From c86d637ceac1c419cf8c5bb836f5a8438eae93c1 Mon Sep 17 00:00:00 2001
From: coulbeck <coulbeck@localhost>
Date: Tue, 03 Oct 2006 18:40:00 +0000
Subject: [PATCH] Unit test for compare operation when the entry is write locked.  Trivial improvements to the LockManager class.

---
 opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java                                     |   25 +++++-------
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/CompareOperationTestCase.java |   71 +++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+), 15 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
index 18a480f..c124d6e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
@@ -127,7 +127,7 @@
    *          it was not possible to obtain a read lock for some
    *          reason.
    */
-  public static final Lock tryLockRead(DN entryDN)
+  public static Lock tryLockRead(DN entryDN)
   {
     assert debugEnter(CLASS_NAME, "tryLockRead",
                       String.valueOf(entryDN));
@@ -251,7 +251,7 @@
    *          it was not possible to obtain a read lock for some
    *          reason.
    */
-  public static final Lock lockRead(DN entryDN)
+  public static Lock lockRead(DN entryDN)
   {
     assert debugEnter(CLASS_NAME, "lockRead",
                       String.valueOf(entryDN));
@@ -277,7 +277,7 @@
    *          it was not possible to obtain a read lock for some
    *          reason.
    */
-  public static final Lock lockRead(DN entryDN, long timeout)
+  public static Lock lockRead(DN entryDN, long timeout)
   {
     assert debugEnter(CLASS_NAME, "lockRead", String.valueOf(entryDN),
                       String.valueOf(timeout));
@@ -416,7 +416,7 @@
    *          if it was not possible to obtain a write lock for some
    *          reason.
    */
-  public static final Lock tryLockWrite(DN entryDN)
+  public static Lock tryLockWrite(DN entryDN)
   {
     assert debugEnter(CLASS_NAME, "lockWrite",
                       String.valueOf(entryDN));
@@ -536,12 +536,12 @@
    *                  write lock.
    *
    * @return  The write lock that was acquired, or <CODE>null</CODE>
-   *          if it was not possible to obtain a read lock for some
+   *          if it was not possible to obtain a write lock for some
    *          reason.
    */
-  public static final Lock lockWrite(DN entryDN)
+  public static Lock lockWrite(DN entryDN)
   {
-    assert debugEnter(CLASS_NAME, "lockRead",
+    assert debugEnter(CLASS_NAME, "lockWrite",
                       String.valueOf(entryDN));
 
     return lockWrite(entryDN, DEFAULT_TIMEOUT);
@@ -563,7 +563,7 @@
    *          if it was not possible to obtain a read lock for some
    *          reason.
    */
-  public static final Lock lockWrite(DN entryDN, long timeout)
+  public static Lock lockWrite(DN entryDN, long timeout)
   {
     assert debugEnter(CLASS_NAME, "lockWrite",
                       String.valueOf(entryDN),
@@ -699,7 +699,7 @@
    *                  lock.
    * @param  lock     The read or write lock held for the entry.
    */
-  public static final void unlock(DN entryDN, Lock lock)
+  public static void unlock(DN entryDN, Lock lock)
   {
     assert debugEnter(CLASS_NAME, "unlock", String.valueOf(entryDN));
 
@@ -772,8 +772,6 @@
         // This lock isn't held so we can remove it from the table.
         entryLocks.remove(entryDN);
       }
-
-      return;
     }
     catch (Exception e)
     {
@@ -786,7 +784,6 @@
                   "whether the lock for entry " + entryDN.toString() +
                   " can be removed:  " +
                   stackTraceToSingleLineString(e));
-      return;
     }
     finally
     {
@@ -810,7 +807,7 @@
    *          specified entry.  If a lock object is returned, it may
    *          be possible to get information about who was holding it.
    */
-  public static final ReentrantReadWriteLock destroyLock(DN entryDN)
+  public static ReentrantReadWriteLock destroyLock(DN entryDN)
   {
     assert debugEnter(CLASS_NAME, "destroyLock",
                       String.valueOf(entryDN));
@@ -826,7 +823,7 @@
    *
    * @return  The number of entries currently held in the lock table.
    */
-  public static final int lockTableSize()
+  public static int lockTableSize()
   {
     assert debugEnter(CLASS_NAME, "lockTableSize");
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/CompareOperationTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/CompareOperationTestCase.java
index eff1f6e..98c3f52 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/CompareOperationTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/CompareOperationTestCase.java
@@ -29,10 +29,13 @@
 
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.protocols.asn1.ASN1Reader;
+import org.opends.server.protocols.asn1.ASN1Writer;
+import org.opends.server.protocols.ldap.*;
 import org.opends.server.types.Control;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.Entry;
+import org.opends.server.types.LockManager;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.controls.LDAPAssertionRequestControl;
 import org.opends.server.controls.ProxiedAuthV1Control;
@@ -41,9 +44,12 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 import static org.testng.Assert.*;
+import static org.testng.Assert.assertEquals;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.locks.Lock;
+import java.net.Socket;
 
 public class CompareOperationTestCase extends OperationTestCase
 {
@@ -589,4 +595,67 @@
     examineIncompleteOperation(compareOperation);
   }
 
+  @Test(groups = "slow")
+  public void testCompareWriteLock() throws Exception
+  {
+    // We need the operation to be run in a separate thread because we are going
+    // to write lock the entry in the test case thread and check that the
+    // compare operation does not proceed.
+
+    // Establish a connection to the server.
+    Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
+    try
+    {
+      ASN1Reader r = new ASN1Reader(s);
+      ASN1Writer w = new ASN1Writer(s);
+      r.setIOTimeout(15000);
+
+      BindRequestProtocolOp bindRequest =
+           new BindRequestProtocolOp(
+                new ASN1OctetString("cn=Directory Manager"),
+                3, new ASN1OctetString("password"));
+      LDAPMessage message = new LDAPMessage(1, bindRequest);
+      w.writeElement(message.encode());
+
+      message = LDAPMessage.decode(r.readElement().decodeAsSequence());
+      BindResponseProtocolOp bindResponse = message.getBindResponseProtocolOp();
+      assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
+
+
+      Lock writeLock = LockManager.lockWrite(entry.getDN());
+      assertNotNull(writeLock);
+
+      try
+      {
+        InvocationCounterPlugin.resetAllCounters();
+
+        CompareRequestProtocolOp compareRequest =
+          new CompareRequestProtocolOp(
+               new ASN1OctetString(entry.getDN().toString()),
+               "uid", new ASN1OctetString("rogasawara"));
+        message = new LDAPMessage(2, compareRequest);
+        w.writeElement(message.encode());
+
+        message = LDAPMessage.decode(r.readElement().decodeAsSequence());
+        CompareResponseProtocolOp compareResponse =
+             message.getCompareResponseProtocolOp();
+
+        assertEquals(compareResponse.getResultCode(),
+                     DirectoryServer.getServerErrorResultCode().getIntValue());
+
+        assertEquals(InvocationCounterPlugin.getPreParseCount(), 1);
+        assertEquals(InvocationCounterPlugin.getPreOperationCount(), 0);
+        assertEquals(InvocationCounterPlugin.getPostOperationCount(), 0);
+        assertEquals(InvocationCounterPlugin.getPostResponseCount(), 1);
+      } finally
+      {
+        LockManager.unlock(entry.getDN(), writeLock);
+      }
+    } finally
+    {
+      s.close();
+    }
+
+  }
+
 }

--
Gitblit v1.10.0