Add JSONRestconfService impl for the restconf Draft18 impl
[netconf.git] / netconf / sal-netconf-connector / src / test / java / org / opendaylight / controller / config / yang / md / sal / connector / netconf / NetconfConnectorModuleTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.controller.config.yang.md.sal.connector.netconf;
10
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;
15
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;
45
46 public class NetconfConnectorModuleTest {
47
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()
53             .setUsername("admin")
54             .setPassword("admin")
55             .build();
56     @Mock
57     private DependencyResolver resolver;
58     @Mock
59     private BindingAwareBroker bindingRegistry;
60     @Mock
61     private BindingAwareBroker.ConsumerContext session;
62     @Mock
63     private DataBroker dataBroker;
64     @Mock
65     private WriteTransaction transaction;
66     private NetconfConnectorModule module;
67
68     @Before
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();
82     }
83
84     @Test
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
98         instance.close();
99         verify(transaction).delete(LogicalDatastoreType.CONFIGURATION, id);
100         verify(transaction, times(2)).submit();
101     }
102
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());
110     }
111
112     private static void setViaReflection(final Object object, final String fieldName, final Object value) {
113         try {
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);
119         }
120     }
121
122 }