Close device's source resolution on teardown
[netconf.git] / netconf / sal-netconf-connector / src / test / java / org / opendaylight / netconf / sal / connect / netconf / NetconfDeviceTest.java
index 656b6697873b03d7bb4bf06aae7d1aa93c7174c4..12dcf90b218f3664650889d36bf4e493eec8359d 100644 (file)
@@ -372,6 +372,45 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
         verify(facade, after(1000).never()).onDeviceConnected(any(), any(), any(), any(DOMActionService.class));
     }
 
+    @Test
+    public void testNetconfDeviceReconnectBeforeSchemaSetup() throws Exception {
+        final RemoteDeviceHandler<NetconfSessionPreferences>  facade = getFacade();
+
+        final EffectiveModelContextFactory schemaContextProviderFactory = mock(EffectiveModelContextFactory.class);
+        final SettableFuture<SchemaContext> schemaFuture = SettableFuture.create();
+        doReturn(schemaFuture).when(schemaContextProviderFactory).createEffectiveModelContext(anyCollection());
+
+        final NetconfDevice.SchemaResourcesDTO schemaResourcesDTO = new NetconfDevice.SchemaResourcesDTO(
+            getSchemaRegistry(), getSchemaRepository(), schemaContextProviderFactory, STATE_SCHEMAS_RESOLVER);
+        final NetconfDevice device = new NetconfDeviceBuilder()
+            .setReconnectOnSchemasChange(true)
+            .setSchemaResourcesDTO(schemaResourcesDTO)
+            .setGlobalProcessingExecutor(getExecutor())
+            .setId(getId())
+            .setSalFacade(facade)
+            .setBaseSchemas(BASE_SCHEMAS)
+            .build();
+        final NetconfSessionPreferences sessionCaps = getSessionCaps(true,
+            List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&amp;revision=" + TEST_REVISION));
+
+        final NetconfDeviceCommunicator listener = getListener();
+        // session up, start schema resolution
+        device.onRemoteSessionUp(sessionCaps, listener);
+        // session down
+        device.onRemoteSessionDown();
+        verify(facade, timeout(5000)).onDeviceDisconnected();
+        // session back up, start another schema resolution
+        device.onRemoteSessionUp(sessionCaps, listener);
+        // complete schema setup
+        schemaFuture.set(SCHEMA_CONTEXT);
+        // schema setup performed twice
+        verify(schemaContextProviderFactory, timeout(5000)).createEffectiveModelContext(anyCollection());
+        // onDeviceConnected called once
+        verify(facade, timeout(5000)).onDeviceConnected(
+            any(MountPointContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class),
+            isNull());
+    }
+
     @Test
     public void testNetconfDeviceAvailableCapabilitiesBuilding() throws Exception {
         final RemoteDeviceHandler<NetconfSessionPreferences> facade = getFacade();