Bump upstreams
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / statistics / StatisticsManagerImplTest.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 package org.opendaylight.openflowplugin.impl.statistics;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
16
17 import com.google.common.util.concurrent.ListenableFuture;
18 import com.google.common.util.concurrent.MoreExecutors;
19 import java.util.List;
20 import java.util.concurrent.ExecutionException;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.Mock;
25 import org.mockito.junit.MockitoJUnitRunner;
26 import org.opendaylight.mdsal.binding.api.DataBroker;
27 import org.opendaylight.mdsal.binding.api.RpcProviderService;
28 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
29 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue;
30 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
31 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
32 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
33 import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
34 import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
35 import org.opendaylight.openflowplugin.api.openflow.device.handlers.MultiMsgCollector;
36 import org.opendaylight.openflowplugin.api.openflow.lifecycle.ReconciliationFrameworkRegistrar;
37 import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsContext;
38 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
39 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
40 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.NonZeroUint32Type;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.OpenflowProviderConfigBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.sm.control.rev150812.ChangeStatisticsWorkModeInputBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.sm.control.rev150812.ChangeStatisticsWorkModeOutput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.sm.control.rev150812.StatisticsWorkMode;
52 import org.opendaylight.yangtools.concepts.Registration;
53 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
54 import org.opendaylight.yangtools.yang.binding.Rpc;
55 import org.opendaylight.yangtools.yang.common.RpcResult;
56 import org.opendaylight.yangtools.yang.common.Uint32;
57
58 @RunWith(MockitoJUnitRunner.class)
59 public class StatisticsManagerImplTest {
60     public static final NodeId NODE_ID = new NodeId("ofp-unit-dummy-node-id");
61
62     @Mock
63     private ConnectionContext mockedPrimConnectionContext;
64     @Mock
65     private FeaturesReply mockedFeatures;
66     @Mock
67     private ConnectionAdapter mockedConnectionAdapter;
68     @Mock
69     private MessageSpy mockedMessagSpy;
70     @Mock
71     private DeviceContext mockedDeviceContext;
72     @Mock
73     private DeviceState mockedDeviceState;
74     @Mock
75     private DeviceInfo mockedDeviceInfo;
76     @Mock
77     private RpcProviderService rpcProviderRegistry;
78     @Mock
79     private OutboundQueue outboundQueue;
80     @Mock
81     private MultiMsgCollector multiMagCollector;
82     @Mock
83     private Registration serviceControlRegistration;
84     @Mock
85     private DeviceInfo deviceInfo;
86     @Mock
87     private DataBroker dataBroker;
88     @Mock
89     private ReconciliationFrameworkRegistrar reconciliationFrameworkRegistrar;
90     @Mock
91     private StatisticsContext statisticContext;
92
93     private RequestContext<List<MultipartReply>> currentRequestContext;
94     private StatisticsManagerImpl statisticsManager;
95
96     @Before
97     public void initialization() {
98         final KeyedInstanceIdentifier<Node, NodeKey> nodePath = KeyedInstanceIdentifier
99                 .create(Nodes.class)
100                 .child(Node.class, new NodeKey(new NodeId("openflow:10")));
101
102         when(rpcProviderRegistry.registerRpcImplementations(any(Rpc[].class))).thenReturn(serviceControlRegistration);
103
104         final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
105
106         statisticsManager = new StatisticsManagerImpl(
107                 new OpenflowProviderConfigBuilder()
108                         .setBasicTimerDelay(new NonZeroUint32Type(Uint32.valueOf(3000)))
109                         .setMaximumTimerDelay(new NonZeroUint32Type(Uint32.valueOf(900000)))
110                         .setIsStatisticsPollingOn(false)
111                         .build(), rpcProviderRegistry,
112                 convertorManager,
113                 MoreExecutors.directExecutor());
114     }
115
116     @Test
117     public void testGetStatisticsWorkMode() throws Exception {
118         final var workMode = statisticsManager.getStatisticsWorkMode(null);
119         assertTrue(workMode.isDone());
120         assertTrue(workMode.get().isSuccessful());
121         assertNotNull(workMode.get().getResult());
122         assertEquals(StatisticsWorkMode.COLLECTALL, workMode.get().getResult().getMode());
123     }
124
125     /**
126      * switching to {@link StatisticsWorkMode#FULLYDISABLED}; no pollTimeout and no lifecycleRegistry.
127      *
128      */
129     @Test
130     public void testChangeStatisticsWorkMode1() throws Exception {
131         statisticsManager.contexts.put(deviceInfo, statisticContext);
132
133         final ChangeStatisticsWorkModeInputBuilder changeStatisticsWorkModeInputBld =
134                 new ChangeStatisticsWorkModeInputBuilder()
135                         .setMode(StatisticsWorkMode.FULLYDISABLED);
136
137         final ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode = statisticsManager
138                 .changeStatisticsWorkMode(changeStatisticsWorkModeInputBld.build());
139
140         checkWorkModeChangeOutcome(workMode);
141         verify(statisticContext).disableGathering();
142     }
143
144     private static void checkWorkModeChangeOutcome(
145             final ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode)
146             throws InterruptedException, ExecutionException {
147         assertTrue(workMode.isDone());
148         assertTrue(workMode.get().isSuccessful());
149     }
150
151
152     /**
153      * Switching to {@link StatisticsWorkMode#FULLYDISABLED}; with pollTimeout and lifecycleRegistry.
154      *
155      */
156     @Test
157     public void testChangeStatisticsWorkMode2() throws Exception {
158         statisticsManager.contexts.put(deviceInfo, statisticContext);
159
160         final ChangeStatisticsWorkModeInputBuilder changeStatisticsWorkModeInputBld =
161                 new ChangeStatisticsWorkModeInputBuilder()
162                         .setMode(StatisticsWorkMode.FULLYDISABLED);
163
164         ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode = statisticsManager
165             .changeStatisticsWorkMode(changeStatisticsWorkModeInputBld.build());
166         checkWorkModeChangeOutcome(workMode);
167
168         verify(statisticContext).disableGathering();
169     }
170
171     /**
172      * Tests switching to {@link StatisticsWorkMode#FULLYDISABLED} and back
173      * to {@link StatisticsWorkMode#COLLECTALL}; with lifecycleRegistry and pollTimeout.
174      *
175      */
176     @Test
177     public void testChangeStatisticsWorkMode3() throws Exception {
178         statisticsManager.contexts.put(deviceInfo, statisticContext);
179
180         final ChangeStatisticsWorkModeInputBuilder changeStatisticsWorkModeInputBld =
181                 new ChangeStatisticsWorkModeInputBuilder()
182                         .setMode(StatisticsWorkMode.FULLYDISABLED);
183
184         ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode;
185         workMode = statisticsManager.changeStatisticsWorkMode(
186                 changeStatisticsWorkModeInputBld.build());
187         checkWorkModeChangeOutcome(workMode);
188
189         verify(statisticContext).disableGathering();
190
191         changeStatisticsWorkModeInputBld.setMode(StatisticsWorkMode.COLLECTALL);
192         workMode = statisticsManager.changeStatisticsWorkMode(
193                 changeStatisticsWorkModeInputBld.build());
194         checkWorkModeChangeOutcome(workMode);
195
196         verify(statisticContext).enableGathering();
197     }
198
199     @Test
200     public void testClose() {
201         statisticsManager.close();
202         verify(serviceControlRegistration).close();
203     }
204 }