Bug 1484 - StatisticManager performance improvement refactoring
[controller.git] / opendaylight / md-sal / statistics-manager / src / test / java / test / mock / util / StatisticsManagerTest.java
diff --git a/opendaylight/md-sal/statistics-manager/src/test/java/test/mock/util/StatisticsManagerTest.java b/opendaylight/md-sal/statistics-manager/src/test/java/test/mock/util/StatisticsManagerTest.java
new file mode 100644 (file)
index 0000000..7f266d9
--- /dev/null
@@ -0,0 +1,198 @@
+package test.mock.util;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FeatureCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SwitchFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemovedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.MeterFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+public abstract class StatisticsManagerTest extends AbstractDataBrokerTest {
+
+    public static final Counter64 COUNTER_64_TEST_VALUE = new Counter64(BigInteger.valueOf(128));
+    public static final Counter32 COUNTER_32_TEST_VALUE = new Counter32(64L);
+    public static final Long MAX_GROUPS_TEST_VALUE = 2000L;
+    public static final BigInteger BIG_INTEGER_TEST_VALUE = BigInteger.valueOf(1000);
+
+    private static Flow flow;
+    private static Group group;
+    private static Meter meter;
+    private static Port port;
+    private static Queue queue;
+    private static TableId tableId;
+    private static NodeConnectorId nodeConnectorId;
+
+    private final NotificationProviderServiceHelper notificationMock = new NotificationProviderServiceHelper();
+    protected final NodeKey s1Key = new NodeKey(new NodeId("S1"));
+    protected RpcProviderRegistryMock rpcRegistry;
+    protected ProviderContextMock providerContext;
+
+    @BeforeClass
+    public static void setupTests() {
+        flow = FlowMockGenerator.getRandomFlow();
+        group = GroupMockGenerator.getRandomGroup();
+        meter = MeterMockGenerator.getRandomMeter();
+        port = PortMockGenerator.getRandomPort();
+        queue = QueueMockGenerator.getRandomQueueWithPortNum(port.getPortNumber().getUint32());
+        tableId = new TableId((short) 2);
+        nodeConnectorId = new NodeConnectorId("connector.1");
+    }
+
+    @Before
+    public void init() {
+        rpcRegistry = new RpcProviderRegistryMock(notificationMock);
+        providerContext = new ProviderContextMock(rpcRegistry, getDataBroker(), notificationMock.getNotifBroker());
+    }
+
+    // node with statistics capabilities will enable cyclic statistics collection
+    @SafeVarargs
+    protected final void addFlowCapableNodeWithFeatures(final NodeKey nodeKey, final Boolean hasMeterCapabilities,
+                                                     final Class<? extends FeatureCapability>... capabilities)
+            throws ExecutionException, InterruptedException {
+        final Nodes nodes = new NodesBuilder().setNode(Collections.<Node>emptyList()).build();
+        final InstanceIdentifier<Node> flowNodeIdentifier = InstanceIdentifier.create(Nodes.class)
+                .child(Node.class, nodeKey);
+
+        final FlowCapableNodeBuilder fcnBuilder = new FlowCapableNodeBuilder();
+        final SwitchFeaturesBuilder sfBuilder = new SwitchFeaturesBuilder();
+        final List<Class<? extends FeatureCapability>> capabilitiyList = new ArrayList<>();
+        for (final Class<? extends FeatureCapability> capability : capabilities) {
+            capabilitiyList.add(capability);
+        }
+        sfBuilder.setCapabilities(capabilitiyList);
+        sfBuilder.setMaxTables((short) 2);
+        final NodeBuilder nodeBuilder = new NodeBuilder();
+        nodeBuilder.setKey(nodeKey);
+        fcnBuilder.setSwitchFeatures(sfBuilder.build());
+        final List<Table> tables = new ArrayList<>();
+        final TableBuilder tBuilder = new TableBuilder();
+        tBuilder.setId(getFlow().getTableId());
+        tables.add(tBuilder.build());
+        fcnBuilder.setTable(tables);
+        final FlowCapableNode flowCapableNode = fcnBuilder.build();
+        nodeBuilder.addAugmentation(FlowCapableNode.class, flowCapableNode);
+        final Node node = nodeBuilder.build();
+
+        final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
+        writeTx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class), nodes);
+        writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier, nodeBuilder.build());
+        if (hasMeterCapabilities) {
+            final NodeMeterFeaturesBuilder nmfBuilder = new NodeMeterFeaturesBuilder();
+            final MeterFeaturesBuilder mfBuilder = new MeterFeaturesBuilder();
+            mfBuilder.setMaxBands((short) 4);
+            nmfBuilder.setMeterFeatures(mfBuilder.build());
+            writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier.augmentation(NodeMeterFeatures.class),
+                    nmfBuilder.build());
+        }
+        writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
+        writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
+        assertCommit(writeTx.submit());
+
+        final NodeUpdatedBuilder nuBuilder = new NodeUpdatedBuilder(node);
+        final FlowCapableNodeUpdatedBuilder fcnuBuilder = new FlowCapableNodeUpdatedBuilder(flowCapableNode);
+        nuBuilder.setNodeRef(new NodeRef(flowNodeIdentifier));
+        nuBuilder.addAugmentation(FlowCapableNodeUpdated.class, fcnuBuilder.build());
+        notificationMock.pushNotification(nuBuilder.build());
+    }
+
+    public void addFlowCapableNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
+        final Nodes nodes = new NodesBuilder().setNode(Collections.<Node>emptyList()).build();
+        final InstanceIdentifier<Node> flowNodeIdentifier = InstanceIdentifier.create(Nodes.class)
+                .child(Node.class, nodeKey);
+
+        final FlowCapableNodeBuilder fcnBuilder = new FlowCapableNodeBuilder();
+        final NodeBuilder nodeBuilder = new NodeBuilder();
+        nodeBuilder.setKey(nodeKey);
+        final FlowCapableNode flowCapableNode = fcnBuilder.build();
+        nodeBuilder.addAugmentation(FlowCapableNode.class, flowCapableNode);
+        final Node node = nodeBuilder.build();
+
+        final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
+        writeTx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class), nodes);
+        writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier, node);
+        writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
+        writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
+        assertCommit(writeTx.submit());
+
+        final NodeUpdatedBuilder nuBuilder = new NodeUpdatedBuilder(node);
+        final FlowCapableNodeUpdatedBuilder fcnuBuilder = new FlowCapableNodeUpdatedBuilder(flowCapableNode);
+        nuBuilder.setNodeRef(new NodeRef(flowNodeIdentifier));
+        nuBuilder.addAugmentation(FlowCapableNodeUpdated.class, fcnuBuilder.build());
+        notificationMock.pushNotification(nuBuilder.build());
+    }
+
+    protected void removeNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
+        final InstanceIdentifier<Node> nodeII = InstanceIdentifier.create(Nodes.class).child(Node.class, nodeKey);
+
+        final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
+        writeTx.delete(LogicalDatastoreType.OPERATIONAL, nodeII);
+        writeTx.submit().get();
+
+        final NodeRemovedBuilder nrBuilder = new NodeRemovedBuilder();
+        nrBuilder.setNodeRef(new NodeRef(nodeII));
+        notificationMock.pushNotification(nrBuilder.build());
+    }
+
+    public static Flow getFlow() {
+        return flow;
+    }
+
+    public static Group getGroup() {
+        return group;
+    }
+
+    public static Meter getMeter() {
+        return meter;
+    }
+
+    public static Port getPort() {
+        return port;
+    }
+
+    public static Queue getQueue() {
+        return queue;
+    }
+
+    public static TableId getTableId() {
+        return tableId;
+    }
+
+    public static NodeConnectorId getNodeConnectorId() {
+        return nodeConnectorId;
+    }
+}
+