2 * Copyright (c) 2015 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.impl.statistics;
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;
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;
58 @RunWith(MockitoJUnitRunner.class)
59 public class StatisticsManagerImplTest {
60 public static final NodeId NODE_ID = new NodeId("ofp-unit-dummy-node-id");
63 private ConnectionContext mockedPrimConnectionContext;
65 private FeaturesReply mockedFeatures;
67 private ConnectionAdapter mockedConnectionAdapter;
69 private MessageSpy mockedMessagSpy;
71 private DeviceContext mockedDeviceContext;
73 private DeviceState mockedDeviceState;
75 private DeviceInfo mockedDeviceInfo;
77 private RpcProviderService rpcProviderRegistry;
79 private OutboundQueue outboundQueue;
81 private MultiMsgCollector multiMagCollector;
83 private Registration serviceControlRegistration;
85 private DeviceInfo deviceInfo;
87 private DataBroker dataBroker;
89 private ReconciliationFrameworkRegistrar reconciliationFrameworkRegistrar;
91 private StatisticsContext statisticContext;
93 private RequestContext<List<MultipartReply>> currentRequestContext;
94 private StatisticsManagerImpl statisticsManager;
97 public void initialization() {
98 final KeyedInstanceIdentifier<Node, NodeKey> nodePath = KeyedInstanceIdentifier
100 .child(Node.class, new NodeKey(new NodeId("openflow:10")));
102 when(rpcProviderRegistry.registerRpcImplementations(any(Rpc[].class))).thenReturn(serviceControlRegistration);
104 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
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,
113 MoreExecutors.directExecutor());
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());
126 * switching to {@link StatisticsWorkMode#FULLYDISABLED}; no pollTimeout and no lifecycleRegistry.
130 public void testChangeStatisticsWorkMode1() throws Exception {
131 statisticsManager.contexts.put(deviceInfo, statisticContext);
133 final ChangeStatisticsWorkModeInputBuilder changeStatisticsWorkModeInputBld =
134 new ChangeStatisticsWorkModeInputBuilder()
135 .setMode(StatisticsWorkMode.FULLYDISABLED);
137 final ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode = statisticsManager
138 .changeStatisticsWorkMode(changeStatisticsWorkModeInputBld.build());
140 checkWorkModeChangeOutcome(workMode);
141 verify(statisticContext).disableGathering();
144 private static void checkWorkModeChangeOutcome(
145 final ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode)
146 throws InterruptedException, ExecutionException {
147 assertTrue(workMode.isDone());
148 assertTrue(workMode.get().isSuccessful());
153 * Switching to {@link StatisticsWorkMode#FULLYDISABLED}; with pollTimeout and lifecycleRegistry.
157 public void testChangeStatisticsWorkMode2() throws Exception {
158 statisticsManager.contexts.put(deviceInfo, statisticContext);
160 final ChangeStatisticsWorkModeInputBuilder changeStatisticsWorkModeInputBld =
161 new ChangeStatisticsWorkModeInputBuilder()
162 .setMode(StatisticsWorkMode.FULLYDISABLED);
164 ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode = statisticsManager
165 .changeStatisticsWorkMode(changeStatisticsWorkModeInputBld.build());
166 checkWorkModeChangeOutcome(workMode);
168 verify(statisticContext).disableGathering();
172 * Tests switching to {@link StatisticsWorkMode#FULLYDISABLED} and back
173 * to {@link StatisticsWorkMode#COLLECTALL}; with lifecycleRegistry and pollTimeout.
177 public void testChangeStatisticsWorkMode3() throws Exception {
178 statisticsManager.contexts.put(deviceInfo, statisticContext);
180 final ChangeStatisticsWorkModeInputBuilder changeStatisticsWorkModeInputBld =
181 new ChangeStatisticsWorkModeInputBuilder()
182 .setMode(StatisticsWorkMode.FULLYDISABLED);
184 ListenableFuture<RpcResult<ChangeStatisticsWorkModeOutput>> workMode;
185 workMode = statisticsManager.changeStatisticsWorkMode(
186 changeStatisticsWorkModeInputBld.build());
187 checkWorkModeChangeOutcome(workMode);
189 verify(statisticContext).disableGathering();
191 changeStatisticsWorkModeInputBld.setMode(StatisticsWorkMode.COLLECTALL);
192 workMode = statisticsManager.changeStatisticsWorkMode(
193 changeStatisticsWorkModeInputBld.build());
194 checkWorkModeChangeOutcome(workMode);
196 verify(statisticContext).enableGathering();
200 public void testClose() {
201 statisticsManager.close();
202 verify(serviceControlRegistration).close();