ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
(Generate patch)

Comparing jsr166/src/test/tck/JSR166TestCase.java (file contents):
Revision 1.233 by jsr166, Sat Jul 15 23:15:21 2017 UTC vs.
Revision 1.238 by jsr166, Mon Dec 11 00:27:08 2017 UTC

# Line 76 | Line 76 | import java.util.concurrent.Callable;
76   import java.util.concurrent.CountDownLatch;
77   import java.util.concurrent.CyclicBarrier;
78   import java.util.concurrent.ExecutionException;
79 + import java.util.concurrent.Executor;
80   import java.util.concurrent.Executors;
81   import java.util.concurrent.ExecutorService;
82   import java.util.concurrent.ForkJoinPool;
83   import java.util.concurrent.Future;
84 + import java.util.concurrent.FutureTask;
85   import java.util.concurrent.RecursiveAction;
86   import java.util.concurrent.RecursiveTask;
87 + import java.util.concurrent.RejectedExecutionException;
88   import java.util.concurrent.RejectedExecutionHandler;
89   import java.util.concurrent.Semaphore;
90 + import java.util.concurrent.ScheduledExecutorService;
91 + import java.util.concurrent.ScheduledFuture;
92   import java.util.concurrent.SynchronousQueue;
93   import java.util.concurrent.ThreadFactory;
94   import java.util.concurrent.ThreadLocalRandom;
# Line 440 | Line 445 | public class JSR166TestCase extends Test
445          }
446      }
447  
448 <    public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
449 <    public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
450 <    public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
451 <    public static boolean atLeastJava9() {
452 <        return JAVA_CLASS_VERSION >= 53.0
448 <            // As of 2015-09, java9 still uses 52.0 class file version
449 <            || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?(9|[0-9][0-9])$");
450 <    }
451 <    public static boolean atLeastJava10() {
452 <        return JAVA_CLASS_VERSION >= 54.0
453 <            || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?[0-9][0-9]$");
454 <    }
448 >    public static boolean atLeastJava6()  { return JAVA_CLASS_VERSION >= 50.0; }
449 >    public static boolean atLeastJava7()  { return JAVA_CLASS_VERSION >= 51.0; }
450 >    public static boolean atLeastJava8()  { return JAVA_CLASS_VERSION >= 52.0; }
451 >    public static boolean atLeastJava9()  { return JAVA_CLASS_VERSION >= 53.0; }
452 >    public static boolean atLeastJava10() { return JAVA_CLASS_VERSION >= 54.0; }
453  
454      /**
455       * Collects all JSR166 unit tests as one suite.
# Line 539 | Line 537 | public class JSR166TestCase extends Test
537                  "DoubleAdderTest",
538                  "ForkJoinPool8Test",
539                  "ForkJoinTask8Test",
540 +                "HashMapTest",
541                  "LinkedBlockingDeque8Test",
542                  "LinkedBlockingQueue8Test",
543                  "LongAccumulatorTest",
# Line 1111 | Line 1110 | public class JSR166TestCase extends Test
1110      }
1111  
1112      /**
1114     * Checks that thread does not terminate within the default
1115     * millisecond delay of {@code timeoutMillis()}.
1116     * TODO: REMOVEME
1117     */
1118    void assertThreadStaysAlive(Thread thread) {
1119        assertThreadStaysAlive(thread, timeoutMillis());
1120    }
1121
1122    /**
1123     * Checks that thread does not terminate within the given millisecond delay.
1124     * TODO: REMOVEME
1125     */
1126    void assertThreadStaysAlive(Thread thread, long millis) {
1127        try {
1128            // No need to optimize the failing case via Thread.join.
1129            delay(millis);
1130            assertTrue(thread.isAlive());
1131        } catch (InterruptedException fail) {
1132            threadFail("Unexpected InterruptedException");
1133        }
1134    }
1135
1136    /**
1137     * Checks that the threads do not terminate within the default
1138     * millisecond delay of {@code timeoutMillis()}.
1139     * TODO: REMOVEME
1140     */
1141    void assertThreadsStayAlive(Thread... threads) {
1142        assertThreadsStayAlive(timeoutMillis(), threads);
1143    }
1144
1145    /**
1146     * Checks that the threads do not terminate within the given millisecond delay.
1147     * TODO: REMOVEME
1148     */
1149    void assertThreadsStayAlive(long millis, Thread... threads) {
1150        try {
1151            // No need to optimize the failing case via Thread.join.
1152            delay(millis);
1153            for (Thread thread : threads)
1154                assertTrue(thread.isAlive());
1155        } catch (InterruptedException fail) {
1156            threadFail("Unexpected InterruptedException");
1157        }
1158    }
1159
1160    /**
1113       * Checks that future.get times out, with the default timeout of
1114       * {@code timeoutMillis()}.
1115       */
# Line 1951 | Line 1903 | public class JSR166TestCase extends Test
1903                                 1000L, MILLISECONDS,
1904                                 new SynchronousQueue<Runnable>());
1905  
1906 +    static <T> void shuffle(T[] array) {
1907 +        Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1908 +    }
1909 +
1910 +    /**
1911 +     * Returns the same String as would be returned by {@link
1912 +     * Object#toString}, whether or not the given object's class
1913 +     * overrides toString().
1914 +     *
1915 +     * @see System#identityHashCode
1916 +     */
1917 +    static String identityString(Object x) {
1918 +        return x.getClass().getName()
1919 +            + "@" + Integer.toHexString(System.identityHashCode(x));
1920 +    }
1921 +
1922 +    // --- Shared assertions for Executor tests ---
1923 +
1924      /**
1925       * Returns maximum number of tasks that can be submitted to given
1926       * pool (with bounded queue) before saturation (when submission
# Line 1961 | Line 1931 | public class JSR166TestCase extends Test
1931          return pool.getMaximumPoolSize() + q.size() + q.remainingCapacity();
1932      }
1933  
1934 <    static <T> void shuffle(T[] array) {
1935 <        Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1934 >    @SuppressWarnings("FutureReturnValueIgnored")
1935 >    void assertNullTaskSubmissionThrowsNullPointerException(Executor e) {
1936 >        try {
1937 >            e.execute((Runnable) null);
1938 >            shouldThrow();
1939 >        } catch (NullPointerException success) {}
1940 >
1941 >        if (! (e instanceof ExecutorService)) return;
1942 >        ExecutorService es = (ExecutorService) e;
1943 >        try {
1944 >            es.submit((Runnable) null);
1945 >            shouldThrow();
1946 >        } catch (NullPointerException success) {}
1947 >        try {
1948 >            es.submit((Runnable) null, Boolean.TRUE);
1949 >            shouldThrow();
1950 >        } catch (NullPointerException success) {}
1951 >        try {
1952 >            es.submit((Callable) null);
1953 >            shouldThrow();
1954 >        } catch (NullPointerException success) {}
1955 >
1956 >        if (! (e instanceof ScheduledExecutorService)) return;
1957 >        ScheduledExecutorService ses = (ScheduledExecutorService) e;
1958 >        try {
1959 >            ses.schedule((Runnable) null,
1960 >                         randomTimeout(), randomTimeUnit());
1961 >            shouldThrow();
1962 >        } catch (NullPointerException success) {}
1963 >        try {
1964 >            ses.schedule((Callable) null,
1965 >                         randomTimeout(), randomTimeUnit());
1966 >            shouldThrow();
1967 >        } catch (NullPointerException success) {}
1968 >        try {
1969 >            ses.scheduleAtFixedRate((Runnable) null,
1970 >                                    randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1971 >            shouldThrow();
1972 >        } catch (NullPointerException success) {}
1973 >        try {
1974 >            ses.scheduleWithFixedDelay((Runnable) null,
1975 >                                       randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1976 >            shouldThrow();
1977 >        } catch (NullPointerException success) {}
1978 >    }
1979 >
1980 >    void setRejectedExecutionHandler(
1981 >        ThreadPoolExecutor p, RejectedExecutionHandler handler) {
1982 >        p.setRejectedExecutionHandler(handler);
1983 >        assertSame(handler, p.getRejectedExecutionHandler());
1984 >    }
1985 >
1986 >    void assertTaskSubmissionsAreRejected(ThreadPoolExecutor p) {
1987 >        final RejectedExecutionHandler savedHandler = p.getRejectedExecutionHandler();
1988 >        final long savedTaskCount = p.getTaskCount();
1989 >        final long savedCompletedTaskCount = p.getCompletedTaskCount();
1990 >        final int savedQueueSize = p.getQueue().size();
1991 >        final boolean stock = (p.getClass().getClassLoader() == null);
1992 >
1993 >        Runnable r = () -> {};
1994 >        Callable<Boolean> c = () -> Boolean.TRUE;
1995 >
1996 >        class Recorder implements RejectedExecutionHandler {
1997 >            public volatile Runnable r = null;
1998 >            public volatile ThreadPoolExecutor p = null;
1999 >            public void reset() { r = null; p = null; }
2000 >            public void rejectedExecution(Runnable r, ThreadPoolExecutor p) {
2001 >                assertNull(this.r);
2002 >                assertNull(this.p);
2003 >                this.r = r;
2004 >                this.p = p;
2005 >            }
2006 >        }
2007 >
2008 >        // check custom handler is invoked exactly once per task
2009 >        Recorder recorder = new Recorder();
2010 >        setRejectedExecutionHandler(p, recorder);
2011 >        for (int i = 2; i--> 0; ) {
2012 >            recorder.reset();
2013 >            p.execute(r);
2014 >            if (stock && p.getClass() == ThreadPoolExecutor.class)
2015 >                assertSame(r, recorder.r);
2016 >            assertSame(p, recorder.p);
2017 >
2018 >            recorder.reset();
2019 >            assertFalse(p.submit(r).isDone());
2020 >            if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2021 >            assertSame(p, recorder.p);
2022 >
2023 >            recorder.reset();
2024 >            assertFalse(p.submit(r, Boolean.TRUE).isDone());
2025 >            if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2026 >            assertSame(p, recorder.p);
2027 >
2028 >            recorder.reset();
2029 >            assertFalse(p.submit(c).isDone());
2030 >            if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2031 >            assertSame(p, recorder.p);
2032 >
2033 >            if (p instanceof ScheduledExecutorService) {
2034 >                ScheduledExecutorService s = (ScheduledExecutorService) p;
2035 >                ScheduledFuture<?> future;
2036 >
2037 >                recorder.reset();
2038 >                future = s.schedule(r, randomTimeout(), randomTimeUnit());
2039 >                assertFalse(future.isDone());
2040 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2041 >                assertSame(p, recorder.p);
2042 >
2043 >                recorder.reset();
2044 >                future = s.schedule(c, randomTimeout(), randomTimeUnit());
2045 >                assertFalse(future.isDone());
2046 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2047 >                assertSame(p, recorder.p);
2048 >
2049 >                recorder.reset();
2050 >                future = s.scheduleAtFixedRate(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2051 >                assertFalse(future.isDone());
2052 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2053 >                assertSame(p, recorder.p);
2054 >
2055 >                recorder.reset();
2056 >                future = s.scheduleWithFixedDelay(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2057 >                assertFalse(future.isDone());
2058 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2059 >                assertSame(p, recorder.p);
2060 >            }
2061 >        }
2062 >
2063 >        // Checking our custom handler above should be sufficient, but
2064 >        // we add some integration tests of standard handlers.
2065 >        final AtomicReference<Thread> thread = new AtomicReference<>();
2066 >        final Runnable setThread = () -> thread.set(Thread.currentThread());
2067 >
2068 >        setRejectedExecutionHandler(p, new ThreadPoolExecutor.AbortPolicy());
2069 >        try {
2070 >            p.execute(setThread);
2071 >            shouldThrow();
2072 >        } catch (RejectedExecutionException success) {}
2073 >        assertNull(thread.get());
2074 >
2075 >        setRejectedExecutionHandler(p, new ThreadPoolExecutor.DiscardPolicy());
2076 >        p.execute(setThread);
2077 >        assertNull(thread.get());
2078 >
2079 >        setRejectedExecutionHandler(p, new ThreadPoolExecutor.CallerRunsPolicy());
2080 >        p.execute(setThread);
2081 >        if (p.isShutdown())
2082 >            assertNull(thread.get());
2083 >        else
2084 >            assertSame(Thread.currentThread(), thread.get());
2085 >
2086 >        setRejectedExecutionHandler(p, savedHandler);
2087 >
2088 >        // check that pool was not perturbed by handlers
2089 >        assertEquals(savedTaskCount, p.getTaskCount());
2090 >        assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
2091 >        assertEquals(savedQueueSize, p.getQueue().size());
2092      }
2093   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines