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/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 0ac5d85..8de0b5a 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
@@ -17,6 +17,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.junit.After;
import org.junit.Before;
@@ -24,6 +25,8 @@
import org.onlab.junit.TestTools;
import org.onlab.junit.TestUtils;
import org.onlab.packet.IpAddress;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.TestApplicationId;
import org.onosproject.cfg.ComponentConfigAdapter;
import org.onosproject.cluster.ClusterServiceAdapter;
import org.onosproject.cluster.ControllerNode;
@@ -65,6 +68,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.Collections;
@@ -224,6 +228,13 @@
TestUtils.setField(meterStore, "clusterService", new TestClusterService());
TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
TestUtils.setField(meterStore, "driverService", driverService);
+
+ // 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);
+
// Activate the store
meterStore.activate();
// Init step for the manager
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 b654652..cf4bfcb 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.Iterables;
import com.google.common.collect.Maps;
import org.apache.commons.lang.math.RandomUtils;
@@ -25,6 +26,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;
@@ -90,6 +92,18 @@
private static final String AVAILABLEMETERIDSTORE = "onos-meters-available-store";
private static final String METERIDSTORE = "onos-meters-id-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;
@@ -140,15 +154,7 @@
meters = storageService.<MeterKey, MeterData>consistentMapBuilder()
.withName(METERSTORE)
- .withSerializer(Serializer.using(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);
diff --git a/incubator/store/src/test/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStoreTest.java b/incubator/store/src/test/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStoreTest.java
index 94940c4..f66d3ef 100644
--- a/incubator/store/src/test/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStoreTest.java
+++ b/incubator/store/src/test/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStoreTest.java
@@ -16,12 +16,15 @@
package org.onosproject.incubator.store.meter.impl;
+import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.junit.After;
import org.junit.Before;
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;
@@ -44,6 +47,7 @@
import org.onosproject.net.meter.MeterId;
import org.onosproject.net.meter.MeterKey;
import org.onosproject.net.meter.MeterState;
+import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.TestStorageService;
import java.util.Collections;
@@ -125,6 +129,13 @@
TestUtils.setField(meterStore, "clusterService", new TestClusterService());
TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
TestUtils.setField(meterStore, "driverService", new TestDriverService());
+
+ // 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);
+
// Activate the store
meterStore.activate();
}