From 7e2f3aae4645870b8e9ba3a3e67e0e265c622b98 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 30 Aug 2013 09:43:41 +0000
Subject: [PATCH] ChangeNumberTest.java: Added compareToEquivalentToEquals(), hashCodesEqualWhenChangeNumbersEqual(), hashCodesEqualWhenCompareToEqual() to verify basic properties are covered. Code cleanup.

---
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberTest.java |  217 ++++++++++++++++++++++++++++++++---------------------
 1 files changed, 131 insertions(+), 86 deletions(-)

diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberTest.java
index bb82dec..c3dae5c 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberTest.java
@@ -23,23 +23,26 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2013 ForgeRock AS
  */
 package org.opends.server.replication.common;
 
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import static org.testng.Assert.*;
-
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
 
 import org.opends.server.replication.ReplicationTestCase;
-import org.opends.server.replication.common.ChangeNumber;
-import org.opends.server.replication.common.ChangeNumberGenerator;
 import org.opends.server.util.TimeThread;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
 
+import static org.testng.Assert.*;
 
 /**
  * Test ChangeNumber and ChangeNumberGenerator
  */
+@SuppressWarnings("javadoc")
 public class ChangeNumberTest extends ReplicationTestCase
 {
 
@@ -69,10 +72,10 @@
     ChangeNumber cn = new ChangeNumber(time,seq,id);
     assertEquals(cn.toString(), str);
 
-    new ChangeNumber(time,seq,id);
-    new ChangeNumber(time+1,seq,id) ;
-    new ChangeNumber(time,seq+1,id) ;
-    new ChangeNumber(time,seq,id+1);
+    new ChangeNumber(time,   seq,   id);
+    new ChangeNumber(time+1, seq,   id);
+    new ChangeNumber(time,   seq+1, id);
+    new ChangeNumber(time,   seq,   id+1);
   }
 
   /**
@@ -98,18 +101,18 @@
   @DataProvider(name = "createChangeNumber")
   public Object[][] createChangeNumberData() {
 
-    long time[] = {1, TimeThread.getTime()} ;
-    int seq[] = {0,  123} ;
-    int id [] = {1,  45} ;
+    long time[] = {1, TimeThread.getTime()};
+    int seq[] = {0,  123};
+    int id [] = {1,  45};
 
     Object[][] obj = new Object[time.length][5];
     for (int i=0; i<time.length; i++)
     {
-      obj[i][0] = new ChangeNumber(time[i],seq[i],id[i]);
-      obj[i][1] = new ChangeNumber(time[i],seq[i],id[i]);
-      obj[i][2] = new ChangeNumber(time[i]+1,seq[i],id[i]);
-      obj[i][3] = new ChangeNumber(time[i],seq[i]+1,id[i]);
-      obj[i][4] = new ChangeNumber(time[i],seq[i],id[i]+1);
+      obj[i][0] = new ChangeNumber(time[i],   seq[i],   id[i]);
+      obj[i][1] = new ChangeNumber(time[i],   seq[i],   id[i]);
+      obj[i][2] = new ChangeNumber(time[i]+1, seq[i],   id[i]);
+      obj[i][3] = new ChangeNumber(time[i],   seq[i]+1, id[i]);
+      obj[i][4] = new ChangeNumber(time[i],   seq[i],   id[i]+1);
     }
     return obj;
   }
@@ -122,9 +125,7 @@
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
-
-    // Check hashCode
-    assertTrue (cn1.hashCode() == cn2.hashCode());
+		assertEquals(cn1.hashCode(), cn2.hashCode());
   }
   /**
    * Test ChangeNumber equals method
@@ -134,8 +135,6 @@
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
-
-    // Check equals
     assertFalse(cn1.equals(new Object()));
     assertTrue (cn1.equals(cn1));
     assertTrue (cn1.equals(cn2));
@@ -148,48 +147,46 @@
    * Test ChangeNumbergetTimeSec method
    */
   @Test(dataProvider = "createChangeNumber")
