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
8 package org.opendaylight.netconf.impl.osgi;
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Mockito.doNothing;
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.base.Optional;
18 import java.util.ArrayList;
19 import java.util.Collections;
20 import java.util.Date;
21 import java.util.HashSet;
22 import java.util.List;
24 import org.junit.Assert;
25 import org.junit.Before;
26 import org.junit.BeforeClass;
27 import org.junit.Test;
28 import org.mockito.ArgumentCaptor;
29 import org.mockito.Mock;
30 import org.mockito.MockitoAnnotations;
31 import org.opendaylight.controller.config.util.capability.BasicCapability;
32 import org.opendaylight.controller.config.util.capability.Capability;
33 import org.opendaylight.controller.config.util.capability.YangModuleCapability;
34 import org.opendaylight.netconf.api.monitoring.NetconfManagementSession;
35 import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
36 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
37 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.CapabilitiesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChange;
47 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
48 import org.opendaylight.yangtools.yang.model.api.Module;
50 public class NetconfCapabilityMonitoringServiceTest {
52 private static final String TEST_MODULE_CONTENT = "content";
53 private static final String TEST_MODULE_CONTENT2 = "content2";
54 private static final String TEST_MODULE_REV = "1970-01-01";
55 private static final String TEST_MODULE_REV2 = "1970-01-02";
56 private static final Uri TEST_MODULE_NAMESPACE = new Uri("testModuleNamespace");
57 private static final String TEST_MODULE_NAME = "testModule";
58 private static Date TEST_MODULE_DATE;
59 private static Date TEST_MODULE_DATE2;
61 private YangModuleCapability moduleCapability1;
62 private YangModuleCapability moduleCapability2;
63 private static final Session SESSION = new SessionBuilder()
65 .setSourceHost(new Host("0.0.0.0".toCharArray()))
68 private int capabilitiesSize;
70 private final Set<Capability> capabilities = new HashSet<>();
73 private Module moduleMock;
75 private Module moduleMock2;
77 private NetconfOperationServiceFactory operationServiceFactoryMock;
79 private NetconfManagementSession sessionMock;
81 private NetconfMonitoringService.CapabilitiesListener listener;
83 private BaseNotificationPublisherRegistration notificationPublisher;
85 private NetconfCapabilityMonitoringService monitoringService;
88 public static void suiteSetUp() throws Exception {
89 TEST_MODULE_DATE = SimpleDateFormatUtil.getRevisionFormat().parse(TEST_MODULE_REV);
90 TEST_MODULE_DATE2 = SimpleDateFormatUtil.getRevisionFormat().parse(TEST_MODULE_REV2);
94 public void setUp() throws Exception {
95 MockitoAnnotations.initMocks(this);
97 doReturn(new URI(TEST_MODULE_NAMESPACE.getValue())).when(moduleMock).getNamespace();
98 doReturn(TEST_MODULE_NAME).when(moduleMock).getName();
99 doReturn(TEST_MODULE_DATE).when(moduleMock).getRevision();
100 moduleCapability1 = new YangModuleCapability(moduleMock, TEST_MODULE_CONTENT);
102 capabilities.add(moduleCapability1);
104 doReturn(new URI(TEST_MODULE_NAMESPACE.getValue())).when(moduleMock2).getNamespace();
105 doReturn(TEST_MODULE_NAME).when(moduleMock2).getName();
106 doReturn(TEST_MODULE_DATE2).when(moduleMock2).getRevision();
107 moduleCapability2 = new YangModuleCapability(moduleMock2, TEST_MODULE_CONTENT2);
109 capabilities.add(new BasicCapability("urn:ietf:params:netconf:base:1.0"));
110 capabilities.add(new BasicCapability("urn:ietf:params:netconf:base:1.1"));
111 capabilities.add(new BasicCapability("urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&"
112 + "revision=2010-09-24"));
114 doReturn(capabilities).when(operationServiceFactoryMock).getCapabilities();
115 doReturn(null).when(operationServiceFactoryMock)
116 .registerCapabilityListener(any(NetconfCapabilityMonitoringService.class));
118 doReturn(SESSION).when(sessionMock).toManagementSession();
119 doNothing().when(listener).onCapabilitiesChanged(any());
120 doNothing().when(listener).onSchemasChanged(any());
122 doNothing().when(notificationPublisher).onCapabilityChanged(any());
123 doNothing().when(notificationPublisher).onSessionStarted(any());
124 doNothing().when(notificationPublisher).onSessionEnded(any());
126 monitoringService = new NetconfCapabilityMonitoringService(operationServiceFactoryMock);
127 monitoringService.onCapabilitiesChanged(capabilities, Collections.emptySet());
128 monitoringService.setNotificationPublisher(notificationPublisher);
129 monitoringService.registerListener(listener);
130 capabilitiesSize = monitoringService.getCapabilities().getCapability().size();
134 public void testListeners() throws Exception {
135 HashSet<Capability> added = new HashSet<>();
136 added.add(new BasicCapability("toAdd"));
137 monitoringService.onCapabilitiesChanged(added, Collections.emptySet());
138 //onCapabilitiesChanged and onSchemasChanged are invoked also after listener registration
139 verify(listener, times(2)).onCapabilitiesChanged(any());
140 verify(listener, times(2)).onSchemasChanged(any());
144 public void testGetSchemas() throws Exception {
145 Schemas schemas = monitoringService.getSchemas();
146 Schema schema = schemas.getSchema().get(0);
147 Assert.assertEquals(TEST_MODULE_NAMESPACE, schema.getNamespace());
148 Assert.assertEquals(TEST_MODULE_NAME, schema.getIdentifier());
149 Assert.assertEquals(TEST_MODULE_REV, schema.getVersion());
153 public void testGetSchemaForCapability() throws Exception {
154 //test multiple revisions of the same capability
155 monitoringService.onCapabilitiesChanged(Collections.singleton(moduleCapability2), Collections.emptySet());
156 final String schema =
157 monitoringService.getSchemaForModuleRevision(TEST_MODULE_NAME, Optional.of(TEST_MODULE_REV));
158 Assert.assertEquals(TEST_MODULE_CONTENT, schema);
159 final String schema2 =
160 monitoringService.getSchemaForModuleRevision(TEST_MODULE_NAME, Optional.of(TEST_MODULE_REV2));
161 Assert.assertEquals(TEST_MODULE_CONTENT2, schema2);
162 //remove one revision
163 monitoringService.onCapabilitiesChanged(Collections.emptySet(), Collections.singleton(moduleCapability1));
164 //only one revision present
165 final String schema3 = monitoringService.getSchemaForModuleRevision(TEST_MODULE_NAME, Optional.absent());
166 Assert.assertEquals(TEST_MODULE_CONTENT2, schema3);
170 public void testGetCapabilities() throws Exception {
171 Capabilities actual = monitoringService.getCapabilities();
172 List<Uri> exp = new ArrayList<>();
173 for (Capability capability : capabilities) {
174 exp.add(new Uri(capability.getCapabilityUri()));
176 //candidate is added by monitoring service automatically
177 exp.add(0, new Uri("urn:ietf:params:netconf:capability:candidate:1.0"));
178 Capabilities expected = new CapabilitiesBuilder().setCapability(exp).build();
179 Assert.assertEquals(new HashSet<>(expected.getCapability()), new HashSet<>(actual.getCapability()));
183 public void testClose() throws Exception {
184 Assert.assertFalse(monitoringService.getCapabilities().getCapability().isEmpty());
185 monitoringService.close();
186 Assert.assertTrue(monitoringService.getCapabilities().getCapability().isEmpty());
190 public void testOnCapabilitiesChanged() throws Exception {
191 final String capUri = "test";
192 final Uri uri = new Uri(capUri);
193 final HashSet<Capability> testCaps = new HashSet<>();
194 testCaps.add(new BasicCapability(capUri));
195 final ArgumentCaptor<NetconfCapabilityChange> capabilityChangeCaptor =
196 ArgumentCaptor.forClass(NetconfCapabilityChange.class);
197 final ArgumentCaptor<Capabilities> monitoringListenerCaptor = ArgumentCaptor.forClass(Capabilities.class);
199 monitoringService.onCapabilitiesChanged(testCaps, Collections.emptySet());
201 monitoringService.onCapabilitiesChanged(Collections.emptySet(), testCaps);
203 verify(listener, times(3)).onCapabilitiesChanged((monitoringListenerCaptor.capture()));
204 verify(notificationPublisher, times(2)).onCapabilityChanged(capabilityChangeCaptor.capture());
206 //verify listener calls
207 final List<Capabilities> listenerValues = monitoringListenerCaptor.getAllValues();
208 final List<Uri> afterRegisterState = listenerValues.get(0).getCapability();
209 final List<Uri> afterAddState = listenerValues.get(1).getCapability();
210 final List<Uri> afterRemoveState = listenerValues.get(2).getCapability();
212 Assert.assertEquals(capabilitiesSize, afterRegisterState.size());
213 Assert.assertEquals(capabilitiesSize + 1, afterAddState.size());
214 Assert.assertEquals(capabilitiesSize, afterRemoveState.size());
215 Assert.assertFalse(afterRegisterState.contains(uri));
216 Assert.assertTrue(afterAddState.contains(uri));
217 Assert.assertFalse(afterRemoveState.contains(uri));
219 //verify notification publication
220 final List<NetconfCapabilityChange> publisherValues = capabilityChangeCaptor.getAllValues();
221 final NetconfCapabilityChange afterAdd = publisherValues.get(0);
222 final NetconfCapabilityChange afterRemove = publisherValues.get(1);
224 Assert.assertEquals(Collections.singleton(uri), new HashSet<>(afterAdd.getAddedCapability()));
225 Assert.assertEquals(Collections.emptySet(), new HashSet<>(afterAdd.getDeletedCapability()));
226 Assert.assertEquals(Collections.singleton(uri), new HashSet<>(afterRemove.getDeletedCapability()));
227 Assert.assertEquals(Collections.emptySet(), new HashSet<>(afterRemove.getAddedCapability()));