From cd092a8cf0e5ff9b6b0df1c56e3ddfdd86a4aeaa Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Mon, 24 Aug 2009 14:51:06 +0000
Subject: [PATCH] Fix failure of replication Dependency unit test by rethinking ReplicationIterator

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java |  139 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 134 insertions(+), 5 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java
index ff51863..b84564e 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.replication.server;
 
@@ -50,6 +50,7 @@
     ReplicationServer replicationServer = null;
     ReplicationDbEnv dbEnv = null;
     DbHandler handler = null;
+    ReplicationIterator it = null;
     try
     {
       TestCaseUtils.startServer();
@@ -85,22 +86,145 @@
       ChangeNumber changeNumber1 = gen.newChangeNumber();
       ChangeNumber changeNumber2 = gen.newChangeNumber();
       ChangeNumber changeNumber3 = gen.newChangeNumber();
+      ChangeNumber changeNumber4 = gen.newChangeNumber();
+      ChangeNumber changeNumber5 = gen.newChangeNumber();
 
       DeleteMsg update1 = new DeleteMsg(TEST_ROOT_DN_STRING, changeNumber1,
         "uid");
       DeleteMsg update2 = new DeleteMsg(TEST_ROOT_DN_STRING, changeNumber2,
         "uid");
       DeleteMsg update3 = new DeleteMsg(TEST_ROOT_DN_STRING, changeNumber3,
-        "uid");
+      "uid");
+      DeleteMsg update4 = new DeleteMsg(TEST_ROOT_DN_STRING, changeNumber4,
+      "uid");
 
       handler.add(update1);
       handler.add(update2);
       handler.add(update3);
 
-      // The ChangeNumber should not get purged
+      //--
+      // Iterator tests with memory queue only populated
+
+      // verify that memory queue is populated
+      assertEquals(handler.getQueueSize(),3);
+
+      // Iterator from existing CN
+      it = handler.generateIterator(changeNumber1);
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber2)==0,
+          " Actual change number=" + it.getChange().getChangeNumber() +
+          " Expect change number=" + changeNumber2);
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber3)==0,
+          " Actual change number=" + it.getChange().getChangeNumber());
+      assertFalse(it.next());
+      it.releaseCursor();
+      it=null;
+
+      // Iterator from NON existing CN
+      Exception ec = null;
+      try
+      {
+        it = handler.generateIterator(changeNumber5);
+      }
+      catch(Exception e)
+      {
+        ec = e;
+      }
+      assertNotNull(ec);
+      assert(ec.getLocalizedMessage().equals("ChangeNumber not available"));
+      
+      //--
+      // Iterator tests with db only populated
+      Thread.sleep(1000); // let the time for flush to happen
+
+      // verify that memory queue is empty (all changes flushed in the db)
+      assertEquals(handler.getQueueSize(),0);
+
+      // Test iterator from existing CN
+      it = handler.generateIterator(changeNumber1);
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber2)==0,
+          " Actual change number=" + it.getChange().getChangeNumber());
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber3)==0,
+          " Actual change number=" + it.getChange().getChangeNumber());
+      assertFalse(it.next());
+      it.releaseCursor();
+      it=null;
+
+      // Iterator from NON existing CN
+      ec = null;
+      try
+      {
+        it = handler.generateIterator(changeNumber5);
+      }
+      catch(Exception e)
+      {
+        ec = e;
+      }
+      assertNotNull(ec);
+      assert(ec.getLocalizedMessage().equals("ChangeNumber not available"));
+      
+      // Test first and last
       assertEquals(changeNumber1, handler.getFirstChange());
       assertEquals(changeNumber3, handler.getLastChange());
 
+      //--
+      // Iterator tests with db and memory queue populated
+      // all changes in the db - add one in the memory queue
+      handler.add(update4);
+
+      // verify memory queue contains this one
+      assertEquals(handler.getQueueSize(),1);
+
+      // Test iterator from existing CN
+      it = handler.generateIterator(changeNumber1);
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber2)==0,
+          " Actual change number=" + it.getChange().getChangeNumber());
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber3)==0,
+          " Actual change number=" + it.getChange().getChangeNumber());
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber4)==0,
+          " Actual change number=" + it.getChange().getChangeNumber());
+      assertFalse(it.next());
+      assertTrue(it.getChange()==null);
+      it.releaseCursor();
+      it=null;
+
+      // Test iterator from existing CN at the limit between queue and db
+      it = handler.generateIterator(changeNumber3);
+      assertTrue(it.next());
+      assertTrue(it.getChange().getChangeNumber().compareTo(changeNumber4)==0,
+          " Actual change number=" + it.getChange().getChangeNumber());
+      assertFalse(it.next());
+      assertTrue(it.getChange()==null);
+      it.releaseCursor();
+      it=null;
+
+      // Test iterator from existing CN at the limit between queue and db
+      it = handler.generateIterator(changeNumber4);
+      assertFalse(it.next());
+      assertTrue(it.getChange()==null,
+          " Actual change number=" + it.getChange());
+      it.releaseCursor();
+      it=null;
+
+      // Test iterator from NON existing CN
+      ec = null;
+      try
+      {
+        it = handler.generateIterator(changeNumber5);
+      }
+      catch(Exception e)
+      {
+        ec = e;
+      }
+      assertNotNull(ec);
+      assert(ec.getLocalizedMessage().equals("ChangeNumber not available"));
+      
       handler.setPurgeDelay(1);
 
       boolean purged = false;
@@ -109,8 +233,8 @@
       {
         ChangeNumber firstChange = handler.getFirstChange();
         ChangeNumber lastChange = handler.getLastChange();
-        if ((!firstChange.equals(changeNumber3) ||
-          (!lastChange.equals(changeNumber3))))
+        if ((!firstChange.equals(changeNumber4) ||
+          (!lastChange.equals(changeNumber4))))
         {
           TestCaseUtils.sleep(100);
         } else
@@ -120,6 +244,11 @@
       }
     } finally
     {
+      if (it != null)
+      {
+        it.releaseCursor();
+        it=null;
+      }
       if (handler != null)
         handler.shutdown();
       if (dbEnv != null)

--
Gitblit v1.10.0