test/jdk/java/util/concurrent/ArrayBlockingQueue/WhiteBox.java
author dl
Sat, 10 Feb 2018 09:23:41 -0800
changeset 48843 21efc1774302
parent 48541 946e34c2dec9
child 50229 6b29ef846c5c
permissions -rw-r--r--
8195590: Miscellaneous changes imported from jsr166 CVS 2018-02 Reviewed-by: martin, psandoz, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44039
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     1
/*
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     3
 *
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     6
 * published by the Free Software Foundation.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     7
 *
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     8
 * This code is distributed in the hope that it will be useful, but WITHOUT
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
     9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    10
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    11
 * version 2 for more details (a copy is included in the LICENSE file that
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    12
 * accompanied this code).
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    13
 *
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License version
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    15
 * 2 along with this work; if not, write to the Free Software Foundation,
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    16
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    17
 *
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    18
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    19
 * or visit www.oracle.com if you need additional information or have any
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    20
 * questions.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    21
 */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    22
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    23
/*
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    24
 * This file is available under and governed by the GNU General Public
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    25
 * License version 2 only, as published by the Free Software Foundation.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    26
 * However, the following notice accompanied the original version of this
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    27
 * file:
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    28
 *
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    29
 * Written by Martin Buchholz with assistance from members of JCP
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    30
 * JSR-166 Expert Group and released to the public domain, as
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    31
 * explained at http://creativecommons.org/publicdomain/zero/1.0/
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    32
 */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    33
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    34
/*
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    35
 * @test
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    36
 * @modules java.base/java.util.concurrent:open
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    37
 * @run testng WhiteBox
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    38
 * @summary White box tests of implementation details
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    39
 */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    40
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    41
import static org.testng.Assert.*;
48541
946e34c2dec9 8193300: Miscellaneous changes imported from jsr166 CVS 2018-01
dl
parents: 47216
diff changeset
    42
