/*
* ====================
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008-2009 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License("CDDL") (the "License"). You may not use this file
* except in compliance with the License.
*
* You can obtain a copy of the License at
* http://IdentityConnectors.dev.java.net/legal/license.txt
* See the License for the specific language governing permissions and limitations
* under the License.
*
* When distributing the Covered Code, include this CDDL Header Notice in each file
* and include the License file at identityconnectors/legal/license.txt.
* If applicable, add the following below this CDDL Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
* ====================
*/
package org.identityconnectors.ldap.schema;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import java.util.EnumSet;
import java.util.Set;
import org.identityconnectors.framework.api.operations.AuthenticationApiOp;
import org.identityconnectors.framework.api.operations.SyncApiOp;
import org.identityconnectors.framework.common.objects.AttributeInfo;
import org.identityconnectors.framework.common.objects.AttributeInfoBuilder;
import org.identityconnectors.framework.common.objects.AttributeInfoUtil;
import org.identityconnectors.framework.common.objects.ObjectClass;
import org.identityconnectors.framework.common.objects.ObjectClassInfo;
import org.identityconnectors.framework.common.objects.OperationalAttributes;
import org.identityconnectors.framework.common.objects.Schema;
import org.identityconnectors.framework.common.objects.AttributeInfo.Flags;
import org.identityconnectors.ldap.LdapConfiguration;
import org.identityconnectors.ldap.LdapConnection;
import org.identityconnectors.ldap.LdapConnectorTestBase;
import org.identityconnectors.ldap.LdapConstants;
import org.identityconnectors.ldap.LdapConnection.ServerType;
public class LdapSchemaMappingTests extends LdapConnectorTestBase {
// TODO operational attributes.
// TODO test for operation option infos.
@Override
protected boolean restartServerAfterEachTest() {
return false;
}
@Test
public void testObjectClassAttrIsReadOnly() {
LdapConfiguration config = newConfiguration(true);
Schema schema = newFacade(config).schema();
for (ObjectClassInfo oci : schema.getObjectClassInfo()) {
AttributeInfo attrInfo = AttributeInfoUtil.find("objectClass", oci.getAttributeInfo());
assertFalse(attrInfo.isRequired());
assertFalse(attrInfo.isCreateable());
assertFalse(attrInfo.isUpdateable());
}
}
@Test
public void testAccountSchema() {
LdapConfiguration config = newConfiguration(true);
Schema schema = newFacade(config).schema();
ObjectClassInfo oci = schema.findObjectClassInfo(ObjectClass.ACCOUNT_NAME);
assertFalse(oci.isContainer());
// Check some, but not all, attributes of inetOrgClass.
Set<AttributeInfo> attrInfos = oci.getAttributeInfo();
AttributeInfo info = AttributeInfoUtil.find("cn", attrInfos);
assertEquals(AttributeInfoBuilder.build("cn", String.class, EnumSet.of(Flags.REQUIRED, Flags.MULTIVALUED)), info);
info = AttributeInfoUtil.find("uid", attrInfos);
assertEquals(AttributeInfoBuilder.build("uid", String.class, EnumSet.of(Flags.MULTIVALUED)), info);
info = AttributeInfoUtil.find("givenName", attrInfos);
assertEquals(AttributeInfoBuilder.build("givenName", String.class, EnumSet.of(Flags.MULTIVALUED)), info);
info = AttributeInfoUtil.find("sn", attrInfos);
assertEquals(AttributeInfoBuilder.build("sn", String.class, EnumSet.of(Flags.REQUIRED, Flags.MULTIVALUED)), info);
// Operational attributes.
info = AttributeInfoUtil.find(OperationalAttributes.PASSWORD_NAME, attrInfos);
assertEquals(LdapConstants.PASSWORD, info);
}
@Test
public void testGroupSchema() {
LdapConfiguration config = newConfiguration(true);
Schema schema = newFacade(config).schema();
ObjectClassInfo oci = schema.findObjectClassInfo(ObjectClass.GROUP_NAME);
assertFalse(oci.isContainer());
Set<AttributeInfo> attrInfos = oci.getAttributeInfo();
AttributeInfo info = AttributeInfoUtil.find("cn", attrInfos);
assertEquals(AttributeInfoBuilder.build("cn", String.class, EnumSet.of(Flags.REQUIRED, Flags.MULTIVALUED)), info);
}
@Test
public void testAuthenticationOnlyForAccounts() {
LdapConfiguration config = newConfiguration(true);
Schema schema = newFacade(config).schema();
Set<ObjectClassInfo> ocis = schema.getSupportedObjectClassesByOperation().get(AuthenticationApiOp.class);
assertEquals(1, ocis.size());
assertTrue(ocis.iterator().next().is(ObjectClass.ACCOUNT_NAME));
}
@Test
public void testAllObjectClassesInSchema() {
Schema schema = newFacade(newConfiguration(true)).schema();
// Well, at least some of the most well-known.
assertNotNull(schema.findObjectClassInfo("organization"));
assertNotNull(schema.findObjectClassInfo("groupOfNames"));
assertNotNull(schema.findObjectClassInfo("dNSDomain"));
// top is abstract, so it shouldn't be in the schema.
assertNull(schema.findObjectClassInfo("top"));
// extensibleObject is auxiliary, so it shouldn't be in the schema.
assertNull(schema.findObjectClassInfo("extensibleObject"));
}
@Test
public void testArbitraryObjectClass() {
Schema schema = newFacade(newConfiguration(true)).schema();
ObjectClassInfo dnsDomainInfo = schema.findObjectClassInfo("dNSDomain");
assertTrue(dnsDomainInfo.isContainer());
Set<AttributeInfo> dnsDomainAttrInfos = dnsDomainInfo .getAttributeInfo();
// Inherited from domain.
AttributeInfo info = AttributeInfoUtil.find("dc", dnsDomainAttrInfos );
assertEquals(AttributeInfoBuilder.build("dc", String.class, EnumSet.of(Flags.REQUIRED)), info);
info = AttributeInfoUtil.find("telephoneNumber", dnsDomainAttrInfos );
assertEquals(AttributeInfoBuilder.build("telephoneNumber", String.class, EnumSet.of(Flags.MULTIVALUED)), info);
// Defined in dNSDomain.
info = AttributeInfoUtil.find("MXRecord", dnsDomainAttrInfos );
assertEquals(AttributeInfoBuilder.build("MXRecord", String.class, EnumSet.of(Flags.MULTIVALUED)), info);
}
@Test
public void testAttributeTypes() {
LdapConfiguration config = newConfiguration(true);
Schema schema = newFacade(config).schema();
ObjectClassInfo accountInfo = schema.findObjectClassInfo(ObjectClass.ACCOUNT_NAME);
Set<AttributeInfo> accountAttrInfos = accountInfo.getAttributeInfo();
assertEquals(String.class, AttributeInfoUtil.find("cn", accountAttrInfos).getType());
assertEquals(String.class, AttributeInfoUtil.find("ou", accountAttrInfos).getType());
assertEquals(String.class, AttributeInfoUtil.find("telephoneNumber", accountAttrInfos).getType());
assertEquals(byte[].class, AttributeInfoUtil.find("audio", accountAttrInfos).getType());
assertEquals(byte[].class, AttributeInfoUtil.find("jpegPhoto", accountAttrInfos).getType());
assertEquals(byte[].class, AttributeInfoUtil.find("userCertificate", accountAttrInfos).getType());
assertEquals(byte[].class, AttributeInfoUtil.find("x500UniqueIdentifier", accountAttrInfos).getType());
}
@Test
public void testSyncNotSupported() {
LdapConfiguration config = newConfiguration();
LdapConnection conn = new LdapConnection(config);
assertEquals(ServerType.OPENDS, conn.getServerType());
Schema schema = newFacade(config).schema();
assertTrue(schema.getSupportedObjectClassesByOperation().get(SyncApiOp.class).isEmpty());
}
}