mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

lutoff
06.46.2006 307509d87acb80ce1369a1c38e08ea6d8d4341e7
Add basic tests on synchronisation data structure
3 files added
1 files modified
614 ■■■■■ changed files
opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/AttrInfoTest.java 153 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ChangeNumberTest.java 288 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java 53 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ValueInfoTest.java 120 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/AttrInfoTest.java
New file
@@ -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);
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ChangeNumberTest.java
New file
@@ -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 );
  }
}
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());
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ValueInfoTest.java
New file
@@ -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());
    }
  }
}