7f266d9c3ca66462b20985d87be50d0ba4127f7e
[controller.git] / opendaylight / md-sal / statistics-manager / src / test / java / test / mock / util / StatisticsManagerTest.java
1 package test.mock.util;
2
3 import org.junit.Before;
4 import org.junit.BeforeClass;
5 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
6 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
7 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
8 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FeatureCapability;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdatedBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SwitchFeaturesBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemovedBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeatures;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeaturesBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.MeterFeaturesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37
38 import java.math.BigInteger;
39 import java.util.ArrayList;
40 import java.util.Collections;
41 import java.util.List;
42 import java.util.concurrent.ExecutionException;
43
44 public abstract class StatisticsManagerTest extends AbstractDataBrokerTest {
45
46     public static final Counter64 COUNTER_64_TEST_VALUE = new Counter64(BigInteger.valueOf(128));
47     public static final Counter32 COUNTER_32_TEST_VALUE = new Counter32(64L);
48     public static final Long MAX_GROUPS_TEST_VALUE = 2000L;
49     public static final BigInteger BIG_INTEGER_TEST_VALUE = BigInteger.valueOf(1000);
50
51     private static Flow flow;
52     private static Group group;
53     private static Meter meter;
54     private static Port port;
55     private static Queue queue;
56     private static TableId tableId;
57     private static NodeConnectorId nodeConnectorId;
58
59     private final NotificationProviderServiceHelper notificationMock = new NotificationProviderServiceHelper();
60     protected final NodeKey s1Key = new NodeKey(new NodeId("S1"));
61     protected RpcProviderRegistryMock rpcRegistry;
62     protected ProviderContextMock providerContext;
63
64     @BeforeClass
65     public static void setupTests() {
66         flow = FlowMockGenerator.getRandomFlow();
67         group = GroupMockGenerator.getRandomGroup();
68         meter = MeterMockGenerator.getRandomMeter();
69         port = PortMockGenerator.getRandomPort();
70         queue = QueueMockGenerator.getRandomQueueWithPortNum(port.getPortNumber().getUint32());
71         tableId = new TableId((short) 2);
72         nodeConnectorId = new NodeConnectorId("connector.1");
73     }
74
75     @Before
76     public void init() {
77         rpcRegistry = new RpcProviderRegistryMock(notificationMock);
78         providerContext = new ProviderContextMock(rpcRegistry, getDataBroker(), notificationMock.getNotifBroker());
79     }
80
81     // node with statistics capabilities will enable cyclic statistics collection
82     @SafeVarargs
83     protected final void addFlowCapableNodeWithFeatures(final NodeKey nodeKey, final Boolean hasMeterCapabilities,
84                                                      final Class<? extends FeatureCapability>... capabilities)
85             throws ExecutionException, InterruptedException {
86         final Nodes nodes = new NodesBuilder().setNode(Collections.<Node>emptyList()).build();
87         final InstanceIdentifier<Node> flowNodeIdentifier = InstanceIdentifier.create(Nodes.class)
88                 .child(Node.class, nodeKey);
89
90         final FlowCapableNodeBuilder fcnBuilder = new FlowCapableNodeBuilder();
91         final SwitchFeaturesBuilder sfBuilder = new SwitchFeaturesBuilder();
92         final List<Class<? extends FeatureCapability>> capabilitiyList = new ArrayList<>();
93         for (final Class<? extends FeatureCapability> capability : capabilities) {
94             capabilitiyList.add(capability);
95         }
96         sfBuilder.setCapabilities(capabilitiyList);
97         sfBuilder.setMaxTables((short) 2);
98         final NodeBuilder nodeBuilder = new NodeBuilder();
99         nodeBuilder.setKey(nodeKey);
100         fcnBuilder.setSwitchFeatures(sfBuilder.build());
101         final List<Table> tables = new ArrayList<>();
102         final TableBuilder tBuilder = new TableBuilder();
103         tBuilder.setId(getFlow().getTableId());
104         tables.add(tBuilder.build());
105         fcnBuilder.setTable(tables);
106         final FlowCapableNode flowCapableNode = fcnBuilder.build();
107         nodeBuilder.addAugmentation(FlowCapableNode.class, flowCapableNode);
108         final Node node = nodeBuilder.build();
109
110         final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
111         writeTx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class), nodes);
112         writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier, nodeBuilder.build());
113         if (hasMeterCapabilities) {
114             final NodeMeterFeaturesBuilder nmfBuilder = new NodeMeterFeaturesBuilder();
115             final MeterFeaturesBuilder mfBuilder = new MeterFeaturesBuilder();
116             mfBuilder.setMaxBands((short) 4);
117             nmfBuilder.setMeterFeatures(mfBuilder.build());
118             writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier.augmentation(NodeMeterFeatures.class),
119                     nmfBuilder.build());
120         }
121         writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
122         writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
123         assertCommit(writeTx.submit());
124
125         final NodeUpdatedBuilder nuBuilder = new NodeUpdatedBuilder(node);
126         final FlowCapableNodeUpdatedBuilder fcnuBuilder = new FlowCapableNodeUpdatedBuilder(flowCapableNode);
127         nuBuilder.setNodeRef(new NodeRef(flowNodeIdentifier));
128         nuBuilder.addAugmentation(FlowCapableNodeUpdated.class, fcnuBuilder.build());
129         notificationMock.pushNotification(nuBuilder.build());
130     }
131
132     public void addFlowCapableNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
133         final Nodes nodes = new NodesBuilder().setNode(Collections.<Node>emptyList()).build();
134         final InstanceIdentifier<Node> flowNodeIdentifier = InstanceIdentifier.create(Nodes.class)
135                 .child(Node.class, nodeKey);
136
137         final FlowCapableNodeBuilder fcnBuilder = new FlowCapableNodeBuilder();
138         final NodeBuilder nodeBuilder = new NodeBuilder();
139         nodeBuilder.setKey(nodeKey);
140         final FlowCapableNode flowCapableNode = fcnBuilder.build();
141         nodeBuilder.addAugmentation(FlowCapableNode.class, flowCapableNode);
142         final Node node = nodeBuilder.build();
143
144         final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
145         writeTx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class), nodes);
146         writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier, node);
147         writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
148         writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
149         assertCommit(writeTx.submit());
150
151         final NodeUpdatedBuilder nuBuilder = new NodeUpdatedBuilder(node);
152         final FlowCapableNodeUpdatedBuilder fcnuBuilder = new FlowCapableNodeUpdatedBuilder(flowCapableNode);
153         nuBuilder.setNodeRef(new NodeRef(flowNodeIdentifier));
154         nuBuilder.addAugmentation(FlowCapableNodeUpdated.class, fcnuBuilder.build());
155         notificationMock.pushNotification(nuBuilder.build());
156     }
157
158     protected void removeNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
159         final InstanceIdentifier<Node> nodeII = InstanceIdentifier.create(Nodes.class).child(Node.class, nodeKey);
160
161         final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
162         writeTx.delete(LogicalDatastoreType.OPERATIONAL, nodeII);
163         writeTx.submit().get();
164
165         final NodeRemovedBuilder nrBuilder = new NodeRemovedBuilder();
166         nrBuilder.setNodeRef(new NodeRef(nodeII));
167         notificationMock.pushNotification(nrBuilder.build());
168     }
169
170     public static Flow getFlow() {
171         return flow;
172     }
173
174     public static Group getGroup() {
175         return group;
176     }
177
178     public static Meter getMeter() {
179         return meter;
180     }
181
182     public static Port getPort() {
183         return port;
184     }
185
186     public static Queue getQueue() {
187         return queue;
188     }
189
190     public static TableId getTableId() {
191         return tableId;
192     }
193
194     public static NodeConnectorId getNodeConnectorId() {
195         return nodeConnectorId;
196     }
197 }
198