Update MRI projects for Aluminium
[netconf.git] / netconf / netconf-impl / src / test / java / org / opendaylight / netconf / impl / osgi / NetconfCapabilityMonitoringServiceTest.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.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.times;
17 import static org.mockito.Mockito.verify;
18 import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0;
19 import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_URL_1_0;
20
21 import java.net.URI;
22 import java.util.ArrayList;
23 import java.util.Collections;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.Optional;
27 import java.util.Set;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.mockito.ArgumentCaptor;
31 import org.mockito.Mock;
32 import org.mockito.MockitoAnnotations;
33 import org.opendaylight.netconf.api.capability.BasicCapability;
34 import org.opendaylight.netconf.api.capability.Capability;
35 import org.opendaylight.netconf.api.capability.YangModuleCapability;
36 import org.opendaylight.netconf.api.monitoring.NetconfManagementSession;
37 import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
38 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
39 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.HostBuilder;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.CapabilitiesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChange;
49 import org.opendaylight.yangtools.yang.common.Revision;
50 import org.opendaylight.yangtools.yang.common.Uint32;
51 import org.opendaylight.yangtools.yang.model.api.Module;
52
53 public class NetconfCapabilityMonitoringServiceTest {
54
55     private static final String TEST_MODULE_CONTENT = "content";
56     private static final String TEST_MODULE_CONTENT2 = "content2";
57     private static final String TEST_MODULE_REV = "1970-01-01";
58     private static final String TEST_MODULE_REV2 = "1970-01-02";
59     private static final Uri TEST_MODULE_NAMESPACE = new Uri("testModuleNamespace");
60     private static final String TEST_MODULE_NAME = "testModule";
61     private static final Revision  TEST_MODULE_DATE = Revision.of(TEST_MODULE_REV);
62     private static final Revision TEST_MODULE_DATE2 = Revision.of(TEST_MODULE_REV2);
63
64     private YangModuleCapability moduleCapability1;
65     private YangModuleCapability moduleCapability2;
66     private static final Session SESSION = new SessionBuilder()
67             .setSessionId(Uint32.valueOf(1))
68             .setSourceHost(HostBuilder.getDefaultInstance("0.0.0.0"))
69             .setUsername("admin")
70             .build();
71     private int capabilitiesSize;
72
73     private final Set<Capability> capabilities = new HashSet<>();
74
75     @Mock
76     private Module moduleMock;
77     @Mock
78     private Module moduleMock2;
79     @Mock
80     private NetconfOperationServiceFactory operationServiceFactoryMock;
81     @Mock
82     private NetconfManagementSession sessionMock;
83     @Mock
84     private NetconfMonitoringService.CapabilitiesListener listener;
85     @Mock
86     private BaseNotificationPublisherRegistration notificationPublisher;
87
88     private NetconfCapabilityMonitoringService monitoringService;
89
90     @Before
91     public void setUp() throws Exception {
92         MockitoAnnotations.initMocks(this);
93
94         doReturn(new URI(TEST_MODULE_NAMESPACE.getValue())).when(moduleMock).getNamespace();
95         doReturn(TEST_MODULE_NAME).when(moduleMock).getName();
96         doReturn(Optional.of(TEST_MODULE_DATE)).when(moduleMock).getRevision();
97         moduleCapability1 = new YangModuleCapability(moduleMock, TEST_MODULE_CONTENT);
98
99         capabilities.add(moduleCapability1);
100
101         doReturn(new URI(TEST_MODULE_NAMESPACE.getValue())).when(moduleMock2).getNamespace();
102         doReturn(TEST_MODULE_NAME).when(moduleMock2).getName();
103         doReturn(Optional.of(TEST_MODULE_DATE2)).when(moduleMock2).getRevision();
104         moduleCapability2 = new YangModuleCapability(moduleMock2, TEST_MODULE_CONTENT2);
105
106         capabilities.add(new BasicCapability("urn:ietf:params:netconf:base:1.0"));
107         capabilities.add(new BasicCapability("urn:ietf:params:netconf:base:1.1"));
108         capabilities.add(new BasicCapability("urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&amp;"
109                 + "revision=2010-09-24"));
110
111         doReturn(capabilities).when(operationServiceFactoryMock).getCapabilities();
112         doReturn(null).when(operationServiceFactoryMock)
113                 .registerCapabilityListener(any(NetconfCapabilityMonitoringService.class));
114
115         doReturn(SESSION).when(sessionMock).toManagementSession();
116         doNothing().when(listener).onCapabilitiesChanged(any());
117         doNothing().when(listener).onSchemasChanged(any());
118
119         doNothing().when(notificationPublisher).onCapabilityChanged(any());
120         doNothing().when(notificationPublisher).onSessionStarted(any());
121         doNothing().when(notificationPublisher).onSessionEnded(any());
122
123         monitoringService = new NetconfCapabilityMonitoringService(operationServiceFactoryMock);
124         monitoringService.onCapabilitiesChanged(capabilities, Collections.emptySet());
125         monitoringService.setNotificationPublisher(notificationPublisher);
126         monitoringService.registerListener(listener);
127         capabilitiesSize = monitoringService.getCapabilities().getCapability().size();
128     }
129
130     @Test
131     public void testListeners() throws Exception {
132         HashSet<Capability> added = new HashSet<>();
133         added.add(new BasicCapability("toAdd"));
134         monitoringService.onCapabilitiesChanged(added, Collections.emptySet());
135         //onCapabilitiesChanged and onSchemasChanged are invoked also after listener registration
136         verify(listener, times(2)).onCapabilitiesChanged(any());
137         verify(listener, times(2)).onSchemasChanged(any());
138     }
139
140     @Test
141     public void testGetSchemas() throws Exception {
142         Schemas schemas = monitoringService.getSchemas();
143         Schema schema = schemas.getSchema().values().iterator().next();
144         assertEquals(TEST_MODULE_NAMESPACE, schema.getNamespace());
145         assertEquals(TEST_MODULE_NAME, schema.getIdentifier());
146         assertEquals(TEST_MODULE_REV, schema.getVersion());
147     }
148
149     @Test
150     public void testGetSchemaForCapability() throws Exception {
151         //test multiple revisions of the same capability
152         monitoringService.onCapabilitiesChanged(Collections.singleton(moduleCapability2), Collections.emptySet());
153         final String schema =
154                 monitoringService.getSchemaForModuleRevision(TEST_MODULE_NAME, Optional.of(TEST_MODULE_REV));
155         assertEquals(TEST_MODULE_CONTENT, schema);
156         final String schema2 =
157                 monitoringService.getSchemaForModuleRevision(TEST_MODULE_NAME, Optional.of(TEST_MODULE_REV2));
158         assertEquals(TEST_MODULE_CONTENT2, schema2);
159         //remove one revision
160         monitoringService.onCapabilitiesChanged(Collections.emptySet(), Collections.singleton(moduleCapability1));
161         //only one revision present
162         final String schema3 = monitoringService.getSchemaForModuleRevision(TEST_MODULE_NAME, Optional.empty());
163         assertEquals(TEST_MODULE_CONTENT2, schema3);
164     }
165
166     @Test
167     public void testGetCapabilities() throws Exception {
168         List<Uri> exp = new ArrayList<>();
169         for (Capability capability : capabilities) {
170             exp.add(new Uri(capability.getCapabilityUri()));
171         }
172         //candidate and url capabilities are added by monitoring service automatically
173         exp.add(new Uri(URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0));
174         exp.add(new Uri(URN_IETF_PARAMS_NETCONF_CAPABILITY_URL_1_0));
175         Capabilities expected = new CapabilitiesBuilder().setCapability(exp).build();
176         Capabilities actual = monitoringService.getCapabilities();
177         assertEquals(new HashSet<>(expected.getCapability()), new HashSet<>(actual.getCapability()));
178     }
179
180     @Test
181     public void testClose() throws Exception {
182         assertFalse(monitoringService.getCapabilities().getCapability().isEmpty());
183         monitoringService.close();
184         assertTrue(monitoringService.getCapabilities().getCapability().isEmpty());
185     }
186
187     @Test
188     public void testOnCapabilitiesChanged() throws Exception {
189         final String capUri = "test";
190         final Uri uri = new Uri(capUri);
191         final HashSet<Capability> testCaps = new HashSet<>();
192         testCaps.add(new BasicCapability(capUri));
193         final ArgumentCaptor<NetconfCapabilityChange> capabilityChangeCaptor =
194                 ArgumentCaptor.forClass(NetconfCapabilityChange.class);
195         final ArgumentCaptor<Capabilities> monitoringListenerCaptor = ArgumentCaptor.forClass(Capabilities.class);
196         //add capability
197         monitoringService.onCapabilitiesChanged(testCaps, Collections.emptySet());
198         //remove capability
199         monitoringService.onCapabilitiesChanged(Collections.emptySet(), testCaps);
200
201         verify(listener, times(3)).onCapabilitiesChanged(monitoringListenerCaptor.capture());
202         verify(notificationPublisher, times(2)).onCapabilityChanged(capabilityChangeCaptor.capture());
203
204         //verify listener calls
205         final List<Capabilities> listenerValues = monitoringListenerCaptor.getAllValues();
206         final List<Uri> afterRegisterState = listenerValues.get(0).getCapability();
207         final List<Uri> afterAddState = listenerValues.get(1).getCapability();
208         final List<Uri> afterRemoveState = listenerValues.get(2).getCapability();
209
210         assertEquals(capabilitiesSize, afterRegisterState.size());
211         assertEquals(capabilitiesSize + 1, afterAddState.size());
212         assertEquals(capabilitiesSize, afterRemoveState.size());
213         assertFalse(afterRegisterState.contains(uri));
214         assertTrue(afterAddState.contains(uri));
215         assertFalse(afterRemoveState.contains(uri));
216
217         //verify notification publication
218         final List<NetconfCapabilityChange> publisherValues = capabilityChangeCaptor.getAllValues();
219         final NetconfCapabilityChange afterAdd = publisherValues.get(0);
220         final NetconfCapabilityChange afterRemove = publisherValues.get(1);
221
222         assertEquals(Collections.singleton(uri), new HashSet<>(afterAdd.getAddedCapability()));
223         assertEquals(Collections.emptySet(), new HashSet<>(afterAdd.getDeletedCapability()));
224         assertEquals(Collections.singleton(uri), new HashSet<>(afterRemove.getDeletedCapability()));
225         assertEquals(Collections.emptySet(), new HashSet<>(afterRemove.getAddedCapability()));
226     }
227 }