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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines