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;
12 import com.google.common.util.concurrent.ListeningExecutorService;
13 import java.math.BigInteger;
14 import java.net.InetSocketAddress;
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 import org.mockito.Matchers;
20 import org.mockito.Mock;
21 import org.mockito.Mockito;
22 import org.mockito.invocation.InvocationOnMock;
23 import org.mockito.runners.MockitoJUnitRunner;
24 import org.mockito.stubbing.Answer;
25 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
26 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration;
27 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
28 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
29 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
30 import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;
31 import org.opendaylight.openflowplugin.api.openflow.md.core.NotificationEnqueuer;
32 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
33 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionManager;
34 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SwitchSessionKeyOF;
35 import org.opendaylight.openflowplugin.openflow.md.core.role.OfEntityManager;
36 import org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl;
37 import org.opendaylight.openflowplugin.openflow.md.core.sal.SalRegistrationManager;
38 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
39 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;
41 import org.opendaylight.yangtools.yang.binding.RpcService;
44 * test of {@link SessionManagerOFImpl}
46 @RunWith(MockitoJUnitRunner.class)
47 public class SessionManagerOFImplTest {
49 private SessionManager sm;
50 private SwitchSessionKeyOF sessionKey;
52 private SessionContext context;
54 private ConnectionConductor primaryConductor;
56 private ListeningExecutorService rpcPool;
58 private NotificationProviderService notificationProviderService;
60 private RpcProviderRegistry rpcProviderRegistry;
62 private NotificationEnqueuer notificationEnqueuer;
64 private ConnectionAdapter connectionAdapter;
66 private DataBroker dataService;
69 private OfEntityManager entManager;
72 private ModelDrivenSwitchImpl ofSwitch;
76 * prepare session manager
81 Mockito.when(context.getPrimaryConductor()).thenReturn(primaryConductor);
82 Mockito.when(context.getNotificationEnqueuer()).thenReturn(notificationEnqueuer);
84 // provider context - registration responder
85 Mockito.when(rpcProviderRegistry.addRoutedRpcImplementation(Matchers.<Class<RpcService>> any(), any(RpcService.class)))
86 .then(new Answer<RoutedRpcRegistration<?>>() {
88 public RoutedRpcRegistration<?> answer(final InvocationOnMock invocation) {
89 final Object[] args = invocation.getArguments();
90 final RoutedRpcRegistration<RpcService> registration = Mockito.mock(RoutedRpcRegistration.class);
91 Mockito.when(registration.getInstance()).thenReturn((RpcService) args[1]);
96 // session listener - prepare registration and notification mockery
97 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
98 final SalRegistrationManager sessionListener = new SalRegistrationManager(convertorManager);
99 sessionListener.setPublishService(notificationProviderService);
100 sessionListener.setRpcProviderRegistry(rpcProviderRegistry);
101 sessionListener.setDataService(dataService);
102 sessionListener.setOfEntityManager(entManager);
104 // session manager (mimic SalRegistrationManager.onSessionInitiated())
105 sm = SessionManagerOFImpl.getInstance();
106 sm.setRpcPool(rpcPool);
107 sm.registerSessionListener(sessionListener);
108 sm.setNotificationProviderService(notificationProviderService);
110 // session key - switch id
111 sessionKey = new SwitchSessionKeyOF();
112 sessionKey.setDatapathId(BigInteger.valueOf(42));
116 * free session manager
119 public void tearDown() {
120 SessionManagerOFImpl.releaseInstance();
125 * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.session.SessionManagerOFImpl#addSessionContext(SwitchSessionKeyOF, SessionContext)}.
128 public void testAddSessionContext() {
129 // prepare mocks and values
130 final GetFeaturesOutputBuilder featuresBld = new GetFeaturesOutputBuilder().setDatapathId(BigInteger.valueOf(42));
131 featuresBld.setVersion((short) 123);
132 Mockito.when(context.getFeatures()).thenReturn(featuresBld.build());
133 Mockito.when(primaryConductor.getConnectionAdapter()).thenReturn(connectionAdapter);
134 Mockito.when(connectionAdapter.getRemoteAddress()).thenReturn(new InetSocketAddress("10.1.2.3", 4242));
137 sm.addSessionContext(sessionKey, context);
140 //ArgumentCaptor<NotificationQueueWrapper> notifCaptor = ArgumentCaptor.forClass(NotificationQueueWrapper.class);
141 //Mockito.verify(notificationEnqueuer).enqueueNotification(notifCaptor.capture());
143 //Notification notification = notifCaptor.getValue().getNotification();
144 //Assert.assertEquals(NodeUpdated.class, notification.getImplementedInterface());
145 //FlowCapableNodeUpdated fcNodeUpdate = ((NodeUpdated) notification).getAugmentation(FlowCapableNodeUpdated.class);
147 //Assert.assertNotNull(fcNodeUpdate);
148 //Assert.assertEquals("10.1.2.3", fcNodeUpdate.getIpAddress().getIpv4Address().getValue());