| New file |
| | |
| | | /* |
| | | * 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/opendj3/legal-notices/CDDLv1_0.txt |
| | | * or http://forgerock.org/license/CDDLv1.0.html. |
| | | * 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/opendj3/legal-notices/CDDLv1_0.txt. 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 2009 Sun Microsystems, Inc. |
| | | * Portions copyright 2011 ForgeRock AS |
| | | */ |
| | | package org.forgerock.opendj.ldap.schema; |
| | | |
| | | |
| | | |
| | | import static org.fest.assertions.Assertions.assertThat; |
| | | import static org.forgerock.opendj.ldap.schema.SchemaValidationPolicy.defaultPolicy; |
| | | import static org.forgerock.opendj.ldap.schema.SchemaValidationPolicy.ignoreAll; |
| | | |
| | | import java.util.Collection; |
| | | |
| | | import org.forgerock.i18n.LocalizableMessage; |
| | | import org.forgerock.opendj.ldap.DN; |
| | | import org.forgerock.opendj.ldap.Entry; |
| | | import org.forgerock.opendj.ldap.ErrorResultException; |
| | | import org.forgerock.opendj.ldap.ResultCode; |
| | | import org.forgerock.opendj.ldap.schema.SchemaValidationPolicy.EntryResolver; |
| | | import org.forgerock.opendj.ldap.schema.SchemaValidationPolicy.Policy; |
| | | import org.forgerock.opendj.ldif.LDIFEntryReader; |
| | | import org.testng.annotations.Test; |
| | | |
| | | |
| | | |
| | | /** |
| | | * Test schema validation using {@link Schema#validateEntry}. |
| | | */ |
| | | @Test |
| | | public class EntrySchemaCheckingTestCase extends SchemaTestCase |
| | | { |
| | | /** |
| | | * Ensures that the provided entry fails schema checking validation with |
| | | * strict compliance enabled, but will pass in a more relaxed configuration. |
| | | * <p> |
| | | * Uses the default schema. |
| | | * |
| | | * @param e |
| | | * The entry to be tested. |
| | | */ |
| | | private void failOnlyForStrictEvaluation(Entry e) |
| | | { |
| | | failOnlyForStrictEvaluation(e, Schema.getDefaultSchema()); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Ensures that the provided entry fails schema checking validation with |
| | | * strict compliance enabled, but will pass in a more relaxed configuration. |
| | | * |
| | | * @param e |
| | | * The entry to be tested. |
| | | * @param schema |
| | | * The schema to use. |
| | | */ |
| | | private void failOnlyForStrictEvaluation(Entry e, Schema schema) |
| | | { |
| | | assertThat( |
| | | conformsToSchema(e, schema, defaultPolicy() |
| | | .requireSingleStructuralObjectClass(Policy.IGNORE), null)).isTrue(); |
| | | assertThat( |
| | | conformsToSchema(e, schema, defaultPolicy() |
| | | .requireSingleStructuralObjectClass(Policy.WARN), null)).isTrue(); |
| | | assertThat( |
| | | conformsToSchema(e, schema, defaultPolicy() |
| | | .requireSingleStructuralObjectClass(Policy.REJECT), null)) |
| | | .isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry with a valid single structural |
| | | * objectclass. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testValidSingleStructuralClass() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: dc=example,dc=com", |
| | | "objectClass: top", |
| | | "objectClass: domain", |
| | | "dc: example"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry (not covered by a DIT content rule) with |
| | | * a valid single structural objectclass as well as an auxiliary objectclass. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testValidSingleStructuralClassAndAuxiliaryClass() |
| | | throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: dc=example,dc=com", |
| | | "objectClass: top", |
| | | "objectClass: organization", |
| | | "objectClass: dcObject", |
| | | "dc: example", |
| | | "o: Example Org"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that does not contain a structural |
| | | * objectclass. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testNoStructuralClass() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: dc=example,dc=com", |
| | | "objectClass: top", |
| | | "objectClass: dcObject", |
| | | "dc: example"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that contains multiple structural |
| | | * objectclasses. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testMultipleStructuralClasses() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: uid=test.user,o=test", |
| | | "objectClass: top", |
| | | "objectClass: person", |
| | | "objectClass: organizationalPerson", |
| | | "objectClass: inetOrgPerson", |
| | | "objectClass: account", |
| | | "uid: test.user", |
| | | "givenName: Test", |
| | | "sn: User", |
| | | "cn: Test User"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that contains an undefined objectclass |
| | | * with no other structural class. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test() |
| | | public void testUndefinedStructuralObjectClass() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: xxxundefinedstructuralxxx", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, defaultPolicy(), null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that contains an undefined objectclass |
| | | * as well as a valid structural class. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test() |
| | | public void testUndefinedAuxiliaryObjectClass() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: device", |
| | | "objectClass: xxxundefinedauxiliaryxxx", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, defaultPolicy(), null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that is missing an attribute required by |
| | | * its structural object class. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test() |
| | | public void testMissingAttributeRequiredByStructuralClass() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testmissingatrequiredbystructuraloc-oid " |
| | | + "NAME 'testMissingATRequiredByStructuralOC' SUP top STRUCTURAL " |
| | | + "MUST ( cn $ description ) " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testMissingATRequiredByStructuralOC", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | private Entry newEntry(String... ldif) |
| | | { |
| | | return newEntry(Schema.getDefaultSchema(), ldif); |
| | | } |
| | | |
| | | |
| | | |
| | | private Entry newEntry(Schema schema, String... ldif) |
| | | { |
| | | try |
| | | { |
| | | return new LDIFEntryReader(ldif).setSchema(schema).readEntry(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new IllegalArgumentException(e); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that is missing an attribute required by |
| | | * an auxiliary object class. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test() |
| | | public void testMissingAttributeRequiredByAuxiliaryClass() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testmissingatrequiredbyauxiliaryoc-oid " |
| | | + "NAME 'testMissingATRequiredByAuxiliaryOC' SUP top AUXILIARY " |
| | | + "MUST ( cn $ description ) " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: device", |
| | | "objectClass: testMissingATRequiredByAuxiliaryOC", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that includes an attribute type that is |
| | | * not allowed by any of its object classes. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test() |
| | | public void testDisallowedAttributeType() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testdisallowedattributetypeoc-oid " |
| | | + "NAME 'testDisallowedAttributeTypeOC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testDisallowedAttributeTypeOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | private boolean conformsToSchema(final Entry entry, |
| | | final SchemaValidationPolicy policy, |
| | | final Collection<LocalizableMessage> errorMessages) |
| | | { |
| | | return conformsToSchema(entry, Schema.getDefaultSchema(), policy, |
| | | errorMessages); |
| | | } |
| | | |
| | | |
| | | |
| | | private boolean conformsToSchema(final Entry entry, final Schema schema, |
| | | final SchemaValidationPolicy policy, |
| | | final Collection<LocalizableMessage> errorMessages) |
| | | { |
| | | return schema.validateEntry(entry, policy, errorMessages); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that includes multiple values for a |
| | | * multivalued attribute. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testMultipleValuesForMultiValuedAttribute() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: o=test", |
| | | "objectClass: top", |
| | | "objectClass: organization", |
| | | "o: test", |
| | | "o: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that includes multiple values for a |
| | | * single-valued attribute. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test() |
| | | public void testMultipleValuesForSingleValuedAttribute() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: dc=example,dc=com", |
| | | "objectClass: top", |
| | | "objectClass: domain", |
| | | "dc: example", |
| | | "dc: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat( |
| | | conformsToSchema(e, ignoreAll().checkAttributeValues(Policy.REJECT), |
| | | null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that includes multiple values for a |
| | | * single-valued operational attribute. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testMultipleValuesForSingleValuedOperationalAttribute() |
| | | throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: dc=example,dc=com", |
| | | "objectClass: top", |
| | | "objectClass: domain", |
| | | "dc: example", |
| | | "creatorsName: cn=Directory Manager", |
| | | "creatorsName: cn=Another Manager"); |
| | | // @formatter:on |
| | | |
| | | assertThat( |
| | | conformsToSchema(e, ignoreAll().checkAttributeValues(Policy.REJECT), |
| | | null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that contains structural and auxiliary |
| | | * objectclasses where the auxiliary class is allowed by a DIT content rule. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testAuxiliaryClassAllowedByDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testauxiliaryclassallowedbydcroc-oid " |
| | | + "NAME 'testAuxiliaryClassAllowedByDCROC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addObjectClass( |
| | | "( testauxiliaryclassallowedbydcrocaux-oid " |
| | | + "NAME 'testAuxiliaryClassAllowedByDCROCAux' SUP top AUXILIARY " |
| | | + "MAY description X-ORIGIN 'EntrySchemaCheckingTestCase')", |
| | | false) |
| | | .addDITContentRule( |
| | | "( testauxiliaryclassallowedbydcroc-oid " |
| | | + "NAME 'testAuxiliaryClassAllowedByDCR' " |
| | | + "AUX testAuxiliaryClassAllowedByDCROCAux " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testAuxiliaryClassAllowedByDCROC", |
| | | "objectClass: testAuxiliaryClassAllowedByDCROCAux", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that contains structural and auxiliary |
| | | * objectclasses where the auxiliary class is not allowed by the associated |
| | | * DIT content rule. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testAuxiliaryClassNotAllowedByDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testauxiliaryclassnotallowedbydcroc-oid " |
| | | + "NAME 'testAuxiliaryClassNotAllowedByDCROC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addObjectClass( |
| | | "( testauxiliaryclassnotallowedbydcrocaux-oid " |
| | | + "NAME 'testAuxiliaryClassNotAllowedByDCROCAux' SUP top " |
| | | + "AUXILIARY MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addDITContentRule( |
| | | "( testauxiliaryclassnotallowedbydcroc-oid " |
| | | + "NAME 'testAuxiliaryClassNotAllowedByDCR' " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testAuxiliaryClassNotAllowedByDCROC", |
| | | "objectClass: testAuxiliaryClassNotAllowedByDCROCAux", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry covered by a DIT content rule to ensure |
| | | * that attributes required by the DIT content rule are allowed even if not |
| | | * directly allowed by any of the entry's objectclasses. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testAllowAttributeRequiredByDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testallowatrequiredbydcroc-oid " |
| | | + "NAME 'testAllowATRequiredByDCROC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addDITContentRule( |
| | | "( testallowatrequiredbydcroc-oid " |
| | | + "NAME 'testAllowATRequiredByDCR' MUST description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testAllowATRequiredByDCROC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry covered by a DIT content rule to ensure |
| | | * that attributes required by the DIT content rule are required even if not |
| | | * directly allowed by any of the entry's objectclasses. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testRequireAttributeRequiredByDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testrequireatrequiredbydcroc-oid " |
| | | + "NAME 'testRequireATRequiredByDCROC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addDITContentRule( |
| | | "( testrequireatrequiredbydcroc-oid " |
| | | + "NAME 'testRequireATRequiredByDCR' MUST description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testRequireATRequiredByDCROC", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry for which there is a DIT content rule |
| | | * covering the structural objectclass but that DIT content rule is marked |
| | | * OBSOLETE. In this case, any attribute types required by the DIT content |
| | | * rule should not be required for the entry. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testDontRequireAttributeRequiredByObsoleteDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testdontrequireatrequiredbyobsoletedcroc-oid " |
| | | + "NAME 'testDontRequireATRequiredByObsoleteDCROC' SUP top " |
| | | + "STRUCTURAL MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", |
| | | false) |
| | | .addDITContentRule( |
| | | "( testdontrequireatrequiredbyobsoletedcroc-oid " |
| | | + "NAME 'testDontRequireATRequiredByObsoleteDCR' OBSOLETE " |
| | | + "MUST description X-ORIGIN 'EntrySchemaCheckingTestCase' )", |
| | | false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testDontRequireATRequiredByObsoleteDCROC", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry covered by a DIT content rule to ensure |
| | | * that attributes allowed by the DIT content rule are allowed even if not |
| | | * directly allowed by any of the entry's objectclasses. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testAllowAttributeAllowedByDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testallowatallowedbydcroc-oid " |
| | | + "NAME 'testAllowATAllowedByDCROC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addDITContentRule( |
| | | "( testallowatallowedbydcroc-oid " |
| | | + "NAME 'testAllowATAllowedByDCR' MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testAllowATAllowedByDCROC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry covered by a DIT content rule to ensure |
| | | * that attributes allowed by the DIT content rule are allowed but not |
| | | * required if they are not required by any of the associated object classes. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testDontRequireAttributeAllowedByDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testdontrequireatallowedbydcroc-oid " |
| | | + "NAME 'testDontRequireATAllowedByDCROC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addDITContentRule( |
| | | "( testdontrequireatallowedbydcroc-oid " |
| | | + "NAME 'testDontRequireATAllowedByDCR' MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testDontRequireATAllowedByDCROC", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry covered by a DIT content rule to ensure |
| | | * that attributes prohibited by the DIT content rule are not allowed even if |
| | | * they are allowed by the associated object classes. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testDontAllowAttributeProhibitedByDCR() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testdontallowattributeprohibitedbydcroc-oid " |
| | | + "NAME 'testDontAllowAttributeProhibitedByDCROC' SUP top " |
| | | + "STRUCTURAL MUST cn MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addDITContentRule( |
| | | "( testdontallowattributeprohibitedbydcroc-oid " |
| | | + "NAME 'testDontAllowAttributeProhibitedByDCR' NOT description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testDontAllowAttributeProhibitedByDCROC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be accepted if its |
| | | * single-valued RDN component is compliant with that name form. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testSatisfiesSingleValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testsatisfiessinglevaluednameformoc-oid " |
| | | + "NAME 'testSatisfiesSingleValuedNameFormOC' SUP top STRUCTURAL " |
| | | + "MUST cn X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addNameForm( |
| | | "( testsatisfiessinglevaluednameform-oid " |
| | | + "NAME 'testSatisfiesSingleValuedNameForm' " |
| | | + "OC testSatisfiesSingleValuedNameFormOC MUST cn " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testSatisfiesSingleValuedNameFormOC", |
| | | "cn: test"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be rejected if its |
| | | * single-valued RDN component violates that name form. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testViolatesSingleValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testviolatessinglevaluednameformoc-oid " |
| | | + "NAME 'testViolatesSingleValuedNameFormOC' SUP top STRUCTURAL " |
| | | + "MUST cn MAY description X-ORIGIN 'EntrySchemaCheckingTestCase')", |
| | | false) |
| | | .addNameForm( |
| | | "( testviolatessinglevaluednameform-oid " |
| | | + "NAME 'testViolatesSingleValuedNameForm' " |
| | | + "OC testViolatesSingleValuedNameFormOC MUST cn " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: description=foo,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testViolatesSingleValuedNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be rejected if its |
| | | * multivalued RDN component violates that name form which only allows a |
| | | * single value. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testMVViolatesSingleValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testmvviolatessinglevaluednameformoc-oid " |
| | | + "NAME 'testMVViolatesSingleValuedNameFormOC' SUP top STRUCTURAL " |
| | | + "MUST cn MAY description X-ORIGIN 'EntrySchemaCheckingTestCase')", |
| | | false) |
| | | .addNameForm( |
| | | "( testmvviolatessinglevaluednameform-oid " |
| | | + "NAME 'testMVViolatesSingleValuedNameForm' " |
| | | + "OC testMVViolatesSingleValuedNameFormOC MUST cn " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test+description=foo,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testMVViolatesSingleValuedNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will not be rejected if its |
| | | * single-valued RDN component violates that name form but the name form is |
| | | * declared OBSOLETE. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testViolatesSingleValuedObsoleteNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testviolatessinglevaluedobsoletenameformoc-oid " |
| | | + "NAME 'testViolatesSingleValuedObsoleteNameFormOC' SUP top " |
| | | + "STRUCTURAL MUST cn MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addNameForm( |
| | | "( testviolatessinglevaluedobsoletenameform-oid " |
| | | + "NAME 'testViolatesSingleValuedObsoleteNameForm' OBSOLETE " |
| | | + "OC testViolatesSingleValuedObsoleteNameFormOC MUST cn " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: description=foo,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testViolatesSingleValuedObsoleteNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be accepted if its |
| | | * multivalued RDN component is compliant with that name form which requires |
| | | * multiple values. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testSatisfiesRequiredMultiValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testsatisfiesrequiredmultivaluednameformoc-oid " |
| | | + "NAME 'testSatisfiesRequiredMultiValuedNameFormOC' SUP top " |
| | | + "STRUCTURAL MUST cn MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addNameForm( |
| | | "( testsatisfiesrequiredmultivaluednameform-oid " |
| | | + "NAME 'testSatisfiesRequiredMultiValuedNameForm' " |
| | | + "OC testSatisfiesRequiredMultiValuedNameFormOC " |
| | | + "MUST ( cn $ description ) " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test+description=foo,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testSatisfiesRequiredMultiValuedNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be accepted if its |
| | | * single-valued RDN component only contains one of the multiple required |
| | | * attribute types. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testViolatesRequiredMultiValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testviolatesrequiredmultivaluednameformoc-oid " |
| | | + "NAME 'testViolatesRequiredMultiValuedNameFormOC' SUP top " |
| | | + "STRUCTURAL MUST cn MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addNameForm( |
| | | "( testviolatesrequiredmultivaluednameform-oid " |
| | | + "NAME 'testViolatesRequiredMultiValuedNameForm' " |
| | | + "OC testViolatesRequiredMultiValuedNameFormOC " |
| | | + "MUST ( cn $ description ) " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testViolatesRequiredMultiValuedNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be accepted if its |
| | | * single-valued RDN component is compliant with that name form which requires |
| | | * one value but allows other values. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testSVSatisfiesOptionalMultiValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testsvsatisfiesoptionalmultivaluednameformoc-oid " |
| | | + "NAME 'testSVSatisfiesOptionalMultiValuedNameFormOC' SUP top " |
| | | + "STRUCTURAL MUST cn MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addNameForm( |
| | | "( testsvsatisfiesoptionalmultivaluednameform-oid " |
| | | + "NAME 'testSVSatisfiesOptionalMultiValuedNameForm' " |
| | | + "OC testSVSatisfiesOptionalMultiValuedNameFormOC MUST cn " |
| | | + "MAY description X-ORIGIN 'EntrySchemaCheckingTestCase' )", |
| | | false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testSVSatisfiesOptionalMultiValuedNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be accepted if its |
| | | * multivalued RDN component is compliant with that name form which requires |
| | | * one value but allows other values. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testMVSatisfiesOptionalMultiValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testmvsatisfiesoptionalmultivaluednameformoc-oid " |
| | | + "NAME 'testMVSatisfiesOptionalMultiValuedNameFormOC' SUP top " |
| | | + "STRUCTURAL MUST cn MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addNameForm( |
| | | "( testmvsatisfiesoptionalmultivaluednameform-oid " |
| | | + "NAME 'testMVSatisfiesOptionalMultiValuedNameForm' " |
| | | + "OC testMVSatisfiesOptionalMultiValuedNameFormOC MUST cn " |
| | | + "MAY description X-ORIGIN 'EntrySchemaCheckingTestCase' )", |
| | | false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=test+description=foo,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testMVSatisfiesOptionalMultiValuedNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | assertThat(conformsToSchema(e, schema, defaultPolicy(), null)).isTrue(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests that an entry covered by a name form will be accepted if its |
| | | * single-valued RDN component violates that name form which requires one |
| | | * value but allows other values. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testSVViolatesOptionalMultiValuedNameForm() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testsvviolatesoptionalmultivaluednameformoc-oid " |
| | | + "NAME 'testSVViolatesOptionalMultiValuedNameFormOC' SUP top " |
| | | + "STRUCTURAL MUST cn MAY description " |
| | | + "X-ORIGIN 'EntrySchemaCheckingTestCase')", false) |
| | | .addNameForm( |
| | | "( testsvviolatesoptionalmultivaluednameform-oid " |
| | | + "NAME 'testSVViolatesOptionalMultiValuedNameForm' " |
| | | + "OC testSVViolatesOptionalMultiValuedNameFormOC MUST cn " |
| | | + "MAY description X-ORIGIN 'EntrySchemaCheckingTestCase' )", |
| | | false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: description=foo,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testSVViolatesOptionalMultiValuedNameFormOC", |
| | | "cn: test", |
| | | "description: foo"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Performs various tests to ensure that the server appropriately enforces DIT |
| | | * structure rule constraints. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test(enabled = false) |
| | | public void testDITStructureRuleConstraints() throws Exception |
| | | { |
| | | Schema schema = new SchemaBuilder(Schema.getDefaultSchema()) |
| | | .addObjectClass( |
| | | "( testditstructureruleconstraintssupoc-oid " |
| | | + "NAME 'testDITStructureRuleConstraintsSupOC' SUP top " |
| | | + "STRUCTURAL MUST ou X-ORIGIN 'SchemaBackendTestCase')", false) |
| | | .addObjectClass( |
| | | "( testditstructureruleconstraintssuboc-oid " |
| | | + "NAME 'testDITStructureRuleConstraintsSubOC' SUP top " |
| | | + "STRUCTURAL MUST cn X-ORIGIN 'SchemaBackendTestCase')", false) |
| | | .addNameForm( |
| | | "( testditstructureruleconstraintsupsnf-oid " |
| | | + "NAME 'testDITStructureRuleConstraintsSupNF' " |
| | | + "OC testDITStructureRuleConstraintsSupOC MUST ou " |
| | | + "X-ORIGIN 'SchemaBackendTestCase' )", false) |
| | | .addNameForm( |
| | | "( testditstructureruleconstraintsubsnf-oid " |
| | | + "NAME 'testDITStructureRuleConstraintsSubNF' " |
| | | + "OC testDITStructureRuleConstraintsSubOC MUST cn " |
| | | + "X-ORIGIN 'SchemaBackendTestCase' )", false) |
| | | .addDITStructureRule( |
| | | "( 999014 " + "NAME 'testDITStructureRuleConstraintsSup' " |
| | | + "FORM testDITStructureRuleConstraintsSupNF " |
| | | + "X-ORIGIN 'SchemaBackendTestCase' )", false) |
| | | .addDITStructureRule( |
| | | "( 999015 " + "NAME 'testDITStructureRuleConstraintsSub' " |
| | | + "FORM testDITStructureRuleConstraintsSubNF SUP 999014 " |
| | | + "X-ORIGIN 'SchemaBackendTestCase' )", false).toSchema(); |
| | | |
| | | // @formatter:off |
| | | Entry e = newEntry(schema, |
| | | "dn: cn=child,ou=parent,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testDITStructureRuleConstraintsSubOC", |
| | | "cn: child"); |
| | | // @formatter:on |
| | | |
| | | failOnlyForStrictEvaluation(e, schema); |
| | | |
| | | // @formatter:off |
| | | Entry p = newEntry(schema, |
| | | "dn: ou=parent,o=test", |
| | | "changetype: add", |
| | | "objectClass: top", |
| | | "objectClass: testDITStructureRuleConstraintsSupOC", |
| | | "ou: parent"); |
| | | // @formatter:on |
| | | |
| | | assertThat( |
| | | conformsToSchema( |
| | | e, |
| | | schema, |
| | | defaultPolicy().checkDITStructureRules(Policy.REJECT, |
| | | newResolver(p)), null)).isFalse(); |
| | | |
| | | // @formatter:off |
| | | e = newEntry(schema, |
| | | "dn: cn=not below valid parent,o=test", |
| | | "objectClass: top", |
| | | "objectClass: testDITStructureRuleConstraintsSubOC", |
| | | "cn: not below valid parent"); |
| | | // @formatter:on |
| | | |
| | | assertThat( |
| | | conformsToSchema( |
| | | e, |
| | | schema, |
| | | defaultPolicy().checkDITStructureRules(Policy.REJECT, |
| | | newResolver(null)), null)).isFalse(); |
| | | |
| | | // @formatter:off |
| | | e = newEntry(schema, |
| | | "dn: cn=invalid entry below parent covered by DSR,ou=parent,o=test", |
| | | "objectClass: top", "objectClass: device", |
| | | "cn: invalid entry below parent covered by DSR"); |
| | | // @formatter:on |
| | | |
| | | assertThat( |
| | | conformsToSchema( |
| | | e, |
| | | schema, |
| | | defaultPolicy().checkDITStructureRules(Policy.REJECT, |
| | | newResolver(p)), null)).isFalse(); |
| | | } |
| | | |
| | | |
| | | |
| | | private EntryResolver newResolver(final Entry e) |
| | | { |
| | | return new EntryResolver() |
| | | { |
| | | |
| | | public Entry getEntry(DN dn) throws ErrorResultException |
| | | { |
| | | if (e == null) |
| | | { |
| | | throw ErrorResultException.newErrorResult(ResultCode.NO_SUCH_OBJECT, |
| | | "no such entry " + dn.toString()); |
| | | } |
| | | |
| | | assertThat((Object) dn).isEqualTo(e.getName()); |
| | | return e; |
| | | } |
| | | }; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tests schema checking for an entry that includes an attribute not defined |
| | | * in any objectClasses but the subtypes of the attribute are. |
| | | * |
| | | * @throws Exception |
| | | * If an unexpected problem occurs. |
| | | */ |
| | | @Test() |
| | | public void testInvalidSuperiorAttribute() throws Exception |
| | | { |
| | | // @formatter:off |
| | | Entry e = newEntry( |
| | | "dn: uid=test.user,o=test", |
| | | "objectClass: top", |
| | | "objectClass: person", |
| | | "objectClass: organizationalPerson", |
| | | "objectClass: inetOrgPerson", |
| | | "objectClass: account", |
| | | "uid: test.user", |
| | | "givenName: Test", |
| | | "sn: User", |
| | | "cn: Test User", |
| | | "name: foo"); |
| | | // @formatter:off |
| | | |
| | | assertThat(conformsToSchema(e, defaultPolicy(), null)).isFalse(); |
| | | } |
| | | } |