From c64a1a0c3c0aae2208fb6a15352d9e25e5939811 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 22 Feb 2021 14:42:26 +0000 Subject: [PATCH] Add tests to CopyOnWriteMultisetTest for modification during iteration This is a key use-case for copy-on-write collections. PiperOrigin-RevId: 358807866 --- .../util/CopyOnWriteMultisetTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/CopyOnWriteMultisetTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/CopyOnWriteMultisetTest.java index edbb2047bc..1b41a2a79d 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/CopyOnWriteMultisetTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/CopyOnWriteMultisetTest.java @@ -117,4 +117,34 @@ public final class CopyOnWriteMultisetTest { assertThat(multiset.count("a string")).isEqualTo(2); assertThat(multiset.count("another string")).isEqualTo(0); } + + @Test + public void modifyingWhileIteratingElements_succeeds() { + CopyOnWriteMultiset multiset = new CopyOnWriteMultiset<>(); + multiset.add("a string"); + multiset.add("a string"); + multiset.add("another string"); + + // A traditional collection would throw a ConcurrentModificationException here. + for (String element : multiset) { + multiset.remove(element); + } + + assertThat(multiset).isEmpty(); + } + + @Test + public void modifyingWhileIteratingElementSet_succeeds() { + CopyOnWriteMultiset multiset = new CopyOnWriteMultiset<>(); + multiset.add("a string"); + multiset.add("a string"); + multiset.add("another string"); + + // A traditional collection would throw a ConcurrentModificationException here. + for (String element : multiset.elementSet()) { + multiset.remove(element); + } + + assertThat(multiset).containsExactly("a string"); + } }