diff --git a/apps/streaming/java/build.xml b/apps/streaming/java/build.xml
index 96b286180e..d69b14c83c 100644
--- a/apps/streaming/java/build.xml
+++ b/apps/streaming/java/build.xml
@@ -90,6 +90,7 @@
+
diff --git a/apps/streaming/java/test/junit/net/i2p/client/streaming/impl/SchedulerDeadTest.java b/apps/streaming/java/test/junit/net/i2p/client/streaming/impl/SchedulerDeadTest.java
new file mode 100644
index 0000000000..9189fd4799
--- /dev/null
+++ b/apps/streaming/java/test/junit/net/i2p/client/streaming/impl/SchedulerDeadTest.java
@@ -0,0 +1,56 @@
+package net.i2p.client.streaming.impl;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.Test;
+import org.mockito.Mock;
+
+public class SchedulerDeadTest extends SchedulerImplTestBase {
+
+ private SchedulerDead s;
+ @Mock private Connection con;
+ @Mock private ConnectionOptions opts;
+
+ protected void initScheduler() {
+ s = new SchedulerDead(context);
+ }
+
+ @Test
+ public void testAccept_null() {
+ assertFalse(s.accept(null));
+ }
+
+ private void setMocks(int now, int discSchOn, int connTimeout, int lifetime, int sendStreamId) {
+ when(clock.now()).thenReturn((long) now);
+ when(con.getDisconnectScheduledOn()).thenReturn((long) discSchOn);
+ when(con.getOptions()).thenReturn(opts);
+ when(opts.getConnectTimeout()).thenReturn((long) connTimeout);
+ when(con.getLifetime()).thenReturn((long) lifetime);
+ when(con.getSendStreamId()).thenReturn((long) sendStreamId);
+ }
+
+ @Test
+ public void testAccept_nothingLeftToDo() {
+ setMocks(10*60*1000, 9*60*1000 - Connection.DISCONNECT_TIMEOUT, 0, 0, 0);
+ assertTrue(s.accept(con));
+ }
+
+ @Test
+ public void testAccept_noDisconnectScheduled() {
+ setMocks(10*60*1000, 0, 0, 0, 0);
+ assertFalse(s.accept(con));
+ }
+
+ @Test
+ public void testAccept_timedOut() {
+ setMocks(0, 0, Connection.DISCONNECT_TIMEOUT/2, Connection.DISCONNECT_TIMEOUT, 0);
+ assertTrue(s.accept(con));
+ }
+
+ @Test
+ public void testEventOccurred() {
+ s.eventOccurred(con);
+ verify(con).disconnectComplete();
+ }
+}
diff --git a/apps/streaming/java/test/junit/net/i2p/client/streaming/impl/SchedulerImplTestBase.java b/apps/streaming/java/test/junit/net/i2p/client/streaming/impl/SchedulerImplTestBase.java
new file mode 100644
index 0000000000..a52acd9aa8
--- /dev/null
+++ b/apps/streaming/java/test/junit/net/i2p/client/streaming/impl/SchedulerImplTestBase.java
@@ -0,0 +1,38 @@
+package net.i2p.client.streaming.impl;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+import net.i2p.I2PAppContext;
+import net.i2p.util.Clock;
+import net.i2p.util.SimpleTimer2;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+public abstract class SchedulerImplTestBase {
+
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
+
+ @Spy protected I2PAppContext context = I2PAppContext.getGlobalContext();
+ @Mock protected Clock clock;
+ @Mock protected SimpleTimer2 timer;
+
+ protected SchedulerDead scheduler;
+
+ @Before
+ public void setUp() {
+ when(context.clock()).thenReturn(clock);
+ when(context.simpleTimer2()).thenReturn(timer);
+
+ initScheduler();
+ }
+
+ protected abstract void initScheduler();
+}