2 * Copyright (c) 2014 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.openflowplugin.openflow.md.core.session;
10 import static org.mockito.Matchers.any;
11 import com.google.common.util.concurrent.ListeningExecutorService;
12 import java.math.BigInteger;
13 import java.net.InetSocketAddress;
14 import org.junit.After;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.junit.runner.RunWith;
18 import org.mockito.Matchers;
19 import org.mockito.Mock;
20 import org.mockito.Mockito;
21 import org.mockito.invocation.InvocationOnMock;
22 import org.mockito.runners.MockitoJUnitRunner;
23 import org.mockito.stubbing.Answer;
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration;
26 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
27 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
28 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
29 import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;
30 import org.opendaylight.openflowplugin.api.openflow.md.core.NotificationEnqueuer;
31 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
32 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionManager;
33 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SwitchSessionKeyOF;
34 import org.opendaylight.openflowplugin.openflow.md.core.role.OfEntityManager;
35 import org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl;
36 import org.opendaylight.openflowplugin.openflow.md.core.sal.SalRegistrationManager;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;
38 import org.opendaylight.yangtools.yang.binding.RpcService;
41 * test of {@link SessionManagerOFImpl}
43 @RunWith(MockitoJUnitRunner.class)
44 public class SessionManagerOFImplTest {
46 private SessionManager sm;
47 private SwitchSessionKeyOF sessionKey;
49 private SessionContext context;
51 private ConnectionConductor primaryConductor;
53 private ListeningExecutorService rpcPool;
55 private NotificationProviderService notificationProviderService;
57 private RpcProviderRegistry rpcProviderRegistry;
59 private NotificationEnqueuer notificationEnqueuer;
61 private ConnectionAdapter connectionAdapter;
63 private DataBroker dataService;
66 private OfEntityManager entManager;
69 private ModelDrivenSwitchImpl ofSwitch;
73 * prepare session manager
78 Mockito.when(context.getPrimaryConductor()).thenReturn(primaryConductor);
79 Mockito.when(context.getNotificationEnqueuer()).thenReturn(notificationEnqueuer);
81 // provider context - registration responder
82 Mockito.when(rpcProviderRegistry.addRoutedRpcImplementation(Matchers.<Class<RpcService>> any(), any(RpcService.class)))
83 .then(new Answer<RoutedRpcRegistration<?>>() {
85 public RoutedRpcRegistration<?> answer(final InvocationOnMock invocation) {
86 final Object[] args = invocation.getArguments();
87 final RoutedRpcRegistration<RpcService> registration = Mockito.mock(RoutedRpcRegistration.class);
88 Mockito.when(registration.getInstance()).thenReturn((RpcService) args[1]);
93 // session listener - prepare registration and notification mockery
94 final SalRegistrationManager sessionListener = new SalRegistrationManager();
95 sessionListener.setPublishService(notificationProviderService);
96 sessionListener.setRpcProviderRegistry(rpcProviderRegistry);
97 sessionListener.setDataService(dataService);
98 sessionListener.setOfEntityManager(entManager);
100 // session manager (mimic SalRegistrationManager.onSessionInitiated())
101 sm = SessionManagerOFImpl.getInstance();
102 sm.setRpcPool(rpcPool);
103 sm.registerSessionListener(sessionListener);
104 sm.setNotificationProviderService(notificationProviderService);
106 // session key - switch id
107 sessionKey = new SwitchSessionKeyOF();
108 sessionKey.setDatapathId(BigInteger.valueOf(42));
112 * free session manager
115 public void tearDown() {
116 SessionManagerOFImpl.releaseInstance();
121 * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.session.SessionManagerOFImpl#addSessionContext(SwitchSessionKeyOF, SessionContext)}.
124 public void testAddSessionContext() {
125 // prepare mocks and values
126 final GetFeaturesOutputBuilder featuresBld = new GetFeaturesOutputBuilder().setDatapathId(BigInteger.valueOf(42));
127 featuresBld.setVersion((short) 123);
128 Mockito.when(context.getFeatures()).thenReturn(featuresBld.build());
129 Mockito.when(primaryConductor.getConnectionAdapter()).thenReturn(connectionAdapter);
130 Mockito.when(connectionAdapter.getRemoteAddress()).thenReturn(new InetSocketAddress("10.1.2.3", 4242));
133 sm.addSessionContext(sessionKey, context);
136 //ArgumentCaptor<NotificationQueueWrapper> notifCaptor = ArgumentCaptor.forClass(NotificationQueueWrapper.class);
137 //Mockito.verify(notificationEnqueuer).enqueueNotification(notifCaptor.capture());
139 //Notification notification = notifCaptor.getValue().getNotification();
140 //Assert.assertEquals(NodeUpdated.class, notification.getImplementedInterface());
141 //FlowCapableNodeUpdated fcNodeUpdate = ((NodeUpdated) notification).getAugmentation(FlowCapableNodeUpdated.class);
143 //Assert.assertNotNull(fcNodeUpdate);
144 //Assert.assertEquals("10.1.2.3", fcNodeUpdate.getIpAddress().getIpv4Address().getValue());