blob: 0402f57f9eb5ddcc1b3c778def3be53dc8277ab5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.api.ldap.model.schema.syntaxes.parser;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import java.text.ParseException;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.api.ldap.model.schema.UsageEnum;
import org.apache.directory.api.ldap.model.schema.parsers.AttributeTypeDescriptionSchemaParser;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
/**
* Tests the AttributeTypeDescriptionSchemaParser class.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@Execution(ExecutionMode.CONCURRENT)
public class AttributeTypeDescriptionSchemaParserStrictTest
{
/** the parser instance */
private AttributeTypeDescriptionSchemaParser parser;
@BeforeEach
public void setUp() throws Exception
{
parser = new AttributeTypeDescriptionSchemaParser();
}
@AfterEach
public void tearDown() throws Exception
{
parser = null;
}
/**
* Test numericoid
*
* @throws ParseException
*/
@Test
public void testNumericOid() throws ParseException
{
SchemaParserTestUtils.testNumericOid( parser, "SYNTAX 1.1" );
}
/**
* Tests NAME and its values
*
* @throws ParseException
*/
@Test
public void testNames() throws ParseException
{
SchemaParserTestUtils.testNamesStrict( parser, "1.1", "SYNTAX 1.1" );
}
/**
* Tests DESC
*
* @throws ParseException
*/
@Test
public void testDescription() throws ParseException
{
SchemaParserTestUtils.testDescription( parser, "1.1", "SYNTAX 1.1" );
}
/**
* Tests OBSOLETE
*
* @throws ParseException
*/
@Test
public void testObsolete() throws ParseException
{
SchemaParserTestUtils.testObsolete( parser, "1.1", "SYNTAX 1.1" );
}
/**
* Test SUP and its value, in strict mode.
*
* @throws ParseException
*/
@Test
public void testSup() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// no SUP
value = "( 1.1 SYNTAX 1.1 )";
attributeType = parser.parse( value );
assertNull( attributeType.getSuperiorOid() );
// SUP, no SYNTAX
value = "( 1.1 SUP 1.1 )";
attributeType = parser.parse( value );
assertEquals( "1.1", attributeType.getSuperiorOid() );
// SUP numericoid
value = "( 1.1 SYNTAX 1.1 SUP 1.2.3.4.5.6.7.8.9.0 )";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4.5.6.7.8.9.0", attributeType.getSuperiorOid() );
// SUP descr, no space
value = "(1.1 SYNTAX1.1 SUPabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789)";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, space expected after SUP" );
}
catch ( ParseException pe )
{
// expected
}
// SUP descr, tabs
value = "\t(\t1.1\tSYNTAX\t1.1\tSUP\tabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789\t)\t";
attributeType = parser.parse( value );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", attributeType
.getSuperiorOid() );
// SUP descr, newline
value = "\n(\n1.1\nSYNTAX\n1.1\nSUP\nabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789\n)\n";
attributeType = parser.parse( value );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", attributeType
.getSuperiorOid() );
// quoted SUP value
value = "( 1.1 SYNTAX 1.1 SUP 'name' )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, SUP oids should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
// quoted SUP value
value = "( 1.1 SYNTAX 1.1 SUP '1.2.3.4' )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, SUP should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
// quoted SUP value
value = "( 1.1 SYNTAX 1.1 SUP ('1.2.3.4') )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, SUP should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
// unquoted SUP value
value = "( 1.1 SYNTAX 1.1 SUP (1.2.3.4) )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, SUP should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
// invalid character
value = "( 1.1 SYNTAX 1.1 SUP 1.2.3.4.A )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SUP '1.2.3.4.A' (invalid character)" );
}
catch ( ParseException pe )
{
// expected
}
// invalid character
value = "( 1.1 SYNTAX 1.1 SUP with_underscore )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SUP with_underscore (invalid character)" );
}
catch ( ParseException pe )
{
// expected
}
// invalid OID
value = "( 1.1 SYNTAX 1.1 SUP 11.2.3.4. )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SUP '11.2.3.4.' (invalid OID)" );
}
catch ( ParseException pe )
{
// expected
}
// only single SUP allowed
value = "( 1.1 SYNTAX 1.1 SUP ( name1 $ name2 ) )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, only single SUP allowed" );
}
catch ( ParseException pe )
{
// expected
}
// empty sup
value = "( 1.1 SYNTAX 1.1 SUP )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, no SUP value" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Tests EQUALITY and its values.
* Very similar to SUP, so here are less test cases.
*
* @throws ParseException
*/
@Test
public void testEquality() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// no EQUALITY
value = "( 1.1 SYNTAX 1.1 )";
attributeType = parser.parse( value );
assertNull( attributeType.getEqualityOid() );
// EQUALITY numericoid
value = "( 1.1 SYNTAX 1.1 EQUALITY 1.2.3.4567.8.9.0 )";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4567.8.9.0", attributeType.getEqualityOid() );
// EQUALITY descr, no space
value = "(1.1 SYNTAX1.1 EQUALITYabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789)";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, spaces expected after EQUALITY" );
}
catch ( ParseException pe )
{
// expected
}
// EQUALITY descr, newline
value = "\n(\n1.1\nSYNTAX\n1.1\nEQUALITY\nabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789\n)\n";
attributeType = parser.parse( value );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", attributeType
.getEqualityOid() );
// quoted value
value = "( 1.1 SYNTAX 1.1 EQUALITY 'caseExactMatch' )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, EQUALITY should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
// quote value in parentheses
value = "( 1.1 SYNTAX 1.1 EQUALITY ('caseExactMatch') )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, EQUALITY should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Tests ORDERING and its values.
* Very similar to SUP, so here are less test cases.
*
* @throws ParseException
*/
@Test
public void testOrdering() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// no ORDERING
value = "( 1.1 SYNTAX 1.1 )";
attributeType = parser.parse( value );
assertNull( attributeType.getOrderingOid() );
// ORDERING numericoid
value = "( 1.1 SYNTAX 1.1 ORDERING 1.2.3.4567.8.9.0 )";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4567.8.9.0", attributeType.getOrderingOid() );
// ORDERING descr, no space
value = "(1.1 SYNTAX1.1 ORDERINGabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789)";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, ORDERING should have space" );
}
catch ( ParseException pe )
{
// expected
}
// ORDERING descr, newline
value = "\r(\r1.1\rSYNTAX\r1.1\rORDERING\rabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789\r)\r";
attributeType = parser.parse( value );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", attributeType
.getOrderingOid() );
// quoted value
value = "( 1.1 SYNTAX 1.1 ORDERING 'generalizedTimeOrderingMatch' )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, ORDERING should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
// quote value in parentheses
value = "( 1.1 SYNTAX 1.1 ORDERING ('generalizedTimeOrderingMatch') )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, ORDERING should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Tests SUBSTRING and its values.
* Very similar to SUP, so here are less test cases.
*
* @throws ParseException
*/
@Test
public void testSubstring() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// no SUBSTR
value = "( 1.1 SYNTAX 1.1 )";
attributeType = parser.parse( value );
assertNull( attributeType.getSubstringOid() );
// SUBSTR numericoid
value = "( 1.1 SYNTAX 1.1 SUBSTR 1.2.3.4567.8.9.0 )";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4567.8.9.0", attributeType.getSubstringOid() );
// SUBSTR descr, no space
value = "(1.1 SYNTAX1.1 SUBSTRabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789)";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, spaces expected after SUBSTR" );
}
catch ( ParseException pe )
{
// expected
}
// SUBSTR descr, newline
value = "\r\n(\r\n1.1\r\nSYNTAX\r\n1.1\r\nSUBSTR\r\nabcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789\r\n)\r\n";
attributeType = parser.parse( value );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", attributeType
.getSubstringOid() );
// quoted value
value = "( 1.1 SYNTAX 1.1 SUBSTR 'caseIgnoreSubstringsMatch' )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, SUBSTR should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
// quote value in parentheses
value = "( 1.1 SYNTAX 1.1 SUBSTR ('caseIgnoreSubstringsMatch') )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, SUBSTR should not be quoted" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Tests SYNTAX
*
* @throws ParseException
*/
@Test
public void testSyntax() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// no SYNTAX
value = "( 1.1 SUP 1.1 )";
attributeType = parser.parse( value );
assertNull( attributeType.getSyntaxOid() );
assertEquals( 0, attributeType.getSyntaxLength() );
// SYNTAX string
value = "( 1.1 SYNTAX IA5String )";
attributeType = parser.parse( value );
assertEquals( "IA5String", attributeType.getSyntaxOid() );
assertEquals( 0, attributeType.getSyntaxLength() );
// SYNTAX numericoid
value = "( 1.1 SYNTAX 1.2.3.4567.8.9.0 )";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4567.8.9.0", attributeType.getSyntaxOid() );
assertEquals( 0, attributeType.getSyntaxLength() );
// quoted numericoid
value = "( 1.1 SYNTAX '1.2.3.4567.8.9.0' )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, quoted syntax OID not allowed" );
}
catch ( ParseException pe )
{
// expected
}
// quoted numericoid
value = "( 1.1 SYNTAX ('1.2.3.4567.8.9.0') )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, quoted syntax OID not allowed" );
}
catch ( ParseException pe )
{
// expected
}
// SYNTAX numericoid and length, no spaces
value = "(1.1 SYNTAX1.2.3.4567.8.9.0{1234567890})";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, missing space" );
}
catch ( ParseException pe )
{
// expected
}
// SYNTAX, with tabs
value = "\t(\t1.1\tSYNTAX\t1.2.3.4567.8.9.0{1234567890}\t)\t";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4567.8.9.0", attributeType.getSyntaxOid() );
assertEquals( 1234567890, attributeType.getSyntaxLength() );
// SYNTAX numericoid and zero length
value = "( 1.1 SYNTAX 1.2.3{0} )";
attributeType = parser.parse( value );
assertEquals( "1.2.3", attributeType.getSyntaxOid() );
assertEquals( 0, attributeType.getSyntaxLength() );
// quoted value
value = "( 1.1 SYNTAX '1.2.3{32}' )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, quoted syntax OID not allowed" );
}
catch ( ParseException pe )
{
// expected
}
// quote value in parentheses
value = "( 1.1 SYNTAX ( '1.2.3{32}' ) )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, quoted syntax OID not allowed" );
}
catch ( ParseException pe )
{
// expected
}
// empty length
value = "( 1.1 SYNTAX 1.2.3.4{} )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SYNTAX 1.2.3.4{} (empty length)" );
}
catch ( ParseException pe )
{
// expected
}
// leading zero in length
value = "( 1.1 SYNTAX 1.2.3.4{01} )";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4", attributeType.getSyntaxOid() );
assertEquals( 1, attributeType.getSyntaxLength() );
// invalid syntax length
value = "( 1.1 SYNTAX 1.2.3.4{X} )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SYNTAX 1.2.3.4{X} (invalid length)" );
}
catch ( ParseException pe )
{
// expected
}
// no syntax
value = "( 1.1 SYNTAX {32} )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SYNTAX {32} (no syntax)" );
}
catch ( ParseException pe )
{
// expected
}
// length overflow
value = "( 1.1 SYNTAX 1.2.3.4{123456789012234567890} )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SYNTAX 1.2.3.4{12345678901234567890} (length overflow)" );
}
catch ( NumberFormatException nfe )
{
// expected
}
}
/**
* Tests SINGLE-VALUE
*
* @throws ParseException
*/
@Test
public void testSingleValue() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// not single-value
value = "( 1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' )";
attributeType = parser.parse( value );
assertFalse( attributeType.isSingleValued() );
// single-value
value = "(1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' SINGLE-VALUE)";
attributeType = parser.parse( value );
assertTrue( attributeType.isSingleValued() );
// single-value
value = "(1.1 SYNTAX 1.1 SINGLE-VALUE)";
attributeType = parser.parse( value );
assertTrue( attributeType.isSingleValued() );
// invalid
value = "(1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' SINGLE-VALU )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid SINGLE-VALUE value" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Tests COLLECTIVE
*
* @throws ParseException
*/
@Test
public void testCollective() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// not collective
value = "( 1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' )";
attributeType = parser.parse( value );
assertFalse( attributeType.isCollective() );
// collective
value = "(1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' COLLECTIVE )";
attributeType = parser.parse( value );
assertTrue( attributeType.isCollective() );
// collective
value = "(1.1 SYNTAX 1.1 COLLECTIVE)";
attributeType = parser.parse( value );
assertTrue( attributeType.isCollective() );
// invalid
value = "(1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' COLLECTIV )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid COLLECTIVE value" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Tests NO-USER-MODIFICATION
*
* @throws ParseException
*/
@Test
public void testNoUserModification() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// not NO-USER-MODIFICATION
value = "( 1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' )";
attributeType = parser.parse( value );
assertTrue( attributeType.isUserModifiable() );
// NO-USER-MODIFICATION
value = "(1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' NO-USER-MODIFICATION USAGE directoryOperation )";
attributeType = parser.parse( value );
assertFalse( attributeType.isUserModifiable() );
// NO-USER-MODIFICATION
value = "(1.1 SYNTAX 1.1 NO-USER-MODIFICATION USAGE directoryOperation )";
attributeType = parser.parse( value );
assertFalse( attributeType.isUserModifiable() );
// invalid
value = "(1.1 SYNTAX 1.1 NAME 'test' DESC 'Descripton' NO-USER-MODIFICATIO USAGE directoryOperation )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid NO-USER-MODIFICATION value" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Tests usage
*
* @throws ParseException
*/
@Test
public void testUsage() throws ParseException
{
String value = null;
AttributeType attributeType = null;
// DEFAULT is userApplications
value = "( 1.1 SYNTAX 1.1 )";
attributeType = parser.parse( value );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
// userApplications
value = "( 1.1 SYNTAX 1.1 USAGE userApplications )";
attributeType = parser.parse( value );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
// directoryOperation
value = "( 1.1 SYNTAX 1.1 USAGE directoryOperation )";
attributeType = parser.parse( value );
assertEquals( UsageEnum.DIRECTORY_OPERATION, attributeType.getUsage() );
// distributedOperation, tabs
value = "\t(\t1.1\tSYNTAX\t1.1\tUSAGE\tdistributedOperation\t)\t";
attributeType = parser.parse( value );
assertEquals( UsageEnum.DISTRIBUTED_OPERATION, attributeType.getUsage() );
// dSAOperation, no space
value = "(1.1 SYNTAX1.1 USAGEdSAOperation)";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, space expected after USAGE" );
}
catch ( ParseException pe )
{
// expected
}
// directoryOperation, case insensitivity
value = "( 1.1 SYNTAX 1.1 USAGE DiReCtOrYoPeRaTiOn )";
attributeType = parser.parse( value );
assertEquals( UsageEnum.DIRECTORY_OPERATION, attributeType.getUsage() );
// invalid
value = "( 1.1 SYNTAX 1.1 USAGE abc )";
try
{
attributeType = parser.parse( value );
fail( "Exception expected, invalid USAGE value" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Test extensions.
*
* @throws ParseException
*/
@Test
public void testExtensions() throws ParseException
{
SchemaParserTestUtils.testExtensions( parser, "1.1", "SYNTAX 1.1" );
}
/**
* Test full attribute type description.
*
* @throws ParseException
*/
@Test
public void testFull() throws ParseException
{
String value = null;
AttributeType attributeType = null;
value = "( 1.2.3.4.5.6.7.8.9.0 NAME ( 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789' 'test' ) DESC 'Description \u00E4\u00F6\u00FC\u00DF \u90E8\u9577' OBSOLETE SUP abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 EQUALITY 2.3.4.5.6.7.8.9.0.1 ORDERING 2.3.4.5.6.7.8.9.0.1.2 SUBSTR 2.3.4.5.6.7.8.9.0.1.2.3 SYNTAX 2.3.4.5.6.7.8.9.0.1.2.3.4{1234567890} SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation X-TEST-a ('test1-1' 'test1-2') X-TEST-b ('test2-1' 'test2-2') )";
attributeType = parser.parse( value );
assertEquals( "1.2.3.4.5.6.7.8.9.0", attributeType.getOid() );
assertEquals( 2, attributeType.getNames().size() );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", attributeType.getNames().get(
0 ) );
assertEquals( "test", attributeType.getNames().get( 1 ) );
assertEquals( "Description \u00E4\u00F6\u00FC\u00DF \u90E8\u9577", attributeType.getDescription() );
assertTrue( attributeType.isObsolete() );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", attributeType
.getSuperiorOid() );
assertEquals( "2.3.4.5.6.7.8.9.0.1", attributeType.getEqualityOid() );
assertEquals( "2.3.4.5.6.7.8.9.0.1.2", attributeType.getOrderingOid() );
assertEquals( "2.3.4.5.6.7.8.9.0.1.2.3", attributeType.getSubstringOid() );
assertEquals( "2.3.4.5.6.7.8.9.0.1.2.3.4", attributeType.getSyntaxOid() );
assertEquals( 1234567890, attributeType.getSyntaxLength() );
assertTrue( attributeType.isSingleValued() );
assertFalse( attributeType.isCollective() );
assertFalse( attributeType.isUserModifiable() );
assertEquals( UsageEnum.DSA_OPERATION, attributeType.getUsage() );
assertEquals( 2, attributeType.getExtensions().size() );
assertNotNull( attributeType.getExtension( "X-TEST-a" ) );
assertEquals( 2, attributeType.getExtension( "X-TEST-a" ).size() );
assertEquals( "test1-1", attributeType.getExtension( "X-TEST-a" ).get( 0 ) );
assertEquals( "test1-2", attributeType.getExtension( "X-TEST-a" ).get( 1 ) );
assertNotNull( attributeType.getExtension( "X-TEST-b" ) );
assertEquals( 2, attributeType.getExtension( "X-TEST-b" ).size() );
assertEquals( "test2-1", attributeType.getExtension( "X-TEST-b" ).get( 0 ) );
assertEquals( "test2-2", attributeType.getExtension( "X-TEST-b" ).get( 1 ) );
}
/**
* Test unique elements.
*
* @throws ParseException
*/
@Test
public void testUniqueElements()
{
String[] testValues = new String[]
{ "( 1.1 SYNTAX 1.1 NAME 'test1' NAME 'test2' )", "( 1.1 SYNTAX 1.1 DESC 'test1' DESC 'test2' )",
"( 1.1 SYNTAX 1.1 OBSOLETE OBSOLETE )", "( 1.1 SYNTAX 1.1 SUP test1 SUP test2 )",
"( 1.1 SYNTAX 1.1 EQUALITY test1 EQUALITY test2 )", "( 1.1 SYNTAX 1.1 ORDERING test1 ORDERING test2 )",
"( 1.1 SYNTAX 1.1 SUBSTR test1 SUBSTR test2 )", "( 1.1 SYNTAX 1.1 SYNTAX 2.2 SYNTAX 3.3 )",
"( 1.1 SYNTAX 1.1 SINGLE-VALUE SINGLE-VALUE )", "( 1.1 SYNTAX 1.1 COLLECTIVE COLLECTIVE )",
"( 1.1 SYNTAX 1.1 USAGE directoryOperation NO-USER-MODIFICATION NO-USER-MODIFICATION )",
"( 1.1 SYNTAX 1.1 USAGE directoryOperation USAGE userApplications )",
"( 1.1 SYNTAX 1.1 X-TEST 'test1' X-TEST 'test2' )" };
SchemaParserTestUtils.testUnique( parser, testValues );
}
/**
* Test required elements.
*
* @throws ParseException
*/
@Test
public void testRequiredElements() throws ParseException
{
String value = null;
AttributeType attributeType = null;
value = "( 1.2.3.4.5.6.7.8.9.0 SYNTAX 1.1 SUP 1.1 )";
attributeType = parser.parse( value );
assertNotNull( attributeType.getSyntaxOid() );
assertNotNull( attributeType.getSuperiorOid() );
value = "( 1.2.3.4.5.6.7.8.9.0 SYNTAX 1.1 )";
attributeType = parser.parse( value );
assertNotNull( attributeType.getSyntaxOid() );
assertNull( attributeType.getSuperiorOid() );
value = "( 1.2.3.4.5.6.7.8.9.0 SUP 1.1 )";
attributeType = parser.parse( value );
assertNull( attributeType.getSyntaxOid() );
assertNotNull( attributeType.getSuperiorOid() );
if ( !parser.isQuirksMode() )
{
value = "( 1.2.3.4.5.6.7.8.9.0 )";
try
{
parser.parse( value );
fail( "Exception expected, SYNTAX or SUP is required" );
}
catch ( ParseException pe )
{
// expected
}
}
}
/**
* Test collective constraint:
* COLLECTIVE requires USAGE userApplications
*
* @throws ParseException
*/
@Test
public void testCollectiveConstraint() throws ParseException
{
String value = null;
AttributeType attributeType = null;
value = "( 1.1 SYNTAX 1.1 COLLECTIVE )";
attributeType = parser.parse( value );
assertTrue( attributeType.isCollective() );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
value = "( 1.1 SYNTAX 1.1 COLLECTIVE USAGE userApplications )";
attributeType = parser.parse( value );
assertTrue( attributeType.isCollective() );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
value = "( 1.1 SYNTAX 1.1 COLLECTIVE USAGE directoryOperation )";
try
{
parser.parse( value );
fail( "Exception expected, COLLECTIVE requires USAGE userApplications" );
}
catch ( ParseException pe )
{
// expected
}
value = "( 1.1 SYNTAX 1.1 COLLECTIVE USAGE dSAOperation )";
try
{
parser.parse( value );
fail( "Exception expected, COLLECTIVE requires USAGE userApplications" );
}
catch ( ParseException pe )
{
// expected
}
value = "( 1.1 SYNTAX 1.1 COLLECTIVE USAGE distributedOperation )";
try
{
parser.parse( value );
fail( "Exception expected, COLLECTIVE requires USAGE userApplications" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Test no-user-modification constraint:
* NO-USER-MODIFICATION requires an operational USAGE
*
* @throws ParseException
*/
@Test
public void testNoUserModificatonConstraint() throws ParseException
{
String value = null;
AttributeType attributeType = null;
value = "( 1.1 SYNTAX 1.1 NO-USER-MODIFICATION USAGE directoryOperation )";
attributeType = parser.parse( value );
assertFalse( attributeType.isUserModifiable() );
assertEquals( UsageEnum.DIRECTORY_OPERATION, attributeType.getUsage() );
value = "( 1.1 SYNTAX 1.1 NO-USER-MODIFICATION USAGE dSAOperation )";
attributeType = parser.parse( value );
assertFalse( attributeType.isUserModifiable() );
assertEquals( UsageEnum.DSA_OPERATION, attributeType.getUsage() );
value = "( 1.1 SYNTAX 1.1 NO-USER-MODIFICATION USAGE distributedOperation )";
attributeType = parser.parse( value );
assertFalse( attributeType.isUserModifiable() );
assertEquals( UsageEnum.DISTRIBUTED_OPERATION, attributeType.getUsage() );
value = "( 1.1 SYNTAX 1.1 NO-USER-MODIFICATION USAGE userApplications )";
try
{
parser.parse( value );
fail( "Exception expected, NO-USER-MODIFICATION requires an operational USAGE" );
}
catch ( ParseException pe )
{
// expected
}
value = "( 1.1 SYNTAX 1.1 NO-USER-MODIFICATION )";
try
{
parser.parse( value );
fail( "Exception expected, NO-USER-MODIFICATION requires an operational USAGE" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Ensure that element order is ignored
*
* @throws ParseException
*/
@Test
public void testIgnoreElementOrder() throws ParseException
{
String value = "( 2.5.4.3 SUP name SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE userApplications DESC 'RFC2256: common name(s) for which the entity is known by' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch NAME ( 'cn' 'commonName' ) )";
AttributeType attributeType = parser.parse( value );
assertEquals( "2.5.4.3", attributeType.getOid() );
assertEquals( 2, attributeType.getNames().size() );
assertEquals( "cn", attributeType.getNames().get( 0 ) );
assertEquals( "commonName", attributeType.getNames().get( 1 ) );
assertEquals( "RFC2256: common name(s) for which the entity is known by", attributeType.getDescription() );
assertEquals( "name", attributeType.getSuperiorOid() );
assertEquals( "caseIgnoreMatch", attributeType.getEqualityOid() );
assertEquals( "caseIgnoreSubstringsMatch", attributeType.getSubstringOid() );
assertEquals( "1.3.6.1.4.1.1466.115.121.1.15", attributeType.getSyntaxOid() );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
assertEquals( 0, attributeType.getExtensions().size() );
}
////////////////////////////////////////////////////////////////
// Some real-world attribute type definitions //
////////////////////////////////////////////////////////////////
@Test
public void testRfcUid() throws ParseException
{
String value = "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) DESC 'RFC1274: user identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} USAGE userApplications )";
AttributeType attributeType = parser.parse( value );
assertEquals( "0.9.2342.19200300.100.1.1", attributeType.getOid() );
assertEquals( 2, attributeType.getNames().size() );
assertEquals( "uid", attributeType.getNames().get( 0 ) );
assertEquals( "userid", attributeType.getNames().get( 1 ) );
assertEquals( "RFC1274: user identifier", attributeType.getDescription() );
assertNull( attributeType.getSuperiorOid() );
assertEquals( "caseIgnoreMatch", attributeType.getEqualityOid() );
assertEquals( "caseIgnoreSubstringsMatch", attributeType.getSubstringOid() );
assertNull( attributeType.getOrderingOid() );
assertEquals( "1.3.6.1.4.1.1466.115.121.1.15", attributeType.getSyntaxOid() );
assertEquals( 256, attributeType.getSyntaxLength() );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
assertFalse( attributeType.isObsolete() );
assertFalse( attributeType.isCollective() );
assertFalse( attributeType.isSingleValued() );
assertTrue( attributeType.isUserModifiable() );
assertEquals( 0, attributeType.getExtensions().size() );
}
/**
* Tests the parse of a simple AttributeType
*/
@Test
public void testAddAttributeType() throws ParseException
{
String substrate = "( 1.3.6.1.4.1.18060.0.4.0.2.10000 NAME ( 'bogus' 'bogusName' ) "
+ "DESC 'bogus description' SUP name SINGLE-VALUE )";
AttributeType desc = parser.parse( substrate );
assertEquals( "1.3.6.1.4.1.18060.0.4.0.2.10000", desc.getOid() );
assertEquals( "bogus", desc.getNames().get( 0 ) );
assertEquals( "bogusName", desc.getNames().get( 1 ) );
assertEquals( "bogus description", desc.getDescription() );
assertEquals( "name", desc.getSuperiorOid() );
assertEquals( true, desc.isSingleValued() );
}
/**
* Tests the parse of a simple AttributeType with the schema extension.
*/
@Test
public void testAttributeTypeWithSchemaExtension() throws ParseException
{
String substrate = "( 1.3.6.1.4.1.18060.0.4.0.2.10000 NAME ( 'bogus' 'bogusName' ) "
+ "DESC 'bogus description' SUP name SINGLE-VALUE X-SCHEMA 'blah' )";
AttributeType desc = parser.parse( substrate );
assertEquals( "1.3.6.1.4.1.18060.0.4.0.2.10000", desc.getOid() );
assertEquals( "bogus", desc.getNames().get( 0 ) );
assertEquals( "bogusName", desc.getNames().get( 1 ) );
assertEquals( "bogus description", desc.getDescription() );
assertEquals( "name", desc.getSuperiorOid() );
assertEquals( true, desc.isSingleValued() );
assertEquals( "blah", desc.getExtension( "X-SCHEMA" ).get( 0 ) );
}
/**
* Tests the multithreaded use of a single parser.
*/
@Test
public void testMultiThreaded() throws ParseException
{
String[] testValues = new String[]
{
"( 1.1 SYNTAX 1.1 )",
"( 2.5.4.41 NAME 'name' DESC 'RFC2256: common supertype of name attributes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} USAGE userApplications )",
"( 2.5.4.3 NAME ( 'cn' 'commonName' ) DESC 'RFC2256: common name(s) for which the entity is known by' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE userApplications )",
"( 1.2.3.4.5.6.7.8.9.0 NAME ( 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789' 'test' ) DESC 'Descripton \u00E4\u00F6\u00FC\u00DF \u90E8\u9577' OBSOLETE SUP abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 EQUALITY 2.3.4.5.6.7.8.9.0.1 ORDERING 2.3.4.5.6.7.8.9.0.1.2 SUBSTR 2.3.4.5.6.7.8.9.0.1.2.3 SYNTAX 2.3.4.5.6.7.8.9.0.1.2.3.4{1234567890} SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation X-TEST-a ('test1-1' 'test1-2') X-TEST-b ('test2-1' 'test2-2') )" };
SchemaParserTestUtils.testMultiThreaded( parser, testValues );
}
/**
* Tests without EQUALITY
*
* @throws ParseException
*/
@Test
public void testNoqualityMR() throws ParseException
{
String value = "( 2.5.4.58 NAME 'attributeCertificateAttribute' " + "DESC 'attribute certificate use ;binary' "
+ "SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 ) ";
AttributeType attributeType = parser.parse( value );
assertEquals( "2.5.4.58", attributeType.getOid() );
assertEquals( 1, attributeType.getNames().size() );
assertEquals( "attributeCertificateAttribute", attributeType.getNames().get( 0 ) );
assertEquals( "attribute certificate use ;binary", attributeType.getDescription() );
assertNull( attributeType.getSuperiorOid() );
assertNull( attributeType.getEqualityOid() );
assertEquals( "1.3.6.1.4.1.1466.115.121.1.8", attributeType.getSyntaxOid() );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
assertEquals( 0, attributeType.getExtensions().size() );
}
/**
* Tests with spaces in DESC
*
* @throws ParseException
*/
@Test
public void testATWithSpacesInDesc() throws ParseException
{
String value = "( 1.3.18.0.2.4.216 NAME 'SAFDfpDataClass' DESC ' ' " +
"EQUALITY 2.5.13.2 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )";
AttributeType attributeType = parser.parse( value );
assertEquals( "1.3.18.0.2.4.216", attributeType.getOid() );
assertEquals( 1, attributeType.getNames().size() );
assertEquals( "SAFDfpDataClass", attributeType.getNames().get( 0 ) );
assertEquals( " ", attributeType.getDescription() );
assertNull( attributeType.getSuperiorOid() );
assertEquals( "2.5.13.2", attributeType.getEqualityOid() );
assertEquals( "1.3.6.1.4.1.1466.115.121.1.15", attributeType.getSyntaxOid() );
assertEquals( UsageEnum.USER_APPLICATIONS, attributeType.getUsage() );
assertTrue( attributeType.isSingleValued() );
assertEquals( 0, attributeType.getExtensions().size() );
}
}