-  public void ChangeNumbergetTimeSec(
+	public void ChangeNumberGetTimeSec(
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
     // Check time in sec
-    assertEquals(cn1.getTime()/1000, cn1.getTimeSec()) ;
-    assertEquals(cn2.getTime()/1000, cn2.getTimeSec()) ;
-    assertEquals(cn3.getTime()/1000, cn3.getTimeSec()) ;
-    assertEquals(cn4.getTime()/1000, cn4.getTimeSec()) ;
-    assertEquals(cn5.getTime()/1000, cn5.getTimeSec()) ;
+    assertEquals(cn1.getTime()/1000, cn1.getTimeSec());
+    assertEquals(cn2.getTime()/1000, cn2.getTimeSec());
+    assertEquals(cn3.getTime()/1000, cn3.getTimeSec());
+    assertEquals(cn4.getTime()/1000, cn4.getTimeSec());
+    assertEquals(cn5.getTime()/1000, cn5.getTimeSec());
   }
 
   /**
    * Test ChangeNumber compare method
    */
   @Test(dataProvider = "createChangeNumber")
-  public void ChangeNumbercompare(
+	public void ChangeNumberCompare(
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
-    // Check compare
-    assertTrue((ChangeNumber.compare(null, null) == 0));
-    assertTrue((ChangeNumber.compare(null, cn2) < 0));
-    assertTrue((ChangeNumber.compare(cn1, null) > 0));
-    assertTrue((ChangeNumber.compare(cn1, cn2) == 0));
-    assertTrue((ChangeNumber.compare(cn1, cn3) < 0));
-    assertTrue((ChangeNumber.compare(cn3, cn1) > 0));
-    assertTrue((ChangeNumber.compare(cn1, cn4) < 0));
-    assertTrue((ChangeNumber.compare(cn4, cn1) > 0));
-    assertTrue((ChangeNumber.compare(cn1, cn5) < 0));
-    assertTrue((ChangeNumber.compare(cn5, cn1) > 0));
+    assertTrue(ChangeNumber.compare(null, null) == 0);
+    assertTrue(ChangeNumber.compare(null, cn2) < 0);
+    assertTrue(ChangeNumber.compare(cn1, null) > 0);
+    assertTrue(ChangeNumber.compare(cn1, cn2) == 0);
+    assertTrue(ChangeNumber.compare(cn1, cn3) < 0);
+    assertTrue(ChangeNumber.compare(cn3, cn1) > 0);
+    assertTrue(ChangeNumber.compare(cn1, cn4) < 0);
+    assertTrue(ChangeNumber.compare(cn4, cn1) > 0);
+    assertTrue(ChangeNumber.compare(cn1, cn5) < 0);
+    assertTrue(ChangeNumber.compare(cn5, cn1) > 0);
   }
 
   /**
    * Test ChangeNumber older method
    */
   @Test(dataProvider = "createChangeNumber")
-  public void ChangeNumberolder(
+	public void ChangeNumberOlder(
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
-    // Check older
     assertFalse(cn1.older(null));
     assertFalse(cn1.older(cn1));
     assertTrue(cn1.older(cn3));
@@ -201,11 +198,10 @@
    * Test ChangeNumber olderOrEqual method
    */
   @Test(dataProvider = "createChangeNumber")
-  public void ChangeNumberolderOrEqual(
+	public void ChangeNumberOlderOrEqual(
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
-    // Check olderOrEqual
     assertFalse(cn1.olderOrEqual(null));
     assertTrue(cn1.olderOrEqual(cn1));
     assertTrue(cn1.olderOrEqual(cn3));
@@ -217,12 +213,10 @@
    * Test ChangeNumber newer method
    */
   @Test(dataProvider = "createChangeNumber")
-  public void ChangeNumbernewer(
+	public void ChangeNumberNewer(
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
-
-    // Check newer
     assertTrue(cn1.newer(null));
     assertFalse(cn1.newer(cn1));
     assertFalse(cn1.newer(cn3));
@@ -234,12 +228,10 @@
    * Test ChangeNumber newerOrEquals method
    */
   @Test(dataProvider = "createChangeNumber")
-  public void ChangeNumbernewerOrEquals(
+	public void ChangeNumberNewerOrEquals(
       ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
       ChangeNumber cn5) throws Exception
   {
-
-    // Check newerOrEquals
     assertTrue(cn1.newerOrEquals(null));
     assertTrue(cn1.newerOrEquals(cn1));
     assertFalse(cn1.newerOrEquals(cn3));
@@ -249,11 +241,14 @@
 
 
   /**
-   * Create a ChangeNumberGenerator The call NewChangeNumber() and adjust()
-   */
+	 * Create a ChangeNumberGenerator The call NewChangeNumber() and adjust()
+	 * <p>
+	 * FIXME these tests are calling Thread.sleep() which makes them slow. We
+	 * should really have a way to control time (make it go slower or faster) for
+	 * the unit tests to avoid such waits.
+	 */
   @Test
-  public void changeNumberGenerator()
-         throws Exception
+	public void changeNumberGenerator() throws Exception
   {
     ChangeNumber CN1;
     ChangeNumber CN2;
@@ -262,51 +257,49 @@
     ChangeNumberGenerator cng =
       new ChangeNumberGenerator( 0, TimeThread.getTime());
 
-    // Generate 2 changeNumbers and check that they are differents
+		// Generate 2 changeNumbers and check that they are different
     CN1 = cng.newChangeNumber();
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0);
 
-    // Generate a changeNumber separates by 10 milliseconds
-    // and check that they are differents
+		// Generate a changeNumber separated by 10 milliseconds
+		// and check that they are different
     Thread.sleep(10);
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0);
 
-    // Generate a changeNumber separates by 300 milliseconds
-    // and check that they are differents
+		// Generate a changeNumber separated by 300 milliseconds
+		// and check that they are different
     Thread.sleep(300);
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0);
 
     // Adjust with the oldest CN
-    cng.adjust(CN1) ;
+    cng.adjust(CN1);
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0 );
 
     // Adjust with the newest generated
-    cng.adjust(CN2) ;
+    cng.adjust(CN2);
     CN1 = CN2;
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0 );
 
     //  Adjust with the newest generated (time + 300)
-    CN1 = new ChangeNumber(CN2.getTime() +300 ,CN2.getSeqnum(),
-        CN2.getServerId()) ;
-    cng.adjust(CN1) ;
+    CN1 = new ChangeNumber(CN2.getTime() +300 ,CN2.getSeqnum(), CN2.getServerId());
+    cng.adjust(CN1);
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0 );
 
     //  Adjust with the newest generated (seqmun + 10)
-    CN1 = new ChangeNumber(CN2.getTime() ,CN2.getSeqnum() +10,
-        CN2.getServerId()) ;
-    cng.adjust(CN1) ;
+    CN1 = new ChangeNumber(CN2.getTime() ,CN2.getSeqnum() +10, CN2.getServerId());
+    cng.adjust(CN1);
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0 );
 
     //  Adjust with the newest generated (seqmun = 0XFFFF)
-    CN1 = new ChangeNumber(CN2.getTime() ,0XFFFF +10,CN2.getServerId()) ;
-    cng.adjust(CN1) ;
+    CN1 = new ChangeNumber(CN2.getTime() ,0XFFFF +10,CN2.getServerId());
+    cng.adjust(CN1);
     CN2 = cng.newChangeNumber();
     assertTrue(CN1.compareTo(CN2) != 0 );
   }
@@ -315,42 +308,41 @@
    * Test the difference in seq num between 2 change numbers.
    */
   @Test
-  public void changeNumberDiffSeqNum()
-         throws Exception
+	public void changeNumberDiffSeqNum() throws Exception
   {
     ChangeNumber CN1;
     ChangeNumber CN2;
 
-    CN1 = new ChangeNumber((long)0, 3, 0);
+    CN1 = new ChangeNumber(0, 3, 0);
 
     // 3-0 = 3
-    CN2 = new ChangeNumber((long)0, 0, 0);
+    CN2 = new ChangeNumber(0, 0, 0);
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 3);
 
     // 3-1 = 2
-    CN2 = new ChangeNumber((long)0, 1, 0);
+    CN2 = new ChangeNumber(0, 1, 0);
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 2);
 
     // 3-3 = 0
-    CN2 = new ChangeNumber((long)0, 3, 0);
+    CN2 = new ChangeNumber(0, 3, 0);
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 0);
 
     // 3-4 = 0 (CN1 must be newer otherwise 0 should be returned)
-    CN2 = new ChangeNumber((long)0, 4, 0);
+    CN2 = new ChangeNumber(0, 4, 0);
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 0);
 
