package edu.berkeley.thebes.common.data; import junit.framework.TestCase; public class VersionTest extends TestCase { private static final int numBitsTimestamp = 29; private static final int numBitsLogicalTime = 27; private static final int numBitsClientID = 8; /** Constructs a new Version! */ public static Version v(long clientID, long logicalTime, long timestamp) { return new Version((short) clientID, logicalTime, timestamp); } public void testInAndOut() { Version v1, v2; v1 = v(1, 23, 456); assertTrue(v1.getClientID() == 1); assertTrue(v1.getLogicalTime() == 23); assertTrue(v1.getTimestamp() == 456); v2 = Version.fromThrift(Version.toThrift(v1)); assertSame(v1, v2); v1 = v(pow2Less1(numBitsClientID), pow2Less1(numBitsLogicalTime), pow2Less1(numBitsTimestamp)); assertTrue(v1.getClientID() == pow2Less1(numBitsClientID)); assertTrue(v1.getLogicalTime() == pow2Less1(numBitsLogicalTime)); assertTrue(v1.getTimestamp() == pow2Less1(numBitsTimestamp)); v2 = Version.fromThrift(Version.toThrift(v1)); assertSame(v1, v2); } public void testOutOfBounds() { Version v1, v2; v1 = v(pow2Less1(numBitsClientID)+2, pow2Less1(numBitsLogicalTime)+2, pow2Less1(numBitsTimestamp)+2); assertTrue(v1.getClientID() == 1); assertTrue(v1.getLogicalTime() == 1); assertTrue(v1.getTimestamp() == 1); v2 = Version.fromThrift(Version.toThrift(v1)); assertSame(v1, v2); } public void testCompare() { Version v1 = v(1, 23, 456); assertCompare(v1, v(1, 23, 456), 0); assertCompare(v1, v(2, 23, 456), -1); assertCompare(v1, v(1, 24, 456), -1); assertCompare(v1, v(1, 23, 457), -1); // Test wraparound of timestamps! assertCompare(v1, v(1, 23, pow2Less1(numBitsTimestamp)/2), -1); assertCompare(v1, v(1, 23, pow2Less1(numBitsTimestamp)/2+457), 1); assertCompare(v1, v(1, 23, pow2Less1(numBitsTimestamp)), 1); // Nothing else should wraparound assertCompare(v1, v(1, pow2Less1(numBitsLogicalTime), 456), -1); assertCompare(v1, v(pow2Less1(numBitsClientID), 23, 456), -1); // Ordering: Timestamp, Client, Logical time assertCompare(v1, v(1000, 1000, 455), 1); assertCompare(v1, v(0, 1000, 456), 1); assertCompare(v1, v(1000, 0, 456), -1); } public static void assertCompare(Version v1, Version v2, int expect) { assertTrue(v1.compareTo(v2) == expect); assertTrue(v2.compareTo(v1) == -expect); } public static void assertSame(Version v1, Version v2) { assertEquals(v1, v2); assertTrue(v1.compareTo(v2) == 0); assertTrue(v2.compareTo(v1) == 0); assertEquals(v1.hashCode(), v2.hashCode()); } private static long pow2Less1(int b) { return Math.round(Math.pow(2, b)) - 1; } }