Merge "Bug-1376 Add caching for premature notifications in netconf connector"
authorTony Tkacik <ttkacik@cisco.com>
Fri, 18 Jul 2014 08:38:32 +0000 (08:38 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 18 Jul 2014 08:38:32 +0000 (08:38 +0000)
1  2 
opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTest.java

index ec2a820daab098618461d617155fa6804a369326,cd81a869f1cf0cdfe073250276fe93367507d9fc..defaab629f3684de2be6a5b1d7a578749cd493e0
@@@ -12,6 -12,7 +12,7 @@@ import static org.mockito.Matchers.anyS
  import static org.mockito.Mockito.doNothing;
  import static org.mockito.Mockito.doReturn;
  import static org.mockito.Mockito.timeout;
+ import static org.mockito.Mockito.times;
  import static org.mockito.Mockito.verify;
  
  import java.io.InputStream;
@@@ -27,6 -28,7 +28,6 @@@ import org.junit.Test
  import org.mockito.Mockito;
  import org.opendaylight.controller.netconf.api.NetconfMessage;
  import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants;
 -import org.opendaylight.controller.sal.common.util.Rpcs;
  import org.opendaylight.controller.sal.connect.api.MessageTransformer;
  import org.opendaylight.controller.sal.connect.api.RemoteDeviceCommunicator;
  import org.opendaylight.controller.sal.connect.api.RemoteDeviceHandler;
@@@ -37,8 -39,8 +38,8 @@@ import org.opendaylight.controller.sal.
  import org.opendaylight.controller.sal.connect.util.RemoteDeviceId;
  import org.opendaylight.controller.sal.core.api.RpcImplementation;
  import org.opendaylight.yangtools.yang.common.QName;
 -import org.opendaylight.yangtools.yang.common.RpcError;
  import org.opendaylight.yangtools.yang.common.RpcResult;
 +import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
  import org.opendaylight.yangtools.yang.data.api.CompositeNode;
  import org.opendaylight.yangtools.yang.model.api.Module;
  import org.opendaylight.yangtools.yang.model.api.SchemaContext;
@@@ -64,8 -66,8 +65,8 @@@ public class NetconfDeviceTest 
          }
      }
  
 -    private static final  RpcResult<NetconfMessage> rpcResult = Rpcs.getRpcResult(true, netconfMessage, Collections.<RpcError>emptySet());
 -    private static final  RpcResult<CompositeNode> rpcResultC = Rpcs.getRpcResult(true, compositeNode, Collections.<RpcError>emptySet());
 +    private static final  RpcResult<NetconfMessage> rpcResult = RpcResultBuilder.success(netconfMessage).build();
 +    private static final  RpcResult<CompositeNode> rpcResultC = RpcResultBuilder.success(compositeNode).build();
  
      public static final String TEST_NAMESPACE = "test:namespace";
      public static final String TEST_MODULE = "test-module";
          Mockito.verify(facade, Mockito.timeout(5000)).onDeviceDisconnected();
      }
  
+     @Test
+     public void testNotificationBeforeSchema() throws Exception {
+         final RemoteDeviceHandler<NetconfSessionCapabilities> facade = getFacade();
+         final RemoteDeviceCommunicator<NetconfMessage> listener = getListener();
+         final MessageTransformer<NetconfMessage> messageTransformer = getMessageTransformer();
+         final NetconfDevice device = new NetconfDevice(getId(), facade, getExecutor(), messageTransformer, getSchemaContextProviderFactory(), getSourceProviderFactory());
+         device.onNotification(netconfMessage);
+         device.onNotification(netconfMessage);
+         verify(facade, times(0)).onNotification(any(CompositeNode.class));
+         final NetconfSessionCapabilities sessionCaps = getSessionCaps(true,
+                 Lists.newArrayList(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&amp;revision=" + TEST_REVISION));
+         device.onRemoteSessionUp(sessionCaps, listener);
+         verify(messageTransformer, timeout(10000).times(2)).toNotification(netconfMessage);
+         verify(facade, times(2)).onNotification(compositeNode);
+         device.onNotification(netconfMessage);
+         verify(messageTransformer, times(3)).toNotification(netconfMessage);
+         verify(facade, times(3)).onNotification(compositeNode);
+     }
      @Test
      public void testNetconfDeviceReconnect() throws Exception {
          final RemoteDeviceHandler<NetconfSessionCapabilities> facade = getFacade();
          final RemoteDeviceHandler<NetconfSessionCapabilities> remoteDeviceHandler = mockCloseableClass(RemoteDeviceHandler.class);
          doNothing().when(remoteDeviceHandler).onDeviceConnected(any(SchemaContextProvider.class), any(NetconfSessionCapabilities.class), any(RpcImplementation.class));
          doNothing().when(remoteDeviceHandler).onDeviceDisconnected();
+         doNothing().when(remoteDeviceHandler).onNotification(any(CompositeNode.class));
          return remoteDeviceHandler;
      }
  
          final MessageTransformer<NetconfMessage> messageTransformer = mockClass(MessageTransformer.class);
          doReturn(netconfMessage).when(messageTransformer).toRpcRequest(any(QName.class), any(CompositeNode.class));
          doReturn(rpcResultC).when(messageTransformer).toRpcResult(any(NetconfMessage.class), any(QName.class));
+         doReturn(compositeNode).when(messageTransformer).toNotification(any(NetconfMessage.class));
          doNothing().when(messageTransformer).onGlobalContextUpdated(any(SchemaContext.class));
          return messageTransformer;
      }
          doReturn(Futures.immediateFuture(rpcResult)).when(remoteDeviceCommunicator).sendRequest(any(NetconfMessage.class), any(QName.class));
          return remoteDeviceCommunicator;
      }
--}
++}