Introduce NetconfTimer
[netconf.git] / apps / netconf-topology-singleton / src / test / java / org / opendaylight / netconf / topology / singleton / impl / NetconfTopologyManagerTest.java
index 51cfec7c24560815fa9f4309e65ae185d7a573dc..64a36ce299df314fea66ed09fcd1cd23ded1669b 100644 (file)
@@ -23,16 +23,17 @@ import static org.opendaylight.mdsal.binding.api.DataObjectModification.Modifica
 import static org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType.SUBTREE_MODIFIED;
 import static org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType.WRITE;
 
+import akka.actor.ActorSystem;
 import akka.util.Timeout;
-import io.netty.util.concurrent.EventExecutor;
-import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -40,9 +41,6 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
-import org.opendaylight.controller.cluster.ActorSystemProvider;
-import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
-import org.opendaylight.controller.config.threadpool.ThreadPool;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
@@ -50,35 +48,33 @@ import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTest;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
-import org.opendaylight.netconf.client.NetconfClientDispatcher;
-import org.opendaylight.netconf.client.mdsal.api.CredentialProvider;
+import org.opendaylight.netconf.client.NetconfClientFactory;
 import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory;
-import org.opendaylight.netconf.client.mdsal.api.KeyStoreProvider;
 import org.opendaylight.netconf.client.mdsal.impl.DefaultSchemaResourceManager;
+import org.opendaylight.netconf.common.NetconfTimer;
 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologySetup;
 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils;
+import org.opendaylight.netconf.topology.spi.NetconfClientConfigurationBuilderFactory;
+import org.opendaylight.netconf.topology.spi.NetconfTopologySchemaAssembler;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.Config;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.ConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.common.Uint16;
@@ -86,17 +82,37 @@ import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
-    private static final Uint16 ACTOR_RESPONSE_WAIT_TIME = Uint16.valueOf(10);
+    private static final Uint16 ACTOR_RESPONSE_WAIT_TIME = Uint16.TEN;
     private static final String TOPOLOGY_ID = "topologyID";
 
     private NetconfTopologyManager netconfTopologyManager;
 
     @Mock
     private ClusterSingletonServiceProvider clusterSingletonServiceProvider;
-
     @Mock
     private ListenerRegistration<?> mockListenerReg;
+    @Mock
+    private Registration mockRpcReg;
+    @Mock
+    private NetconfTimer timer;
+    @Mock
+    private ExecutorService processingService;
+    @Mock
+    private ActorSystem actorSystem;
+    @Mock
+    private NetconfClientFactory clientFactory;
+    @Mock
+    private DOMMountPointService mountPointService;
+    @Mock
+    private AAAEncryptionService encryptionService;
+    @Mock
+    private DeviceActionFactory actionFactory;
+    @Mock
+    private RpcProviderService rpcProviderService;
+    @Mock
+    private NetconfClientConfigurationBuilderFactory builderFactory;
 
+    private NetconfTopologySchemaAssembler schemaAssembler;
     private DataBroker dataBroker;
 
     private final Map<InstanceIdentifier<Node>, Function<NetconfTopologySetup, NetconfTopologyContext>>
@@ -104,39 +120,26 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
 
     @Before
     public void setUp() throws Exception {
+        schemaAssembler = new NetconfTopologySchemaAssembler(1, 1, 0, TimeUnit.SECONDS);
+
         AbstractDataBrokerTest dataBrokerTest = new AbstractDataBrokerTest() {
             @Override
             protected Set<YangModuleInfo> getModuleInfos() throws Exception {
-                return Set.of(BindingReflections.getModuleInfo(NetworkTopology.class));
+                return Set.of(BindingRuntimeHelpers.getYangModuleInfo(NetworkTopology.class));
             }
         };
 
         dataBrokerTest.setup();
         dataBroker = spy(dataBrokerTest.getDataBroker());
 
-        final DOMRpcProviderService rpcProviderRegistry = mock(DOMRpcProviderService.class);
-        final ScheduledThreadPool keepaliveExecutor = mock(ScheduledThreadPool.class);
-        final DOMActionProviderService actionProviderRegistry = mock(DOMActionProviderService.class);
-        final ThreadPool processingThreadPool = mock(ThreadPool.class);
-        final ExecutorService processingService = mock(ExecutorService.class);
-        doReturn(processingService).when(processingThreadPool).getExecutor();
-        final ActorSystemProvider actorSystemProvider = mock(ActorSystemProvider.class);
-        final EventExecutor eventExecutor = mock(EventExecutor.class);
-        final NetconfClientDispatcher clientDispatcher = mock(NetconfClientDispatcher.class);
-        final DOMMountPointService mountPointService = mock(DOMMountPointService.class);
-        final AAAEncryptionService encryptionService = mock(AAAEncryptionService.class);
-        final DeviceActionFactory deviceActionFactory = mock(DeviceActionFactory.class);
-        final RpcProviderService rpcProviderService = mock(RpcProviderService.class);
-        final CredentialProvider credentialProvider = mock(CredentialProvider.class);
-        final KeyStoreProvider keyStoreProvider = mock(KeyStoreProvider.class);
-
-        final Config config = new ConfigBuilder().setWriteTransactionIdleTimeout(Uint16.ZERO).build();
-        netconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, dataBroker, rpcProviderRegistry,
-                actionProviderRegistry, clusterSingletonServiceProvider, keepaliveExecutor, processingThreadPool,
-                actorSystemProvider, eventExecutor, clientDispatcher, TOPOLOGY_ID, config,
-                mountPointService, encryptionService, rpcProviderService, deviceActionFactory,
-                new DefaultSchemaResourceManager(new DefaultYangParserFactory()), credentialProvider,
-                keyStoreProvider) {
+        doNothing().when(mockListenerReg).close();
+        doReturn(mockListenerReg).when(dataBroker).registerDataTreeChangeListener(any(), any());
+        doReturn(mockRpcReg).when(rpcProviderService).registerRpcImplementations(any());
+
+        netconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, dataBroker, clusterSingletonServiceProvider,
+                timer, schemaAssembler, actorSystem, clientFactory, mountPointService, encryptionService,
+                rpcProviderService, actionFactory, new DefaultSchemaResourceManager(new DefaultYangParserFactory()),
+                builderFactory, TOPOLOGY_ID, Uint16.ZERO) {
             @Override
             protected NetconfTopologyContext newNetconfTopologyContext(final NetconfTopologySetup setup,
                 final ServiceGroupIdentifier serviceGroupIdent, final Timeout actorResponseWaitTime,
@@ -146,16 +149,15 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
                         "No mock context for " + setup.getInstanceIdentifier()).apply(setup);
             }
         };
