[AETHER-432][VOL-3263] Revisit meters subsystem to be fully distributed.

- Events are now propagated across the cluster.
- REF_COUNT_ZERO is now generated after the first stats interval.
- SB ops are offloaded to the installers.
- Installers use predictable executors.
- Deprecated MeterData API that exposes origin node and removed unused code.
- Comments are added to parts of the code that are obscure.
- MeterManager and DistributedMeterStore unit tests are improved.
- Fix an issue in TestConsistentMap.

Change-Id: I0329f903e5fdc421f29ee33f8f8133f18c794d8f
(cherry picked from commit 89c130115df20c80de446aac9c48e838468028d4)
diff --git a/core/net/src/test/java/org/onosproject/net/meter/impl/MeterManagerTest.java b/core/net/src/test/java/org/onosproject/net/meter/impl/MeterManagerTest.java
index 030b9e6..52970dd 100644
--- a/core/net/src/test/java/org/onosproject/net/meter/impl/MeterManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/meter/impl/MeterManagerTest.java
@@ -19,6 +19,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -73,6 +74,7 @@
 import org.onosproject.store.meter.impl.DistributedMeterStore;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.TestStorageService;
+import org.osgi.service.component.ComponentContext;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -80,8 +82,12 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.Dictionary;
+import java.util.Hashtable;
 import java.util.concurrent.CompletableFuture;
 
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -115,7 +121,6 @@
             new DefaultDevice(PROGRAMMABLE_PROVIDER, PROGRAMMABLE_DID, Device.Type.SWITCH,
                     "", "", "", "", null, ANNOTATIONS);
 
-
     private MeterService service;
 
     // Test Driver service used during the tests
@@ -232,8 +237,6 @@
         meterStore = new DistributedMeterStore();
         // Let's initialize some internal services of the store
         TestUtils.setField(meterStore, "storageService", new TestStorageService());
-        TestUtils.setField(meterStore, "clusterService", new TestClusterService());
-        TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
         TestUtils.setField(meterStore, "driverService", driverService);
 
         // Inject TestApplicationId into the DistributedMeterStore serializer
@@ -252,16 +255,20 @@
         manager.deviceService = deviceService;
         manager.mastershipService = new TestMastershipService();
         manager.cfgService = new ComponentConfigAdapter();
-        TestUtils.setField(manager, "storageService", new TestStorageService());
+        manager.clusterService = new TestClusterService();
         // Init the reference of the registry
         registry = manager;
 
         manager.driverService = driverService;
 
         // Activate the manager
-        manager.activate(null);
-        // Initialize the test provider
+        Dictionary<String, Object> cfgDict = new Hashtable<>();
+        ComponentContext componentContext = EasyMock.createMock(ComponentContext.class);
+        expect(componentContext.getProperties()).andReturn(cfgDict);
+        replay(componentContext);
+        manager.activate(componentContext);
 
+        // Initialize the test provider
         provider = new TestProvider(PID);
         // Register the provider against the manager
         providerService = registry.register(provider);
@@ -315,8 +322,8 @@
         // Submit meter request
         manager.submit(m1Request.add());
         // Verify add
-        assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
-        assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
+        assertEquals("The meter was not added", 1, manager.getAllMeters().size());
+        assertEquals("The meter was not added", 1, manager.getMeters(did1).size());
         // Get Meter
         Meter installingMeter = manager.getMeter(did1, mid1);
         // Verify add of installingMeter and pending add state
@@ -329,8 +336,8 @@
         Meter installedMeter = manager.getMeter(did1, mid1);
         // Verify installation
         assertThat(installedMeter.state(), is(MeterState.ADDED));
