Correctly persists the old value in TestConsistentMap by deep cloning the entry

In addition, inject TestApplicationId into DistributedMeterStore serializer when running MeterManagerTest

Change-Id: I8dcb4b2953a8d7e0fa1e5d765c859cde31d7633b
diff --git a/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java b/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java
index e34d110..673a531 100644
--- a/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java
+++ b/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java
@@ -42,11 +42,13 @@
     private final Map<K, Versioned<V>> map;
     private final String mapName;
     private final AtomicLong counter = new AtomicLong(0);
+    private final Serializer serializer;
 
-    private TestConsistentMap(String mapName) {
+    private TestConsistentMap(String mapName, Serializer serializer) {
         map = new HashMap<>();
         listeners = new LinkedList<>();
         this.mapName = mapName;
+        this.serializer = serializer;
     }
 
     private Versioned<V> version(V v) {
@@ -111,7 +113,7 @@
             AtomicReference<Versioned<V>> previousValue = new AtomicReference<>();
             Versioned<V> result = map.compute(key, (k, v) -> {
                     updated.set(true);
-                    previousValue.set(v);
+                    previousValue.set(serializer.decode(serializer.encode(v)));
                     return version(remappingFunction.apply(k, Versioned.valueOrNull(v)));
                 });
             if (updated.get()) {
@@ -127,7 +129,7 @@
         Versioned<V> result = map.compute(key, (k, v) -> {
             if (v != null) {
                 updated.set(true);
-                previousValue.set(v);
+                previousValue.set(serializer.decode(serializer.encode(v)));
                 return version(remappingFunction.apply(k, v.value()));
             }
             return v;
@@ -145,7 +147,7 @@
         AtomicReference<Versioned<V>> previousValue = new AtomicReference<>();
         Versioned<V> result = map.compute(key, (k, v) -> {
             if (condition.test(Versioned.valueOrNull(v))) {
-                previousValue.set(v);
+                previousValue.set(serializer.decode(serializer.encode(v)));
                 updated.set(true);
                 return version(remappingFunction.apply(k, Versioned.valueOrNull(v)));
             }
@@ -296,7 +298,7 @@
 
         @Override
         public ConsistentMap<K, V> build() {
-            return new TestConsistentMap<>(name());
+            return new TestConsistentMap<>(name(), serializer());
         }
 
         @Override
diff --git a/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java b/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java
index 89a9350..e06ecc1 100644
--- a/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java
+++ b/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.incubator.net.meter.impl;
 
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.junit.After;
@@ -22,13 +23,14 @@
 import org.junit.Test;
 import org.onlab.junit.TestUtils;
 import org.onlab.packet.IpAddress;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.TestApplicationId;
 import org.onosproject.cluster.ClusterServiceAdapter;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.DefaultControllerNode;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.common.event.impl.TestEventDispatcher;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.incubator.store.meter.impl.DistributedMeterStore;
 import org.onosproject.mastership.MastershipServiceAdapter;
 import org.onosproject.net.DeviceId;
@@ -50,6 +52,7 @@
 import org.onosproject.net.meter.MeterState;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.TestStorageService;
 
 import java.util.Collection;
@@ -98,6 +101,13 @@
         TestUtils.setField(meterStore, "storageService", new TestStorageService());
         TestUtils.setField(meterStore, "clusterService", new TestClusterService());
         TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
+
+        // Inject TestApplicationId into the DistributedMeterStore serializer
+        KryoNamespace.Builder testKryoBuilder = TestUtils.getField(meterStore, "APP_KRYO_BUILDER");
+        testKryoBuilder.register(TestApplicationId.class);
+        Serializer testSerializer = Serializer.using(Lists.newArrayList(testKryoBuilder.build()));
+        TestUtils.setField(meterStore, "serializer", testSerializer);
+
         meterStore.activate();
         meterStore.storeMeterFeatures(DefaultMeterFeatures.builder().forDevice(did("1"))
                 .withMaxMeters(255L)
@@ -130,7 +140,7 @@
         provider = new TestProvider(PID);
         providerService = registry.register(provider);
 
-        appId = new TestApplicationId(0, "MeterManagerTest");
+        appId = new TestApplicationId("MeterManagerTest");
 
         assertTrue("provider should be registered",
                    registry.getProviders().contains(provider.id()));
@@ -251,14 +261,6 @@
 
     }
 
-
-
-    public class TestApplicationId extends DefaultApplicationId {
-        public TestApplicationId(int id, String name) {
-            super(id, name);
-        }
-    }
-
     private class TestProvider extends AbstractProvider implements MeterProvider {
 
         protected TestProvider(ProviderId id) {
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
index 5c51478..dd1e81a 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
@@ -16,6 +16,7 @@
 package org.onosproject.incubator.store.meter.impl;
 
 import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -23,6 +24,7 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.mastership.MastershipService;
@@ -78,6 +80,18 @@
     private static final String METERFEATURESSTORE = "onos-meter-features-store";
     private static final String AVAILABLEMETERIDSTORE = "onos-meters-available-store";
 
+    private static final KryoNamespace.Builder APP_KRYO_BUILDER = KryoNamespace.newBuilder()
+            .register(KryoNamespaces.API)
+            .register(MeterKey.class)
+            .register(MeterData.class)
+            .register(DefaultMeter.class)
+            .register(DefaultBand.class)
+            .register(Band.Type.class)
+            .register(MeterState.class)
+            .register(Meter.Unit.class);
+
+    private Serializer serializer = Serializer.using(Lists.newArrayList(APP_KRYO_BUILDER.build()));
+
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private StorageService storageService;
 
@@ -105,15 +119,7 @@
 
         meters = storageService.<MeterKey, MeterData>consistentMapBuilder()
                     .withName(METERSTORE)
-                    .withSerializer(Serializer.using(Arrays.asList(KryoNamespaces.API),
-                                                     MeterKey.class,
-                                                     MeterData.class,
-                                                     DefaultMeter.class,
-                                                     DefaultBand.class,
-                                                     Band.Type.class,
-                                                     MeterState.class,
-                                                     Meter.Unit.class,
-                                                     MeterFailReason.class)).build();
+                    .withSerializer(serializer).build();
 
         meters.addListener(mapListener);