Add RemoteDeviceServices
[netconf.git] / netconf / sal-netconf-connector / src / test / java / org / opendaylight / netconf / sal / connect / netconf / NetconfDeviceTest.java
index fca46b3943e328fb91f9d5269d749da4c532b478..43bf865e5ef32d498003db30328d9edb6e2fa8f1 100644 (file)
@@ -13,7 +13,6 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyCollection;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.after;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
@@ -24,7 +23,7 @@ import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -45,10 +44,8 @@ import java.util.Set;
 import java.util.concurrent.Executors;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
-import org.opendaylight.mdsal.dom.api.DOMActionService;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
-import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
 import org.opendaylight.netconf.api.NetconfMessage;
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
@@ -56,23 +53,21 @@ import org.opendaylight.netconf.api.xml.XmlUtil;
 import org.opendaylight.netconf.sal.connect.api.MessageTransformer;
 import org.opendaylight.netconf.sal.connect.api.NetconfDeviceSchemasResolver;
 import org.opendaylight.netconf.sal.connect.api.RemoteDeviceHandler;
+import org.opendaylight.netconf.sal.connect.api.RemoteDeviceServices;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCapabilities;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
-import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceRpc;
 import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
 import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability.CapabilityOrigin;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory;
 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
-import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
@@ -103,13 +98,11 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
     public static final String TEST_NAMESPACE = "test:namespace";
     public static final String TEST_MODULE = "test-module";
     public static final String TEST_REVISION = "2013-07-22";
-    public static final SourceIdentifier TEST_SID =
-            RevisionSourceIdentifier.create(TEST_MODULE, Revision.of(TEST_REVISION));
+    public static final SourceIdentifier TEST_SID = new SourceIdentifier(TEST_MODULE, TEST_REVISION);
     public static final String TEST_CAPABILITY =
             TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION;
 
-    public static final SourceIdentifier TEST_SID2 =
-            RevisionSourceIdentifier.create(TEST_MODULE + "2", Revision.of(TEST_REVISION));
+    public static final SourceIdentifier TEST_SID2 = new SourceIdentifier(TEST_MODULE + "2", TEST_REVISION);
     public static final String TEST_CAPABILITY2 =
             TEST_NAMESPACE + "?module=" + TEST_MODULE + "2" + "&revision=" + TEST_REVISION;
 
@@ -119,7 +112,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     @Test
     public void testNetconfDeviceFlawedModelFailedResolution() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
 
         final EffectiveModelContextFactory schemaFactory = getSchemaFactory();
@@ -161,8 +154,8 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
                 getSessionCaps(true, Lists.newArrayList(TEST_CAPABILITY, TEST_CAPABILITY2));
         device.onRemoteSessionUp(sessionCaps, listener);
 
-        verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class),
-            any(NetconfSessionPreferences.class), any(NetconfDeviceRpc.class), isNull());
+        verify(facade, timeout(5000)).onDeviceConnected(any(NetconfDeviceSchema.class),
+            any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
         verify(schemaFactory, times(2)).createEffectiveModelContext(anyCollection());
     }
 
@@ -170,16 +163,15 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
     public void testNetconfDeviceFailFirstSchemaFailSecondEmpty() throws Exception {
         final ArrayList<String> capList = Lists.newArrayList(TEST_CAPABILITY);
 
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
 
         final EffectiveModelContextFactory schemaFactory = getSchemaFactory();
         final SchemaRepository schemaRepository = getSchemaRepository();
 
         // Make fallback attempt to fail due to empty resolved sources
-        final SchemaResolutionException schemaResolutionException
-                = new SchemaResolutionException("fail first",
-                Collections.emptyList(), HashMultimap.create());
+        final SchemaResolutionException schemaResolutionException = new SchemaResolutionException("fail first",
+                List.of(), ImmutableMultimap.of());
         doReturn(Futures.immediateFailedFuture(schemaResolutionException))
                 .when(schemaFactory).createEffectiveModelContext(anyCollection());
 
@@ -205,7 +197,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     @Test
     public void testNetconfDeviceMissingSource() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
 
         final EffectiveModelContextFactory schemaFactory = getSchemaFactory();
@@ -247,11 +239,11 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
                 .build();
         // Monitoring supported
         final NetconfSessionPreferences sessionCaps =
-                getSessionCaps(true, Lists.newArrayList(TEST_CAPABILITY, TEST_CAPABILITY2));
+                getSessionCaps(true, List.of(TEST_CAPABILITY, TEST_CAPABILITY2));
         device.onRemoteSessionUp(sessionCaps, listener);
 
-        verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class),
-            any(NetconfSessionPreferences.class), any(NetconfDeviceRpc.class), isNull());
+        verify(facade, timeout(5000)).onDeviceConnected(any(NetconfDeviceSchema.class),
+            any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
         verify(schemaFactory, times(1)).createEffectiveModelContext(anyCollection());
     }
 