44039
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    43
import org.testng.annotations.Test;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    44
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    45
import java.lang.ref.WeakReference;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    46
import java.lang.invoke.MethodHandles;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    47
import java.lang.invoke.VarHandle;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    48
import java.util.ArrayDeque;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    49
import java.util.ArrayList;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    50
import java.util.Arrays;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    51
import java.util.Collection;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    52
import java.util.Collections;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    53
import java.util.Iterator;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    54
import java.util.List;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    55
import java.util.NoSuchElementException;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    56
import java.util.Queue;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    57
import java.util.concurrent.ArrayBlockingQueue;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    58
import java.util.concurrent.CountDownLatch;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    59
import java.util.concurrent.ThreadLocalRandom;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    60
import java.util.concurrent.TimeUnit;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    61
import java.util.function.BooleanSupplier;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    62
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    63
@Test
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    64
public class WhiteBox {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    65
    final ThreadLocalRandom rnd = ThreadLocalRandom.current();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    66
    final MethodHandles.Lookup lookup = MethodHandles.lookup();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    67
    final VarHandle ITRS, ITEMS, TAKEINDEX, PUTINDEX, COUNT, HEAD, NEXT, PREVTAKEINDEX;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    68
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    69
    WhiteBox() throws ReflectiveOperationException {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    70
        Class<?> qClass = ArrayBlockingQueue.class;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    71
        Class<?> itrClass  = Class.forName(qClass.getName() + "$Itr");
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    72
        Class<?> itrsClass = Class.forName(qClass.getName() + "$Itrs");
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    73
        Class<?> nodeClass = Class.forName(itrsClass.getName() + "$Node");
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    74
        ITRS      = findVarHandle(qClass, "itrs", itrsClass);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    75
        ITEMS     = findVarHandle(qClass, "items", Object[].class);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    76
        TAKEINDEX = findVarHandle(qClass, "takeIndex", int.class);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    77
        PUTINDEX  = findVarHandle(qClass, "putIndex", int.class);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    78
        COUNT     = findVarHandle(qClass, "count", int.class);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    79
        HEAD      = findVarHandle(itrsClass, "head", nodeClass);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    80
        NEXT      = findVarHandle(nodeClass, "next", nodeClass);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    81
        PREVTAKEINDEX = findVarHandle(itrClass, "prevTakeIndex", int.class);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    82
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    83
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    84
    VarHandle findVarHandle(Class<?> recv, String name, Class<?> type)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    85
        throws ReflectiveOperationException {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    86
        return MethodHandles.privateLookupIn(recv, lookup)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    87
            .findVarHandle(recv, name, type);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    88
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    89
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    90
    Object itrs(ArrayBlockingQueue q) { return ITRS.get(q); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    91
    Object[] items(ArrayBlockingQueue q) { return (Object[]) ITEMS.get(q); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    92
    int takeIndex(ArrayBlockingQueue q) { return (int) TAKEINDEX.get(q); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    93
    int putIndex(ArrayBlockingQueue q) { return (int) PUTINDEX.get(q); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    94
    int count(ArrayBlockingQueue q) { return (int) COUNT.get(q); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    95
    Object head(Object itrs) { return HEAD.get(itrs); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    96
    Object next(Object node) { return NEXT.get(node); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    97
    int prevTakeIndex(Iterator itr) { return (int) PREVTAKEINDEX.get(itr); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    98
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
    99
    boolean isDetached(Iterator it) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   100
        return prevTakeIndex(it) < 0;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   101
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   102
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   103
    void assertIteratorExhausted(Iterator it) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   104
        if (rnd.nextBoolean()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   105
            assertTrue(!it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   106
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   107
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   108
        if (rnd.nextBoolean()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   109
            it.forEachRemaining(e -> { throw new AssertionError(); });
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   110
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   111
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   112
        if (rnd.nextBoolean())
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   113
            try { it.next(); fail("should throw"); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   114
            catch (NoSuchElementException success) {}
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   115
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   116
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   117
    List<Iterator> trackedIterators(ArrayBlockingQueue q) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   118
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   119
        Object itrs = itrs(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   120
        if (itrs != null) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   121
            for (Object p = head(itrs); p != null; p = next(p))
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   122
                its.add(((WeakReference<Iterator>)(p)).get());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   123
            Collections.reverse(its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   124
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   125
        return its;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   126
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   127
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   128
    List<Iterator> attachedIterators(ArrayBlockingQueue q) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   129
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   130
        Object itrs = itrs(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   131
        if (itrs != null) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   132
            for (Object p = head(itrs); p != null; p = next(p)) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   133
                Iterator it = ((WeakReference<Iterator>)(p)).get();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   134
                if (it != null && !isDetached(it))
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   135
                    its.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   136
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   137
            Collections.reverse(its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   138
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   139
        return its;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   140
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   141
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   142
    void assertRemoveThrowsISE(Iterator it) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   143
        if (rnd.nextBoolean())
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   144
            try { it.remove(); fail("should throw"); }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   145
            catch (IllegalStateException success) {}
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   146
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   147
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   148
    void assertRemoveHasNoEffect(Iterator it, Collection c) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   149
        if (rnd.nextBoolean()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   150
            int size = c.size();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   151
            it.remove(); // no effect
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   152
            assertEquals(c.size(), size);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   153
            assertRemoveThrowsISE(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   154
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   155
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   156
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   157
    void checkIterationSanity(Queue q) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   158
        if (rnd.nextBoolean())
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   159
            return;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   160
        int size = q.size();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   161
        Object[] a = q.toArray();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   162
        Object[] b = new Object[size+2];
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   163
        Arrays.fill(b, Boolean.TRUE);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   164
        Object[] c = q.toArray(b);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   165
        assertEquals(a.length, size);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   166
        assertSame(b, c);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   167
        assertNull(b[size]);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   168
        assertSame(b[size+1], Boolean.TRUE);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   169
        assertEquals(q.toString(), Arrays.toString(a));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   170
        Integer[] xx = null, yy = null;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   171
        if (size > 0) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   172
            xx = new Integer[size - 1];
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   173
            Arrays.fill(xx, 42);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   174
            yy = ((Queue<Integer>)q).toArray(xx);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   175
            for (Integer zz : xx)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   176
                assertEquals(42, (int) zz);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   177
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   178
        Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   179
        for (int i = 0; i < size; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   180
            if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   181
            Object x = it.next();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   182
            assertSame(x, a[i]);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   183
            assertSame(x, b[i]);
48843
21efc1774302 8195590: Miscellaneous changes imported from jsr166 CVS 2018-02
dl
parents: 48541
diff changeset
   184
            assertSame(x, yy[i]);
44039
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   185
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   186
        if (rnd.nextBoolean()) assertTrue(!it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   187
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   188
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   189
    /**
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   190
     * Instead of having putIndex (and takeIndex) at the initial
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   191
     * default of 0, move them to a random location.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   192
     */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   193
    void randomizePutIndex(ArrayBlockingQueue q) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   194
        assertTrue(q.isEmpty());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   195
        int capacity = q.remainingCapacity();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   196
        int n = rnd.nextInt(capacity + 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   197
        int putIndex = putIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   198
        for (int i = n; i-->0; ) q.add(Boolean.TRUE);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   199
        for (int i = n; i-->0; ) q.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   200
        assertEquals(putIndex(q), (putIndex + n) % items(q).length);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   201
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   202
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   203
    /** No guarantees, but effective in practice. */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   204
    static void forceFullGc() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   205
        CountDownLatch finalizeDone = new CountDownLatch(1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   206
        WeakReference<?> ref = new WeakReference<Object>(new Object() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   207
            protected void finalize() { finalizeDone.countDown(); }});
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   208
        try {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   209
            for (int i = 0; i < 10; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   210
                System.gc();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   211
                if (finalizeDone.await(1L, TimeUnit.SECONDS) && ref.get() == null) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   212
                    System.runFinalization(); // try to pick up stragglers
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   213
                    return;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   214
                }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   215
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   216
        } catch (InterruptedException unexpected) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   217
            throw new AssertionError("unexpected InterruptedException");
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   218
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   219
        throw new AssertionError("failed to do a \"full\" gc");
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   220
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   221
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   222
    static void gcAwait(BooleanSupplier s) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   223
        for (int i = 0; i < 10; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   224
            if (s.getAsBoolean())
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   225
                return;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   226
            forceFullGc();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   227
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   228
        throw new AssertionError("failed to satisfy condition");
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   229
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   230
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   231
    public void clear_willClearItrs() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   232
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   233
        int capacity = rnd.nextInt(2, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   234
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   235
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   236
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   237
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   238
            assertTrue(q.add(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   239
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   240
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   241
            its.add(q.iterator());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   242
            assertEquals(trackedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   243
            q.poll();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   244
            q.add(capacity + i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   245
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   246
        q.clear();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   247
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   248
        int j = 0;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   249
        for (Iterator it : its) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   250
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   251
            if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   252
            if (rnd.nextBoolean()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   253
                assertEquals(it.next(), j);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   254
                assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   255
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   256
            j++;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   257
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   258
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   259
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   260
    public void queueEmptyingWillClearItrs() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   261
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   262
        int capacity = rnd.nextInt(2, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   263
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   264
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   265
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   266
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   267
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   268
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   269
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   270
            its.add(q.iterator());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   271
            assertEquals(trackedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   272
            q.poll();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   273
            q.add(capacity+i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   274
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   275
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   276
            q.poll();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   277
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   278
        int j = 0;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   279
        for (Iterator it : its) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   280
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   281
            if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   282
            if (rnd.nextBoolean()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   283
                assertEquals(it.next(), j);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   284
                assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   285
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   286
            j++;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   287
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   288
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   289
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   290
    public void advancing2CyclesWillRemoveIterators() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   291
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   292
        int capacity = rnd.nextInt(2, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   293
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   294
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   295
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   296
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   297
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   298
        for (int i = capacity; i < 3 * capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   299
            its.add(q.iterator());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   300
            assertEquals(trackedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   301
            q.poll();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   302
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   303
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   304
        for (int i = 3 * capacity; i < 4 * capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   305
            assertEquals(trackedIterators(q), its.subList(capacity,2*capacity));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   306
            q.poll();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   307
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   308
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   309
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   310
        int j = 0;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   311
        for (Iterator it : its) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   312
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   313
            if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   314
            if (rnd.nextBoolean()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   315
                assertEquals(it.next(), j);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   316
                assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   317
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   318
            j++;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   319
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   320
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   321
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   322
    /**
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   323
     * Interior removal of elements used by an iterator will cause it
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   324
     * to be untracked.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   325
     */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   326
    public void interiorRemovalOfElementsUsedByIterator() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   327
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   328
        int capacity = rnd.nextInt(10, 20);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   329
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   330
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   331
        q.add(0);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   332
        for (int i = 1; i < 2 * capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   333
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   334
            Integer[] elts = { -1, -2, -3 };
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   335
            for (Integer elt : elts) q.add(elt);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   336
            assertEquals(q.remove(), i - 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   337
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   338
            assertEquals(it.next(), i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   339
            assertEquals(it.next(), elts[0]);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   340
            Collections.shuffle(Arrays.asList(elts));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   341
            assertTrue(q.remove(elts[0]));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   342
            assertTrue(q.remove(elts[1]));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   343
            assertEquals(trackedIterators(q), Collections.singletonList(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   344
            assertTrue(q.remove(elts[2]));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   345
            assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   346
            assertEquals(it.next(), -2);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   347
            assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   348
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   349
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   350
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   351
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   352
    public void iteratorsOnEmptyQueue() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   353
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   354
        int capacity = rnd.nextInt(1, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   355
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   356
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   357
        for (int i = 0; i < 4; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   358
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   359
            assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   360
            assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   361
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   362
            assertRemoveThrowsISE(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   363
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   364
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   365
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   366
    public void interiorRemovalOfIteratorsLastElement() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   367
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   368
        int capacity = rnd.nextInt(3, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   369
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   370
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   371
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   372
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   373
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   374
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   375
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   376
            its.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   377
            for (int j = 0; j < i; j++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   378
                assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   379
            assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   380
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   381
        q.remove(capacity - 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   382
        assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   383
        for (int i = 1; i < capacity - 1; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   384
            q.remove(capacity - i - 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   385
            Iterator it = its.get(capacity - i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   386
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   387
            assertEquals(attachedIterators(q), its.subList(0, capacity - i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   388
            if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   389
            assertEquals(it.next(), capacity - i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   390
            assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   391
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   392
        assertEquals(attachedIterators(q), its.subList(0, 2));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   393
        q.remove(0);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   394
        assertTrue(q.isEmpty());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   395
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   396
        Iterator it = its.get(0);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   397
        assertEquals(it.next(), 0);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   398
        assertRemoveHasNoEffect(it, q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   399
        assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   400
        assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   401
        assertRemoveHasNoEffect(its.get(1), q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   402
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   403
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   404
    /**
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   405
     * Checks "interior" removal of alternating elements, straddling 2 cycles
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   406
     */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   407
    public void interiorRemovalOfAlternatingElements() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   408
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   409
        int capacity = 2 * rnd.nextInt(2, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   410
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   411
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   412
        // Move takeIndex to middle
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   413
        for (int i = 0; i < capacity/2; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   414
            assertTrue(q.add(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   415
            assertEquals(q.poll(), i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   416
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   417
        assertEquals(takeIndex(q), capacity/2);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   418
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   419
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   420
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   421
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   422
            its.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   423
            for (int j = 0; j < i; j++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   424
                assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   425
            assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   426
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   427
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   428
        // Remove all even elements, in either direction, using
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   429
        // q.remove(), or iterator.remove()
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   430
        switch (rnd.nextInt(3)) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   431
        case 0:
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   432
            for (int i = 0; i < capacity; i+=2) assertTrue(q.remove(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   433
            break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   434
        case 1:
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   435
            for (int i = capacity - 2; i >= 0; i-=2) assertTrue(q.remove(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   436
            break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   437
        case 2:
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   438
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   439
            while (it.hasNext()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   440
                int i = (Integer) it.next();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   441
                if ((i & 1) == 0)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   442
                    it.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   443
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   444
            break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   445
        default: throw new AssertionError();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   446
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   447
        assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   448
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   449
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   450
            Iterator it = its.get(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   451
            boolean even = ((i & 1) == 0);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   452
            if (even) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   453
                if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   454
                assertEquals(i, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   455
                for (int j = i+1; j < capacity; j += 2)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   456
                    assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   457
                assertTrue(!isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   458
                assertTrue(!it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   459
                assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   460
            } else { /* odd */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   461
                if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   462
                assertRemoveHasNoEffect(it, q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   463
                assertEquals(i, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   464
                for (int j = i+2; j < capacity; j += 2)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   465
                    assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   466
                assertTrue(!isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   467
                assertTrue(!it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   468
                assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   469
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   470
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   471
        assertEquals(trackedIterators(q), Collections.emptyList());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   472
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   473
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   474
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   475
    public void garbageCollectionOfUnreachableIterators() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   476
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   477
        int capacity = rnd.nextInt(1, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   478
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   479
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   480
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   481
        for (int i = 0; i < capacity; i++) q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   482
        for (int i = 0; i < capacity; i++) its.add(q.iterator());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   483
        assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   484
        its = null;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   485
        gcAwait(() -> {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   486
            List<Iterator> trackedIterators = trackedIterators(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   487
            assertEquals(trackedIterators.size(), capacity);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   488
            for (Iterator x : trackedIterators)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   489
                if (x != null) return false;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   490
            return true;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   491
        });
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   492
        Iterator it = q.iterator(); //
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   493
        assertEquals(trackedIterators(q), Collections.singletonList(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   494
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   495
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   496
    public void garbageCollectionOfUnreachableIteratorsWithRandomlyRetainedSubset() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   497
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   498
        int capacity = rnd.nextInt(10, 20);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   499
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   500
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   501
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   502
        List<Iterator> retained = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   503
        final int size = 1 + rnd.nextInt(capacity);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   504
        for (int i = 0; i < size; i++) q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   505
        for (int i = 0; i < size; i++) its.add(q.iterator());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   506
        assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   507
        // Leave sufficient gaps in retained
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   508
        for (int i = 0; i < size; i+= 2+rnd.nextInt(3))
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   509
            retained.add(its.get(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   510
        its = null;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   511
        gcAwait(() -> {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   512
            List<Iterator> trackedIterators = trackedIterators(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   513
            assertEquals(trackedIterators.size(), size);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   514
            for (Iterator it : trackedIterators)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   515
                if ((it != null) ^ retained.contains(it)) return false;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   516
            return true;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   517
        });
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   518
        Iterator it = q.iterator(); // trigger another sweep
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   519
        retained.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   520
        assertEquals(trackedIterators(q), retained);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   521
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   522
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   523
    /**
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   524
     * Checks incremental sweeping of unreachable iterators.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   525
     * Excessively white box?!
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   526
     */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   527
    public void incrementalSweepingOfUnreachableIterators() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   528
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   529
        int capacity = rnd.nextInt(10, 20);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   530
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   531
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   532
        final int SHORT_SWEEP_PROBES = 4;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   533
        final int LONG_SWEEP_PROBES = 16;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   534
        final int PROBE_HOP = LONG_SWEEP_PROBES + 6 * SHORT_SWEEP_PROBES;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   535
        final int PROBE_HOP_COUNT = 10;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   536
        // Expect around 8 sweeps per PROBE_HOP
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   537
        final int SWEEPS_PER_PROBE_HOP = 8;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   538
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   539
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   540
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   541
        for (int i = 0; i < PROBE_HOP_COUNT * PROBE_HOP; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   542
            its.add(q.iterator());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   543
        assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   544
        // make some garbage, separated by PROBE_HOP
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   545
        for (int i = 0; i < its.size(); i += PROBE_HOP)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   546
            its.set(i, null);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   547
        its.removeIf(it -> it == null);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   548
        forceFullGc();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   549
        int retries;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   550
        for (retries = 0;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   551
             trackedIterators(q).contains(null) && retries < 1000;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   552
             retries++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   553
            // one round of sweeping
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   554
            its.add(q.iterator());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   555
        assertTrue(retries >= PROBE_HOP_COUNT * (SWEEPS_PER_PROBE_HOP - 2));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   556
        assertTrue(retries <= PROBE_HOP_COUNT * (SWEEPS_PER_PROBE_HOP + 2));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   557
        assertEquals(trackedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   558
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   559
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   560
    public void Iterator_remove_safetyWhileInDetachedMode() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   561
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   562
        int capacity = rnd.nextInt(10, 20);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   563
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   564
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   565
        for (int i = 0; i < capacity/2; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   566
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   567
            q.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   568
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   569
        assertEquals(takeIndex(q), capacity/2);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   570
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   571
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   572
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   573
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   574
            its.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   575
            for (int j = 0; j < i; j++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   576
                assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   577
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   578
        assertEquals(attachedIterators(q), its);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   579
        for (int i = capacity - 1; i >= 0; i--) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   580
            Iterator it = its.get(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   581
            assertEquals(i, it.next()); // last element
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   582
            assertTrue(!isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   583
            assertTrue(!it.hasNext()); // first hasNext failure
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   584
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   585
            int size = q.size();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   586
            assertTrue(q.contains(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   587
            switch (rnd.nextInt(3)) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   588
            case 0:
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   589
                it.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   590
                assertTrue(!q.contains(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   591
                assertEquals(q.size(), size - 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   592
                break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   593
            case 1:
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   594
                // replace i with impostor
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   595
                if (q.remainingCapacity() == 0) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   596
                    assertTrue(q.remove(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   597
                    assertTrue(q.add(-1));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   598
                } else {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   599
                    assertTrue(q.add(-1));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   600
                    assertTrue(q.remove(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   601
                }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   602
                it.remove(); // should have no effect
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   603
                assertEquals(size, q.size());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   604
                assertTrue(q.contains(-1));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   605
                assertTrue(q.remove(-1));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   606
                break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   607
            case 2:
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   608
                // replace i with true impostor
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   609
                if (i != 0) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   610
                    assertTrue(q.remove(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   611
                    assertTrue(q.add(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   612
                }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   613
                it.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   614
                assertTrue(!q.contains(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   615
                assertEquals(q.size(), size - 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   616
                break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   617
            default: throw new AssertionError();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   618
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   619
            assertRemoveThrowsISE(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   620
            assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   621
            assertTrue(!trackedIterators(q).contains(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   622
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   623
        assertTrue(q.isEmpty());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   624
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   625
        for (Iterator it : its)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   626
            assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   627
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   628
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   629
    /**
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   630
     * Checks dequeues bypassing iterators' current positions.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   631
     */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   632
    public void dequeuesBypassingIteratorCurrentPositions() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   633
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   634
        int capacity = rnd.nextInt(10, 20);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   635
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   636
        Queue<Iterator> its0 = new ArrayDeque<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   637
        Queue<Iterator> itsMid = new ArrayDeque<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   638
        List<Iterator> its = new ArrayList<>();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   639
        for (int i = 0; i < capacity; i++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   640
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   641
        for (int i = 0; i < 2 * capacity + 1; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   642
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   643
            its.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   644
            its0.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   645
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   646
        for (int i = 0; i < 2 * capacity + 1; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   647
            Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   648
            for (int j = 0; j < capacity/2; j++)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   649
                assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   650
            its.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   651
            itsMid.add(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   652
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   653
        for (int i = capacity; i < 3 * capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   654
            Iterator it;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   655
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   656
            it = its0.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   657
            assertRemoveThrowsISE(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   658
            if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   659
            assertEquals(0, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   660
            int victim = i - capacity;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   661
            for (int j = victim + (victim == 0 ? 1 : 0); j < i; j++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   662
                if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   663
                assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   664
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   665
            assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   666
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   667
            it = itsMid.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   668
            if (victim >= capacity/2)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   669
                assertRemoveHasNoEffect(it, q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   670
            assertEquals(capacity/2, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   671
            if (victim > capacity/2)
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   672
                assertRemoveHasNoEffect(it, q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   673
            for (int j = Math.max(victim, capacity/2 + 1); j < i; j++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   674
                if (rnd.nextBoolean()) assertTrue(it.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   675
                assertEquals(j, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   676
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   677
            assertIteratorExhausted(it);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   678
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   679
            if (rnd.nextBoolean()) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   680
                assertEquals(victim, q.remove());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   681
            } else {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   682
                ArrayList list = new ArrayList(1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   683
                q.drainTo(list, 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   684
                assertEquals(list.size(), 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   685
                assertEquals(victim, list.get(0));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   686
            }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   687
            assertTrue(q.add(i));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   688
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   689
        // takeIndex has wrapped twice.
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   690
        Iterator it0 = its0.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   691
        Iterator itMid = itsMid.remove();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   692
        assertTrue(isDetached(it0));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   693
        assertTrue(isDetached(itMid));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   694
        if (rnd.nextBoolean()) assertTrue(it0.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   695
        if (rnd.nextBoolean()) assertTrue(itMid.hasNext());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   696
        assertRemoveThrowsISE(it0);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   697
        assertRemoveHasNoEffect(itMid, q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   698
        if (rnd.nextBoolean()) assertEquals(0, it0.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   699
        if (rnd.nextBoolean()) assertEquals(capacity/2, itMid.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   700
        assertTrue(isDetached(it0));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   701
        assertTrue(isDetached(itMid));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   702
        assertEquals(capacity, q.size());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   703
        assertEquals(0, q.remainingCapacity());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   704
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   705
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   706
    /**
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   707
     * Checks collective sanity of iteration, toArray() and toString().
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   708
     */
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   709
    public void collectiveSanity() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   710
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   711
        int capacity = rnd.nextInt(10, 20);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   712
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   713
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   714
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   715
            checkIterationSanity(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   716
            assertEquals(capacity, q.size() + q.remainingCapacity());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   717
            q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   718
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   719
        for (int i = 0; i < (capacity + (capacity >> 1)); i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   720
            checkIterationSanity(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   721
            assertEquals(capacity, q.size() + q.remainingCapacity());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   722
            assertEquals(i, q.peek());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   723
            assertEquals(i, q.poll());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   724
            checkIterationSanity(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   725
            assertEquals(capacity, q.size() + q.remainingCapacity());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   726
            q.add(capacity + i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   727
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   728
        for (int i = 0; i < capacity; i++) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   729
            checkIterationSanity(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   730
            assertEquals(capacity, q.size() + q.remainingCapacity());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   731
            int expected = i + capacity + (capacity >> 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   732
            assertEquals(expected, q.peek());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   733
            assertEquals(expected, q.poll());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   734
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   735
        checkIterationSanity(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   736
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   737
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   738
    public void iteratorsDetachedWhenExhaustedAndLastRetRemoved() {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   739
        boolean fair = rnd.nextBoolean();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   740
        int capacity = rnd.nextInt(2, 10);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   741
        ArrayBlockingQueue q = new ArrayBlockingQueue(capacity, fair);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   742
        randomizePutIndex(q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   743
        int size = rnd.nextInt(1, capacity + 1);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   744
        for (int i = 0; i < size; i++) q.add(i);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   745
        Iterator it = q.iterator();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   746
        for (int i = 0; i < size - 1; i++) assertEquals(i, it.next());
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   747
        assertEquals(trackedIterators(q), Collections.singletonList(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   748
        assertFalse(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   749
        switch (rnd.nextInt(2)) {
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   750
        case 0: assertTrue(q.remove(size - 1)); break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   751
        case 1: assertTrue(q.removeIf(e -> e.equals(size - 1))); break;
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   752
        default: throw new AssertionError();
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   753
        }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   754
        assertEquals(size - 1, it.next()); // should trigger detach
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   755
        assertNull(itrs(q));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   756
        assertTrue(isDetached(it));
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   757
        assertRemoveHasNoEffect(it, q);
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   758
    }
058585425bb7 8173909: Miscellaneous changes imported from jsr166 CVS 2017-03
dl
parents:
diff changeset
   759
}