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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines