package com.limegroup.gnutella.io; import junit.framework.Test; import com.limegroup.gnutella.util.BaseTestCase; public class TimeoutControllerTest extends BaseTestCase { public TimeoutControllerTest(String name) { super(name); } public static Test suite() { return buildTestSuite(TimeoutControllerTest.class); } public void testNoTimeout() { TimeoutController controller = new TimeoutController(); assertEquals(-1, controller.getNextExpireTime()); controller.processTimeouts(100); // does nothing. } public void testBasicTimeout() { TimeoutController controller = new TimeoutController(); StubTimeoutable t1 = new StubTimeoutable(); controller.addTimeout(t1, 100, 101); assertEquals(201, controller.getNextExpireTime()); for(int i = 0; i < 201; i++) { controller.processTimeouts(i); assertFalse(t1.isNotified()); } controller.processTimeouts(201); assertTrue(t1.isNotified()); assertEquals(201, t1.getNow()); assertEquals(201, t1.getExpired()); assertEquals(101, t1.getTimeoutLength()); assertEquals(-1, controller.getNextExpireTime()); } public void testDelayedTimeout() { TimeoutController controller = new TimeoutController(); StubTimeoutable t1 = new StubTimeoutable(); controller.addTimeout(t1, 100, 150); assertEquals(250, controller.getNextExpireTime()); controller.processTimeouts(500); assertTrue(t1.isNotified()); assertEquals(500, t1.getNow()); assertEquals(250, t1.getExpired()); assertEquals(150, t1.getTimeoutLength()); assertEquals(-1, controller.getNextExpireTime()); } public void testMultipleTimeoutsAtSameTime() { TimeoutController controller = new TimeoutController(); StubTimeoutable t1 = new StubTimeoutable(); StubTimeoutable t2 = new StubTimeoutable(); assertEquals(-1, controller.getNextExpireTime()); controller.addTimeout(t1, 100, 50); assertEquals(150, controller.getNextExpireTime()); controller.addTimeout(t2, 120, 30); assertEquals(150, controller.getNextExpireTime()); controller.processTimeouts(149); assertFalse(t1.isNotified()); assertFalse(t2.isNotified()); assertEquals(150, controller.getNextExpireTime()); controller.processTimeouts(151); assertTrue(t1.isNotified()); assertEquals(151, t1.getNow()); assertEquals(150, t1.getExpired()); assertEquals(50, t1.getTimeoutLength()); assertTrue(t2.isNotified()); assertEquals(151, t2.getNow()); assertEquals(150, t2.getExpired()); assertEquals(30, t2.getTimeoutLength()); assertEquals(-1, controller.getNextExpireTime()); } public void testMultipleTimeoutsDifferentTimes() { TimeoutController controller = new TimeoutController(); StubTimeoutable t1 = new StubTimeoutable(); StubTimeoutable t2 = new StubTimeoutable(); StubTimeoutable t3 = new StubTimeoutable(); assertEquals(-1, controller.getNextExpireTime()); controller.addTimeout(t1, 100, 50); assertEquals(150, controller.getNextExpireTime()); controller.addTimeout(t2, 120, 70); assertEquals(150, controller.getNextExpireTime()); controller.addTimeout(t3, 140, 5); assertEquals(145, controller.getNextExpireTime()); controller.processTimeouts(147); assertFalse(t1.isNotified()); assertFalse(t2.isNotified()); assertTrue(t3.isNotified()); assertEquals(147, t3.getNow()); assertEquals(145, t3.getExpired()); assertEquals(5, t3.getTimeoutLength()); assertEquals(150, controller.getNextExpireTime()); controller.processTimeouts(200); assertTrue(t1.isNotified()); assertEquals(200, t1.getNow()); assertEquals(150, t1.getExpired()); assertEquals(50, t1.getTimeoutLength()); assertTrue(t2.isNotified()); assertEquals(200, t2.getNow()); assertEquals(190, t2.getExpired()); assertEquals(70, t2.getTimeoutLength()); assertEquals(-1, controller.getNextExpireTime()); } }