Merge "Bug 2806 - Immediate and infinite reconnect attempts during negotiation" into...
[netconf.git] / opendaylight / netconf / netconf-impl / src / test / java / org / opendaylight / netconf / impl / osgi / NetconfMonitoringServiceImplTest.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 package org.opendaylight.netconf.impl.osgi;
9
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Mockito.doReturn;
12
13 import com.google.common.base.Optional;
14 import java.net.URI;
15 import java.util.ArrayList;
16 import java.util.Date;
17 import java.util.HashSet;
18 import java.util.List;
19 import java.util.Set;
20 import java.util.concurrent.atomic.AtomicInteger;
21 import org.junit.Assert;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.mockito.Mock;
25 import org.mockito.MockitoAnnotations;
26 import org.opendaylight.controller.config.util.capability.BasicCapability;
27 import org.opendaylight.controller.config.util.capability.Capability;
28 import org.opendaylight.controller.config.util.capability.YangModuleCapability;
29 import org.opendaylight.netconf.api.monitoring.NetconfManagementSession;
30 import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
31 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
32 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.CapabilitiesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChange;
41 import org.opendaylight.yangtools.yang.model.api.Module;
42
43 public class NetconfMonitoringServiceImplTest {
44
45     private static final String TEST_MODULE_CONTENT = "content";
46     private static final String TEST_MODULE_REV = "1970-01-01";
47     private static final  Uri TEST_MODULE_NAMESPACE = new Uri("testModuleNamespace");
48     private static final String TEST_MODULE_NAME = "testModule";
49     private static final Date TEST_MODULE_DATE = new Date(0);
50
51     private final Set<Capability> CAPABILITIES = new HashSet<>();
52
53     private NetconfMonitoringServiceImpl monitoringService;
54
55     @Mock
56     private Module moduleMock;
57     @Mock
58     private NetconfOperationServiceFactory operationServiceFactoryMock;
59     @Mock
60     private NetconfManagementSession sessionMock;
61
62     @Before
63     public void setUp() throws Exception {
64         MockitoAnnotations.initMocks(this);
65         CAPABILITIES.add(new BasicCapability("urn:ietf:params:netconf:base:1.0"));
66         CAPABILITIES.add(new BasicCapability("urn:ietf:params:netconf:base:1.1"));
67         CAPABILITIES.add(new BasicCapability("urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&amp;revision=2010-09-24"));
68         doReturn(new URI(TEST_MODULE_NAMESPACE.getValue())).when(moduleMock).getNamespace();
69         doReturn(TEST_MODULE_NAME).when(moduleMock).getName();
70         doReturn(TEST_MODULE_DATE).when(moduleMock).getRevision();
71         doReturn(TEST_MODULE_NAME).when(moduleMock).getName();
72
73         CAPABILITIES.add(new YangModuleCapability(moduleMock, TEST_MODULE_CONTENT));
74         doReturn(CAPABILITIES).when(operationServiceFactoryMock).getCapabilities();
75         doReturn(null).when(operationServiceFactoryMock).registerCapabilityListener(any(NetconfMonitoringServiceImpl.class));
76
77         monitoringService = new NetconfMonitoringServiceImpl(operationServiceFactoryMock);
78         monitoringService.onCapabilitiesChanged(CAPABILITIES, new HashSet<Capability>());
79
80         doReturn(new SessionBuilder().build()).when(sessionMock).toManagementSession();
81     }
82
83     @Test
84     public void testListeners() throws Exception {
85         final AtomicInteger stateChanged = new AtomicInteger(0);
86         NetconfMonitoringService.MonitoringListener listener = getMonitoringListener(stateChanged);
87         monitoringService.registerListener(listener);
88         Assert.assertEquals(1, stateChanged.get());
89         monitoringService.onSessionUp(sessionMock);
90         Assert.assertEquals(2, stateChanged.get());
91         HashSet<Capability> added = new HashSet<>();
92         added.add(new BasicCapability("toAdd"));
93         monitoringService.onCapabilitiesChanged(added, new HashSet<Capability>());
94         Assert.assertEquals(3, stateChanged.get());
95         monitoringService.onSessionDown(sessionMock);
96         Assert.assertEquals(4, stateChanged.get());
97     }
98
99     @Test
100     public void testGetSchemas() throws Exception {
101         Schemas schemas = monitoringService.getSchemas();
102         Schema schema = schemas.getSchema().get(0);
103         Assert.assertEquals(TEST_MODULE_NAMESPACE, schema.getNamespace());
104         Assert.assertEquals(TEST_MODULE_NAME, schema.getIdentifier());
105         Assert.assertEquals(TEST_MODULE_REV, schema.getVersion());
106
107     }
108
109     @Test
110     public void testGetSchemaForCapability() throws Exception {
111         String schema = monitoringService.getSchemaForCapability(TEST_MODULE_NAME, Optional.of(TEST_MODULE_REV));
112         Assert.assertEquals(TEST_MODULE_CONTENT, schema);
113
114     }
115
116     @Test
117     public void testGetCapabilities() throws Exception {
118         Capabilities actual = monitoringService.getCapabilities();
119         List<Uri> exp = new ArrayList<>();
120         for (Capability capability : CAPABILITIES) {
121             exp.add(new Uri(capability.getCapabilityUri()));
122         }
123         exp.add(0, new Uri("urn:ietf:params:netconf:capability:candidate:1.0"));
124         Capabilities expected = new CapabilitiesBuilder().setCapability(exp).build();
125         Assert.assertEquals(new HashSet<>(expected.getCapability()), new HashSet<>(actual.getCapability()));
126     }
127
128     @Test
129     public void testClose() throws Exception {
130         monitoringService.onSessionUp(sessionMock);
131         Assert.assertFalse(monitoringService.getSessions().getSession().isEmpty());
132         Assert.assertFalse(monitoringService.getCapabilities().getCapability().isEmpty());
133         monitoringService.close();
134         Assert.assertTrue(monitoringService.getSessions().getSession().isEmpty());
135         Assert.assertTrue(monitoringService.getCapabilities().getCapability().isEmpty());
136     }
137
138     @Test
139     public void testOnCapabilitiesChanged() throws Exception {
140         final List<String> actualCapabilities = new ArrayList<>();
141         monitoringService.registerListener(new NetconfMonitoringService.MonitoringListener() {
142             @Override
143             public void onStateChanged(NetconfState state) {
144                 List<Uri> capability = state.getCapabilities().getCapability();
145                 for (Uri uri : capability) {
146                     actualCapabilities.add(uri.getValue());
147                 }
148             }
149         });
150         HashSet<Capability> testCaps = new HashSet<>();
151         String capUri = "test";
152         testCaps.add(new BasicCapability(capUri));
153         monitoringService.onCapabilitiesChanged(testCaps, new HashSet<Capability>());
154         Assert.assertTrue(actualCapabilities.contains(capUri));
155         actualCapabilities.clear();
156         monitoringService.onCapabilitiesChanged(new HashSet<Capability>(), testCaps);
157         Assert.assertFalse(actualCapabilities.contains(capUri));
158     }
159
160     @Test
161     public void testonCapabilitiesChanged() throws Exception {
162         final String toAdd = "toAdd";
163         final String toRemove = "toRemove";
164         monitoringService.setNotificationPublisher(new BaseNotificationPublisherRegistration() {
165             @Override
166             public void onCapabilityChanged(NetconfCapabilityChange capabilityChange) {
167                 Assert.assertEquals(1, capabilityChange.getAddedCapability().size());
168
169                 Assert.assertEquals(toAdd, capabilityChange.getAddedCapability().get(0).getValue());
170                 Assert.assertEquals(1, capabilityChange.getDeletedCapability().size());
171                 Assert.assertEquals(toRemove, capabilityChange.getDeletedCapability().get(0).getValue());
172             }
173
174             @Override
175             public void close() {
176
177             }
178         });
179         Set<Capability> removed = new HashSet<>();
180         removed.add(new BasicCapability(toRemove));
181         Set<Capability> added = new HashSet<>();
182         added.add(new BasicCapability(toAdd));
183         monitoringService.onCapabilitiesChanged(added, removed);
184     }
185
186     private NetconfMonitoringService.MonitoringListener getMonitoringListener(final AtomicInteger stateChanged) {
187         return new NetconfMonitoringService.MonitoringListener() {
188             @Override
189             public void onStateChanged(NetconfState state) {
190                 stateChanged.incrementAndGet();
191             }
192         };
193     }
194
195 }