/* * 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 * * * Copyright 2008-2010 Sun Microsystems, Inc. * Portions Copyright 2012 ForgeRock AS */ package org.opends.server.extensions; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.opends.server.TestCaseUtils; import org.opends.server.core.DirectoryServer; import org.opends.server.core.GroupManager; import org.opends.server.core.ModifyOperation; import org.opends.server.protocols.internal.InternalClientConnection; import org.opends.server.protocols.internal.InternalSearchOperation; import org.opends.server.types.*; import static org.testng.Assert.*; /** * A set of test cases for the virtual static group implementation and the * member virtual attribute provider. */ public class VirtualStaticGroupTestCase extends ExtensionsTestCase { /** * The lines comprising the LDIF test data. */ private static final String[] LDIF_LINES = { "dn: ou=People,o=test", "objectClass: top", "objectClass: organizationalUnit", "ou: People", "", "dn: uid=test.1,ou=People,o=test", "objectClass: top", "objectClass: person", "objectClass: organizationalPerson", "objectClass: inetOrgPerson", "uid: test.1", "givenName: Test", "sn: 1", "cn: Test 1", "userPassword: password", "", "dn: uid=test.2,ou=People,o=test", "objectClass: top", "objectClass: person", "objectClass: organizationalPerson", "objectClass: inetOrgPerson", "uid: test.2", "givenName: Test", "sn: 2", "cn: Test 2", "userPassword: password", "", "dn: uid=test.3,ou=People,o=test", "objectClass: top", "objectClass: person", "objectClass: organizationalPerson", "objectClass: inetOrgPerson", "uid: test.3", "givenName: Test", "sn: 3", "cn: Test 3", "userPassword: password", "", "dn: uid=test.4,ou=People,o=test", "objectClass: top", "objectClass: person", "objectClass: organizationalPerson", "objectClass: inetOrgPerson", "uid: test.4", "givenName: Test", "sn: 4", "cn: Test 4", "userPassword: password", "", "dn: ou=Groups,o=test", "objectClass: top", "objectClass: organizationalUnit", "ou: Groups", "", "dn: cn=Dynamic All Users,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfURLs", "cn: Dynamic All Users", "memberURL: ldap:///ou=People,o=test??sub?(objectClass=person)", "", "dn: cn=Dynamic One User,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfURLs", "cn: Dynamic One User", "memberURL: ldap:///ou=People,o=test??sub?(&(objectClass=person)(sn=4))", "", "dn: cn=Static member List,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "cn: Static member List", "member: uid=test.1,ou=People,o=test", "member: uid=test.3,ou=People,o=test", "", "dn: cn=Static uniqueMember List,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfUniqueNames", "cn: Static uniqueMember List", "uniqueMember: uid=test.2,ou=People,o=test", "uniqueMember: uid=test.3,ou=People,o=test", "uniqueMember: uid=no-such-user,ou=People,o=test", "", "dn: cn=Virtual member All Users,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: Virtual member All Users", "ds-target-group-dn: cn=Dynamic All Users,ou=Groups,o=test", "", "dn: cn=Virtual uniqueMember All Users,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfUniqueNames", "objectClass: ds-virtual-static-group", "cn: Virtual uniqueMember All Users", "ds-target-group-dn: cn=Dynamic All Users,ou=Groups,o=test", "", "dn: cn=Virtual member One User,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: Virtual member One User", "ds-target-group-dn: cn=Dynamic One User,ou=Groups,o=test", "", "dn: cn=Virtual uniqueMember One User,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfUniqueNames", "objectClass: ds-virtual-static-group", "cn: Virtual uniqueMember One User", "ds-target-group-dn: cn=Dynamic One User,ou=Groups,o=test", "", "dn: cn=Virtual Static member List,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: Virtual Static member List", "ds-target-group-dn: cn=Static member List,ou=Groups,o=test", "", "dn: cn=Virtual Static uniqueMember List,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfUniqueNames", "objectClass: ds-virtual-static-group", "cn: Virtual Static uniqueMember List", "ds-target-group-dn: cn=Static uniqueMember List,ou=Groups,o=test", "", "dn: cn=Crossover member Static Group,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfUniqueNames", "objectClass: ds-virtual-static-group", "cn: Crossover member Static Group", "ds-target-group-dn: cn=Static member List,ou=Groups,o=test", "", "dn: cn=Crossover uniqueMember Static Group,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: Crossover uniqueMember Static Group", "ds-target-group-dn: cn=Static uniqueMember List,ou=Groups,o=test", "", "dn: cn=Virtual Nonexistent,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: Virtual Nonexistent", "ds-target-group-dn: cn=Nonexistent,ou=Groups,o=test" }; // The attribute type for the member attribute. private AttributeType memberType; // The attribute type for the uniqueMember attribute. private AttributeType uniqueMemberType; // The server group manager. private GroupManager groupManager; // The DNs of the various entries in the data set. private DN u1; private DN u2; private DN u3; private DN u4; private DN da; private DN d1; private DN sm; private DN su; private DN vmda; private DN vuda; private DN vmd1; private DN vud1; private DN vsm; private DN vsu; private DN vcm; private DN vcu; private DN vn; private DN ne; /** * Ensures that the Directory Server is running. * * @throws Exception If an unexpected problem occurs. */ @BeforeClass() public void startServer() throws Exception { TestCaseUtils.startServer(); memberType = DirectoryServer.getAttributeType("member", false); assertNotNull(memberType); uniqueMemberType = DirectoryServer.getAttributeType("uniquemember", false); assertNotNull(uniqueMemberType); groupManager = DirectoryServer.getGroupManager(); u1 = DN.decode("uid=test.1,ou=People,o=test"); u2 = DN.decode("uid=test.2,ou=People,o=test"); u3 = DN.decode("uid=test.3,ou=People,o=test"); u4 = DN.decode("uid=test.4,ou=People,o=test"); da = DN.decode("cn=Dynamic All Users,ou=Groups,o=test"); d1 = DN.decode("cn=Dynamic One User,ou=Groups,o=test"); sm = DN.decode("cn=Static member List,ou=Groups,o=test"); su = DN.decode("cn=Static uniqueMember List,ou=Groups,o=test"); vmda = DN.decode("cn=Virtual member All Users,ou=Groups,o=test"); vuda = DN.decode("cn=Virtual uniqueMember All Users,ou=Groups,o=test"); vmd1 = DN.decode("cn=Virtual member One User,ou=Groups,o=test"); vud1 = DN.decode("cn=Virtual uniqueMember One User,ou=Groups,o=test"); vsm = DN.decode("cn=Virtual Static member List,ou=Groups,o=test"); vsu = DN.decode("cn=Virtual Static uniqueMember List,ou=Groups,o=test"); vcm = DN.decode("cn=Crossover member Static Group,ou=Groups,o=test"); vcu = DN.decode("cn=Crossover uniqueMember Static Group,ou=Groups,o=test"); vn = DN.decode("cn=Virtual Nonexistent,ou=Groups,o=test"); ne = DN.decode("cn=Nonexistent,ou=Groups,o=test"); } /** * Tests creating a new instance of a virtual static group from a valid entry. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testCreateValidGroup() throws Exception { Entry entry = TestCaseUtils.makeEntry( "dn: cn=Valid Virtual Static Group,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: Valid Virtual Static Group", "ds-target-group-dn: cn=Static member List,ou=Groups,o=test"); VirtualStaticGroup groupImplementation = new VirtualStaticGroup(); VirtualStaticGroup groupInstance = groupImplementation.newInstance(entry); assertNotNull(groupInstance); groupImplementation.finalizeGroupImplementation(); } /** * Retrieves a set of invalid vittual static group definition entries. * * @return A set of invalid virtul static group definition entries. * * @throws Exception If an unexpected problem occurs. */ @DataProvider(name = "invalidGroups") public Object[][] getInvalidGroupDefinitions() throws Exception { List<Entry> groupEntries = TestCaseUtils.makeEntries( "dn: cn=Not a Virtual Static Group,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "cn: Not a Virtual Static Group", "member: uid=test.1,ou=People,o=test", "", "dn: cn=No Target,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: No Target", "", "dn: cn=Invalid Target,ou=Groups,o=test", "objectClass: top", "objectClass: groupOfNames", "objectClass: ds-virtual-static-group", "cn: Invalid Target", "ds-target-group-dn: invalid"); Object[][] entryArray = new Object[groupEntries.size()][1]; for (int i=0; i < entryArray.length; i++) { entryArray[i][0] = groupEntries.get(i); } return entryArray; } /** * Tests creating a new instance of a virtual static group from an invalid * entry. * * @throws Exception If an unexpected problem occurs. */ @Test(dataProvider = "invalidGroups", expectedExceptions = { DirectoryException.class }) public void testCreateInvalidGroup(Entry entry) throws Exception { VirtualStaticGroup groupImplementation = new VirtualStaticGroup(); try { VirtualStaticGroup groupInstance = groupImplementation.newInstance(entry); } finally { groupImplementation.finalizeGroupImplementation(); } } /** * Performs general tests of the group API for virtual static groups with a * group that has a real target group. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testGroupAPI() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); VirtualStaticGroup g = (VirtualStaticGroup) groupManager.getGroupInstance(vmda); assertNotNull(g); assertTrue(g.isMember(u1)); assertNotNull(g.getGroupDefinitionFilter()); assertEquals(g.getGroupDN(), vmda); assertEquals(g.getTargetGroupDN(), da); assertFalse(g.supportsNestedGroups()); assertTrue(g.getNestedGroupDNs().isEmpty()); assertFalse(g.mayAlterMemberList()); Entry entry = DirectoryServer.getEntry(u1); assertTrue(g.isMember(entry)); MemberList memberList = g.getMembers(); assertTrue(memberList.hasMoreMembers()); assertNotNull(memberList.nextMemberDN()); assertNotNull(memberList.nextMemberEntry()); assertNotNull(memberList.nextMemberDN()); assertNotNull(memberList.nextMemberDN()); assertFalse(memberList.hasMoreMembers()); SearchFilter filter = SearchFilter.createFilterFromString("(sn=1)"); memberList = g.getMembers(DN.decode("o=test"), SearchScope.WHOLE_SUBTREE, filter); assertTrue(memberList.hasMoreMembers()); assertNotNull(memberList.nextMemberDN()); assertFalse(memberList.hasMoreMembers()); try { g.addNestedGroup(d1); fail("Expected an exception from addNestedGroupDN"); } catch (Exception e) {} try { g.removeNestedGroup(d1); fail("Expected an exception from removeNestedGroupDN"); } catch (Exception e) {} try { g.addMember(entry); fail("Expected an exception from addMember"); } catch (Exception e) {} try { g.removeMember(u1); fail("Expected an exception from removeMember"); } catch (Exception e) {} assertNotNull(g.toString()); cleanUp(); } /** * Performs general tests of the group API for virtual static groups with a * group that has a nonexistent target group. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testGroupAPINonexistent() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); VirtualStaticGroup g = (VirtualStaticGroup) groupManager.getGroupInstance(vn); assertNotNull(g); assertNotNull(g.getGroupDefinitionFilter()); assertEquals(g.getGroupDN(), vn); assertEquals(g.getTargetGroupDN(), ne); assertFalse(g.supportsNestedGroups()); assertTrue(g.getNestedGroupDNs().isEmpty()); assertFalse(g.mayAlterMemberList()); Entry entry = DirectoryServer.getEntry(u1); try { g.isMember(u1); fail("Expected an exception from isMember(DN)"); } catch (Exception e) {} try { g.isMember(entry); fail("Expected an exception from isMember(Entry)"); } catch (Exception e) {} try { g.getMembers(); fail("Expected an exception from getMembers()"); } catch (Exception e) {} try { SearchFilter filter = SearchFilter.createFilterFromString("(sn=1)"); g.getMembers(DN.decode("o=test"), SearchScope.WHOLE_SUBTREE, filter); fail("Expected an exception from getMembers(base, scope, filter)"); } catch (Exception e) {} try { g.addNestedGroup(d1); fail("Expected an exception from addNestedGroupDN"); } catch (Exception e) {} try { g.removeNestedGroup(d1); fail("Expected an exception from removeNestedGroupDN"); } catch (Exception e) {} try { g.addMember(entry); fail("Expected an exception from addMember"); } catch (Exception e) {} try { g.removeMember(u1); fail("Expected an exception from removeMember"); } catch (Exception e) {} assertNotNull(g.toString()); cleanUp(); } /** * Tests the behavior of the virtual static group with a dynamic group. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testVirtualGroupDynamicGroupWithMember() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); VirtualStaticGroup g = (VirtualStaticGroup) groupManager.getGroupInstance(vmda); assertNotNull(g); assertTrue(g.isMember(u1)); assertTrue(g.isMember(u2)); assertTrue(g.isMember(u3)); assertTrue(g.isMember(u4)); cleanUp(); } /** * Tests the behavior of the virtual static group with a static group based on * the member attribute. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testVirtualGroupStaticGroupWithMember() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); VirtualStaticGroup g = (VirtualStaticGroup) groupManager.getGroupInstance(vsm); assertNotNull(g); assertTrue(g.isMember(u1)); assertFalse(g.isMember(u2)); assertTrue(g.isMember(u3)); assertFalse(g.isMember(u4)); cleanUp(); } /** * Tests the behavior of the virtual static group with a static group based on * the uniqueMember attribute. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testVirtualGroupStaticGroupWithUniqueMember() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); VirtualStaticGroup g = (VirtualStaticGroup) groupManager.getGroupInstance(vsu); assertNotNull(g); assertFalse(g.isMember(u1)); assertTrue(g.isMember(u2)); assertTrue(g.isMember(u3)); assertFalse(g.isMember(u4)); cleanUp(); } /** * Performs general tests of the virtual attribute provider API for the member * virtual attribute with a target group that exists. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testVirtualAttributeAPI() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); VirtualAttributeRule rule = null; for (VirtualAttributeRule r : DirectoryServer.getVirtualAttributes()) { if (r.getAttributeType().equals(memberType)) { rule = r; break; } } assertNotNull(rule); MemberVirtualAttributeProvider provider = (MemberVirtualAttributeProvider) rule.getProvider(); assertNotNull(provider); Entry entry = DirectoryServer.getEntry(vsm); assertNotNull(entry); assertTrue(provider.isMultiValued()); Set<AttributeValue> values = provider.getValues(entry, rule); assertNotNull(values); assertFalse(values.isEmpty()); assertTrue(provider.hasValue(entry, rule)); assertTrue(provider.hasValue(entry, rule, AttributeValues.create(memberType, u1.toString()))); assertFalse(provider.hasValue(entry, rule, AttributeValues.create(memberType, ne.toString()))); assertTrue(provider.hasAnyValue(entry, rule, values)); assertFalse(provider.hasAnyValue(entry, rule, Collections.<AttributeValue>emptySet())); assertEquals(provider.matchesSubstring(entry, rule, null, null, null), ConditionResult.UNDEFINED); assertEquals(provider.greaterThanOrEqualTo(entry, rule, null), ConditionResult.UNDEFINED); assertEquals(provider.lessThanOrEqualTo(entry, rule, null), ConditionResult.UNDEFINED); assertEquals(provider.approximatelyEqualTo(entry, rule, null), ConditionResult.UNDEFINED); InternalClientConnection conn = InternalClientConnection.getRootConnection(); InternalSearchOperation searchOperation = new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(), null, DN.decode("o=test"), SearchScope.WHOLE_SUBTREE, DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false, SearchFilter.createFilterFromString( "(member=" + u1.toString() + ")"), null, null); assertFalse(provider.isSearchable(rule, searchOperation, false)); assertFalse(provider.isSearchable(rule, searchOperation, true)); provider.processSearch(rule, searchOperation); assertFalse(searchOperation.getResultCode() == ResultCode.SUCCESS); cleanUp(); } /** * Performs general tests of the virtual attribute provider API for the member * virtual attribute with a target group that does not exist. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testVirtualAttributeAPINonexistent() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); VirtualAttributeRule rule = null; for (VirtualAttributeRule r : DirectoryServer.getVirtualAttributes()) { if (r.getAttributeType().equals(memberType)) { rule = r; break; } } assertNotNull(rule); MemberVirtualAttributeProvider provider = (MemberVirtualAttributeProvider) rule.getProvider(); assertNotNull(provider); Entry entry = DirectoryServer.getEntry(vn); assertNotNull(entry); assertTrue(provider.isMultiValued()); Set<AttributeValue> values = provider.getValues(entry, rule); assertNotNull(values); assertTrue(values.isEmpty()); assertFalse(provider.hasValue(entry, rule)); assertFalse(provider.hasValue(entry, rule, AttributeValues.create(memberType, u1.toString()))); assertFalse(provider.hasValue(entry, rule, AttributeValues.create(memberType, ne.toString()))); assertFalse(provider.hasAnyValue(entry, rule, values)); assertFalse(provider.hasAnyValue(entry, rule, Collections.<AttributeValue>emptySet())); assertEquals(provider.matchesSubstring(entry, rule, null, null, null), ConditionResult.UNDEFINED); assertEquals(provider.greaterThanOrEqualTo(entry, rule, null), ConditionResult.UNDEFINED); assertEquals(provider.lessThanOrEqualTo(entry, rule, null), ConditionResult.UNDEFINED); assertEquals(provider.approximatelyEqualTo(entry, rule, null), ConditionResult.UNDEFINED); InternalClientConnection conn = InternalClientConnection.getRootConnection(); InternalSearchOperation searchOperation = new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(), null, DN.decode("o=test"), SearchScope.WHOLE_SUBTREE, DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false, SearchFilter.createFilterFromString( "(member=" + u1.toString() + ")"), null, null); assertFalse(provider.isSearchable(rule, searchOperation, false)); assertFalse(provider.isSearchable(rule, searchOperation, false)); provider.processSearch(rule, searchOperation); assertFalse(searchOperation.getResultCode() == ResultCode.SUCCESS); cleanUp(); } /** * Tests the behavior of the member virtual attribute with a dynamic group. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testVirtualAttrDynamicGroupWithMember() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); Entry e = DirectoryServer.getEntry(vmda); assertNotNull(e); assertTrue(e.hasAttribute(memberType)); Attribute a = e.getAttribute(memberType).get(0); assertEquals(a.size(), 4); AttributeValue v = AttributeValues.create(memberType, u1.toString()); assertTrue(a.contains(v)); cleanUp(); } /** * Tests the behavior of the member virtual attribute with a dynamic group. * The target dynamic group will initially have only one memberURL which * matches only one user, but will then be updated on the fly to contain a * second URL that matches all users. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testVirtualAttrDynamicGroupWithUpdatedMemberURLs() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); Entry e = DirectoryServer.getEntry(vmd1); assertNotNull(e); assertTrue(e.hasAttribute(memberType)); Attribute a = e.getAttribute(memberType).get(0); assertEquals(a.size(), 1); AttributeValue v = AttributeValues.create(memberType, u4.toString()); assertTrue(a.contains(v)); InternalClientConnection conn = InternalClientConnection.getRootConnection(); LinkedList<Modification> mods = new LinkedList<Modification>(); mods.add(new Modification(ModificationType.ADD, Attributes.create("memberurl", "ldap:///o=test??sub?(objectClass=person)"))); ModifyOperation modifyOperation = conn.processModify(d1, mods); assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS); a = e.getAttribute(memberType).get(0); assertEquals(a.size(), 4); assertTrue(a.contains(v)); cleanUp(); } /** * Tests the behavior of the member virtual attribute with different settings * for the "allow retrieving membership" attribute. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testAllowRetrievingMembership() throws Exception { TestCaseUtils.initializeTestBackend(true); TestCaseUtils.addEntries(LDIF_LINES); Entry e = DirectoryServer.getEntry(vmd1); assertNotNull(e); assertTrue(e.hasAttribute(memberType)); Attribute a = e.getAttribute(memberType).get(0); assertEquals(a.size(), 1); AttributeValue v = AttributeValues.create(memberType, u4.toString()); assertTrue(a.contains(v)); InternalClientConnection conn = InternalClientConnection.getRootConnection(); LinkedList<Modification> mods = new LinkedList<Modification>(); mods.add(new Modification(ModificationType.REPLACE, Attributes.create("ds-cfg-allow-retrieving-membership", "false"))); DN definitionDN = DN.decode("cn=Virtual Static member,cn=Virtual Attributes,cn=config"); ModifyOperation modifyOperation = conn.processModify(definitionDN, mods); assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS); e = DirectoryServer.getEntry(vmd1); assertNotNull(e); assertTrue(e.hasAttribute(memberType)); a = e.getAttribute(memberType).get(0); assertEquals(a.size(), 0); v = AttributeValues.create(memberType, u4.toString()); assertTrue(a.contains(v)); mods = new LinkedList<Modification>(); mods.add(new Modification(ModificationType.REPLACE, Attributes.create("ds-cfg-allow-retrieving-membership", "true"))); modifyOperation = conn.processModify(definitionDN, mods); assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS); cleanUp(); } /** * Removes all of the groups that have been added to the server. * * @throws Exception If an unexpected problem occurs. */ private void cleanUp() throws Exception { InternalClientConnection conn = InternalClientConnection.getRootConnection(); InternalSearchOperation searchOperation = conn.processSearch(DN.decode("ou=Groups,dc=example,dc=com"), SearchScope.SINGLE_LEVEL, SearchFilter.createFilterFromString("(objectClass=*)")); for (Entry e : searchOperation.getSearchEntries()) { conn.processDelete(e.getDN()); } } }