summaryrefslogtreecommitdiff
path: root/jsr166-tests/src/test/java/jsr166/FutureTaskTest.java
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2015-04-28 11:40:00 +0100
committerNarayan Kamath <narayan@google.com>2015-04-30 12:00:08 +0100
commit8e9a0e92906742b17eb08d7fb83cca91965f9b8e (patch)
tree790a5161ed9c8648a8dacc94c36b5db53f8da4eb /jsr166-tests/src/test/java/jsr166/FutureTaskTest.java
parentedf43d27e240d82106f39ae91404963c23987234 (diff)
Update JSR166 tck tests.
The following tests have been omitted because they are unsupported : - Atomic8Test.java - CompletableFutureTest.java - ConcurrentHashMap8Test.java - DoubleAccumulatorTest.java - DoubleAdderTest.java - ForkJoinPool8Test.java - ForkJoinTask8Test.java - LongAccumulatorTest.java - LongAdderTest.java - SplittableRandomTest.java - StampedLockTest.java - ThreadLocalRandom8Test.java - ThreadPoolExecutor9Test.java A package declaration has been added to all files (package jsr166;) and the base-class JSR166Test has been changed not to rely on features that aren't available on android / junit in the android environment. We also avoid using junit4 style TestSuite declarations. While the CTS test runner handles them properly usually, it trips over itself when it encounters a failure and tries to run each test in an invidual process and fails each test for no good reason (needs investigation on the CTS side of things) bug: 20628776 (cherry picked from commit 5da8b2b3cac51f0f592a5e1941bd84eade9648cd) Change-Id: If35be0881ad8da4c604ce6683149b15c1a85f289
Diffstat (limited to 'jsr166-tests/src/test/java/jsr166/FutureTaskTest.java')
-rw-r--r--jsr166-tests/src/test/java/jsr166/FutureTaskTest.java57
1 files changed, 51 insertions, 6 deletions
diff --git a/jsr166-tests/src/test/java/jsr166/FutureTaskTest.java b/jsr166-tests/src/test/java/jsr166/FutureTaskTest.java
index baab79e4bc..a5d8c466a1 100644
--- a/jsr166-tests/src/test/java/jsr166/FutureTaskTest.java
+++ b/jsr166-tests/src/test/java/jsr166/FutureTaskTest.java
@@ -8,21 +8,39 @@
package jsr166;
-import junit.framework.*;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import java.util.*;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
public class FutureTaskTest extends JSR166TestCase {
+ // android-note: Removed because the CTS runner does a bad job of
+ // retrying tests that have suite() declarations.
+ //
+ // public static void main(String[] args) {
+ // main(suite(), args);
+ // }
+ // public static Test suite() {
+ // return new TestSuite(...);
+ // }
+
void checkIsDone(Future<?> f) {
assertTrue(f.isDone());
assertFalse(f.cancel(false));
@@ -122,7 +140,7 @@ public class FutureTaskTest extends JSR166TestCase {
pf.set(new Object());
pf.setException(new Error());
for (boolean mayInterruptIfRunning : new boolean[] { true, false }) {
- pf.cancel(true);
+ pf.cancel(mayInterruptIfRunning);
}
}
@@ -473,8 +491,8 @@ public class FutureTaskTest extends JSR166TestCase {
final PublicFutureTask task =
new PublicFutureTask(new Runnable() {
public void run() {
+ pleaseCancel.countDown();
try {
- pleaseCancel.countDown();
delay(LONG_DELAY_MS);
threadShouldThrow();
} catch (InterruptedException success) {
@@ -796,4 +814,31 @@ public class FutureTaskTest extends JSR166TestCase {
}
}
+ /**
+ * timed get with most negative timeout works correctly (i.e. no
+ * underflow bug)
+ */
+ public void testGet_NegativeInfinityTimeout() throws Exception {
+ final ExecutorService pool = Executors.newFixedThreadPool(10);
+ final Runnable nop = new Runnable() { public void run() {}};
+ final FutureTask<Void> task = new FutureTask<>(nop, null);
+ final List<Future<?>> futures = new ArrayList<>();
+ Runnable r = new Runnable() { public void run() {
+ for (long timeout : new long[] { 0L, -1L, Long.MIN_VALUE }) {
+ try {
+ task.get(timeout, NANOSECONDS);
+ shouldThrow();
+ } catch (TimeoutException success) {
+ } catch (Throwable fail) {threadUnexpectedException(fail);}}}};
+ for (int i = 0; i < 10; i++)
+ futures.add(pool.submit(r));
+ try {
+ joinPool(pool);
+ for (Future<?> future : futures)
+ checkCompletedNormally(future, null);
+ } finally {
+ task.run(); // last resort to help terminate
+ }
+ }
+
}