2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.config.yang.md.sal.connector.netconf;
11 import static org.mockito.Matchers.eq;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.times;
14 import static org.mockito.Mockito.verify;
16 import com.google.common.util.concurrent.Futures;
17 import java.lang.reflect.Field;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.mockito.ArgumentCaptor;
22 import org.mockito.Mock;
23 import org.mockito.MockitoAnnotations;
24 import org.opendaylight.controller.config.api.DependencyResolver;
25 import org.opendaylight.controller.config.api.ModuleIdentifier;
26 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
27 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
28 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
29 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.DomainName;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPassword;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
46 public class NetconfConnectorModuleTest {
48 private static final String MODULE_NAME = "module-name";
49 private static final Host HOST = new Host(new DomainName("localhost"));
50 private static final PortNumber PORT = new PortNumber(17830);
51 private static final Boolean TCP_ONLY = Boolean.FALSE;
52 private static final LoginPassword LOGIN_PASSWORD = new LoginPasswordBuilder()
57 private DependencyResolver resolver;
59 private BindingAwareBroker bindingRegistry;
61 private BindingAwareBroker.ConsumerContext session;
63 private DataBroker dataBroker;
65 private WriteTransaction transaction;
66 private NetconfConnectorModule module;
69 public void setUp() throws Exception {
70 MockitoAnnotations.initMocks(this);
71 module = new NetconfConnectorModule(new ModuleIdentifier("factory", MODULE_NAME), resolver);
72 setViaReflection(module, "bindingRegistryDependency", bindingRegistry);
73 setViaReflection(module, "address", HOST);
74 setViaReflection(module, "port", PORT);
75 setViaReflection(module, "tcpOnly", TCP_ONLY);
76 setViaReflection(module, "username", LOGIN_PASSWORD.getUsername());
77 setViaReflection(module, "password", LOGIN_PASSWORD.getPassword());
78 doReturn(dataBroker).when(session).getSALService(DataBroker.class);
79 doReturn(transaction).when(dataBroker).newWriteOnlyTransaction();
80 doReturn(Futures.immediateCheckedFuture(null)).when(transaction).submit();
81 module.customValidation();
85 public void onSessionInitialized() throws Exception {
86 final AutoCloseable instance = module.createInstance();
87 verify(bindingRegistry).registerConsumer(module);
88 final NodeId nodeId = new NodeId(MODULE_NAME);
89 final KeyedInstanceIdentifier<Node, NodeKey> id = InstanceIdentifier.create(NetworkTopology.class)
90 .child(Topology.class, new TopologyKey(new TopologyId("topology-netconf")))
91 .child(Node.class, new NodeKey(nodeId));
92 //when session is initialized, topology node should be created
93 module.onSessionInitialized(session);
94 final ArgumentCaptor<Node> createdNodeCaptor = ArgumentCaptor.forClass(Node.class);
95 verify(transaction).put(eq(LogicalDatastoreType.CONFIGURATION), eq(id), createdNodeCaptor.capture());
96 verifyNode(nodeId, createdNodeCaptor.getValue());
97 //node should be deleted on close
99 verify(transaction).delete(LogicalDatastoreType.CONFIGURATION, id);
100 verify(transaction, times(2)).submit();
103 private static void verifyNode(final NodeId nodeId, final Node node) {
104 Assert.assertEquals(nodeId, node.getNodeId());
105 final NetconfNode netconfNode = node.getAugmentation(NetconfNode.class);
106 Assert.assertEquals(HOST, netconfNode.getHost());
107 Assert.assertEquals(PORT, netconfNode.getPort());
108 Assert.assertEquals(LOGIN_PASSWORD, netconfNode.getCredentials());
109 Assert.assertEquals(TCP_ONLY, netconfNode.isTcpOnly());
112 private static void setViaReflection(final Object object, final String fieldName, final Object value) {
114 final Field field = AbstractNetconfConnectorModule.class.getDeclaredField(fieldName);
115 field.setAccessible(true);
116 field.set(object, value);
117 } catch (NoSuchFieldException | IllegalAccessException e) {
118 Assert.fail("Failed to set field via reflection: " + fieldName);