From 307509d87acb80ce1369a1c38e08ea6d8d4341e7 Mon Sep 17 00:00:00 2001
From: lutoff <lutoff@localhost>
Date: Wed, 06 Sep 2006 06:46:42 +0000
Subject: [PATCH] Add basic tests on synchronisation data structure

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ValueInfoTest.java          |  120 ++++++++++
 opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java |   53 ++++
 opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ChangeNumberTest.java       |  288 ++++++++++++++++++++++++++
 opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/AttrInfoTest.java           |  153 +++++++++++++
 4 files changed, 613 insertions(+), 1 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/AttrInfoTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/AttrInfoTest.java
new file mode 100644
index 0000000..0988362
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/AttrInfoTest.java
@@ -0,0 +1,153 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.synchronization;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.util.TimeThread;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+/**
+ * Test AttrInfo and AttrInfoWithOptions
+ */
+public class AttrInfoTest
+    extends SynchronizationTestCase
+{
+  /**
+   * Build some data for the AttrInfo test below.
+   */
+  @DataProvider(name = "attrInfo")
+  public Object[][] createData()
+  {
+    AttributeType type = DirectoryServer.getAttributeType("description");
+
+    AttributeValue att1 = new AttributeValue(type, "string");
+    AttributeValue att2 = new AttributeValue(type, "value");
+    AttributeValue att3 = new AttributeValue(null, "again");
+
+    ChangeNumber del1 = new ChangeNumber(1, (short) 0, (short) 1);
+    ChangeNumber del2 = new ChangeNumber(1, (short) 1, (short) 1);
+    ChangeNumber del3 = new ChangeNumber(1, (short) 0, (short) 2);
+
+    ChangeNumber upd1 = new ChangeNumber(TimeThread.getTime(),
+        (short) 123, (short) 45);
+    ChangeNumber upd2 = new ChangeNumber(TimeThread.getTime() + 1000,
+        (short) 123, (short) 45);
+    ChangeNumber upd3 = new ChangeNumber(TimeThread.getTime(),
+        (short) 321, (short) 54);
+
+    return new Object[][]
+    {
+    { att1, del1, upd1 },
+    { att2, del2, upd2 },
+    { att3, del3, upd3 },
+    { att3, upd3, upd3 } };
+  }
+
+  /**
+   * Create a AttrInfo and check the methods
+   */
+  @Test(dataProvider = "attrInfo")
+  public void attrInfo(
+      AttributeValue att, ChangeNumber deleteTime, ChangeNumber updateTime)
+      throws Exception
+  {
+    // Create an empty AttrInfo
+    AttrInfo attrInfo1 = new AttrInfo();
+
+    // Check getLastUpdateTime setLastUpdateTime
+    if (attrInfo1.getLastUpdateTime() != null)
+    {
+      assertTrue(false);
+    }
+    attrInfo1.setLastUpdateTime(updateTime);
+    assertTrue(attrInfo1.getLastUpdateTime().compareTo(updateTime) == 0);
+
+    // Check getDeleteTime setDeleteTime
+    if (attrInfo1.getDeleteTime() != null)
+    {
+      assertTrue(false);
+    }
+    attrInfo1.setDeleteTime(deleteTime);
+    assertTrue(attrInfo1.getDeleteTime().compareTo(deleteTime) == 0);
+
+    // Check add(AttributeValue val, ChangeNumber CN)
+    attrInfo1.add(att, updateTime);
+    ArrayList<ValueInfo> values1 = attrInfo1.getValuesInfo();
+    assertTrue(values1.size() == 1);
+    ValueInfo valueInfo1 = new ValueInfo(att, updateTime, null);
+    assertTrue(values1.get(0).equals(valueInfo1));
+
+    // Check constructor with parameter
+    ValueInfo valueInfo2 = new ValueInfo(att, updateTime, deleteTime);
+    ArrayList<ValueInfo> values = new ArrayList<ValueInfo>();
+    values.add(valueInfo2);
+    AttrInfo attrInfo2 = new AttrInfo(deleteTime, updateTime, values);
+
+    // Check equality
+    assertTrue(attrInfo1.getLastUpdateTime().compareTo(
+        attrInfo2.getLastUpdateTime()) == 0);
+    assertTrue(attrInfo1.getDeleteTime().compareTo(attrInfo2.getDeleteTime())==0);
+
+    //  Check constructor with time parameter and not Value
+    AttrInfo attrInfo3 = new AttrInfo(deleteTime, updateTime, null);
+    attrInfo3.add(att, updateTime);
+    ArrayList<ValueInfo> values3 = attrInfo3.getValuesInfo();
+    assertTrue(values3.size() == 1);
+    valueInfo1 = new ValueInfo(att, updateTime, null);
+    assertTrue(values3.get(0).equals(valueInfo1));
+
+    // Check duplicate
+    AttrInfo attrInfo4 = attrInfo3.duplicate();
+    ArrayList<ValueInfo> values4 = attrInfo4.getValuesInfo();
+    assertTrue(attrInfo4.getDeleteTime().compareTo(attrInfo3.getDeleteTime())==0);
+    assertTrue(attrInfo4.getLastUpdateTime().compareTo(
+        attrInfo3.getLastUpdateTime()) == 0);
+    assertEquals(values4.size(), values3.size());
+
+    // Check delete(AttributeValue val, ChangeNumber CN)
+    attrInfo4.delete(att, updateTime);
+    assertTrue(attrInfo4.getValuesInfo().size() == 1);
+
+    // Check delete(LinkedHashSet<AttributeValue> values, ChangeNumber CN)
+    LinkedHashSet<AttributeValue> attVals = new LinkedHashSet<AttributeValue>();
+    attVals.add(att);
+    attrInfo3.delete(attVals, updateTime) ;
+    assertTrue(attrInfo3.getValuesInfo().size() == 1);
+
+    // Check delete(ChangeNumber CN)
+    attrInfo2.delete(updateTime) ;
+    assertTrue(attrInfo2.getValuesInfo().size() == 0);
+
+  }
+}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ChangeNumberTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ChangeNumberTest.java
new file mode 100644
index 0000000..8dc5b64
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ChangeNumberTest.java
@@ -0,0 +1,288 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.synchronization;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+
+import org.opends.server.util.TimeThread;
+
+
+/**
+ * Test ChangeNumber and ChangeNumberGenerator
+ */
+public class ChangeNumberTest extends SynchronizationTestCase
+{
+
+  /**
+   * Create ChangeNumber Data
+   */
+  @DataProvider(name = "changeNumberData")
+  public Object[][] createConstructorData() {
+    return new Object[][] {
+       {1, (short) 0, (short) 1},
+       {TimeThread.getTime(), (short) 123, (short) 45}
+    };
+  }
+
+  /**
+   * Test ChangeNumber constructor
+   */
+  @Test(dataProvider = "changeNumberData")
+  public void CreateChangeNumber(long time, int seq, short id)
+         throws Exception
+  {
+    // Create 2 ChangeNumber with the same data and check equality
+    new ChangeNumber(time,seq,id);
+    new ChangeNumber(time,seq,id);
+    new ChangeNumber(time+1,seq,id) ;
+    new ChangeNumber(time,seq+1,id) ;
+    new ChangeNumber(time,seq,(short)(id+1));
+    assertTrue(true);
+  }
+
+  /**
+   * Create ChangeNumber
+   */
+  @DataProvider(name = "createChangeNumber")
+  public Object[][] createChangeNumberData() {
+
+    long time[] = {1, TimeThread.getTime()} ;
+    short seq[] = {(short)0,  (short) 123} ;
+    short id [] = {(short)1,  (short) 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],(short)(id[i]+1));
+    }
+    return obj;
+  }
+
+  /**
+   * Test ChangeNumber hashCode method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  public void ChangeNumberhashCode(
+      ChangeNumber cn1, ChangeNumber cn2, ChangeNumber cn3, ChangeNumber cn4,
+      ChangeNumber cn5) throws Exception
+  {
+
+    // Check hashCode
+    assertTrue (cn1.hashCode() == cn2.hashCode());
+  }
+  /**
+   * Test ChangeNumber equals method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  public void ChangeNumberEquals(
+      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));
+    assertFalse(cn1.equals(cn3));
+    assertFalse(cn1.equals(cn4));
+    assertFalse(cn1.equals(cn5));
+  }
+
+  /**
+   * Test ChangeNumbergetTimeSec method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  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()) ;
+  }
+
+  /**
+   * Test ChangeNumber compare method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  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));
+  }
+
+  /**
+   * Test ChangeNumber older method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  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));
+    assertTrue(cn1.older(cn4));
+    assertTrue(cn1.older(cn5));
+  }
+
+  /**
+   * Test ChangeNumber olderOrEqual method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  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));
+    assertTrue(cn1.olderOrEqual(cn4));
+    assertTrue(cn1.olderOrEqual(cn5));
+  }
+
+  /**
+   * Test ChangeNumber newer method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  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));
+    assertFalse(cn1.newer(cn4));
+    assertFalse(cn1.newer(cn5));
+  }
+
+  /**
+   * Test ChangeNumber newerOrEquals method
+   */
+  @Test(dataProvider = "createChangeNumber")
+  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));
+    assertFalse(cn1.newerOrEquals(cn4));
+    assertFalse(cn1.newerOrEquals(cn5));
+  }
+
+
+  /**
+   * Create a ChangeNumberGenerator The call NewChangeNumber() and adjust()
+   */
+  @Test
+  public void changeNumberGenerator()
+         throws Exception
+  {
+    ChangeNumber CN1;
+    ChangeNumber CN2;
+
+    // Generated the ChangeNumberGenerator object
+    ChangeNumberGenerator cng =
+      new ChangeNumberGenerator((short) 0, TimeThread.getTime());
+
+    // Generate 2 changeNumbers and check that they are differents
+    CN1 = cng.NewChangeNumber();
+    CN2 = cng.NewChangeNumber();
+    assertTrue(CN1.compareTo(CN2) != 0);
+
+    // Generate a changeNumber separates by 10 milliseconds
+    // and check that they are differents
+    Thread.currentThread().sleep(10);
+    CN2 = cng.NewChangeNumber();
+    assertTrue(CN1.compareTo(CN2) != 0);
+
+    // Generate a changeNumber separates by 300 milliseconds
+    // and check that they are differents
+    Thread.currentThread().sleep(300);
+    CN2 = cng.NewChangeNumber();
+    assertTrue(CN1.compareTo(CN2) != 0);
+
+    // Adjust with the oldest CN
+    cng.adjust(CN1) ;
+    CN2 = cng.NewChangeNumber();
+    assertTrue(CN1.compareTo(CN2) != 0 );
+
+    // Adjust with the newest generated
+    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) ;
+    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) ;
+    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) ;
+    CN2 = cng.NewChangeNumber();
+    assertTrue(CN1.compareTo(CN2) != 0 );
+  }
+}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java
index 74fdec7..bcc98c9 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java
@@ -29,6 +29,7 @@
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.zip.DataFormatException;
 
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
@@ -55,7 +56,7 @@
 
 /**
  * Test the contructors, encoders and decoders of the synchronization
- * ModifyMsg, ModifyDnMsg, AddMsg and Delete Msg
+ * AckMsg, ModifyMsg, ModifyDnMsg, AddMsg and Delete Msg
  */
 public class SynchronizationMsgTest extends SynchronizationTestCase
 {
@@ -279,4 +280,54 @@
     assertEquals(msg.getBytes(), generatedMsg.getBytes());
     // TODO : should test that generated attributes match original attributes.
   }
