--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netconf.impl.osgi;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+
+import com.google.common.base.Optional;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
+import org.opendaylight.netconf.api.capability.BasicCapability;
+import org.opendaylight.netconf.api.capability.Capability;
+import org.opendaylight.netconf.api.monitoring.NetconfManagementSession;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.netconf.api.monitoring.SessionEvent;
+import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.HostBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
+
+public class NetconfSessionMonitoringServiceTest {
+
+ private static final Session SESSION_1 = new SessionBuilder()
+ .setSessionId(1L)
+ .setSourceHost(HostBuilder.getDefaultInstance("0.0.0.0"))
+ .setUsername("admin")
+ .build();
+ private static final Session SESSION_2 = new SessionBuilder()
+ .setSessionId(2L)
+ .setSourceHost(HostBuilder.getDefaultInstance("0.0.0.0"))
+ .setUsername("admin")
+ .build();
+
+ @Mock
+ private NetconfManagementSession sessionMock1;
+ @Mock
+ private NetconfManagementSession sessionMock2;
+ @Mock
+ private NetconfMonitoringService.SessionsListener listener;
+ @Mock
+ private BaseNotificationPublisherRegistration notificationPublisher;
+
+ private NetconfSessionMonitoringService monitoringService;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ doReturn(SESSION_1).when(sessionMock1).toManagementSession();
+ doReturn(SESSION_2).when(sessionMock2).toManagementSession();
+ doNothing().when(listener).onSessionStarted(any());
+ doNothing().when(listener).onSessionEnded(any());
+
+ doNothing().when(notificationPublisher).onCapabilityChanged(any());
+ doNothing().when(notificationPublisher).onSessionStarted(any());
+ doNothing().when(notificationPublisher).onSessionEnded(any());
+
+ monitoringService = new NetconfSessionMonitoringService(Optional.absent(), 0);
+ monitoringService.registerListener(listener);
+ }
+
+ @Test
+ public void testListeners() throws Exception {
+ monitoringService.onSessionUp(sessionMock1);
+ HashSet<Capability> added = new HashSet<>();
+ added.add(new BasicCapability("toAdd"));
+ monitoringService.onSessionDown(sessionMock1);
+ verify(listener).onSessionStarted(any());
+ verify(listener).onSessionEnded(any());
+ }
+
+
+ @Test
+ public void testClose() throws Exception {
+ monitoringService.onSessionUp(sessionMock1);
+ Assert.assertFalse(monitoringService.getSessions().getSession().isEmpty());
+ monitoringService.close();
+ Assert.assertTrue(monitoringService.getSessions().getSession().isEmpty());
+ }
+
+
+ @Test
+ public void testOnSessionUpAndDown() throws Exception {
+ monitoringService.onSessionUp(sessionMock1);
+ ArgumentCaptor<Session> sessionUpCaptor = ArgumentCaptor.forClass(Session.class);
+ verify(listener).onSessionStarted(sessionUpCaptor.capture());
+ final Session sesionUp = sessionUpCaptor.getValue();
+ Assert.assertEquals(SESSION_1.getSessionId(), sesionUp.getSessionId());
+ Assert.assertEquals(SESSION_1.getSourceHost(), sesionUp.getSourceHost());
+ Assert.assertEquals(SESSION_1.getUsername(), sesionUp.getUsername());
+
+ monitoringService.onSessionDown(sessionMock1);
+ ArgumentCaptor<Session> sessionDownCaptor = ArgumentCaptor.forClass(Session.class);
+ verify(listener).onSessionEnded(sessionDownCaptor.capture());
+ final Session sessionDown = sessionDownCaptor.getValue();
+ Assert.assertEquals(SESSION_1.getSessionId(), sessionDown.getSessionId());
+ Assert.assertEquals(SESSION_1.getSourceHost(), sessionDown.getSourceHost());
+ Assert.assertEquals(SESSION_1.getUsername(), sessionDown.getUsername());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void testListenerUpdateSession() throws Exception {
+ ScheduledThreadPool threadPool = mock(ScheduledThreadPool.class);
+ ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+ doReturn(executor).when(threadPool).getExecutor();
+ monitoringService = new NetconfSessionMonitoringService(Optional.of(threadPool), 1);
+ monitoringService.registerListener(listener);
+ monitoringService.onSessionUp(sessionMock1);
+ monitoringService.onSessionUp(sessionMock2);
+ monitoringService.onSessionEvent(SessionEvent.inRpcSuccess(sessionMock1));
+ ArgumentCaptor<Collection> captor =
+ ArgumentCaptor.forClass(Collection.class);
+ verify(listener, timeout(2000)).onSessionsUpdated(captor.capture());
+ final Collection<Session> value = captor.getValue();
+ Assert.assertTrue(value.contains(SESSION_1));
+ Assert.assertFalse(value.contains(SESSION_2));
+ monitoringService.close();
+ }
+}