-    CN1 = new ChangeNumber((long)0, 0, 0);
+    CN1 = new ChangeNumber(0, 0, 0);
 
     // 0-0 = 0
-    CN2 = new ChangeNumber((long)0, 0, 0);
+    CN2 = new ChangeNumber(0, 0, 0);
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 0);
 
     // 0-1 = 0 (CN1 must be newer otherwise 0 should be returned)
-    CN2 = new ChangeNumber((long)0, 1, 0);
+    CN2 = new ChangeNumber(0, 1, 0);
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 0);
 
-    CN1 = new ChangeNumber((long)0, 5, 0);
-    CN2 = new ChangeNumber((long)0, 2, 0);
+    CN1 = new ChangeNumber(0, 5, 0);
+    CN2 = new ChangeNumber(0, 2, 0);
 
     // 5-null = 5
     assertEquals(ChangeNumber.diffSeqNum(CN1, null), 5);
@@ -361,16 +353,69 @@
     // null-null = 0
     assertEquals(ChangeNumber.diffSeqNum(null, null), 0);
 
-    CN1 = new ChangeNumber((long)1111111, 2, 0);
-    CN2 = new ChangeNumber((long)3333333, 4, 0);
+    CN1 = new ChangeNumber(1111111, 2, 0);
+    CN2 = new ChangeNumber(3333333, 4, 0);
 
     // CN1 older than CN2 -> 0
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 0);
 
