--- jsr166/src/test/tck/JSR166TestCase.java 2019/09/22 01:59:57 1.268
+++ jsr166/src/test/tck/JSR166TestCase.java 2022/11/25 16:39:49 1.276
@@ -74,6 +74,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.PropertyPermission;
+import java.util.Queue;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
@@ -150,6 +151,11 @@ import junit.framework.TestSuite;
* but even so, if there is ever any doubt, they can all be increased
* in one spot to rerun tests on slower platforms.
*
+ * Class Item is used for elements of collections and related
+ * purposes. Many tests rely on their keys being equal to ints. To
+ * check these, methods mustEqual, mustContain, etc adapt the JUnit
+ * assert methods to intercept ints.
+ *
*
All threads generated must be joined inside each test case
* method (or {@code fail} to do so) before returning from the
* method. The {@code joinPool} method can be used to do this when
@@ -189,8 +195,9 @@ import junit.framework.TestSuite;
*
*/
public class JSR166TestCase extends TestCase {
+ // No longer run with custom securityManagers
private static final boolean useSecurityManager =
- Boolean.getBoolean("jsr166.useSecurityManager");
+ Boolean.getBoolean("jsr166.useSecurityManager");
protected static final boolean expensiveTests =
Boolean.getBoolean("jsr166.expensiveTests");
@@ -401,11 +408,15 @@ public class JSR166TestCase extends Test
* Runs all unit tests in the given test suite.
* Actual behavior influenced by jsr166.* system properties.
*/
+ @SuppressWarnings("removal")
static void main(Test suite, String[] args) {
if (useSecurityManager) {
System.err.println("Setting a permissive security manager");
Policy.setPolicy(permissivePolicy());
- System.setSecurityManager(new SecurityManager());
+ try {
+ System.setSecurityManager(new SecurityManager());
+ } catch (Throwable ok) { // failure OK during deprecation
+ }
}
for (int i = 0; i < suiteRuns; i++) {
TestResult result = newPithyTestRunner().doRun(suite);
@@ -446,14 +457,18 @@ public class JSR166TestCase extends Test
public static final String JAVA_SPECIFICATION_VERSION;
static {
try {
- JAVA_CLASS_VERSION = java.security.AccessController.doPrivileged(
+ @SuppressWarnings("removal") double jcv =
+ java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Double run() {
return Double.valueOf(System.getProperty("java.class.version"));}});
- JAVA_SPECIFICATION_VERSION = java.security.AccessController.doPrivileged(
+ JAVA_CLASS_VERSION = jcv;
+ @SuppressWarnings("removal") String jsv =
+ java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public String run() {
return System.getProperty("java.specification.version");}});
+ JAVA_SPECIFICATION_VERSION = jsv;
} catch (Throwable t) {
throw new Error(t);
}
@@ -590,6 +605,12 @@ public class JSR166TestCase extends Test
addNamedTestClasses(suite, java9TestClassNames);
}
+ if (atLeastJava17()) {
+ String[] java17TestClassNames = {
+ "ForkJoinPool19Test",
+ };
+ addNamedTestClasses(suite, java17TestClassNames);
+ }
return suite;
}
@@ -704,6 +725,14 @@ public class JSR166TestCase extends Test
/**
* Returns a random element from given choices.
*/
+ T chooseRandomly(List choices) {
+ return choices.get(ThreadLocalRandom.current().nextInt(choices.size()));
+ }
+
+ /**
+ * Returns a random element from given choices.
+ */
+ @SuppressWarnings("unchecked")
T chooseRandomly(T... choices) {
return choices[ThreadLocalRandom.current().nextInt(choices.length)];
}
@@ -1040,7 +1069,7 @@ public class JSR166TestCase extends Test
void joinPool(ExecutorService pool) {
try {
pool.shutdown();
- if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
+ if (!pool.awaitTermination(20 * LONG_DELAY_MS, MILLISECONDS)) {
try {
threadFail("ExecutorService " + pool +
" did not terminate in a timely manner");
@@ -1124,6 +1153,7 @@ public class JSR166TestCase extends Test
* A debugging tool to print stack traces of most threads, as jstack does.
* Uninteresting threads are filtered out.
*/
+ @SuppressWarnings("removal")
static void dumpTestThreads() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
@@ -1178,14 +1208,14 @@ public class JSR166TestCase extends Test
* Checks that future.get times out, with the default timeout of
* {@code timeoutMillis()}.
*/
- void assertFutureTimesOut(Future future) {
+ void assertFutureTimesOut(Future> future) {
assertFutureTimesOut(future, timeoutMillis());
}
/**
* Checks that future.get times out, with the given millisecond timeout.
*/
- void assertFutureTimesOut(Future future, long timeoutMillis) {
+ void assertFutureTimesOut(Future> future, long timeoutMillis) {
long startTime = System.nanoTime();
try {
future.get(timeoutMillis, MILLISECONDS);
@@ -1193,8 +1223,9 @@ public class JSR166TestCase extends Test
} catch (TimeoutException success) {
} catch (Exception fail) {
threadUnexpectedException(fail);
- } finally { future.cancel(true); }
+ }
assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
+ assertFalse(future.isDone());
}
/**
@@ -1219,28 +1250,135 @@ public class JSR166TestCase extends Test
/**
* The number of elements to place in collections, arrays, etc.
+ * Must be at least ten;
*/
- public static final int SIZE = 20;
-
- // Some convenient Integer constants
+ public static final int SIZE = 32;
- public static final Integer zero = new Integer(0);
- public static final Integer one = new Integer(1);
- public static final Integer two = new Integer(2);
- public static final Integer three = new Integer(3);
- public static final Integer four = new Integer(4);
- public static final Integer five = new Integer(5);
- public static final Integer six = new Integer(6);
- public static final Integer seven = new Integer(7);
- public static final Integer eight = new Integer(8);
- public static final Integer nine = new Integer(9);
- public static final Integer m1 = new Integer(-1);
- public static final Integer m2 = new Integer(-2);
- public static final Integer m3 = new Integer(-3);
- public static final Integer m4 = new Integer(-4);
- public static final Integer m5 = new Integer(-5);
- public static final Integer m6 = new Integer(-6);
- public static final Integer m10 = new Integer(-10);
+ static Item[] seqItems(int size) {
+ Item[] s = new Item[size];
+ for (int i = 0; i < size; ++i)
+ s[i] = new Item(i);
+ return s;
+ }
+ static Item[] negativeSeqItems(int size) {
+ Item[] s = new Item[size];
+ for (int i = 0; i < size; ++i)
+ s[i] = new Item(-i);
+ return s;
+ }
+
+ // Many tests rely on defaultItems all being sequential nonnegative
+ public static final Item[] defaultItems = seqItems(SIZE);
+
+ static Item itemFor(int i) { // check cache for defaultItems
+ Item[] items = defaultItems;
+ return (i >= 0 && i < items.length) ? items[i] : new Item(i);
+ }
+
+ public static final Item zero = defaultItems[0];
+ public static final Item one = defaultItems[1];
+ public static final Item two = defaultItems[2];
+ public static final Item three = defaultItems[3];
+ public static final Item four = defaultItems[4];
+ public static final Item five = defaultItems[5];
+ public static final Item six = defaultItems[6];
+ public static final Item seven = defaultItems[7];
+ public static final Item eight = defaultItems[8];
+ public static final Item nine = defaultItems[9];
+ public static final Item ten = defaultItems[10];
+
+ public static final Item[] negativeItems = negativeSeqItems(SIZE);
+
+ public static final Item minusOne = negativeItems[1];
+ public static final Item minusTwo = negativeItems[2];
+ public static final Item minusThree = negativeItems[3];
+ public static final Item minusFour = negativeItems[4];
+ public static final Item minusFive = negativeItems[5];
+ public static final Item minusSix = negativeItems[6];
+ public static final Item minusSeven = negativeItems[7];
+ public static final Item minusEight = negativeItems[8];
+ public static final Item minusNone = negativeItems[9];
+ public static final Item minusTen = negativeItems[10];
+
+ // elements expected to be missing
+ public static final Item fortytwo = new Item(42);
+ public static final Item eightysix = new Item(86);
+ public static final Item ninetynine = new Item(99);
+
+ // Interop across Item, int
+
+ static void mustEqual(Item x, Item y) {
+ if (x != y)
+ assertEquals(x.value, y.value);
+ }
+ static void mustEqual(Item x, int y) {
+ assertEquals(x.value, y);
+ }
+ static void mustEqual(int x, Item y) {
+ assertEquals(x, y.value);
+ }
+ static void mustEqual(int x, int y) {
+ assertEquals(x, y);
+ }
+ static void mustEqual(Object x, Object y) {
+ if (x != y)
+ assertEquals(x, y);
+ }
+ static void mustEqual(int x, Object y) {
+ if (y instanceof Item)
+ assertEquals(x, ((Item)y).value);
+ else fail();
+ }
+ static void mustEqual(Object x, int y) {
+ if (x instanceof Item)
+ assertEquals(((Item)x).value, y);
+ else fail();
+ }
+ static void mustEqual(boolean x, boolean y) {
+ assertEquals(x, y);
+ }
+ static void mustEqual(long x, long y) {
+ assertEquals(x, y);
+ }
+ static void mustEqual(double x, double y) {
+ assertEquals(x, y);
+ }
+ static void mustContain(Collection c, int i) {
+ assertTrue(c.contains(itemFor(i)));
+ }
+ static void mustContain(Collection c, Item i) {
+ assertTrue(c.contains(i));
+ }
+ static void mustNotContain(Collection c, int i) {
+ assertFalse(c.contains(itemFor(i)));
+ }
+ static void mustNotContain(Collection c, Item i) {
+ assertFalse(c.contains(i));
+ }
+ static void mustRemove(Collection c, int i) {
+ assertTrue(c.remove(itemFor(i)));
+ }
+ static void mustRemove(Collection c, Item i) {
+ assertTrue(c.remove(i));
+ }
+ static void mustNotRemove(Collection c, int i) {
+ assertFalse(c.remove(itemFor(i)));
+ }
+ static void mustNotRemove(Collection c, Item i) {
+ assertFalse(c.remove(i));
+ }
+ static void mustAdd(Collection c, int i) {
+ assertTrue(c.add(itemFor(i)));
+ }
+ static void mustAdd(Collection c, Item i) {
+ assertTrue(c.add(i));
+ }
+ static void mustOffer(Queue c, int i) {
+ assertTrue(c.offer(itemFor(i)));
+ }
+ static void mustOffer(Queue c, Item i) {
+ assertTrue(c.offer(i));
+ }
/**
* Runs Runnable r with a security policy that permits precisely
@@ -1249,6 +1387,7 @@ public class JSR166TestCase extends Test
* security manager. We require that any security manager permit
* getPolicy/setPolicy.
*/
+ @SuppressWarnings("removal")
public void runWithPermissions(Runnable r, Permission... permissions) {
SecurityManager sm = System.getSecurityManager();
if (sm == null) {
@@ -1264,8 +1403,10 @@ public class JSR166TestCase extends Test
* Runnable. We require that any security manager permit
* getPolicy/setPolicy.
*/
+ @SuppressWarnings("removal")
public void runWithSecurityManagerWithPermissions(Runnable r,
Permission... permissions) {
+ if (!useSecurityManager) return;
SecurityManager sm = System.getSecurityManager();
if (sm == null) {
Policy savedPolicy = Policy.getPolicy();
@@ -1273,9 +1414,13 @@ public class JSR166TestCase extends Test
Policy.setPolicy(permissivePolicy());
System.setSecurityManager(new SecurityManager());
runWithSecurityManagerWithPermissions(r, permissions);
+ } catch (UnsupportedOperationException ok) {
} finally {
- System.setSecurityManager(null);
- Policy.setPolicy(savedPolicy);
+ try {
+ System.setSecurityManager(null);
+ Policy.setPolicy(savedPolicy);
+ } catch (Exception ok) {
+ }
}
} else {
Policy savedPolicy = Policy.getPolicy();
@@ -1302,6 +1447,7 @@ public class JSR166TestCase extends Test
* A security policy where new permissions can be dynamically added
* or all cleared.
*/
+ @SuppressWarnings("removal")
public static class AdjustablePolicy extends java.security.Policy {
Permissions perms = new Permissions();
AdjustablePolicy(Permission... permissions) {
@@ -1331,6 +1477,7 @@ public class JSR166TestCase extends Test
/**
* Returns a policy containing all the permissions we ever need.
*/
+ @SuppressWarnings("removal")
public static Policy permissivePolicy() {
return new AdjustablePolicy
// Permissions j.u.c. needs directly
@@ -1477,7 +1624,7 @@ public class JSR166TestCase extends Test
* wrapped in a CheckedRunnable.
*/
Thread newStartedThread(Action action) {
- return newStartedThread(checkedRunnable(action));
+ return newStartedThread(checkedRunnable(action));
}
/**
@@ -1588,7 +1735,7 @@ public class JSR166TestCase extends Test
public void run() {}
}
- public static class NoOpCallable implements Callable {
+ public static class NoOpCallable implements Callable