OPNFLWPLUG-1032: Neon-MRI: Bump odlparent, yangtools, mdsal
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / connection / listener / SystemNotificationsListenerImplTest.java
index e2cb7224d3ce0fdffd39fefdddb013de88166399..2abf175a02beb836ef7c27001739294d09b07012 100644 (file)
@@ -8,19 +8,25 @@
 
 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.openflowjava.protocol.api.connection.ConnectionAdapter;
 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
 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;
@@ -34,37 +40,47 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
 /**
- * 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;
 
-    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.changeStateToWorking();
-        connectionContextGolem.setNodeId(nodeId);
+        connectionContextGolem.setNodeId(NODE_ID);
+        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);
 
-        systemNotificationsListener = new SystemNotificationsListenerImpl(connectionContext);
+        systemNotificationsListener =
+                new SystemNotificationsListenerImpl(connectionContext, ECHO_REPLY_TIMEOUT, threadPool);
+
     }
 
     @After
@@ -73,111 +89,100 @@ public class SystemNotificationsListenerImplTest {
     }
 
     /**
-     * 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));
 
         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));
 
         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 {
         connectionContextGolem.changeStateToTimeouting();
 
-        Mockito.when(connectionAdapter.isAlive()).thenReturn(true);
-        Mockito.when(connectionAdapter.disconnect()).thenReturn(Futures.<Boolean>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 {
         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<RpcResult<EchoOutput>> echoReply = SettableFuture.create();
-        Mockito.when(connectionAdapter.echo(Matchers.any(EchoInput.class))).thenReturn(echoReply);
+        final ListenableFuture<RpcResult<EchoOutput>> echoReply =
+                Futures.immediateFuture(RpcResultBuilder.success(new EchoOutputBuilder().setXid(0L).build()).build());
+
+        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<RpcResult<EchoOutput>> 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.<Boolean>immediateFailedFuture(new Exception("unit exception")));
+        Mockito.when(connectionAdapter.disconnect())
+                .thenReturn(Futures.<Boolean>immediateFailedFuture(new Exception("unit exception")));
 
         SwitchIdleEvent notification = new SwitchIdleEventBuilder().setInfo("wake up, device sleeps").build();
         systemNotificationsListener.onSwitchIdleEvent(notification);
@@ -185,10 +190,12 @@ 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() {
@@ -200,4 +207,4 @@ public class SystemNotificationsListenerImplTest {
         Mockito.verify(connectionContext, Mockito.timeout(SAFE_TIMEOUT).atLeastOnce()).getConnectionState();
         Mockito.verify(connectionContext, Mockito.timeout(SAFE_TIMEOUT).atLeastOnce()).getFeatures();
     }
-}
\ No newline at end of file
+}