+
+  /**
+   * Build some data for the AckMsg test below.
+   * @throws DirectoryException
+   */
+  @DataProvider(name = "ackMsg")
+  public Object[][] createAckData() {
+    ChangeNumber cn1 = new ChangeNumber(1, (short) 0, (short) 1);
+    ChangeNumber cn2 = new ChangeNumber(TimeThread.getTime(),
+                                       (short) 123, (short) 45);
+
+    return new Object[][] {
+        {cn1},
+        {cn2}
+        };
+  }
+
+  @Test(dataProvider = "ackMsg")
+  public void ackMsg(ChangeNumber cn)
+         throws Exception
+  {
+    AckMessage msg1, msg2 ;
+
+    // Consctructor test (with ChangeNumber)
+    // Chech that retrieved CN is OK
+    msg1 = new  AckMessage(cn);
+    assertEquals(msg1.getChangeNumber().compareTo(cn), 0);
+
+    // Consctructor test (with byte[])
+    // Check that retrieved CN is OK
+    msg2 = new  AckMessage(msg1.getBytes());
+    assertEquals(msg2.getChangeNumber().compareTo(cn), 0);
+
+    // Check invalid bytes for constructor
+    byte[] b = msg1.getBytes();
+    b[0] = SynchronizationMessage.MSG_TYPE_ADD_REQUEST ;
+    try
+    {
+      // This should generated an exception
+      msg2 = new  AckMessage(b);
+      assertTrue(false);
+    }
+    catch (DataFormatException e)
+    {
+      assertTrue(true);
+    }
+
+    // Check that retrieved CN is OK
+    msg2 = new  AckMessage(msg1.getBytes());
+  }
 }
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ValueInfoTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ValueInfoTest.java
new file mode 100644
index 0000000..4a9f7a3
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ValueInfoTest.java
@@ -0,0 +1,120 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.synchronization;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.util.TimeThread;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+
+/**
+ * Test of ValueInfo
+ */
+public class ValueInfoTest extends SynchronizationTestCase
+{
+  /**
+   * Build some data for the ValueInfo test below.
+   */
+  @DataProvider(name = "valueInfo")
+  public Object[][] createData() {
+    AttributeType type = DirectoryServer.getAttributeType("description");
+
+    AttributeValue att1 = new AttributeValue(type, "string");
+    AttributeValue att2 = new AttributeValue(type, "value");
+    AttributeValue att3 = new AttributeValue(type, "again");
+
+    ChangeNumber del1 = new ChangeNumber(1, (short) 0, (short) 1);
+    ChangeNumber del2 = new ChangeNumber(1, (short) 1, (short) 1);
+    ChangeNumber del3 = new ChangeNumber(1, (short) 0, (short) 2);
+
+    ChangeNumber upd1 = new ChangeNumber(TimeThread.getTime(),
+                                       (short) 123, (short) 45);
+    ChangeNumber upd2 = new ChangeNumber(TimeThread.getTime()+ 1000,
+        (short) 123, (short) 45);
+    ChangeNumber upd3 = new ChangeNumber(TimeThread.getTime(),
+        (short) 321, (short) 54);
+
+    return new Object[][] {
+        {att1,null,null},
+        {att1,upd1,del1},
+        {att2,upd2,del2},
+        {att3,upd3,del3}};
+  }
+
+  /**
+   * Create a ValueInfo and check the methods
+   */
+  @Test(dataProvider = "valueInfo")
+  public void valueInfo(AttributeValue value,
+      ChangeNumber CNupdate,
+      ChangeNumber CNdelete)
+         throws Exception
+  {
+    ValueInfo valInfo1 = new ValueInfo(value,CNupdate,CNdelete);
+    ValueInfo valInfo2 = new ValueInfo(value,CNupdate,CNupdate);
+    ValueInfo valInfo3 = new ValueInfo(new AttributeValue(null,"Test"),
+        CNupdate,CNupdate);
+
+    // Check equals
+    assertFalse(valInfo1.equals(new Object())) ;
+    assertTrue(valInfo1.equals(valInfo1)) ;
+    assertTrue(valInfo1.equals(valInfo2)) ;
+    assertFalse(valInfo1.equals(valInfo3)) ;
+
+    // Check hashcode
+    assertTrue(valInfo1.hashCode() == valInfo2.hashCode()) ;
+
+    // Check getValueDeleteTime
+    if (valInfo1.getValueDeleteTime() != null)
+    {
+      assertTrue(valInfo1.getValueDeleteTime().compareTo(CNdelete) == 0);
+    }
+
+    // Check getValueUpdateTime
+    if (valInfo1.getValueUpdateTime() != null)
+    {
+      assertTrue(valInfo1.getValueUpdateTime().compareTo(CNupdate) == 0);
+    }
+
+    // Check getValue
+    assertTrue(valInfo1.getValue().equals(value)) ;
+
+    // Chek valueUpdateTime
+    if (CNupdate == null)
+    {
+      assertFalse(valInfo1.isUpdate());
+    }
+    else
+    {
+      assertTrue(valInfo1.isUpdate());
+    }
+  }
+}

--
Gitblit v1.10.0