-    CN1 = new ChangeNumber((long)3333333, 1, 0);
-    CN2 = new ChangeNumber((long)1111111, Integer.MAX_VALUE-1, 0);
+    CN1 = new ChangeNumber(3333333, 1, 0);
+    CN2 = new ChangeNumber(1111111, Integer.MAX_VALUE-1, 0);
 
     // CN1 seqnum looped
     assertEquals(ChangeNumber.diffSeqNum(CN1, CN2), 3);
   }
+
+  @DataProvider
+	public Iterator<Object[]> createCNPairsToCompare()
+	{
+		final List<Object> allCNs = new ArrayList<Object>();
+		for (Object[] cnData : createChangeNumberData())
+		{
+			allCNs.addAll(Arrays.asList(cnData));
+		}
+
+		final List<Object[]> results = new ArrayList<Object[]>();
+		for (Object cn1 : allCNs)
+		{
+			for (Object cn2 : allCNs)
+			{
+				/*
+				 * it is ok to compare to the exact same CN to ensure operations are
+				 * reflexive, and it is also ok to compare cn1 to cn2, and cn2 to cn1 to
+				 * ensure operations are symmetric
+				 */
+				results.add(new Object[] { cn1, cn2 });
+			}
+		}
+		return results.iterator();
+	}
+
+	@Test(dataProvider = "createCNPairsToCompare")
+	public void compareToEquivalentToEquals(ChangeNumber cn1, ChangeNumber cn2)
+			throws Exception
+	{
+		assertEquals(cn1.compareTo(cn2) == 0, cn1.equals(cn2));
+	}
+
+	@Test(dataProvider = "createCNPairsToCompare")
+	public void hashCodesEqualWhenChangeNumbersEqual(ChangeNumber cn1,
+			ChangeNumber cn2) throws Exception
+	{
+		if (cn1.equals(cn2))
+		{
+			assertEquals(cn1.hashCode(), cn2.hashCode());
+		}
+	}
+
+	@Test(dataProvider = "createCNPairsToCompare")
+	public void hashCodesEqualWhenCompareToEqual(ChangeNumber cn1,
+			ChangeNumber cn2) throws Exception
+	{
+		if (cn1.compareTo(cn2) == 0)
+		{
+			assertEquals(cn1.hashCode(), cn2.hashCode());
+		}
+	}
+
 }

--
Gitblit v1.10.0