VirtualStaticGroupTestCase.java revision ea1068c292e9b341af6d6b563cd8988a96be20a9
2852N/A/*
2887N/A * CDDL HEADER START
2852N/A *
2852N/A * The contents of this file are subject to the terms of the
2852N/A * Common Development and Distribution License, Version 1.0 only
2852N/A * (the "License"). You may not use this file except in compliance
2852N/A * with the License.
2852N/A *
2852N/A * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
2852N/A * or http://forgerock.org/license/CDDLv1.0.html.
2852N/A * See the License for the specific language governing permissions
2852N/A * and limitations under the License.
2852N/A *
2852N/A * When distributing Covered Code, include this CDDL HEADER in each
2852N/A * file and include the License file at legal-notices/CDDLv1_0.txt.
2852N/A * If applicable, add the following below this CDDL HEADER, with the
2852N/A * fields enclosed by brackets "[]" replaced with your own identifying
2852N/A * information:
2852N/A * Portions Copyright [yyyy] [name of copyright owner]
2852N/A *
2852N/A * CDDL HEADER END
2852N/A *
2852N/A *
2852N/A * Copyright 2008-2010 Sun Microsystems, Inc.
2852N/A * Portions Copyright 2012-2015 ForgeRock AS
4347N/A */
2938N/Apackage org.opends.server.extensions;
2852N/A
2852N/Aimport java.util.LinkedList;
2852N/Aimport java.util.List;
4865N/A
4618N/Aimport org.forgerock.opendj.ldap.ByteString;
4618N/Aimport org.forgerock.opendj.ldap.ConditionResult;
4618N/Aimport org.forgerock.opendj.ldap.ModificationType;
4618N/Aimport org.forgerock.opendj.ldap.ResultCode;
4618N/Aimport org.forgerock.opendj.ldap.SearchScope;
4865N/Aimport org.opends.server.TestCaseUtils;
4618N/Aimport org.opends.server.core.DirectoryServer;
4618N/Aimport org.opends.server.core.GroupManager;
4618N/Aimport org.opends.server.core.ModifyOperation;
4618N/Aimport org.opends.server.protocols.internal.InternalClientConnection;
4618N/Aimport org.opends.server.protocols.internal.InternalSearchOperation;
4618N/Aimport org.opends.server.protocols.internal.SearchRequest;
4618N/Aimport org.opends.server.types.*;
4618N/Aimport org.testng.annotations.BeforeClass;
4618N/Aimport org.testng.annotations.DataProvider;
4618N/Aimport org.testng.annotations.Test;
4618N/A
4618N/Aimport static org.opends.server.protocols.internal.InternalClientConnection.*;
4618N/Aimport static org.opends.server.protocols.internal.Requests.*;
4618N/Aimport static org.testng.Assert.*;
4618N/A
4618N/A/**
4618N/A * A set of test cases for the virtual static group implementation and the
4865N/A * member virtual attribute provider.
4618N/A */
4618N/Apublic class VirtualStaticGroupTestCase
4618N/A extends ExtensionsTestCase
4618N/A{
4618N/A /**
4618N/A * The lines comprising the LDIF test data.
4618N/A */
4618N/A private static final String[] LDIF_LINES =
4618N/A {
4618N/A "dn: ou=People,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: organizationalUnit",
4618N/A "ou: People",
4618N/A "",
4618N/A "dn: uid=test.1,ou=People,o=test",
4618N/A "objectClass: top",
4865N/A "objectClass: person",
4618N/A "objectClass: organizationalPerson",
4865N/A "objectClass: inetOrgPerson",
4618N/A "uid: test.1",
4618N/A "givenName: Test",
4618N/A "sn: 1",
4618N/A "cn: Test 1",
4618N/A "userPassword: password",
4618N/A "",
4618N/A "dn: uid=test.2,ou=People,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: person",
4618N/A "objectClass: organizationalPerson",
4618N/A "objectClass: inetOrgPerson",
4618N/A "uid: test.2",
4618N/A "givenName: Test",
4618N/A "sn: 2",
4618N/A "cn: Test 2",
4618N/A "userPassword: password",
4618N/A "",
4618N/A "dn: uid=test.3,ou=People,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: person",
4618N/A "objectClass: organizationalPerson",
4618N/A "objectClass: inetOrgPerson",
4618N/A "uid: test.3",
4618N/A "givenName: Test",
4618N/A "sn: 3",
4618N/A "cn: Test 3",
4618N/A "userPassword: password",
4618N/A "",
4618N/A "dn: uid=test.4,ou=People,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: person",
4618N/A "objectClass: organizationalPerson",
4618N/A "objectClass: inetOrgPerson",
4618N/A "uid: test.4",
4618N/A "givenName: Test",
4618N/A "sn: 4",
4618N/A "cn: Test 4",
4618N/A "userPassword: password",
4618N/A "",
4865N/A "dn: ou=Groups,o=test",
4865N/A "objectClass: top",
4865N/A "objectClass: organizationalUnit",
4865N/A "ou: Groups",
4865N/A "",
4865N/A "dn: cn=Dynamic All Users,ou=Groups,o=test",
4865N/A "objectClass: top",
4618N/A "objectClass: groupOfURLs",
4618N/A "cn: Dynamic All Users",
4618N/A "memberURL: ldap:///ou=People,o=test??sub?(objectClass=person)",
4618N/A "",
4618N/A "dn: cn=Dynamic One User,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfURLs",
4865N/A "cn: Dynamic One User",
4618N/A "memberURL: ldap:///ou=People,o=test??sub?(&(objectClass=person)(sn=4))",
4618N/A "",
4618N/A "dn: cn=Static member List,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfNames",
4865N/A "cn: Static member List",
4618N/A "member: uid=test.1,ou=People,o=test",
4865N/A "member: uid=test.3,ou=People,o=test",
4618N/A "",
4618N/A "dn: cn=Static uniqueMember List,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfUniqueNames",
3175N/A "cn: Static uniqueMember List",
4618N/A "uniqueMember: uid=test.2,ou=People,o=test",
4618N/A "uniqueMember: uid=test.3,ou=People,o=test",
4618N/A "uniqueMember: uid=no-such-user,ou=People,o=test",
4618N/A "",
4618N/A "dn: cn=Virtual member All Users,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfNames",
4618N/A "objectClass: ds-virtual-static-group",
4618N/A "cn: Virtual member All Users",
4618N/A "ds-target-group-dn: cn=Dynamic All Users,ou=Groups,o=test",
4618N/A "",
4618N/A "dn: cn=Virtual uniqueMember All Users,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfUniqueNames",
4618N/A "objectClass: ds-virtual-static-group",
4618N/A "cn: Virtual uniqueMember All Users",
4865N/A "ds-target-group-dn: cn=Dynamic All Users,ou=Groups,o=test",
4618N/A "",
4865N/A "dn: cn=Virtual member One User,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfNames",
4618N/A "objectClass: ds-virtual-static-group",
4618N/A "cn: Virtual member One User",
4618N/A "ds-target-group-dn: cn=Dynamic One User,ou=Groups,o=test",
4618N/A "",
4618N/A "dn: cn=Virtual uniqueMember One User,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfUniqueNames",
4713N/A "objectClass: ds-virtual-static-group",
4713N/A "cn: Virtual uniqueMember One User",
4713N/A "ds-target-group-dn: cn=Dynamic One User,ou=Groups,o=test",
4713N/A "",
4713N/A "dn: cn=Virtual Static member List,ou=Groups,o=test",
4713N/A "objectClass: top",
4713N/A "objectClass: groupOfNames",
4713N/A "objectClass: ds-virtual-static-group",
4713N/A "cn: Virtual Static member List",
4713N/A "ds-target-group-dn: cn=Static member List,ou=Groups,o=test",
4713N/A "",
4713N/A "dn: cn=Virtual Static uniqueMember List,ou=Groups,o=test",
4713N/A "objectClass: top",
4713N/A "objectClass: groupOfUniqueNames",
4713N/A "objectClass: ds-virtual-static-group",
4713N/A "cn: Virtual Static uniqueMember List",
4713N/A "ds-target-group-dn: cn=Static uniqueMember List,ou=Groups,o=test",
4713N/A "",
4713N/A "dn: cn=Crossover member Static Group,ou=Groups,o=test",
4713N/A "objectClass: top",
4713N/A "objectClass: groupOfUniqueNames",
4713N/A "objectClass: ds-virtual-static-group",
4713N/A "cn: Crossover member Static Group",
4713N/A "ds-target-group-dn: cn=Static member List,ou=Groups,o=test",
4713N/A "",
4713N/A "dn: cn=Crossover uniqueMember Static Group,ou=Groups,o=test",
4713N/A "objectClass: top",
4713N/A "objectClass: groupOfNames",
4713N/A "objectClass: ds-virtual-static-group",
4713N/A "cn: Crossover uniqueMember Static Group",
4865N/A "ds-target-group-dn: cn=Static uniqueMember List,ou=Groups,o=test",
4865N/A "",
4865N/A "dn: cn=Virtual Nonexistent,ou=Groups,o=test",
4865N/A "objectClass: top",
4713N/A "objectClass: groupOfNames",
4713N/A "objectClass: ds-virtual-static-group",
4618N/A "cn: Virtual Nonexistent",
4618N/A "ds-target-group-dn: cn=Nonexistent,ou=Groups,o=test"
4618N/A };
4618N/A
4618N/A
4618N/A
4618N/A // The attribute type for the member attribute.
4618N/A private AttributeType memberType;
4618N/A
4618N/A // The attribute type for the uniqueMember attribute.
4618N/A private AttributeType uniqueMemberType;
4618N/A
4865N/A // The server group manager.
4618N/A private GroupManager groupManager;
4865N/A
4618N/A // The DNs of the various entries in the data set.
4618N/A private DN u1;
4618N/A private DN u2;
4865N/A private DN u3;
4618N/A private DN u4;
4618N/A private DN da;
4618N/A private DN d1;
4618N/A private DN sm;
4618N/A private DN su;
4618N/A private DN vmda;
4618N/A private DN vuda;
4618N/A private DN vmd1;
4618N/A private DN vud1;
4618N/A private DN vsm;
4618N/A private DN vsu;
4618N/A private DN vcm;
4618N/A private DN vcu;
4618N/A private DN vn;
4618N/A private DN ne;
4865N/A
4618N/A
4618N/A
4865N/A /**
4618N/A * Ensures that the Directory Server is running.
4618N/A *
4618N/A * @throws Exception If an unexpected problem occurs.
4618N/A */
4618N/A @BeforeClass
4618N/A public void startServer()
4618N/A throws Exception
4865N/A {
4618N/A TestCaseUtils.startServer();
4618N/A
4865N/A memberType = DirectoryServer.getAttributeType("member", false);
4618N/A assertNotNull(memberType);
4865N/A
4865N/A uniqueMemberType = DirectoryServer.getAttributeType("uniquemember", false);
4865N/A assertNotNull(uniqueMemberType);
4865N/A
4865N/A groupManager = DirectoryServer.getGroupManager();
4618N/A
4618N/A u1 = DN.valueOf("uid=test.1,ou=People,o=test");
4618N/A u2 = DN.valueOf("uid=test.2,ou=People,o=test");
4618N/A u3 = DN.valueOf("uid=test.3,ou=People,o=test");
4618N/A u4 = DN.valueOf("uid=test.4,ou=People,o=test");
4618N/A da = DN.valueOf("cn=Dynamic All Users,ou=Groups,o=test");
4618N/A d1 = DN.valueOf("cn=Dynamic One User,ou=Groups,o=test");
4618N/A sm = DN.valueOf("cn=Static member List,ou=Groups,o=test");
4618N/A su = DN.valueOf("cn=Static uniqueMember List,ou=Groups,o=test");
4618N/A vmda = DN.valueOf("cn=Virtual member All Users,ou=Groups,o=test");
4618N/A vuda = DN.valueOf("cn=Virtual uniqueMember All Users,ou=Groups,o=test");
4618N/A vmd1 = DN.valueOf("cn=Virtual member One User,ou=Groups,o=test");
4618N/A vud1 = DN.valueOf("cn=Virtual uniqueMember One User,ou=Groups,o=test");
4618N/A vsm = DN.valueOf("cn=Virtual Static member List,ou=Groups,o=test");
4618N/A vsu = DN.valueOf("cn=Virtual Static uniqueMember List,ou=Groups,o=test");
4618N/A vcm = DN.valueOf("cn=Crossover member Static Group,ou=Groups,o=test");
4618N/A vcu = DN.valueOf("cn=Crossover uniqueMember Static Group,ou=Groups,o=test");
4618N/A vn = DN.valueOf("cn=Virtual Nonexistent,ou=Groups,o=test");
4618N/A ne = DN.valueOf("cn=Nonexistent,ou=Groups,o=test");
4618N/A }
4618N/A
4618N/A
4618N/A
4618N/A /**
4618N/A * Tests creating a new instance of a virtual static group from a valid entry.
4618N/A *
4618N/A * @throws Exception If an unexpected problem occurs.
4618N/A */
4618N/A @Test
4618N/A public void testCreateValidGroup()
4618N/A throws Exception
4618N/A {
4618N/A Entry entry = TestCaseUtils.makeEntry(
4618N/A "dn: cn=Valid Virtual Static Group,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfNames",
4618N/A "objectClass: ds-virtual-static-group",
4618N/A "cn: Valid Virtual Static Group",
4618N/A "ds-target-group-dn: cn=Static member List,ou=Groups,o=test");
4618N/A
4865N/A VirtualStaticGroup groupImplementation = new VirtualStaticGroup();
4618N/A VirtualStaticGroup groupInstance = groupImplementation.newInstance(null, entry);
4618N/A assertNotNull(groupInstance);
4618N/A groupImplementation.finalizeGroupImplementation();
4618N/A }
4618N/A
4618N/A
4618N/A
4618N/A /**
4618N/A * Retrieves a set of invalid vittual static group definition entries.
4618N/A *
4618N/A * @return A set of invalid virtul static group definition entries.
4618N/A *
4618N/A * @throws Exception If an unexpected problem occurs.
4618N/A */
4618N/A @DataProvider(name = "invalidGroups")
4618N/A public Object[][] getInvalidGroupDefinitions()
4618N/A throws Exception
4618N/A {
4618N/A List<Entry> groupEntries = TestCaseUtils.makeEntries(
4618N/A "dn: cn=Not a Virtual Static Group,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfNames",
4618N/A "cn: Not a Virtual Static Group",
4618N/A "member: uid=test.1,ou=People,o=test",
4618N/A "",
4618N/A "dn: cn=No Target,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfNames",
4618N/A "objectClass: ds-virtual-static-group",
4618N/A "cn: No Target",
4618N/A "",
4618N/A "dn: cn=Invalid Target,ou=Groups,o=test",
4618N/A "objectClass: top",
4618N/A "objectClass: groupOfNames",
4618N/A "objectClass: ds-virtual-static-group",
4618N/A "cn: Invalid Target",
4618N/A "ds-target-group-dn: invalid");
4680N/A
4618N/A Object[][] entryArray = new Object[groupEntries.size()][1];
4618N/A for (int i=0; i < entryArray.length; i++)
4618N/A {
4618N/A entryArray[i][0] = groupEntries.get(i);
4618N/A }
4618N/A
4618N/A return entryArray;
4618N/A }
4618N/A
4618N/A
4618N/A
4618N/A /**
4618N/A * Tests creating a new instance of a virtual static group from an invalid
4618N/A * entry.
4618N/A *
4618N/A * @throws Exception If an unexpected problem occurs.
4618N/A */
4618N/A @Test(dataProvider = "invalidGroups",
4618N/A expectedExceptions = { DirectoryException.class })
4618N/A public void testCreateInvalidGroup(Entry entry)
4618N/A throws Exception
4618N/A {
4618N/A VirtualStaticGroup groupImplementation = new VirtualStaticGroup();
4618N/A try
4618N/A {
4618N/A groupImplementation.newInstance(null, entry);
4618N/A }
4618N/A finally
4618N/A {
4618N/A groupImplementation.finalizeGroupImplementation();
4618N/A }
4618N/A }
4618N/A
4618N/A
4618N/A
4618N/A /**
4618N/A * Performs general tests of the group API for virtual static groups with a
4618N/A * group that has a real target group.
4618N/A *
4618N/A * @throws Exception If an unexpected problem occurs.
4618N/A */
4618N/A @Test
4618N/A public void testGroupAPI()
4618N/A throws Exception
4618N/A {
4618N/A TestCaseUtils.initializeTestBackend(true);
4618N/A TestCaseUtils.addEntries(LDIF_LINES);
4618N/A
4618N/A VirtualStaticGroup g =
4618N/A (VirtualStaticGroup) groupManager.getGroupInstance(vmda);
4618N/A assertNotNull(g);
4618N/A assertTrue(g.isMember(u1));
4618N/A
4618N/A assertNotNull(g.getGroupDefinitionFilter());
4618N/A assertEquals(g.getGroupDN(), vmda);
4618N/A assertEquals(g.getTargetGroupDN(), da);
4618N/A assertFalse(g.supportsNestedGroups());
4618N/A assertTrue(g.getNestedGroupDNs().isEmpty());
4618N/A assertFalse(g.mayAlterMemberList());
4618N/A
4618N/A Entry entry = DirectoryServer.getEntry(u1);
4618N/A assertTrue(g.isMember(entry));
4618N/A
4618N/A MemberList memberList = g.getMembers();
4618N/A assertTrue(memberList.hasMoreMembers());
4618N/A assertNotNull(memberList.nextMemberDN());
4618N/A assertNotNull(memberList.nextMemberEntry());
2938N/A assertNotNull(memberList.nextMemberDN());
4618N/A assertNotNull(memberList.nextMemberDN());
4618N/A assertFalse(memberList.hasMoreMembers());
4618N/A
4618N/A SearchFilter filter = SearchFilter.createFilterFromString("(sn=1)");
4865N/A memberList = g.getMembers(DN.valueOf("o=test"), SearchScope.WHOLE_SUBTREE,
4865N/A filter);
4865N/A assertTrue(memberList.hasMoreMembers());
4865N/A assertNotNull(memberList.nextMemberDN());
4865N/A assertFalse(memberList.hasMoreMembers());
4865N/A
4865N/A try
4865N/A {
4618N/A g.addNestedGroup(d1);
2938N/A fail("Expected an exception from addNestedGroupDN");
4618N/A } catch (Exception e) {}
4618N/A
4618N/A try
4865N/A {
2938N/A g.removeNestedGroup(d1);
2852N/A 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.valueOf("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());
Attribute values = provider.getValues(entry, rule);
assertNotNull(values);
assertFalse(values.isEmpty());
assertTrue(provider.hasValue(entry, rule));
assertTrue(provider.hasValue(entry, rule, ByteString.valueOf(u1.toString())));
assertFalse(provider.hasValue(entry, rule, ByteString.valueOf(ne.toString())));
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);
SearchFilter filter = SearchFilter.createFilterFromString("(member=" + u1 + ")");
SearchRequest request = newSearchRequest(DN.valueOf("o=test"), SearchScope.WHOLE_SUBTREE, filter);
InternalSearchOperation searchOperation =
new InternalSearchOperation(getRootConnection(), nextOperationID(), nextMessageID(), request);
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());
Attribute values = provider.getValues(entry, rule);
assertNotNull(values);
assertTrue(values.isEmpty());
assertFalse(provider.hasValue(entry, rule));
assertFalse(provider.hasValue(entry, rule, ByteString.valueOf(u1.toString())));
assertFalse(provider.hasValue(entry, rule, ByteString.valueOf(ne.toString())));
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);
SearchFilter filter = SearchFilter.createFilterFromString("(member=" + u1 + ")");
SearchRequest request = newSearchRequest(DN.valueOf("o=test"), SearchScope.WHOLE_SUBTREE, filter);
InternalSearchOperation searchOperation =
new InternalSearchOperation(getRootConnection(), nextOperationID(), nextMessageID(), request);
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);
assertTrue(a.contains(ByteString.valueOf(u1.toString())));
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);
ByteString v = ByteString.valueOf(u4.toString());
assertTrue(a.contains(v));
LinkedList<Modification> mods = new LinkedList<Modification>();
mods.add(new Modification(ModificationType.ADD,
Attributes.create("memberurl",
"ldap:///o=test??sub?(objectClass=person)")));
ModifyOperation modifyOperation = getRootConnection().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);
ByteString v = ByteString.valueOf(u4.toString());
assertTrue(a.contains(v));
InternalClientConnection conn = getRootConnection();
LinkedList<Modification> mods = new LinkedList<Modification>();
mods.add(new Modification(ModificationType.REPLACE,
Attributes.create("ds-cfg-allow-retrieving-membership", "false")));
DN definitionDN =
DN.valueOf("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 = ByteString.valueOf(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
{
DN dn = DN.valueOf("ou=Groups,dc=example,dc=com");
final SearchRequest request = newSearchRequest(dn, SearchScope.SINGLE_LEVEL);
InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
for (Entry e : searchOperation.getSearchEntries())
{
getRootConnection().processDelete(e.getName());
}
}
}