--- jsr166/src/test/tck/MapTest.java 2017/08/23 05:33:00 1.1 +++ jsr166/src/test/tck/MapTest.java 2019/04/24 17:29:50 1.5 @@ -102,7 +102,7 @@ public class MapTest extends JSR166TestC final Object v2 = (permitsNullValues && rnd.nextBoolean() && v1 != null) ? null : impl.makeValue(2); - /** If true, always lands in first bucket in hash tables. */ + // If true, always lands in first bucket in hash tables. final boolean poorHash = rnd.nextBoolean(); class Key implements Comparable { final int i; @@ -139,6 +139,66 @@ public class MapTest extends JSR166TestC assertEquals(1, m.size()); } + /** + * "Missing" test found while investigating JDK-8210280. + * ant -Djsr166.tckTestClass=HashMapTest -Djsr166.methodFilter=testBug8210280 -Djsr166.runsPerTest=1000000 tck + */ + public void testBug8210280() { + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final int size1 = rnd.nextInt(32); + final int size2 = rnd.nextInt(128); + + final Map m1 = impl.emptyMap(); + for (int i = 0; i < size1; i++) { + int elt = rnd.nextInt(1024 * i, 1024 * (i + 1)); + assertNull(m1.put(impl.makeKey(elt), impl.makeValue(elt))); + } + + final Map m2 = impl.emptyMap(); + for (int i = 0; i < size2; i++) { + int elt = rnd.nextInt(Integer.MIN_VALUE + 1024 * i, + Integer.MIN_VALUE + 1024 * (i + 1)); + assertNull(m2.put(impl.makeKey(elt), impl.makeValue(-elt))); + } + + final Map m1Copy = impl.emptyMap(); + m1Copy.putAll(m1); + + m1.putAll(m2); + + for (Object elt : m2.keySet()) + assertEquals(m2.get(elt), m1.get(elt)); + for (Object elt : m1Copy.keySet()) + assertSame(m1Copy.get(elt), m1.get(elt)); + assertEquals(size1 + size2, m1.size()); + } + + /** + * 8222930: ConcurrentSkipListMap.clone() shares size variable between original and clone + */ + public void testClone() { + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final int size = rnd.nextInt(4); + final Map map = impl.emptyMap(); + for (int i = size; i--> 0; ) + map.put(impl.makeKey(i), impl.makeValue(i)); + final Map clone = cloneableClone(map); + if (clone == null) return; // not cloneable? + + assertEquals(size, map.size()); + assertEquals(size, clone.size()); + assertEquals(map.isEmpty(), clone.isEmpty()); + + clone.put(impl.makeKey(-1), impl.makeValue(-1)); + assertEquals(size, map.size()); + assertEquals(size + 1, clone.size()); + + clone.clear(); + assertEquals(size, map.size()); + assertEquals(0, clone.size()); + assertTrue(clone.isEmpty()); + } + // public void testFailsIntentionallyForDebugging() { // fail(impl.klazz().getSimpleName()); // }