Encapsulate OpenFlowPlugin configuration
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / device / DeviceManagerImplTest.java
1 /*
2  * Copyright (c) 2015 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
9 package org.opendaylight.openflowplugin.impl.device;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.verify;
14 import static org.mockito.Mockito.when;
15
16 import com.google.common.util.concurrent.CheckedFuture;
17 import io.netty.util.HashedWheelTimer;
18 import java.lang.reflect.Field;
19 import java.math.BigInteger;
20 import java.util.concurrent.ConcurrentHashMap;
21 import org.junit.Assert;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.Mock;
26 import org.mockito.runners.MockitoJUnitRunner;
27 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
28 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
29 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
30 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
31 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
32 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
33 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
34 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
35 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
36 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency;
37 import org.opendaylight.openflowplugin.impl.device.initialization.DeviceInitializerProviderFactory;
38 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Capabilities;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.CapabilitiesV10;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.NonZeroUint16Type;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.NonZeroUint32Type;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.OpenflowProviderConfigBuilder;
46
47 @RunWith(MockitoJUnitRunner.class)
48 public class DeviceManagerImplTest {
49
50     private static final long TEST_VALUE_GLOBAL_NOTIFICATION_QUOTA = 2000L;
51     private static final int barrierCountLimit = 25600;
52     private static final long barrierIntervalNanos = 500;
53     private static final NodeId DUMMY_NODE_ID = new NodeId("dummyNodeId");
54
55     @Mock
56     private CheckedFuture<Void, TransactionCommitFailedException> mockedFuture;
57     @Mock
58     private FeaturesReply mockFeatures;
59     @Mock
60     private ConnectionContext mockConnectionContext;
61     @Mock
62     private ConnectionAdapter mockedConnectionAdapter;
63     @Mock
64     private DeviceContextImpl mockedDeviceContext;
65     @Mock
66     private MessageIntelligenceAgency messageIntelligenceAgency;
67     @Mock
68     private DeviceInfo deviceInfo;
69     @Mock
70     private ConvertorExecutor convertorExecutor;
71     @Before
72     public void setUp() throws Exception {
73         when(mockConnectionContext.getNodeId()).thenReturn(DUMMY_NODE_ID);
74         when(mockConnectionContext.getFeatures()).thenReturn(mockFeatures);
75         when(mockConnectionContext.getConnectionAdapter()).thenReturn(mockedConnectionAdapter);
76         when(mockConnectionContext.getDeviceInfo()).thenReturn(deviceInfo);
77         when(mockedDeviceContext.getPrimaryConnectionContext()).thenReturn(mockConnectionContext);
78         when(deviceInfo.getNodeId()).thenReturn(DUMMY_NODE_ID);
79
80         final Capabilities capabilitiesV13 = mock(Capabilities.class);
81         final CapabilitiesV10 capabilitiesV10 = mock(CapabilitiesV10.class);
82         when(mockFeatures.getCapabilities()).thenReturn(capabilitiesV13);
83         when(mockFeatures.getCapabilitiesV10()).thenReturn(capabilitiesV10);
84         when(mockFeatures.getDatapathId()).thenReturn(BigInteger.valueOf(21L));
85     }
86
87     private DeviceManagerImpl prepareDeviceManager() {
88         final DataBroker mockedDataBroker = mock(DataBroker.class);
89         final WriteTransaction mockedWriteTransaction = mock(WriteTransaction.class);
90
91         final BindingTransactionChain mockedTxChain = mock(BindingTransactionChain.class);
92         final WriteTransaction mockedWTx = mock(WriteTransaction.class);
93         when(mockedTxChain.newWriteOnlyTransaction()).thenReturn(mockedWTx);
94         when(mockedDataBroker.createTransactionChain(any(TransactionChainListener.class))).thenReturn
95                 (mockedTxChain);
96         when(mockedDataBroker.newWriteOnlyTransaction()).thenReturn(mockedWriteTransaction);
97
98         when(mockedWriteTransaction.submit()).thenReturn(mockedFuture);
99
100         final DeviceManagerImpl deviceManager = new DeviceManagerImpl(
101                 new OpenflowProviderConfigBuilder()
102                         .setBarrierCountLimit(new NonZeroUint16Type(barrierCountLimit))
103                         .setBarrierIntervalTimeoutLimit(new NonZeroUint32Type(barrierIntervalNanos))
104                         .setGlobalNotificationQuota(TEST_VALUE_GLOBAL_NOTIFICATION_QUOTA)
105                         .setSwitchFeaturesMandatory(false)
106                         .setEnableFlowRemovedNotification(true)
107                         .setSkipTableFeatures(false)
108                         .build(),
109                 mockedDataBroker,
110                 messageIntelligenceAgency,
111                 null,
112                 new HashedWheelTimer(),
113                 convertorExecutor,
114                 DeviceInitializerProviderFactory.createDefaultProvider());
115
116         return deviceManager;
117     }
118
119     @Test
120     public void testClose() throws Exception {
121         final DeviceContext deviceContext = mock(DeviceContext.class);
122         final DeviceManagerImpl deviceManager = prepareDeviceManager();
123         final ConcurrentHashMap<DeviceInfo, DeviceContext> deviceContexts = getContextsCollection(deviceManager);
124         deviceContexts.put(deviceInfo, deviceContext);
125         Assert.assertEquals(1, deviceContexts.size());
126
127         deviceManager.close();
128
129         verify(deviceContext).close();
130     }
131
132     private static ConcurrentHashMap<DeviceInfo, DeviceContext> getContextsCollection(final DeviceManagerImpl deviceManager) throws NoSuchFieldException, IllegalAccessException {
133         // HACK: contexts collection for testing shall be accessed in some more civilized way
134         final Field contextsField = DeviceManagerImpl.class.getDeclaredField("deviceContexts");
135         Assert.assertNotNull(contextsField);
136         contextsField.setAccessible(true);
137         return (ConcurrentHashMap<DeviceInfo, DeviceContext>) contextsField.get(deviceManager);
138     }
139
140 }