@@ -275,7 +267,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     @Test
     public void testNotificationBeforeSchema() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
         final EffectiveModelContextFactory schemaContextProviderFactory = mock(EffectiveModelContextFactory.class);
         final SettableFuture<SchemaContext> schemaFuture = SettableFuture.create();
@@ -310,7 +302,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     @Test
     public void testNetconfDeviceReconnect() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
 
         final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
@@ -331,8 +323,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         verify(schemaContextProviderFactory, timeout(5000)).createEffectiveModelContext(any(Collection.class));
         verify(facade, timeout(5000)).onDeviceConnected(
-                any(MountPointContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class),
-                isNull());
+                any(NetconfDeviceSchema.class), any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
 
         device.onRemoteSessionDown();
         verify(facade, timeout(5000)).onDeviceDisconnected();
@@ -341,13 +332,12 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         verify(schemaContextProviderFactory, timeout(5000).times(2)).createEffectiveModelContext(any(Collection.class));
         verify(facade, timeout(5000).times(2)).onDeviceConnected(
-                any(MountPointContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class),
-                isNull());
+                any(NetconfDeviceSchema.class), any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
     }
 
     @Test
     public void testNetconfDeviceDisconnectListenerCallCancellation() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
         final EffectiveModelContextFactory schemaContextProviderFactory = mock(EffectiveModelContextFactory.class);
         final SettableFuture<SchemaContext> schemaFuture = SettableFuture.create();
@@ -373,12 +363,12 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
         //complete schema setup
         schemaFuture.set(SCHEMA_CONTEXT);
         //facade.onDeviceDisconnected() was called, so facade.onDeviceConnected() shouldn't be called anymore
-        verify(facade, after(1000).never()).onDeviceConnected(any(), any(), any(), any(DOMActionService.class));
+        verify(facade, after(1000).never()).onDeviceConnected(any(), any(), any(RemoteDeviceServices.class));
     }
 
     @Test
     public void testNetconfDeviceAvailableCapabilitiesBuilding() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
 
         final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
@@ -397,20 +387,17 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         final NetconfSessionPreferences sessionCaps = getSessionCaps(true,
                 Lists.newArrayList(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&amp;revision=" + TEST_REVISION));
-        final Map<QName, AvailableCapability.CapabilityOrigin> moduleBasedCaps = new HashMap<>();
-        moduleBasedCaps.putAll(sessionCaps.getModuleBasedCapsOrigin());
+        final Map<QName, CapabilityOrigin> moduleBasedCaps = new HashMap<>();
+        moduleBasedCaps.putAll(sessionCaps.moduleBasedCaps());
         moduleBasedCaps
-                .put(QName.create("(test:qname:side:loading)test"), AvailableCapability.CapabilityOrigin.UserDefined);
+                .put(QName.create("(test:qname:side:loading)test"), CapabilityOrigin.UserDefined);
 
         netconfSpy.onRemoteSessionUp(sessionCaps.replaceModuleCaps(moduleBasedCaps), listener);
 
-        final ArgumentCaptor<NetconfSessionPreferences> argument =
-                ArgumentCaptor.forClass(NetconfSessionPreferences.class);
-        verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
-            any(DOMRpcService.class), isNull());
-        final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().getNetconfDeviceCapabilities();
-
-        netconfDeviceCaps.getResolvedCapabilities()
+        final ArgumentCaptor<NetconfDeviceSchema> argument =  ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+        verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+            any(RemoteDeviceServices.class));
+        argument.getValue().capabilities().resolvedCapabilities()
                 .forEach(entry -> assertEquals("Builded 'AvailableCapability' schemas should match input capabilities.",
                         moduleBasedCaps.get(
                                 QName.create(entry.getCapability())).getName(), entry.getCapabilityOrigin().getName()));
@@ -418,7 +405,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     @Test
     public void testNetconfDeviceNotificationsModelNotPresentWithCapability() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
         final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
 
@@ -438,10 +425,9 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         netconfSpy.onRemoteSessionUp(sessionCaps, listener);
 
-        final ArgumentCaptor<NetconfSessionPreferences> argument =
-                ArgumentCaptor.forClass(NetconfSessionPreferences.class);
-        verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
-                any(DOMRpcService.class), isNull());
+        final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+        verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+                any(RemoteDeviceServices.class));
 
         List<String> notificationModulesName = Arrays.asList(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
@@ -449,8 +435,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
                         .$YangModuleInfoImpl.getInstance().getName().toString());
 
