--- jsr166/src/test/tck/MapTest.java 2018/12/18 03:54:01 1.4 +++ jsr166/src/test/tck/MapTest.java 2019/07/08 21:17:16 1.7 @@ -95,6 +95,7 @@ public class MapTest extends JSR166TestC */ public void testBug8186171() { if (!impl.supportsSetValue()) return; + if (!atLeastJava10()) return; // jdk9 is abandoned final ThreadLocalRandom rnd = ThreadLocalRandom.current(); final boolean permitsNullValues = impl.permitsNullValues(); final Object v1 = (permitsNullValues && rnd.nextBoolean()) @@ -173,6 +174,32 @@ public class MapTest extends JSR166TestC 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 = 0; i < size; i++) + 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()); // }