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