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