X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=openflowplugin-impl%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fconnection%2Flistener%2FSystemNotificationsListenerImplTest.java;h=effbf13bf8fa860c6b4237c4cbda84b1af711e59;hb=decd15c6f97a9c16b556605304f6887693ec6f6b;hp=e2cb7224d3ce0fdffd39fefdddb013de88166399;hpb=c8b9c6dfd421a3cf4a40295b21f59384924fd8c2;p=openflowplugin.git diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/connection/listener/SystemNotificationsListenerImplTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/connection/listener/SystemNotificationsListenerImplTest.java index e2cb7224d3..effbf13bf8 100644 --- a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/connection/listener/SystemNotificationsListenerImplTest.java +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/connection/listener/SystemNotificationsListenerImplTest.java @@ -8,19 +8,27 @@ package org.opendaylight.openflowplugin.impl.connection.listener; +import static org.mockito.ArgumentMatchers.any; + import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import java.net.InetSocketAddress; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; +import org.opendaylight.mdsal.binding.api.NotificationPublishService; +import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter; import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext; +import org.opendaylight.openflowplugin.api.openflow.connection.DeviceConnectionStatusProvider; import org.opendaylight.openflowplugin.impl.connection.ConnectionContextImpl; +import org.opendaylight.openflowplugin.impl.util.ThreadPoolLoggingExecutor; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput; @@ -32,152 +40,154 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.S import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEventBuilder; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.opendaylight.yangtools.yang.common.Uint8; /** - * Testing basic bahavior of {@link SystemNotificationsListenerImpl} + * Testing basic bahavior of {@link SystemNotificationsListenerImpl}. */ @RunWith(MockitoJUnitRunner.class) public class SystemNotificationsListenerImplTest { - public static final int SAFE_TIMEOUT = 1000; + private static final int SAFE_TIMEOUT = 1000; + private static final int ECHO_REPLY_TIMEOUT = 2000; + @Mock - private org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter connectionAdapter; + private ConnectionAdapter connectionAdapter; @Mock private FeaturesReply features; - private ConnectionContext connectionContext; + @Mock + private DeviceConnectionStatusProvider deviceConnectionStatusProvider; + @Mock + private NotificationPublishService notificationPublishService; - private SystemNotificationsListenerImpl systemNotificationsListener; + private ConnectionContext connectionContext; private ConnectionContextImpl connectionContextGolem; - private static final NodeId nodeId = new NodeId("OFP:TEST"); + private SystemNotificationsListenerImpl systemNotificationsListener; + + private static final NodeId NODE_ID = + new NodeId("OFP:TEST"); + + private final ThreadPoolLoggingExecutor threadPool = new ThreadPoolLoggingExecutor( + 0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>(), "opfpool"); @Before public void setUp() { - connectionContextGolem = new ConnectionContextImpl(connectionAdapter); + connectionContextGolem = new ConnectionContextImpl(connectionAdapter, deviceConnectionStatusProvider); connectionContextGolem.changeStateToWorking(); - connectionContextGolem.setNodeId(nodeId); + connectionContextGolem.setNodeId(NODE_ID); + connectionContextGolem.setFeatures(features); + connectionContext = Mockito.spy(connectionContextGolem); Mockito.when(connectionAdapter.getRemoteAddress()).thenReturn( InetSocketAddress.createUnresolved("unit-odl.example.org", 4242)); - connectionContext = Mockito.spy(connectionContextGolem); - Mockito.when(features.getAuxiliaryId()).thenReturn((short) 0); - Mockito.when(connectionContext.getConnectionAdapter()).thenReturn(connectionAdapter); - Mockito.when(connectionContext.getFeatures()).thenReturn(features); + Mockito.when(features.getAuxiliaryId()).thenReturn(Uint8.ZERO); - systemNotificationsListener = new SystemNotificationsListenerImpl(connectionContext); + systemNotificationsListener = new SystemNotificationsListenerImpl(connectionContext, ECHO_REPLY_TIMEOUT, + threadPool, notificationPublishService); } @After - public void tearDown() throws Exception { + public void tearDown() { Mockito.verifyNoMoreInteractions(connectionContext); } /** - * successful scenario - connection is on and closes without errors - * - * @throws Exception + * Successful scenario - connection is on and closes without errors. */ @Test - public void testOnDisconnectEvent1() throws Exception { - Mockito.when(connectionAdapter.isAlive()).thenReturn(true); - Mockito.when(connectionAdapter.disconnect()).thenReturn(Futures.immediateFuture(Boolean.TRUE)); + public void testOnDisconnectEvent1() { DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build(); systemNotificationsListener.onDisconnectEvent(disconnectNotification); verifyCommonInvocationsSubSet(); Mockito.verify(connectionContext).onConnectionClosed(); + Mockito.verify(connectionContext).getConnectionAdapter(); + Mockito.verify(connectionContext, Mockito.atLeastOnce()).getSafeNodeIdForLOG(); } /** - * broken scenario - connection is on but fails to close - * - * @throws Exception + * Broken scenario - connection is on but fails to close. */ @Test - public void testOnDisconnectEvent2() throws Exception { - Mockito.when(connectionAdapter.isAlive()).thenReturn(true); - Mockito.when(connectionAdapter.disconnect()).thenReturn(Futures.immediateFuture(Boolean.FALSE)); + public void testOnDisconnectEvent2() { DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build(); systemNotificationsListener.onDisconnectEvent(disconnectNotification); verifyCommonInvocationsSubSet(); Mockito.verify(connectionContext).onConnectionClosed(); + Mockito.verify(connectionContext).getConnectionAdapter(); + Mockito.verify(connectionContext, Mockito.atLeastOnce()).getSafeNodeIdForLOG(); } /** - * successful scenario - connection is already down - * - * @throws Exception + * Successful scenario - connection is already down. */ @Test - public void testOnDisconnectEvent3() throws Exception { + public void testOnDisconnectEvent3() { connectionContextGolem.changeStateToTimeouting(); - Mockito.when(connectionAdapter.isAlive()).thenReturn(true); - Mockito.when(connectionAdapter.disconnect()).thenReturn(Futures.immediateFailedFuture(new Exception("unit exception"))); - DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build(); systemNotificationsListener.onDisconnectEvent(disconnectNotification); verifyCommonInvocationsSubSet(); Mockito.verify(connectionContext).onConnectionClosed(); + Mockito.verify(connectionContext).getConnectionAdapter(); + Mockito.verify(connectionContext, Mockito.atLeastOnce()).getSafeNodeIdForLOG(); } /** - * broken scenario - connection is on but throws error on close - * - * @throws Exception + * Broken scenario - connection is on but throws error on close. */ @Test - public void testOnDisconnectEvent4() throws Exception { + public void testOnDisconnectEvent4() { Mockito.when(connectionContext.getConnectionState()).thenReturn(ConnectionContext.CONNECTION_STATE.RIP); - Mockito.when(connectionAdapter.isAlive()).thenReturn(false); DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build(); systemNotificationsListener.onDisconnectEvent(disconnectNotification); verifyCommonInvocationsSubSet(); Mockito.verify(connectionContext).onConnectionClosed(); + Mockito.verify(connectionContext).getConnectionAdapter(); + Mockito.verify(connectionContext, Mockito.atLeastOnce()).getSafeNodeIdForLOG(); } /** - * first encounter of idle event, echo received successfully - * - * @throws Exception + * First encounter of idle event, echo received successfully. */ @Test public void testOnSwitchIdleEvent1() throws Exception { - final SettableFuture> echoReply = SettableFuture.create(); - Mockito.when(connectionAdapter.echo(Matchers.any(EchoInput.class))).thenReturn(echoReply); + final ListenableFuture> echoReply = + RpcResultBuilder.success(new EchoOutputBuilder().setXid(Uint32.ZERO).build()).buildFuture(); + + Mockito.when(connectionAdapter.echo(any(EchoInput.class))).thenReturn(echoReply); SwitchIdleEvent notification = new SwitchIdleEventBuilder().setInfo("wake up, device sleeps").build(); systemNotificationsListener.onSwitchIdleEvent(notification); // make sure that the idle notification processing thread started Thread.sleep(SAFE_TIMEOUT); - EchoOutput echoReplyVal = new EchoOutputBuilder().build(); - echoReply.set(RpcResultBuilder.success(echoReplyVal).build()); verifyCommonInvocations(); - Mockito.verify(connectionAdapter, Mockito.timeout(SAFE_TIMEOUT)).echo(Matchers.any(EchoInput.class)); + Mockito.verify(connectionAdapter, Mockito.timeout(SAFE_TIMEOUT)).echo(any(EchoInput.class)); Mockito.verify(connectionAdapter, Mockito.never()).disconnect(); Mockito.verify(connectionContext).changeStateToTimeouting(); Mockito.verify(connectionContext).changeStateToWorking(); } /** - * first encounter of idle event, echo not receive - * - * @throws Exception + * First encounter of idle event, echo not receive. */ @Test public void testOnSwitchIdleEvent2() throws Exception { final SettableFuture> echoReply = SettableFuture.create(); - Mockito.when(connectionAdapter.echo(Matchers.any(EchoInput.class))).thenReturn(echoReply); + Mockito.when(connectionAdapter.echo(any(EchoInput.class))).thenReturn(echoReply); Mockito.when(connectionAdapter.isAlive()).thenReturn(true); - Mockito.when(connectionAdapter.disconnect()).thenReturn(Futures.immediateFailedFuture(new Exception("unit exception"))); + Mockito.when(connectionAdapter.disconnect()) + .thenReturn(Futures.immediateFailedFuture(new Exception("unit exception"))); SwitchIdleEvent notification = new SwitchIdleEventBuilder().setInfo("wake up, device sleeps").build(); systemNotificationsListener.onSwitchIdleEvent(notification); @@ -185,19 +195,21 @@ public class SystemNotificationsListenerImplTest { Thread.sleep(SystemNotificationsListenerImpl.MAX_ECHO_REPLY_TIMEOUT + SAFE_TIMEOUT); verifyCommonInvocations(); - Mockito.verify(connectionAdapter, Mockito.timeout(SAFE_TIMEOUT)).echo(Matchers.any(EchoInput.class)); + Mockito.verify(connectionAdapter, Mockito.timeout(SAFE_TIMEOUT)).echo(any(EchoInput.class)); Mockito.verify(connectionAdapter).disconnect(); Mockito.verify(connectionContext).changeStateToTimeouting(); Mockito.verify(connectionContext).closeConnection(true); + Mockito.verify(connectionContext, Mockito.atLeastOnce()).getSafeNodeIdForLOG(); + } private void verifyCommonInvocations() { verifyCommonInvocationsSubSet(); + Mockito.verify(connectionContext, Mockito.timeout(SAFE_TIMEOUT).atLeastOnce()).getFeatures(); Mockito.verify(connectionContext, Mockito.timeout(SAFE_TIMEOUT).atLeastOnce()).getConnectionAdapter(); } private void verifyCommonInvocationsSubSet() { Mockito.verify(connectionContext, Mockito.timeout(SAFE_TIMEOUT).atLeastOnce()).getConnectionState(); - Mockito.verify(connectionContext, Mockito.timeout(SAFE_TIMEOUT).atLeastOnce()).getFeatures(); } -} \ No newline at end of file +}