-        assertTrue("The meter was not installed", manager.getAllMeters().size() == 1);
-        assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
+        assertEquals("The meter was not installed", 1, manager.getAllMeters().size());
+        assertEquals("The meter was not installed", 1, manager.getMeters(did1).size());
     }
 
     /**
@@ -348,14 +355,14 @@
         Meter withdrawingMeter = manager.getMeter(did1, mid1);
         // Verify withdrawing
         assertThat(withdrawingMeter.state(), is(MeterState.PENDING_REMOVE));
-        assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 1);
-        assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
+        assertEquals("The meter was not withdrawn", 1, manager.getAllMeters().size());
+        assertEquals("The meter was not withdrawn", 1, manager.getMeters(did1).size());
         // Let's simulate a working data-plane
         pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter);
         // Verify withdrawn
         assertNull(manager.getMeter(did1, mid1));
-        assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
-        assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
+        assertEquals("The meter was not removed", 0, manager.getAllMeters().size());
+        assertEquals("The meter was not removed", 0, manager.getMeters(did1).size());
     }
 
     /**
@@ -370,9 +377,9 @@
         // Submit meter 2
         manager.submit(m2Request.add());
         // Verify add
-        assertTrue("The meter was not added", manager.getAllMeters().size() == 2);
-        assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
-        assertTrue("The meter was not added", manager.getMeters(did2).size() == 1);
+        assertEquals("The meter was not added", 2, manager.getAllMeters().size());
+        assertEquals("The meter was not added", 1, manager.getMeters(did1).size());
+        assertEquals("The meter was not added", 1, manager.getMeters(did2).size());
         // Get Meters
         Meter installingMeter1 = manager.getMeter(did1, mid1);
         Meter installingMeter2 = manager.getMeter(did2, mid1);
@@ -391,9 +398,9 @@
         // Verify installation
         assertThat(installedMeter1.state(), is(MeterState.ADDED));
         assertThat(installedMeter2.state(), is(MeterState.ADDED));
-        assertTrue("The meter was not installed", manager.getAllMeters().size() == 2);
-        assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
-        assertTrue("The meter was not installed", manager.getMeters(did2).size() == 1);
+        assertEquals("The meter was not installed", 2, manager.getAllMeters().size());
+        assertEquals("The meter was not installed", 1, manager.getMeters(did1).size());
+        assertEquals("The meter was not installed", 1, manager.getMeters(did2).size());
     }
 
     /**
@@ -417,73 +424,78 @@
         // Verify withdrawing
         assertThat(withdrawingMeter1.state(), is(MeterState.PENDING_REMOVE));
         assertThat(withdrawingMeter2.state(), is(MeterState.PENDING_REMOVE));
-        assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 2);
-        assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
-        assertTrue("The meter was not withdrawn", manager.getMeters(did2).size() == 1);
+        assertEquals("The meter was not withdrawn", 2, manager.getAllMeters().size());
+        assertEquals("The meter was not withdrawn", 1, manager.getMeters(did1).size());
+        assertEquals("The meter was not withdrawn", 1, manager.getMeters(did2).size());
         // Let's simulate a working data-plane
         pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter1);
         pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter2);
         // Verify withdrawn
         assertNull(manager.getMeter(did1, mid1));
         assertNull(manager.getMeter(did2, mid1));
-        assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
-        assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
-        assertTrue("The meter was not removed", manager.getMeters(did2).size() == 0);
+        assertEquals("The meter was not removed", 0, manager.getAllMeters().size());
+        assertEquals("The meter was not removed", 0, manager.getMeters(did1).size());
+        assertEquals("The meter was not removed", 0, manager.getMeters(did2).size());
+    }
+
+    /**
+     * Test purge meter.
+     */
+    @Test
+    public void testPurge() {
+        // Init store
+        initMeterStore();
+        // Submit meter request
+        manager.submit(m1Request.add());
+        // Verify submit
+        Meter submittingMeter = manager.getMeter(did1, mid1);
+        assertThat(submittingMeter.state(), is(MeterState.PENDING_ADD));
+        assertEquals("The meter was not added", 1, manager.getAllMeters().size());
+        assertEquals("The meter was not added", 1, manager.getMeters(did1).size());
+        // Purge the meters
+        manager.purgeMeters(did1);
+        // Verify purge
+        assertNull(manager.getMeter(did1, mid1));
+        assertEquals("The meter was not purged", 0, manager.getAllMeters().size());
+        assertEquals("The meter was not purged", 0, manager.getMeters(did1).size());
     }
 
     @Test
     public void testAddFromMeterProgrammable()  {
-
         // Init store
         initMeterStore();
-
         manager.submit(mProgrammableRequest.add());
-
         TestTools.assertAfter(500, () -> {
-
-            assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
-
+            assertEquals("The meter was not added", 1, manager.getAllMeters().size());
             assertThat(manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(1)), is(mProgrammable));
         });
-
     }
 
     @Test
     public void testAddBatchFromMeterProgrammable()  {
-
         // Init store
         initMeterStore();
-
         List<MeterOperation> operations = ImmutableList.of(new MeterOperation(mProgrammable, MeterOperation.Type.ADD));
         manager.defaultProvider().performMeterOperation(PROGRAMMABLE_DID, new MeterOperations(operations));
-
         TestTools.assertAfter(500, () -> {
-
-            assertTrue("The meter was not added", meterOperations.size() == 1);
-
-            assertTrue("Wrong Meter Operation", meterOperations.get(0).meter().id().equals(mProgrammable.id()));
+            assertEquals("The meter was not added", 1, meterOperations.size());
+            assertEquals("Wrong Meter Operation", meterOperations.get(0).meter().id(), mProgrammable.id());
         });
 
     }
 
     @Test
     public void testGetFromMeterProgrammable()  {
-
         // Init store
         initMeterStore();
-
         MeterDriverProvider fallback = (MeterDriverProvider) manager.defaultProvider();
-
         testAddFromMeterProgrammable();
-
         fallback.init(manager.deviceService, fallback.meterProviderService, manager.mastershipService, 1);
-
         TestTools.assertAfter(2000, () -> {
-            assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
+            assertEquals("The meter was not added", 1, manager.getAllMeters().size());
             Meter m = manager.getMeters(PROGRAMMABLE_DID).iterator().next();
             assertEquals("incorrect state", MeterState.ADDED, m.state());
         });
-
     }
 
     // Test cluster service