< prev index next >

test/jdk/java/util/concurrent/tck/ConcurrentLinkedDequeTest.java

Print this page
8225490: Miscellaneous changes imported from jsr166 CVS 2019-09
Reviewed-by: martin, alanb


 923         };
 924 
 925         for (Deque<?> q : qs) {
 926             assertFalse(q.contains(null));
 927             try {
 928                 assertFalse(q.remove(null));
 929                 shouldThrow();
 930             } catch (NullPointerException success) {}
 931             try {
 932                 assertFalse(q.removeFirstOccurrence(null));
 933                 shouldThrow();
 934             } catch (NullPointerException success) {}
 935             try {
 936                 assertFalse(q.removeLastOccurrence(null));
 937                 shouldThrow();
 938             } catch (NullPointerException success) {}
 939         }
 940     }
 941 
 942     void runAsync(Runnable r1, Runnable r2) {
 943         boolean b = ThreadLocalRandom.current().nextBoolean();
 944         CompletableFuture<Void> f1 = CompletableFuture.runAsync(b ? r1 : r2);
 945         CompletableFuture<Void> f2 = CompletableFuture.runAsync(b ? r2 : r1);
 946         f1.join();
 947         f2.join();
 948     }
 949 
 950     /**
 951      * Non-traversing Deque operations are linearizable.
 952      * https://bugs.openjdk.java.net/browse/JDK-8188900
 953      * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8188900 tck
 954      */
 955     public void testBug8188900() {
 956         final ThreadLocalRandom rnd = ThreadLocalRandom.current();
 957         final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
 958         for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
 959             ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
 960 
 961             boolean peek = rnd.nextBoolean();
 962             Runnable getter = () -> {
 963                 Integer x = peek ? d.peekFirst() : d.pollFirst();


 984         final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
 985         for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
 986             ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
 987 
 988             boolean peek = rnd.nextBoolean();
 989             Runnable getter = () -> {
 990                 Integer x = peek ? d.peekLast() : d.pollLast();
 991                 if (x == null) nulls.increment();
 992                 else if (x == 0) zeros.increment();
 993                 else
 994                     throw new AssertionError(
 995                         String.format(
 996                             "unexpected value %d after %d nulls and %d zeros",
 997                             x, nulls.sum(), zeros.sum()));
 998             };
 999 
1000             Runnable adder = () -> { d.addLast(0); d.addFirst(42); };
1001 
1002             runAsync(getter, adder);
1003         }
1004     }
1005 
1006     <T> T chooseRandomly(T... choices) {
1007         return choices[ThreadLocalRandom.current().nextInt(choices.length)];
1008     }
1009 
1010     /**
1011      * Non-traversing Deque operations (that return null) are linearizable.
1012      * Don't return null when the deque is observably never empty.
1013      * https://bugs.openjdk.java.net/browse/JDK-8189387
1014      * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8189387 tck
1015      */
1016     public void testBug8189387() {
1017         final ThreadLocalRandom rnd = ThreadLocalRandom.current();
1018         Object x = new Object();
1019         for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
1020             ConcurrentLinkedDeque<Object> d = new ConcurrentLinkedDeque<>();
1021             Runnable add = chooseRandomly(
1022                 () -> d.addFirst(x),
1023                 () -> d.offerFirst(x),
1024                 () -> d.addLast(x),
1025                 () -> d.offerLast(x));
1026 
1027             Runnable get = chooseRandomly(


 923         };
 924 
 925         for (Deque<?> q : qs) {
 926             assertFalse(q.contains(null));
 927             try {
 928                 assertFalse(q.remove(null));
 929                 shouldThrow();
 930             } catch (NullPointerException success) {}
 931             try {
 932                 assertFalse(q.removeFirstOccurrence(null));
 933                 shouldThrow();
 934             } catch (NullPointerException success) {}
 935             try {
 936                 assertFalse(q.removeLastOccurrence(null));
 937                 shouldThrow();
 938             } catch (NullPointerException success) {}
 939         }
 940     }
 941 
 942     void runAsync(Runnable r1, Runnable r2) {
 943         boolean b = randomBoolean();
 944         CompletableFuture<Void> f1 = CompletableFuture.runAsync(b ? r1 : r2);
 945         CompletableFuture<Void> f2 = CompletableFuture.runAsync(b ? r2 : r1);
 946         f1.join();
 947         f2.join();
 948     }
 949 
 950     /**
 951      * Non-traversing Deque operations are linearizable.
 952      * https://bugs.openjdk.java.net/browse/JDK-8188900
 953      * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8188900 tck
 954      */
 955     public void testBug8188900() {
 956         final ThreadLocalRandom rnd = ThreadLocalRandom.current();
 957         final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
 958         for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
 959             ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
 960 
 961             boolean peek = rnd.nextBoolean();
 962             Runnable getter = () -> {
 963                 Integer x = peek ? d.peekFirst() : d.pollFirst();


 984         final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
 985         for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
 986             ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
 987 
 988             boolean peek = rnd.nextBoolean();
 989             Runnable getter = () -> {
 990                 Integer x = peek ? d.peekLast() : d.pollLast();
 991                 if (x == null) nulls.increment();
 992                 else if (x == 0) zeros.increment();
 993                 else
 994                     throw new AssertionError(
 995                         String.format(
 996                             "unexpected value %d after %d nulls and %d zeros",
 997                             x, nulls.sum(), zeros.sum()));
 998             };
 999 
1000             Runnable adder = () -> { d.addLast(0); d.addFirst(42); };
1001 
1002             runAsync(getter, adder);
1003         }




1004     }
1005 
1006     /**
1007      * Non-traversing Deque operations (that return null) are linearizable.
1008      * Don't return null when the deque is observably never empty.
1009      * https://bugs.openjdk.java.net/browse/JDK-8189387
1010      * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8189387 tck
1011      */
1012     public void testBug8189387() {
1013         final ThreadLocalRandom rnd = ThreadLocalRandom.current();
1014         Object x = new Object();
1015         for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
1016             ConcurrentLinkedDeque<Object> d = new ConcurrentLinkedDeque<>();
1017             Runnable add = chooseRandomly(
1018                 () -> d.addFirst(x),
1019                 () -> d.offerFirst(x),
1020                 () -> d.addLast(x),
1021                 () -> d.offerLast(x));
1022 
1023             Runnable get = chooseRandomly(
< prev index next >