-        final Set<AvailableCapability> resolvedCapabilities = argument.getValue().getNetconfDeviceCapabilities()
-                .getResolvedCapabilities();
+        final Set<AvailableCapability> resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities();
 
         assertEquals(2, resolvedCapabilities.size());
         assertTrue(resolvedCapabilities.stream().anyMatch(entry -> notificationModulesName
@@ -459,7 +444,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     @Test
     public void testNetconfDeviceNotificationsCapabilityIsNotPresent() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
         final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
 
@@ -479,25 +464,24 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         netconfSpy.onRemoteSessionUp(sessionCaps, listener);
 
-        final ArgumentCaptor<NetconfSessionPreferences> argument =
-                ArgumentCaptor.forClass(NetconfSessionPreferences.class);
-        verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
-                any(DOMRpcService.class), isNull());
-        final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().getNetconfDeviceCapabilities();
+        final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+        verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+                any(RemoteDeviceServices.class));
+        final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().capabilities();
 
-        List<String> notificationModulesName = Arrays.asList(
+        List<String> notificationModulesName = List.of(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
                         .$YangModuleInfoImpl.getInstance().getName().toString(),
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
                         .$YangModuleInfoImpl.getInstance().getName().toString());
 
-        assertFalse(netconfDeviceCaps.getResolvedCapabilities().stream().anyMatch(entry -> notificationModulesName
-                .contains(entry.getCapability())));
+        assertFalse(netconfDeviceCaps.resolvedCapabilities().stream()
+            .anyMatch(entry -> notificationModulesName.contains(entry.getCapability())));
     }
 
     @Test
     public void testNetconfDeviceNotificationsModelIsPresent() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();
+        final RemoteDeviceHandler facade = getFacade();
         final NetconfDeviceCommunicator listener = getListener();
         final EffectiveModelContextFactory schemaContextProviderFactory = getSchemaFactory();
 
@@ -514,25 +498,23 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         final NetconfSessionPreferences sessionCaps = getSessionCaps(false, Collections.emptyList());
 
-        final Map<QName, AvailableCapability.CapabilityOrigin> moduleBasedCaps = new HashMap<>();
+        final Map<QName, CapabilityOrigin> moduleBasedCaps = new HashMap<>();
         moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
                         .$YangModuleInfoImpl.getInstance().getName(),
-                AvailableCapability.CapabilityOrigin.DeviceAdvertised);
+                CapabilityOrigin.DeviceAdvertised);
         moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
                         .$YangModuleInfoImpl.getInstance().getName(),
-                AvailableCapability.CapabilityOrigin.DeviceAdvertised);
+                CapabilityOrigin.DeviceAdvertised);
 
 
         netconfSpy.onRemoteSessionUp(sessionCaps.replaceModuleCaps(moduleBasedCaps), listener);
 
-        final ArgumentCaptor<NetconfSessionPreferences> argument =
-                ArgumentCaptor.forClass(NetconfSessionPreferences.class);
-        verify(facade, timeout(5000)).onDeviceConnected(any(MountPointContext.class), argument.capture(),
-                any(DOMRpcService.class), isNull());
-        final Set<AvailableCapability> resolvedCapabilities = argument.getValue().getNetconfDeviceCapabilities()
-                .getResolvedCapabilities();
+        final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+        verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
+                any(RemoteDeviceServices.class));
+        final Set<AvailableCapability> resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities();
 
-        List<String> notificationModulesName = Arrays.asList(
+        List<String> notificationModulesName = List.of(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
                         .$YangModuleInfoImpl.getInstance().getName().toString(),
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
@@ -550,12 +532,10 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
         return schemaFactory;
     }
 
-    private static RemoteDeviceHandler<NetconfSessionPreferences> getFacade() throws Exception {
-        final RemoteDeviceHandler<NetconfSessionPreferences> remoteDeviceHandler =
-                mockCloseableClass(RemoteDeviceHandler.class);
+    private static RemoteDeviceHandler getFacade() throws Exception {
+        final RemoteDeviceHandler remoteDeviceHandler = mockCloseableClass(RemoteDeviceHandler.class);
         doNothing().when(remoteDeviceHandler).onDeviceConnected(
-                any(MountPointContext.class), any(NetconfSessionPreferences.class), any(NetconfDeviceRpc.class),
-                any(DOMActionService.class));
+                any(NetconfDeviceSchema.class), any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class));
         doNothing().when(remoteDeviceHandler).onDeviceDisconnected();
         doNothing().when(remoteDeviceHandler).onNotification(any(DOMNotification.class));
         return remoteDeviceHandler;
@@ -582,8 +562,8 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
         return MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
     }
 
-    public MessageTransformer<NetconfMessage> getMessageTransformer() throws Exception {
-        final MessageTransformer<NetconfMessage> messageTransformer = mockClass(MessageTransformer.class);
+    public MessageTransformer getMessageTransformer() throws Exception {
+        final MessageTransformer messageTransformer = mockClass(MessageTransformer.class);
         doReturn(NOTIFICATION).when(messageTransformer).toRpcRequest(any(QName.class), any(NormalizedNode.class));
         doReturn(RPC_RESULT).when(messageTransformer).toRpcResult(any(NetconfMessage.class), any(QName.class));
         doReturn(COMPOSITE_NODE).when(messageTransformer).toNotification(any(NetconfMessage.class));