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.controller.config.yang.netconf.mdsal.notification;
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.mock;
14 import static org.mockito.Mockito.never;
15 import static org.mockito.Mockito.verify;
17 import java.util.Collections;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.mockito.ArgumentCaptor;
22 import org.mockito.Mock;
23 import org.mockito.MockitoAnnotations;
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
26 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
27 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
28 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
29 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
30 import org.opendaylight.netconf.notifications.NetconfNotificationCollector;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChange;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEnd;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.ZeroBasedCounter32;
38 import org.opendaylight.yangtools.concepts.ListenerRegistration;
40 public class SessionNotificationProducerTest {
42 private SessionNotificationProducer publisher;
45 private BaseNotificationPublisherRegistration registration;
47 private ListenerRegistration listenerRegistration;
50 private NetconfNotificationCollector netconfNotificationCollector;
52 private DataBroker dataBroker;
55 public void setUp() throws Exception {
56 MockitoAnnotations.initMocks(this);
58 doReturn(listenerRegistration).when(dataBroker).registerDataTreeChangeListener(any(DataTreeIdentifier.class), any(DataTreeChangeListener.class));
60 doNothing().when(registration).onCapabilityChanged(any(NetconfCapabilityChange.class));
61 doNothing().when(registration).onSessionStarted(any());
62 doNothing().when(registration).onSessionEnded(any());
64 doReturn(registration).when(netconfNotificationCollector).registerBaseNotificationPublisher();
66 publisher = new SessionNotificationProducer(netconfNotificationCollector, dataBroker);
70 public void testOnDataChangedSessionCreated() throws Exception {
71 final Session session = createSession(1);
72 final DataTreeModification<Session> treeChange = getTreeModification(session, DataObjectModification.ModificationType.WRITE);
73 publisher.onDataTreeChanged(Collections.singleton(treeChange));
74 ArgumentCaptor<NetconfSessionStart> captor = ArgumentCaptor.forClass(NetconfSessionStart.class);
75 verify(registration).onSessionStarted(captor.capture());
76 final NetconfSessionStart value = captor.getValue();
77 Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
78 Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
79 Assert.assertEquals(session.getUsername(), value.getUsername());
83 public void testOnDataChangedSessionUpdated() throws Exception {
84 final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
85 final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
86 final Session sessionBefore = createSessionWithInRpcCount(1, 0);
87 final Session sessionAfter = createSessionWithInRpcCount(1, 1);
88 doReturn(sessionBefore).when(changeObject).getDataBefore();
89 doReturn(sessionAfter).when(changeObject).getDataAfter();
90 doReturn(DataObjectModification.ModificationType.WRITE).when(changeObject).getModificationType();
91 doReturn(changeObject).when(treeChange).getRootNode();
92 publisher.onDataTreeChanged(Collections.singleton(treeChange));
93 //session didn't start, only stats changed. No notification should be produced
94 verify(registration, never()).onSessionStarted(any());
95 verify(registration, never()).onSessionEnded(any());
99 public void testOnDataChangedSessionDeleted() throws Exception {
100 final Session session = createSession(1);
101 final DataTreeModification<Session> data = getTreeModification(session, DataObjectModification.ModificationType.DELETE);
102 publisher.onDataTreeChanged(Collections.singleton(data));
103 ArgumentCaptor<NetconfSessionEnd> captor = ArgumentCaptor.forClass(NetconfSessionEnd.class);
104 verify(registration).onSessionEnded(captor.capture());
105 final NetconfSessionEnd value = captor.getValue();
106 Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
107 Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
108 Assert.assertEquals(session.getUsername(), value.getUsername());
111 private Session createSession(long id) {
112 return createSessionWithInRpcCount(id, 0);
115 private Session createSessionWithInRpcCount(long id, long inRpc) {
116 return new SessionBuilder()
118 .setSourceHost(new Host("0.0.0.0".toCharArray()))
120 .setInRpcs(new ZeroBasedCounter32(inRpc))
124 @SuppressWarnings("unchecked")
125 private DataTreeModification<Session> getTreeModification(Session session, DataObjectModification.ModificationType type) {
126 final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
127 final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
130 doReturn(null).when(changeObject).getDataBefore();
131 doReturn(session).when(changeObject).getDataAfter();
134 doReturn(session).when(changeObject).getDataBefore();
137 doReturn(type).when(changeObject).getModificationType();
138 doReturn(changeObject).when(treeChange).getRootNode();