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.237 by jsr166, Wed Aug 23 05:33:00 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 539 | Line 544 | public class JSR166TestCase extends Test
544                  "DoubleAdderTest",
545                  "ForkJoinPool8Test",
546                  "ForkJoinTask8Test",
547 +                "HashMapTest",
548                  "LinkedBlockingDeque8Test",
549                  "LinkedBlockingQueue8Test",
550                  "LongAccumulatorTest",
# Line 1111 | Line 1117 | public class JSR166TestCase extends Test
1117      }
1118  
1119      /**
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    /**
1120       * Checks that future.get times out, with the default timeout of
1121       * {@code timeoutMillis()}.
1122       */
# Line 1951 | Line 1910 | public class JSR166TestCase extends Test
1910                                 1000L, MILLISECONDS,
1911                                 new SynchronousQueue<Runnable>());
1912  
1913 +    static <T> void shuffle(T[] array) {
1914 +        Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1915 +    }
1916 +
1917 +    /**
1918 +     * Returns the same String as would be returned by {@link
1919 +     * Object#toString}, whether or not the given object's class
1920 +     * overrides toString().
1921 +     *
1922 +     * @see System#identityHashCode
1923 +     */
1924 +    static String identityString(Object x) {
1925 +        return x.getClass().getName()
1926 +            + "@" + Integer.toHexString(System.identityHashCode(x));
1927 +    }
1928 +
1929 +    // --- Shared assertions for Executor tests ---
1930 +
1931      /**
1932       * Returns maximum number of tasks that can be submitted to given
1933       * pool (with bounded queue) before saturation (when submission
# Line 1961 | Line 1938 | public class JSR166TestCase extends Test
1938          return pool.getMaximumPoolSize() + q.size() + q.remainingCapacity();
1939      }
1940  
1941 <    static <T> void shuffle(T[] array) {
1942 <        Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1941 >    @SuppressWarnings("FutureReturnValueIgnored")
1942 >    void assertNullTaskSubmissionThrowsNullPointerException(Executor e) {
1943 >        try {
1944 >            e.execute((Runnable) null);
1945 >            shouldThrow();
1946 >        } catch (NullPointerException success) {}
1947 >
1948 >        if (! (e instanceof ExecutorService)) return;
1949 >        ExecutorService es = (ExecutorService) e;
1950 >        try {
1951 >            es.submit((Runnable) null);
1952 >            shouldThrow();
1953 >        } catch (NullPointerException success) {}
1954 >        try {
1955 >            es.submit((Runnable) null, Boolean.TRUE);
1956 >            shouldThrow();
1957 >        } catch (NullPointerException success) {}
1958 >        try {
1959 >            es.submit((Callable) null);
1960 >            shouldThrow();
1961 >        } catch (NullPointerException success) {}
1962 >
1963 >        if (! (e instanceof ScheduledExecutorService)) return;
1964 >        ScheduledExecutorService ses = (ScheduledExecutorService) e;
1965 >        try {
1966 >            ses.schedule((Runnable) null,
1967 >                         randomTimeout(), randomTimeUnit());
1968 >            shouldThrow();
1969 >        } catch (NullPointerException success) {}
1970 >        try {
1971 >            ses.schedule((Callable) null,
1972 >                         randomTimeout(), randomTimeUnit());
1973 >            shouldThrow();
1974 >        } catch (NullPointerException success) {}
1975 >        try {
1976 >            ses.scheduleAtFixedRate((Runnable) null,
1977 >                                    randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1978 >            shouldThrow();
1979 >        } catch (NullPointerException success) {}
1980 >        try {
1981 >            ses.scheduleWithFixedDelay((Runnable) null,
1982 >                                       randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1983 >            shouldThrow();
1984 >        } catch (NullPointerException success) {}
1985 >    }
1986 >
1987 >    void setRejectedExecutionHandler(
1988 >        ThreadPoolExecutor p, RejectedExecutionHandler handler) {
1989 >        p.setRejectedExecutionHandler(handler);
1990 >        assertSame(handler, p.getRejectedExecutionHandler());
1991 >    }
1992 >
1993 >    void assertTaskSubmissionsAreRejected(ThreadPoolExecutor p) {
1994 >        final RejectedExecutionHandler savedHandler = p.getRejectedExecutionHandler();
1995 >        final long savedTaskCount = p.getTaskCount();
1996 >        final long savedCompletedTaskCount = p.getCompletedTaskCount();
1997 >        final int savedQueueSize = p.getQueue().size();
1998 >        final boolean stock = (p.getClass().getClassLoader() == null);
1999 >
2000 >        Runnable r = () -> {};
2001 >        Callable<Boolean> c = () -> Boolean.TRUE;
2002 >
2003 >        class Recorder implements RejectedExecutionHandler {
2004 >            public volatile Runnable r = null;
2005 >            public volatile ThreadPoolExecutor p = null;
2006 >            public void reset() { r = null; p = null; }
2007 >            public void rejectedExecution(Runnable r, ThreadPoolExecutor p) {
2008 >                assertNull(this.r);
2009 >                assertNull(this.p);
2010 >                this.r = r;
2011 >                this.p = p;
2012 >            }
2013 >        }
2014 >
2015 >        // check custom handler is invoked exactly once per task
2016 >        Recorder recorder = new Recorder();
2017 >        setRejectedExecutionHandler(p, recorder);
2018 >        for (int i = 2; i--> 0; ) {
2019 >            recorder.reset();
2020 >            p.execute(r);
2021 >            if (stock && p.getClass() == ThreadPoolExecutor.class)
2022 >                assertSame(r, recorder.r);
2023 >            assertSame(p, recorder.p);
2024 >
2025 >            recorder.reset();
2026 >            assertFalse(p.submit(r).isDone());
2027 >            if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2028 >            assertSame(p, recorder.p);
2029 >
2030 >            recorder.reset();
2031 >            assertFalse(p.submit(r, Boolean.TRUE).isDone());
2032 >            if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2033 >            assertSame(p, recorder.p);
2034 >
2035 >            recorder.reset();
2036 >            assertFalse(p.submit(c).isDone());
2037 >            if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2038 >            assertSame(p, recorder.p);
2039 >
2040 >            if (p instanceof ScheduledExecutorService) {
2041 >                ScheduledExecutorService s = (ScheduledExecutorService) p;
2042 >                ScheduledFuture<?> future;
2043 >
2044 >                recorder.reset();
2045 >                future = s.schedule(r, randomTimeout(), randomTimeUnit());
2046 >                assertFalse(future.isDone());
2047 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2048 >                assertSame(p, recorder.p);
2049 >
2050 >                recorder.reset();
2051 >                future = s.schedule(c, randomTimeout(), randomTimeUnit());
2052 >                assertFalse(future.isDone());
2053 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2054 >                assertSame(p, recorder.p);
2055 >
2056 >                recorder.reset();
2057 >                future = s.scheduleAtFixedRate(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2058 >                assertFalse(future.isDone());
2059 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2060 >                assertSame(p, recorder.p);
2061 >
2062 >                recorder.reset();
2063 >                future = s.scheduleWithFixedDelay(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2064 >                assertFalse(future.isDone());
2065 >                if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2066 >                assertSame(p, recorder.p);
2067 >            }
2068 >        }
2069 >
2070 >        // Checking our custom handler above should be sufficient, but
2071 >        // we add some integration tests of standard handlers.
2072 >        final AtomicReference<Thread> thread = new AtomicReference<>();
2073 >        final Runnable setThread = () -> thread.set(Thread.currentThread());
2074 >
2075 >        setRejectedExecutionHandler(p, new ThreadPoolExecutor.AbortPolicy());
2076 >        try {
2077 >            p.execute(setThread);
2078 >            shouldThrow();
2079 >        } catch (RejectedExecutionException success) {}
2080 >        assertNull(thread.get());
2081 >
2082 >        setRejectedExecutionHandler(p, new ThreadPoolExecutor.DiscardPolicy());
2083 >        p.execute(setThread);
2084 >        assertNull(thread.get());
2085 >
2086 >        setRejectedExecutionHandler(p, new ThreadPoolExecutor.CallerRunsPolicy());
2087 >        p.execute(setThread);
2088 >        if (p.isShutdown())
2089 >            assertNull(thread.get());
2090 >        else
2091 >            assertSame(Thread.currentThread(), thread.get());
2092 >
2093 >        setRejectedExecutionHandler(p, savedHandler);
2094 >
2095 >        // check that pool was not perturbed by handlers
2096 >        assertEquals(savedTaskCount, p.getTaskCount());
2097 >        assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
2098 >        assertEquals(savedQueueSize, p.getQueue().size());
2099      }
2100   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines