Upgrade ietf-{inet,yang}-types to 2013-07-15
[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.DataObjectModification;
25 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
26 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEnd;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.ZeroBasedCounter32;
33
34 public class SessionNotificationProducerTest {
35
36     private SessionNotificationProducer publisher;
37     @Mock
38     private BaseNotificationPublisherRegistration registration;
39
40     @Before
41     public void setUp() throws Exception {
42         MockitoAnnotations.initMocks(this);
43         publisher = new SessionNotificationProducer(registration);
44         doNothing().when(registration).onSessionStarted(any());
45         doNothing().when(registration).onSessionEnded(any());
46     }
47
48     @Test
49     public void testOnDataChangedSessionCreated() throws Exception {
50         final Session session = createSession(1);
51         final DataTreeModification<Session> treeChange = getTreeModification(session, DataObjectModification.ModificationType.WRITE);
52         publisher.onDataTreeChanged(Collections.singleton(treeChange));
53         ArgumentCaptor<NetconfSessionStart> captor = ArgumentCaptor.forClass(NetconfSessionStart.class);
54         verify(registration).onSessionStarted(captor.capture());
55         final NetconfSessionStart value = captor.getValue();
56         Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
57         Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
58         Assert.assertEquals(session.getUsername(), value.getUsername());
59     }
60
61     @Test
62     public void testOnDataChangedSessionUpdated() throws Exception {
63         final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
64         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
65         final Session sessionBefore = createSessionWithInRpcCount(1, 0);
66         final Session sessionAfter = createSessionWithInRpcCount(1, 1);
67         doReturn(sessionBefore).when(changeObject).getDataBefore();
68         doReturn(sessionAfter).when(changeObject).getDataAfter();
69         doReturn(DataObjectModification.ModificationType.WRITE).when(changeObject).getModificationType();
70         doReturn(changeObject).when(treeChange).getRootNode();
71         publisher.onDataTreeChanged(Collections.singleton(treeChange));
72         //session didn't start, only stats changed. No notification should be produced
73         verify(registration, never()).onSessionStarted(any());
74         verify(registration, never()).onSessionEnded(any());
75     }
76
77     @Test
78     public void testOnDataChangedSessionDeleted() throws Exception {
79         final Session session = createSession(1);
80         final DataTreeModification<Session> data = getTreeModification(session, DataObjectModification.ModificationType.DELETE);
81         publisher.onDataTreeChanged(Collections.singleton(data));
82         ArgumentCaptor<NetconfSessionEnd> captor = ArgumentCaptor.forClass(NetconfSessionEnd.class);
83         verify(registration).onSessionEnded(captor.capture());
84         final NetconfSessionEnd value = captor.getValue();
85         Assert.assertEquals(session.getSessionId(), value.getSessionId().getValue());
86         Assert.assertEquals(session.getSourceHost().getIpAddress(), value.getSourceHost());
87         Assert.assertEquals(session.getUsername(), value.getUsername());
88     }
89
90     private Session createSession(long id) {
91         return createSessionWithInRpcCount(id, 0);
92     }
93
94     private Session createSessionWithInRpcCount(long id, long inRpc) {
95         return new SessionBuilder()
96                 .setSessionId(id)
97                 .setSourceHost(new Host("0.0.0.0".toCharArray()))
98                 .setUsername("user")
99                 .setInRpcs(new ZeroBasedCounter32(inRpc))
100                 .build();
101     }
102
103     @SuppressWarnings("unchecked")
104     private DataTreeModification<Session> getTreeModification(Session session, DataObjectModification.ModificationType type) {
105         final DataTreeModification<Session> treeChange = mock(DataTreeModification.class);
106         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
107         switch (type) {
108             case WRITE:
109                 doReturn(null).when(changeObject).getDataBefore();
110                 doReturn(session).when(changeObject).getDataAfter();
111                 break;
112             case DELETE:
113                 doReturn(session).when(changeObject).getDataBefore();
114                 break;
115         }
116         doReturn(type).when(changeObject).getModificationType();
117         doReturn(changeObject).when(treeChange).getRootNode();
118         return treeChange;
119     }
120
121 }