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 com.google.common.util.concurrent.ListeningExecutorService;
11 import java.math.BigInteger;
12 import java.net.InetSocketAddress;
13 import org.junit.After;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.junit.runner.RunWith;
18 import org.mockito.ArgumentCaptor;
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.NotificationQueueWrapper;
33 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
34 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionManager;
35 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SwitchSessionKeyOF;
36 import org.opendaylight.openflowplugin.openflow.md.core.role.OfEntityManager;
37 import org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl;
38 import org.opendaylight.openflowplugin.openflow.md.core.sal.SalRegistrationManager;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;
43 import org.opendaylight.yangtools.yang.binding.Notification;
44 import org.opendaylight.yangtools.yang.binding.RpcService;
46 import static org.mockito.Matchers.any;
49 * test of {@link SessionManagerOFImpl}
51 @RunWith(MockitoJUnitRunner.class)
52 public class SessionManagerOFImplTest {
54 private SessionManager sm;
55 private SwitchSessionKeyOF sessionKey;
57 private SessionContext context;
59 private ConnectionConductor primaryConductor;
61 private ListeningExecutorService rpcPool;
63 private NotificationProviderService notificationProviderService;
65 private RpcProviderRegistry rpcProviderRegistry;
67 private NotificationEnqueuer notificationEnqueuer;
69 private ConnectionAdapter connectionAdapter;
71 private DataBroker dataService;
74 private OfEntityManager entManager;
77 private ModelDrivenSwitchImpl ofSwitch;
81 * prepare session manager
86 Mockito.when(context.getPrimaryConductor()).thenReturn(primaryConductor);
87 Mockito.when(context.getNotificationEnqueuer()).thenReturn(notificationEnqueuer);
89 // provider context - registration responder
90 Mockito.when(rpcProviderRegistry.addRoutedRpcImplementation(any(Class.class), any(RpcService.class)))
91 .then(new Answer<RoutedRpcRegistration<?>>() {
93 public RoutedRpcRegistration<?> answer(InvocationOnMock invocation) {
94 Object[] args = invocation.getArguments();
95 RoutedRpcRegistration<RpcService> registration = Mockito.mock(RoutedRpcRegistration.class);
96 Mockito.when(registration.getInstance()).thenReturn((RpcService) args[1]);
101 // session listener - prepare registration and notification mockery
102 SalRegistrationManager sessionListener = new SalRegistrationManager();
103 sessionListener.setPublishService(notificationProviderService);
104 sessionListener.setRpcProviderRegistry(rpcProviderRegistry);
105 sessionListener.setDataService(dataService);
106 sessionListener.setOfEntityManager(entManager);
108 // session manager (mimic SalRegistrationManager.onSessionInitiated())
109 sm = SessionManagerOFImpl.getInstance();
110 sm.setRpcPool(rpcPool);
111 sm.registerSessionListener(sessionListener);
112 sm.setNotificationProviderService(notificationProviderService);
114 // session key - switch id
115 sessionKey = new SwitchSessionKeyOF();
116 sessionKey.setDatapathId(BigInteger.valueOf(42));
120 * free session manager
123 public void tearDown() {
124 SessionManagerOFImpl.releaseInstance();
129 * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.session.SessionManagerOFImpl#addSessionContext(SwitchSessionKeyOF, SessionContext)}.
132 public void testAddSessionContext() {
133 // prepare mocks and values
134 GetFeaturesOutputBuilder featuresBld = new GetFeaturesOutputBuilder().setDatapathId(BigInteger.valueOf(42));
135 featuresBld.setVersion((short) 123);
136 Mockito.when(context.getFeatures()).thenReturn(featuresBld.build());
137 Mockito.when(primaryConductor.getConnectionAdapter()).thenReturn(connectionAdapter);
138 Mockito.when(connectionAdapter.getRemoteAddress()).thenReturn(new InetSocketAddress("10.1.2.3", 4242));
141 sm.addSessionContext(sessionKey, context);
144 //ArgumentCaptor<NotificationQueueWrapper> notifCaptor = ArgumentCaptor.forClass(NotificationQueueWrapper.class);
145 //Mockito.verify(notificationEnqueuer).enqueueNotification(notifCaptor.capture());
147 //Notification notification = notifCaptor.getValue().getNotification();
148 //Assert.assertEquals(NodeUpdated.class, notification.getImplementedInterface());
149 //FlowCapableNodeUpdated fcNodeUpdate = ((NodeUpdated) notification).getAugmentation(FlowCapableNodeUpdated.class);
151 //Assert.assertNotNull(fcNodeUpdate);
152 //Assert.assertEquals("10.1.2.3", fcNodeUpdate.getIpAddress().getIpv4Address().getValue());