package voldemort.store.routed; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import org.apache.log4j.Logger; import org.junit.Test; import voldemort.TestUtils; import voldemort.utils.ByteArray; import voldemort.versioning.VectorClock; import voldemort.versioning.Version; import voldemort.versioning.Versioned; import static org.junit.Assert.*; public class NodeValueTest { private final static Logger logger = Logger.getLogger(NodeValueTest.class); public static Version createVersion(int nodeId, int clockEntry) { VectorClock version = TestUtils.getClock(nodeId); for (int i=0; i < clockEntry-1; i++) { TestUtils.increment(version, nodeId); } return version; } public static NodeValue<ByteArray, byte[]> createNodeValue(int nodeId, Version version) { ByteArray key = new ByteArray(new byte[]{54, 52, 49, 57, 52, 54, 51, 51}); byte[] value = new byte[]{69,119,105,119,83,71,80,113,108,108,119,86,67,120,103,111}; Versioned<byte[]> versioned = new Versioned<byte[]>(value, version); return new NodeValue<ByteArray, byte[]>(nodeId, key, versioned); } @Test public void testHashCodeEquals() { // Create multiple nodeValues that are equal and see if they hash the same and equal each other Version v1 = createVersion(1, 6); Version v2 = createVersion(1, 6); Version v3 = createVersion(1, 7); logger.info("v1 = " + v1); logger.info("v2 = " + v2); logger.info("v3 = " + v3); assertEquals("VectorClock#equals works", v1, v2); assertEquals("VectorClock#hashCode works", v1.hashCode(), v2.hashCode()); assertFalse(v1.equals(v3)); assertFalse(v1.hashCode() == v3.hashCode()); NodeValue<ByteArray, byte[]> nv1 = createNodeValue(1, v1); NodeValue<ByteArray, byte[]> nv2 = createNodeValue(1, v2); NodeValue<ByteArray, byte[]> nv3 = createNodeValue(1, v3); logger.info("nv1 = " + nv1); logger.info("nv2 = " + nv2); logger.info("nv3 = " + nv3); assertEquals("NodeValue#equals works", nv1, nv2); assertEquals("NodeValue#hashCode works", nv1.hashCode(), nv2.hashCode()); assertFalse(nv1.equals(nv3)); assertFalse(nv1.hashCode() == nv3.hashCode()); } @Test public void testMultimap () { Multimap<Version, NodeValue<ByteArray, byte[]>> multimap = HashMultimap.create(); Version version = createVersion(1,6); NodeValue<ByteArray, byte[]> nodeValue = createNodeValue(1, version); multimap.put(version, nodeValue); Version version2 = createVersion(1, 7); NodeValue<ByteArray, byte[]> nodeValue2 = createNodeValue(1, version2); multimap.put(version2, nodeValue2); multimap.removeAll(version2); logger.info(multimap); assertTrue("Multimap#containsKey() works", multimap.containsKey(version)); assertTrue("Multimap#containsEntry() works", multimap.containsEntry(version, nodeValue)); for (Version v: multimap.keySet()) { logger.info(v); assertTrue("Multimap#get(v) returns a non-empty iterator", multimap.get(v).iterator().hasNext()); NodeValue<ByteArray, byte[]> nv = multimap.get(v).iterator().next(); logger.info(nv); } } }