+    }
 
-        doNothing().when(mockListenerReg).close();
-        doReturn(mockListenerReg).when(dataBroker).registerDataTreeChangeListener(any(), any());
+    @After
+    public void after() {
+        schemaAssembler.close();
     }
 
     @Test
     public void testRegisterDataTreeChangeListener() throws Exception {
-
-        netconfTopologyManager.init();
-
         await().atMost(5, TimeUnit.SECONDS).until(() -> {
             try (ReadTransaction readTx = dataBroker.newReadOnlyTransaction()) {
                 return readTx.exists(LogicalDatastoreType.OPERATIONAL,
@@ -178,10 +180,8 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
 
     @SuppressWarnings("unchecked")
     @Test
-    public void testOnDataTreeChanged() throws Exception {
-
+    public void testOnDataTreeChanged() {
         // Notify of 2 created Node objects.
-
         final NodeId nodeId1 = new NodeId("node-id-1");
         final InstanceIdentifier<Node> nodeInstanceId1 = NetconfTopologyUtils.createTopologyNodeListPath(
                 new NodeKey(nodeId1), TOPOLOGY_ID);
@@ -238,7 +238,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         doReturn(mockClusterRegistration2).when(clusterSingletonServiceProvider)
                 .registerClusterSingletonService(mockContext2);
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1),
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
@@ -248,7 +248,6 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         verify(clusterSingletonServiceProvider).registerClusterSingletonService(mockContext2);
 
         // Notify of Node 1 replaced and Node 2 subtree modified.
-
         mockContextMap.clear();
 
         final NetconfNode updatedNetconfNode1 = new NetconfNodeBuilder(netconfNode1)
@@ -264,7 +263,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         doNothing().when(mockContext1).refresh(any());
         doNothing().when(mockContext2).refresh(any());
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1),
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
@@ -279,10 +278,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         verifyNoMoreInteractions(clusterSingletonServiceProvider);
 
         // Notify of Node 1 deleted.
-
         doReturn(DELETE).when(dataObjectModification1).getModificationType();
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1)));
 
@@ -291,7 +289,6 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         verifyNoMoreInteractions(clusterSingletonServiceProvider, mockClusterRegistration2, mockContext2);
 
         // Notify of Node 1 created again.
-
         reset(clusterSingletonServiceProvider);
 
         final NetconfTopologyContext newMockContext1 = mock(NetconfTopologyContext.class);
@@ -310,17 +307,15 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
             return newMockContext1;
         });
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1)));
 
         verify(clusterSingletonServiceProvider, times(2)).registerClusterSingletonService(newMockContext1);
-
         verifyNoMoreInteractions(mockClusterRegistration1, mockContext1, mockClusterRegistration2, mockContext2,
                 newMockContext1, newMockClusterRegistration1, clusterSingletonServiceProvider);
 
         // Test close.
-
         netconfTopologyManager.close();
 
         verify(newMockClusterRegistration1).close();
@@ -361,9 +356,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         doThrow(new RuntimeException("mock error")).when(clusterSingletonServiceProvider)
                 .registerClusterSingletonService(mockContext);
 
-        netconfTopologyManager.init();
-
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId), dataObjectModification)));