dc18c6ad5c9c62f707f8c1ede6c8641a94f7231c
[netconf.git] / netconf / mdsal-netconf-notification / src / test / java / org / opendaylight / netconf / mdsal / notification / impl / 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.netconf.mdsal.notification.impl;
9
10 import static org.mockito.ArgumentMatchers.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.junit.runner.RunWith;
22 import org.mockito.ArgumentCaptor;
23 import org.mockito.Mock;
24 import org.mockito.junit.MockitoJUnitRunner;
25 import org.opendaylight.mdsal.binding.api.DataBroker;
26 import org.opendaylight.mdsal.binding.api.DataObjectModification;
27 import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
28 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
29 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
30 import org.opendaylight.mdsal.binding.api.DataTreeModification;
31 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
32 import org.opendaylight.netconf.notifications.NetconfNotificationCollector;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.HostBuilder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEnd;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.ZeroBasedCounter32;
39 import org.opendaylight.yangtools.concepts.ListenerRegistration;
40 import org.opendaylight.yangtools.yang.common.Uint32;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44 @RunWith(MockitoJUnitRunner.StrictStubs.class)
45 public class SessionNotificationProducerTest {
46
47     private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducerTest.class);
48
49     private SessionNotificationProducer publisher;
50
51     @Mock
52     private BaseNotificationPublisherRegistration registration;
53     @Mock
54     private ListenerRegistration listenerRegistration;
55
56     @Mock
57     private NetconfNotificationCollector netconfNotificationCollector;
58     @Mock
59     private DataBroker dataBroker;
60
61     @Before
62     public void setUp() {
63         doReturn(listenerRegistration).when(dataBroker).registerDataTreeChangeListener(any(DataTreeIdentifier.class),
64                 any(DataTreeChangeListener.class));
65         doNothing().when(registration).onSessionStarted(any());
66         doNothing().when(registration).onSessionEnded(any());
67
68         doReturn(registration).when(netconfNotificationCollector).registerBaseNotificationPublisher();
69
70         publisher = new SessionNotificationProducer(netconfNotificationCollector, dataBroker);
71     }
72
73     @Test
74     public void testOnDataChangedSessionCreated() throws Exception {
75         final Session session = createSession(Uint32.ONE);
76         final DataTreeModification<Session> treeChange = getTreeModification(session, ModificationType.WRITE);
77         publisher.onDataTreeChanged(Collections.singleton(treeChange));
78         ArgumentCaptor<NetconfSessionStart> captor = ArgumentCaptor.forClass(NetconfSessionStart.class);
79         verify(registration).onSessionStarted(captor.capture());
80         final NetconfSessionStart value = captor.getValue();
81         Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
82         Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
83         Assert.assertEquals(session.getUsername(), value.getUsername());
84     }
85
86     @Test
87     public void testOnDataChangedSessionUpdated() throws Exception {
88         final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
89         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
90         final Session sessionBefore = createSessionWithInRpcCount(Uint32.ONE, Uint32.ZERO);
91         final Session sessionAfter = createSessionWithInRpcCount(Uint32.ONE, Uint32.ONE);
92         doReturn(sessionBefore).when(changeObject).getDataBefore();
93         doReturn(sessionAfter).when(changeObject).getDataAfter();
94         doReturn(ModificationType.WRITE).when(changeObject).getModificationType();
95         doReturn(changeObject).when(treeChange).getRootNode();
96         publisher.onDataTreeChanged(Collections.singleton(treeChange));
97         //session didn't start, only stats changed. No notification should be produced
98         verify(registration, never()).onSessionStarted(any());
99         verify(registration, never()).onSessionEnded(any());
100     }
101
102     @Test
103     public void testOnDataChangedSessionDeleted() throws Exception {
104         final Session session = createSession(Uint32.ONE);
105         final DataTreeModification<Session> data = getTreeModification(session, ModificationType.DELETE);
106         publisher.onDataTreeChanged(Collections.singleton(data));
107         ArgumentCaptor<NetconfSessionEnd> captor = ArgumentCaptor.forClass(NetconfSessionEnd.class);
108         verify(registration).onSessionEnded(captor.capture());
109         final NetconfSessionEnd value = captor.getValue();
110         Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
111         Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
112         Assert.assertEquals(session.getUsername(), value.getUsername());
113     }
114
115     private static Session createSession(final Uint32 id) {
116         return createSessionWithInRpcCount(id, Uint32.ZERO);
117     }
118
119     private static Session createSessionWithInRpcCount(final Uint32 id, final Uint32 inRpc) {
120         return new SessionBuilder()
121                 .setSessionId(id)
122                 .setSourceHost(HostBuilder.getDefaultInstance("0.0.0.0"))
123                 .setUsername("user")
124                 .setInRpcs(new ZeroBasedCounter32(inRpc))
125                 .build();
126     }
127
128     @SuppressWarnings("unchecked")
129     private static DataTreeModification<Session> getTreeModification(final Session session,
130             final ModificationType type) {
131         final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
132         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
133         switch (type) {
134             case WRITE:
135                 doReturn(null).when(changeObject).getDataBefore();
136                 doReturn(session).when(changeObject).getDataAfter();
137                 break;
138             case DELETE:
139                 doReturn(session).when(changeObject).getDataBefore();
140                 break;
141             default:
142                 LOG.debug("Received intentionally unhandled type: {}.", type);
143         }
144         doReturn(type).when(changeObject).getModificationType();
145         doReturn(changeObject).when(treeChange).getRootNode();
146         return treeChange;
147     }
148
149 }