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