package net.jxta.impl.cm; import java.io.IOException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import net.jxta.id.IDFactory; import net.jxta.impl.cm.Srdi.SrdiInterface; import net.jxta.peer.PeerID; import net.jxta.peergroup.PeerGroup; import net.jxta.peergroup.PeerGroupID; import net.jxta.rendezvous.RendezVousService; import net.jxta.rendezvous.RendezVousStatus; import net.jxta.rendezvous.RendezvousEvent; import org.jmock.Expectations; import org.jmock.integration.junit3.MockObjectTestCase; public class SrdiTest extends MockObjectTestCase { private PeerGroup groupMock; private SrdiInterface srdiInterfaceMock; private SrdiIndexBackend srdiIndex; private RendezVousService rendezvousServiceMock; private ScheduledExecutorService executorServiceMock; private ScheduledFuture<?> srdiPeriodicPushTaskHandle; private static final long PUSH_INTERVAL = 10000L; private Srdi srdi; @Override protected void setUp() throws Exception { groupMock = mock(PeerGroup.class); srdiInterfaceMock = mock(SrdiInterface.class); srdiIndex = mock(SrdiIndexBackend.class); rendezvousServiceMock = mock(RendezVousService.class); executorServiceMock = mock(ScheduledExecutorService.class); srdiPeriodicPushTaskHandle = mock(ScheduledFuture.class); checking(new Expectations() {{ ignoring(groupMock).getResolverService(); atLeast(1).of(groupMock).getRendezVousService(); will(returnValue(rendezvousServiceMock)); one(rendezvousServiceMock).addListener(with(any(Srdi.class))); }}); srdi = new Srdi(groupMock, "testHandler", srdiInterfaceMock, srdiIndex); } public void testStartPush() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.EDGE)); one(executorServiceMock).scheduleWithFixedDelay(with(any(SrdiPeriodicPushTask.class)), with(equal(0L)), with(equal(PUSH_INTERVAL)), with(equal(TimeUnit.MILLISECONDS))); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); } public void testStartPushIgnoredIfPeerIsRdvInGroup() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(true)); never(executorServiceMock); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); } public void testStartPushIgnoredIfRdvConnectionNotEstablished() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(false)); never(executorServiceMock); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); } public void testStartPushIgnoredIfRdvServiceIsInAdHocMode() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.ADHOC)); never(executorServiceMock); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); } public void testStartPushSchedulesSrdiPeriodicPushTask() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.EDGE)); one(executorServiceMock).scheduleWithFixedDelay(with(any(SrdiPeriodicPushTask.class)), with(equal(0L)), with(equal(PUSH_INTERVAL)), with(equal(TimeUnit.MILLISECONDS))); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); } public void testRendezvousConnectEventRestartsPush() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(false)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.EDGE)); one(executorServiceMock).scheduleWithFixedDelay(with(any(SrdiPeriodicPushTask.class)), with(equal(0L)), with(equal(PUSH_INTERVAL)), with(equal(TimeUnit.MILLISECONDS))); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.RDVCONNECT, null)); } public void testRendezvousConnectEventIgnoredIfModeIsAdHoc() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(false)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.ADHOC)); never(executorServiceMock); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.RDVCONNECT, null)); } public void testRendezvousConnectIgnoredIfPushNotStarted() { checking(new Expectations() {{ never(executorServiceMock); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.RDVCONNECT, null)); } public void testRendezvousDisconnectEventStopsPush() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.EDGE)); one(executorServiceMock).scheduleWithFixedDelay(with(any(SrdiPeriodicPushTask.class)), with(equal(0L)), with(equal(PUSH_INTERVAL)), with(equal(TimeUnit.MILLISECONDS))); will(returnValue(srdiPeriodicPushTaskHandle)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(srdiPeriodicPushTaskHandle).cancel(false); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.RDVDISCONNECT, null)); } public void testBecameRendezvousEventStopsPush() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.EDGE)); one(executorServiceMock).scheduleWithFixedDelay(with(any(SrdiPeriodicPushTask.class)), with(equal(0L)), with(equal(PUSH_INTERVAL)), with(equal(TimeUnit.MILLISECONDS))); will(returnValue(srdiPeriodicPushTaskHandle)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(srdiPeriodicPushTaskHandle).cancel(false); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.BECAMERDV, null)); } public void testBecameRendezvousEventIgnoredIfNoPushNotStarted() { checking(new Expectations() {{ never(executorServiceMock); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.BECAMERDV, null)); } public void testBecameEdgeEventStartsPush() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(true)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.EDGE)); one(executorServiceMock).scheduleWithFixedDelay(with(any(SrdiPeriodicPushTask.class)), with(equal(0L)), with(equal(PUSH_INTERVAL)), with(equal(TimeUnit.MILLISECONDS))); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.BECAMEEDGE, null)); } public void testBecameEdgeEventIgnoredIfNotConnectedToRendezvous() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(true)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(false)); never(executorServiceMock); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.BECAMEEDGE, null)); } public void testBecameEdgeEventIgnoredIfRendezvousIsInAdHocMode() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(true)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.ADHOC)); never(executorServiceMock); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.BECAMEEDGE, null)); } public void testBecameEdgeEventIgnoredIfPushNotStarted() { checking(new Expectations() {{ never(executorServiceMock); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.BECAMEEDGE, null)); } public void testRdvFailedEventStopsPush() { checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); one(rendezvousServiceMock).isConnectedToRendezVous(); will(returnValue(true)); one(rendezvousServiceMock).getRendezVousStatus(); will(returnValue(RendezVousStatus.EDGE)); one(executorServiceMock).scheduleWithFixedDelay(with(any(SrdiPeriodicPushTask.class)), with(equal(0L)), with(equal(PUSH_INTERVAL)), with(equal(TimeUnit.MILLISECONDS))); will(returnValue(srdiPeriodicPushTaskHandle)); }}); srdi.startPush(executorServiceMock, PUSH_INTERVAL); checking(new Expectations() {{ one(srdiPeriodicPushTaskHandle).cancel(false); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.RDVFAILED, null)); } public void testClientFailedEventRemovesPeerFromSrdiIndexIfCurrentlyARendezvous() throws IOException { final PeerID peerId = IDFactory.newPeerID(PeerGroupID.defaultNetPeerGroupID); checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(true)); one(srdiIndex).remove(peerId); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.CLIENTFAILED, peerId)); } public void testClientFailedEventIgnoredIfNotARendezvous() throws IOException { final PeerID peerId = IDFactory.newPeerID(PeerGroupID.defaultNetPeerGroupID); checking(new Expectations() {{ one(groupMock).isRendezvous(); will(returnValue(false)); never(srdiIndex).remove(peerId); }}); srdi.rendezvousEvent(new RendezvousEvent(new Object(), RendezvousEvent.CLIENTFAILED, peerId)); } }