13ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin/*
23ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Copyright (C) 2010 The Guava Authors
33ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
43ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
53ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * you may not use this file except in compliance with the License.
63ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * You may obtain a copy of the License at
73ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
83ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
93ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Unless required by applicable law or agreed to in writing, software
113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * See the License for the specific language governing permissions and
143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * limitations under the License.
153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */
163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinpackage com.google.common.util.concurrent;
183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport com.google.common.testing.NullPointerTester;
203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport com.google.common.testing.TearDownStack;
213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport junit.framework.TestCase;
233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.Random;
253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.concurrent.TimeUnit;
263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin/**
283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Tests for {@link Monitor}, either interruptible or uninterruptible.
293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @author Justin T. Sampson
313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */
323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinpublic abstract class MonitorTestCase extends TestCase {
343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public class TestGuard extends Monitor.Guard {
363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private volatile boolean satisfied;
373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public TestGuard(boolean satisfied) {
393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      super(MonitorTestCase.this.monitor);
403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.satisfied = satisfied;
413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public boolean isSatisfied() {
443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return this.satisfied;
453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public void setSatisfied(boolean satisfied) {
483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.satisfied = satisfied;
493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private final boolean interruptible;
533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private Monitor monitor;
543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private final TearDownStack tearDownStack = new TearDownStack(true);
553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private TestThread<Monitor> thread1;
563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private TestThread<Monitor> thread2;
573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  protected MonitorTestCase(boolean interruptible) {
593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    this.interruptible = interruptible;
603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override protected final void setUp() throws Exception {
633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    boolean fair = new Random().nextBoolean();
643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    monitor = new Monitor(fair);
653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    tearDownStack.addTearDown(thread1 = new TestThread<Monitor>(monitor, "TestThread #1"));
663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    tearDownStack.addTearDown(thread2 = new TestThread<Monitor>(monitor, "TestThread #2"));
673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override protected final void tearDown() {
703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    tearDownStack.runTearDown();
713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private String enter() {
743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return interruptible ? "enterInterruptibly" : "enter";
753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private String tryEnter() {
783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return "tryEnter";
793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private String enterIf() {
823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return interruptible ? "enterIfInterruptibly" : "enterIf";
833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private String tryEnterIf() {
863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return "tryEnterIf";
873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private String enterWhen() {
903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return interruptible ? "enterWhen" : "enterWhenUninterruptibly";
913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private String waitFor() {
943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return interruptible ? "waitFor" : "waitForUninterruptibly";
953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private String leave() {
983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return "leave";
993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testMutualExclusion() throws Exception {
1023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enter());
1033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertBlocks(enter());
1043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(leave());
1053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.assertPriorCallReturns(enter());
1063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testTryEnter() throws Exception {
1093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(true, tryEnter());
1103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(false, tryEnter());
1113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(true, tryEnter());
1123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(false, tryEnter());
1133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(leave());
1143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(false, tryEnter());
1153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(leave());
1163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(true, tryEnter());
1173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testSystemStateMethods() throws Exception {
1203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    checkSystemStateMethods(0);
1213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enter());
1223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    checkSystemStateMethods(1);
1233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enter());
1243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    checkSystemStateMethods(2);
1253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(leave());
1263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    checkSystemStateMethods(1);
1273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(leave());
1283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    checkSystemStateMethods(0);
1293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private void checkSystemStateMethods(int enterCount) throws Exception {
1323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enterCount != 0, "isOccupied");
1333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enterCount != 0, "isOccupiedByCurrentThread");
1343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enterCount, "getOccupiedDepth");
1353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(enterCount != 0, "isOccupied");
1373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(false, "isOccupiedByCurrentThread");
1383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(0, "getOccupiedDepth");
1393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testEnterWhen_initiallyTrue() throws Exception {
1423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
1433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enterWhen(), guard);
1443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testEnterWhen_initiallyFalse() throws Exception {
1473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(false);
1483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertWaits(enterWhen(), guard);
1493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    monitor.enter();
1503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    guard.setSatisfied(true);
1513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    monitor.leave();
1523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.assertPriorCallReturns(enterWhen());
1533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testEnterWhen_alreadyOccupied() throws Exception {
1563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
1573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(enter());
1583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertBlocks(enterWhen(), guard);
1593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(leave());
1603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.assertPriorCallReturns(enterWhen());
1613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testEnterIf_initiallyTrue() throws Exception {
1643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
1653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(true, enterIf(), guard);
1663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertBlocks(enter());
1673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testEnterIf_initiallyFalse() throws Exception {
1703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(false);
1713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(false, enterIf(), guard);
1723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(enter());
1733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testEnterIf_alreadyOccupied() throws Exception {
1763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
1773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(enter());
1783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertBlocks(enterIf(), guard);
1793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(leave());
1803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.assertPriorCallReturns(true, enterIf());
1813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testTryEnterIf_initiallyTrue() throws Exception {
1843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
1853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(true, tryEnterIf(), guard);
1863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertBlocks(enter());
1873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testTryEnterIf_initiallyFalse() throws Exception {
1903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(false);
1913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(false, tryEnterIf(), guard);
1923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(enter());
1933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testTryEnterIf_alreadyOccupied() throws Exception {
1963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
1973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread2.callAndAssertReturns(enter());
1983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(false, tryEnterIf(), guard);
1993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
2003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
2013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testWaitFor_initiallyTrue() throws Exception {
2023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
2033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enter());
2043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(waitFor(), guard);
2053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
2063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
2073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testWaitFor_initiallyFalse() throws Exception {
2083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(false);
2093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertReturns(enter());
2103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertWaits(waitFor(), guard);
2113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    monitor.enter();
2123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    guard.setSatisfied(true);
2133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    monitor.leave();
2143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.assertPriorCallReturns(waitFor());
2153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
2163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
2173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public final void testWaitFor_withoutEnter() throws Exception {
2183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TestGuard guard = new TestGuard(true);
2193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    thread1.callAndAssertThrows(IllegalMonitorStateException.class, waitFor(), guard);
2203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
2213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
2223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public void testNulls() {
2233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    monitor.enter();  // Inhibit IllegalMonitorStateException
2243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    new NullPointerTester()
2253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        .setDefault(TimeUnit.class, TimeUnit.SECONDS)
2263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        .setDefault(Monitor.Guard.class, new TestGuard(true))
2273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        .testAllPublicInstanceMethods(monitor);
2283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
2293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
2303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test enter(long, TimeUnit).
2313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test enterWhen(Guard, long, TimeUnit).
2323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test enterIf(Guard, long, TimeUnit).
2333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test waitFor(Guard, long, TimeUnit).
2343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test getQueueLength().
2353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test hasQueuedThreads().
2363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test getWaitQueueLength(Guard).
2373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test automatic signaling before leave, waitFor, and reentrant enterWhen.
2383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test blocking to re-enter monitor after being signaled.
2393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test interrupts with both interruptible and uninterruptible monitor.
2403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test multiple waiters: If guard is still satisfied, signal next waiter.
2413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  // TODO: Test multiple waiters: If guard is no longer satisfied, do not signal next waiter.
2423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
2433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin}
244