aa83c680ff8f4ebdc63af1b89961e0ae6d2296e3
[netconf.git] / netconf / mdsal-netconf-notification / src / test / java / org / opendaylight / controller / config / yang / netconf / mdsal / notification / SessionNotificationProducerTest.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.controller.config.yang.netconf.mdsal.notification;
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.mock;
14 import static org.mockito.Mockito.never;
15 import static org.mockito.Mockito.verify;
16
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;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 public class SessionNotificationProducerTest {
43
44     private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducerTest.class);
45
46     private SessionNotificationProducer publisher;
47
48     @Mock
49     private BaseNotificationPublisherRegistration registration;
50     @Mock
51     private ListenerRegistration listenerRegistration;
52
53     @Mock
54     private NetconfNotificationCollector netconfNotificationCollector;
55     @Mock
56     private DataBroker dataBroker;
57
58     @Before
59     public void setUp() throws Exception {
60         MockitoAnnotations.initMocks(this);
61
62         doReturn(listenerRegistration).when(dataBroker).registerDataTreeChangeListener(any(DataTreeIdentifier.class),
63                 any(DataTreeChangeListener.class));
64
65         doNothing().when(registration).onCapabilityChanged(any(NetconfCapabilityChange.class));
66         doNothing().when(registration).onSessionStarted(any());
67         doNothing().when(registration).onSessionEnded(any());
68
69         doReturn(registration).when(netconfNotificationCollector).registerBaseNotificationPublisher();
70
71         publisher = new SessionNotificationProducer(netconfNotificationCollector, dataBroker);
72     }
73
74     @Test
75     public void testOnDataChangedSessionCreated() throws Exception {
76         final Session session = createSession(1);
77         final DataTreeModification<Session> treeChange = getTreeModification(session, DataObjectModification
78                 .ModificationType.WRITE);
79         publisher.onDataTreeChanged(Collections.singleton(treeChange));
80         ArgumentCaptor<NetconfSessionStart> captor = ArgumentCaptor.forClass(NetconfSessionStart.class);
81         verify(registration).onSessionStarted(captor.capture());
82         final NetconfSessionStart value = captor.getValue();
83         Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
84         Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
85         Assert.assertEquals(session.getUsername(), value.getUsername());
86     }
87
88     @Test
89     public void testOnDataChangedSessionUpdated() throws Exception {
90         final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
91         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
92         final Session sessionBefore = createSessionWithInRpcCount(1, 0);
93         final Session sessionAfter = createSessionWithInRpcCount(1, 1);
94         doReturn(sessionBefore).when(changeObject).getDataBefore();
95         doReturn(sessionAfter).when(changeObject).getDataAfter();
96         doReturn(DataObjectModification.ModificationType.WRITE).when(changeObject).getModificationType();
97         doReturn(changeObject).when(treeChange).getRootNode();
98         publisher.onDataTreeChanged(Collections.singleton(treeChange));
99         //session didn't start, only stats changed. No notification should be produced
100         verify(registration, never()).onSessionStarted(any());
101         verify(registration, never()).onSessionEnded(any());
102     }
103
104     @Test
105     public void testOnDataChangedSessionDeleted() throws Exception {
106         final Session session = createSession(1);
107         final DataTreeModification<Session> data = getTreeModification(session, DataObjectModification
108                 .ModificationType.DELETE);
109         publisher.onDataTreeChanged(Collections.singleton(data));
110         ArgumentCaptor<NetconfSessionEnd> captor = ArgumentCaptor.forClass(NetconfSessionEnd.class);
111         verify(registration).onSessionEnded(captor.capture());
112         final NetconfSessionEnd value = captor.getValue();
113         Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
114         Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
115         Assert.assertEquals(session.getUsername(), value.getUsername());
116     }
117
118     private Session createSession(long id) {
119         return createSessionWithInRpcCount(id, 0);
120     }
121
122     private Session createSessionWithInRpcCount(long id, long inRpc) {
123         return new SessionBuilder()
124                 .setSessionId(id)
125                 .setSourceHost(new Host("0.0.0.0".toCharArray()))
126                 .setUsername("user")
127                 .setInRpcs(new ZeroBasedCounter32(inRpc))
128                 .build();
129     }
130
131     @SuppressWarnings("unchecked")
132     private DataTreeModification<Session> getTreeModification(Session session, DataObjectModification
133             .ModificationType type) {
134         final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
135         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
136         switch (type) {
137             case WRITE:
138                 doReturn(null).when(changeObject).getDataBefore();
139                 doReturn(session).when(changeObject).getDataAfter();
140                 break;
141             case DELETE:
142                 doReturn(session).when(changeObject).getDataBefore();
143                 break;
144             default:
145                 LOG.debug("Received intentionally unhandled type: {}.", type);
146         }
147         doReturn(type).when(changeObject).getModificationType();
148         doReturn(changeObject).when(treeChange).getRootNode();
149         return treeChange;
150     }
151
152 }