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
9 package org.opendaylight.netconf.messagebus.eventsources.netconf;
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;
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;
45 public class StreamNotificationTopicRegistrationTest {
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();
56 private NetconfEventSource source;
58 private DOMMountPoint mountPoint;
60 private DOMRpcService service;
62 private DOMNotificationService reference;
64 private ListenerRegistration<DOMNotificationListener> listenerRegistration;
66 private StreamNotificationTopicRegistration registration;
69 public void setUp() throws Exception {
70 MockitoAnnotations.initMocks(this);
72 Node node = new NodeBuilder().setNodeId(NodeId.getDefaultInstance("node-id")).build();
73 when(source.getNode()).thenReturn(node);
74 when(source.getDOMMountPoint()).thenReturn(mountPoint);
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));
82 Stream stream = new StreamBuilder().setName(StreamNameType.getDefaultInstance(STREAM_NAME)).setReplaySupport(true).build();
84 registration = new StreamNotificationTopicRegistration(stream, PREFIX, source);
88 public void testActivateNotificationSource() throws Exception {
89 registration.activateNotificationSource();
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());
98 public void testReActivateNotificationSource() throws Exception {
99 registration.setActive(true);
100 registration.reActivateNotificationSource();
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());
110 public void testReActivateNotificationSourceWithReplay() throws Exception {
111 final Date lastEventTime = new Date();
112 registration.setActive(true);
113 registration.setLastEventTime(lastEventTime);
114 registration.reActivateNotificationSource();
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));
124 public void testClose() throws Exception {
125 registration.setActive(true);
126 registration.close();
127 Assert.assertFalse(registration.isActive());
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));
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));
146 private TopicId registerTopic(String value) {
147 final TopicId topic = TopicId.getDefaultInstance(value);
148 registration.registerNotificationTopic(ConnectionNotificationTopicRegistration.EVENT_SOURCE_STATUS_PATH, topic);
152 private void checkStreamName(ContainerNode value) {
153 final String streamName = (String) value.getChild(STREAM).get().getValue();
154 Assert.assertEquals(STREAM_NAME, streamName);
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);