From 0d750fcfd5d533d22bbf6bbb8a8570230603bafb Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Thu, 23 Oct 2014 09:02:10 +0000
Subject: [PATCH] Port to the DJ3 dev branch the unit-test to verify fix for OPENDJ-1586

---
 opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java |   97 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 97 insertions(+), 0 deletions(-)

diff --git a/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java
index ca70ec3..823560e 100644
--- a/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java
+++ b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java
@@ -882,6 +882,103 @@
     assertEquals(deleteOperation.getResultCode(), ResultCode.SUCCESS);
   }
 
+  /**
+   * Tests the {@code processSearch} method when dealing with nested groups.
+   * This is a test for issue OPENDJ-1586. Before the fix the method would
+   * only return the direct members of the groups. Now it should return
+   * all.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test
+  public void testProcessSearchWithNestedGroup() throws Exception
+  {
+    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.addEntries(
+        "dn: ou=People,o=test",
+        "objectClass: top",
+        "objectClass: organizationalUnit",
+        "ou: People",
+        "",
+        "dn: uid=test.user,ou=People,o=test",
+        "objectClass: top",
+        "objectClass: person",
+        "objectClass: organizationalPerson",
+        "objectClass: inetOrgPerson",
+        "uid: test.user",
+        "givenName: Test",
+        "sn: User",
+        "cn: Test User",
+        "userPassword: password",
+        "",
+        "dn: uid=test.user2,ou=People,o=test",
+        "objectClass: top",
+        "objectClass: person",
+        "objectClass: organizationalPerson",
+        "objectClass: inetOrgPerson",
+        "uid: test.user2",
+        "givenName: Test",
+        "sn: User2",
+        "cn: Test User2",
+        "userPassword: password",
+        "",
+        "dn: ou=Groups,o=test",
+        "objectClass: top",
+        "objectClass: organizationalUnit",
+        "ou: Groups",
+        "",
+        "dn: cn=Test Group 1,ou=Groups,o=test",
+        "objectClass: top",
+        "objectClass: groupOfNames",
+        "cn: Test Group 1",
+        "member: uid=test.user,ou=People,o=test",
+        "",
+        "dn: cn=Test Group 2,ou=Groups,o=test",
+        "objectClass: top",
+        "objectClass: groupOfNames",
+        "cn: Test Group 2",
+        "member: uid=test.user2,ou=People,o=test",
+        "",
+        "dn: cn=Test Group 3,ou=Groups,o=test",
+        "objectClass: top",
+        "objectClass: groupOfNames",
+        "cn: Test Group 3",
+        "member: cn=Test Group 1,ou=Groups,o=test");
+
+    IsMemberOfVirtualAttributeProvider provider =
+        new IsMemberOfVirtualAttributeProvider();
+
+    VirtualAttributeRule rule =
+        new VirtualAttributeRule(isMemberOfType, provider,
+            Collections.<DN>emptySet(), SearchScope.WHOLE_SUBTREE,
+            Collections.<DN>emptySet(),
+            Collections.<SearchFilter>emptySet(),
+            VirtualAttributeCfgDefn.ConflictBehavior.
+                VIRTUAL_OVERRIDES_REAL);
+
+    SearchRequest request = newSearchRequest(DN.valueOf("o=test"), SearchScope.WHOLE_SUBTREE,
+        "isMemberOf=cn=Test Group 3,ou=Groups,o=test");
+    InternalClientConnection conn = getRootConnection();
+    InternalSearchOperation searchOperation = new InternalSearchOperation(
+        conn, nextOperationID(), nextMessageID(), request, null);
+    provider.processSearch(rule, new LocalBackendSearchOperation(searchOperation));
+
+    List<SearchResultEntry> entries = searchOperation.getSearchEntries();
+    assertEquals(entries.size(), 2, "Expecting 2 entries, but got " + entries.size());
+    // First direct members
+    assertEquals(entries.get(0).getName(), DN.valueOf("cn=test group 1,ou=groups,o=test"));
+    // Then indirect members
+    assertEquals(entries.get(1).getName(), DN.valueOf("uid=test.user,ou=people,o=test"));
+
+    DeleteOperation deleteOperation =
+        conn.processDelete(DN.valueOf("cn=test group 1,ou=groups,o=test"));
+    assertEquals(deleteOperation.getResultCode(), ResultCode.SUCCESS);
+
+    deleteOperation =
+        conn.processDelete(DN.valueOf("cn=test group 2,ou=groups,o=test"));
+    assertEquals(deleteOperation.getResultCode(), ResultCode.SUCCESS);
+
+  }
 
 
   /**

--
Gitblit v1.10.0