--- jsr166/src/test/tck/MapTest.java 2018/12/18 03:54:01 1.4 +++ jsr166/src/test/tck/MapTest.java 2019/04/24 17:29:50 1.5 @@ -173,6 +173,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 = 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()); // }