Fix netconf-connector-config groupId
[netconf.git] / opendaylight / netconf / messagebus-netconf / src / test / java / org / opendaylight / netconf / messagebus / eventsources / netconf / StreamNotificationTopicRegistrationTest.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.netconf.messagebus.eventsources.netconf;
10
11 import static org.hamcrest.CoreMatchers.hasItems;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.eq;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
16
17 import com.google.common.base.Optional;
18 import com.google.common.util.concurrent.Futures;
19 import java.util.ArrayList;
20 import java.util.Date;
21 import org.junit.Assert;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.mockito.ArgumentCaptor;
25 import org.mockito.Mock;
26 import org.mockito.MockitoAnnotations;
27 import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint;
28 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationListener;
29 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService;
30 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
31 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.messagebus.eventaggregator.rev141202.TopicId;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.Stream;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.StreamBuilder;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
39 import org.opendaylight.yangtools.concepts.ListenerRegistration;
40 import org.opendaylight.yangtools.yang.common.QName;
41 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
42 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
43 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
44
45 public class StreamNotificationTopicRegistrationTest {
46
47     private static final String NS = CreateSubscriptionInput.QNAME.getNamespace().toString();
48     private static final String REV = CreateSubscriptionInput.QNAME.getFormattedRevision();
49     private static final YangInstanceIdentifier.NodeIdentifier STREAM = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REV, "stream"));
50     private static final YangInstanceIdentifier.NodeIdentifier START_TIME = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REV, "startTime"));
51     private static final String STREAM_NAME = "stream-1";
52     private static final SchemaPath createSubscription = SchemaPath.create(true, QName.create(CreateSubscriptionInput.QNAME, "create-subscription"));
53     private static final String PREFIX = ConnectionNotificationTopicRegistration.EVENT_SOURCE_STATUS_PATH.getLastComponent().getNamespace().toString();
54
55     @Mock
56     private NetconfEventSource source;
57     @Mock
58     private DOMMountPoint mountPoint;
59     @Mock
60     private DOMRpcService service;
61     @Mock
62     private DOMNotificationService reference;
63     @Mock
64     private ListenerRegistration<DOMNotificationListener> listenerRegistration;
65
66     private StreamNotificationTopicRegistration registration;
67
68     @Before
69     public void setUp() throws Exception {
70         MockitoAnnotations.initMocks(this);
71
72         Node node = new NodeBuilder().setNodeId(NodeId.getDefaultInstance("node-id")).build();
73         when(source.getNode()).thenReturn(node);
74         when(source.getDOMMountPoint()).thenReturn(mountPoint);
75
76         when(mountPoint.getService(DOMRpcService.class)).thenReturn(Optional.of(service));
77         when(mountPoint.getService(DOMNotificationService.class)).thenReturn(Optional.of(reference));
78         when(reference.registerNotificationListener(any(), eq(ConnectionNotificationTopicRegistration.EVENT_SOURCE_STATUS_PATH)))
79                 .thenReturn(listenerRegistration);
80         when(service.invokeRpc(eq(createSubscription), any())).thenReturn(Futures.immediateCheckedFuture(null));
81
82         Stream stream = new StreamBuilder().setName(StreamNameType.getDefaultInstance(STREAM_NAME)).setReplaySupport(true).build();
83
84         registration = new StreamNotificationTopicRegistration(stream, PREFIX, source);
85     }
86
87     @Test
88     public void testActivateNotificationSource() throws Exception {
89         registration.activateNotificationSource();
90
91         ArgumentCaptor<ContainerNode> captor = ArgumentCaptor.forClass(ContainerNode.class);
92         Assert.assertTrue(registration.isActive());
93         verify(service).invokeRpc(eq(createSubscription), captor.capture());
94         checkStreamName(captor.getValue());
95     }
96
97     @Test
98     public void testReActivateNotificationSource() throws Exception {
99         registration.setActive(true);
100         registration.reActivateNotificationSource();
101
102         ArgumentCaptor<ContainerNode> captor = ArgumentCaptor.forClass(ContainerNode.class);
103         Assert.assertTrue(registration.isActive());
104         verify(service).invokeRpc(eq(createSubscription), captor.capture());
105         checkStreamName(captor.getValue());
106         checkDate(captor.getValue(), Optional.absent());
107     }
108
109     @Test
110     public void testReActivateNotificationSourceWithReplay() throws Exception {
111         final Date lastEventTime = new Date();
112         registration.setActive(true);
113         registration.setLastEventTime(lastEventTime);
114         registration.reActivateNotificationSource();
115
116         ArgumentCaptor<ContainerNode> captor = ArgumentCaptor.forClass(ContainerNode.class);
117         Assert.assertTrue(registration.isActive());
118         verify(service).invokeRpc(eq(createSubscription), captor.capture());
119         checkStreamName(captor.getValue());
120         checkDate(captor.getValue(), Optional.of(lastEventTime));
121     }
122
123     @Test
124     public void testClose() throws Exception {
125         registration.setActive(true);
126         registration.close();
127         Assert.assertFalse(registration.isActive());
128     }
129
130     @Test
131     public void testRegisterAndUnregisterNotificationTopic() throws Exception {
132         final TopicId topic1 = registerTopic("topic1");
133         final TopicId topic2 = registerTopic("topic2");
134         final TopicId topic3 = registerTopic("topic3");
135         final ArrayList<TopicId> notificationTopicIds = registration.getNotificationTopicIds(ConnectionNotificationTopicRegistration.EVENT_SOURCE_STATUS_PATH);
136         Assert.assertNotNull(notificationTopicIds);
137         Assert.assertThat(notificationTopicIds, hasItems(topic1, topic2, topic3));
138
139         registration.unRegisterNotificationTopic(topic3);
140         final ArrayList<TopicId> afterUnregister = registration.getNotificationTopicIds(ConnectionNotificationTopicRegistration.EVENT_SOURCE_STATUS_PATH);
141         Assert.assertNotNull(afterUnregister);
142         Assert.assertThat(afterUnregister, hasItems(topic1, topic2));
143         Assert.assertFalse(afterUnregister.contains(topic3));
144     }
145
146     private TopicId registerTopic(String value) {
147         final TopicId topic = TopicId.getDefaultInstance(value);
148         registration.registerNotificationTopic(ConnectionNotificationTopicRegistration.EVENT_SOURCE_STATUS_PATH, topic);
149         return topic;
150     }
151
152     private void checkStreamName(ContainerNode value) {
153         final String streamName = (String) value.getChild(STREAM).get().getValue();
154         Assert.assertEquals(STREAM_NAME, streamName);
155     }
156
157     private void checkDate(ContainerNode value, Optional<Date> lastEventTime) {
158         final Optional<Date> startTime = (Optional<Date>) value.getChild(START_TIME).get().getValue();
159         Assert.assertEquals(lastEventTime, startTime);
160     }
161
162 }