blob: b206b1137a02c1a932d0caebc3f15ca929e7e145 [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.assertNotNull;
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.DitContentRule;
import org.apache.directory.api.ldap.model.schema.parsers.DitContentRuleDescriptionSchemaParser;
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 DitContentRuleDescriptionSchemaParser class.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@Execution(ExecutionMode.CONCURRENT)
public class DitContentRuleDescriptionSchemaParserTest
{
/** the parser instance */
private DitContentRuleDescriptionSchemaParser parser;
@BeforeEach
public void setUp() throws Exception
{
parser = new DitContentRuleDescriptionSchemaParser();
}
@AfterEach
public void tearDown() throws Exception
{
parser = null;
}
/**
* Test numericoid
*
* @throws ParseException
*/
@Test
public void testNumericOid() throws ParseException
{
SchemaParserTestUtils.testNumericOid( parser, "" );
}
/**
* Tests NAME and its values
*
* @throws ParseException
*/
@Test
public void testNames() throws ParseException
{
SchemaParserTestUtils.testNamesStrict( parser, "1.1", "" );
}
/**
* Tests DESC
*
* @throws ParseException
*/
@Test
public void testDescription() throws ParseException
{
SchemaParserTestUtils.testDescription( parser, "1.1", "" );
}
/**
* Tests OBSOLETE
*
* @throws ParseException
*/
@Test
public void testObsolete() throws ParseException
{
SchemaParserTestUtils.testObsolete( parser, "1.1", "" );
}
/**
* Test AUX and its values.
*
* @throws ParseException
*/
@Test
public void testAux() throws ParseException
{
String value = null;
DitContentRule ditContentRule = null;
// no AUX
value = "( 1.1 )";
ditContentRule = parser.parse( value );
assertEquals( 0, ditContentRule.getAuxObjectClassOids().size() );
// AUX simple numericoid
value = "( 1.1 AUX 1.2.3 )";
ditContentRule = parser.parse( value );
assertEquals( 1, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "1.2.3", ditContentRule.getAuxObjectClassOids().get( 0 ) );
// AUX simple descr
value = "( 1.1 AUX top )";
ditContentRule = parser.parse( value );
assertEquals( 1, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "top", ditContentRule.getAuxObjectClassOids().get( 0 ) );
// AUX single numericoid
value = "( 1.1 AUX ( 1.2.3.4.5 ) )";
ditContentRule = parser.parse( value );
assertEquals( 1, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "1.2.3.4.5", ditContentRule.getAuxObjectClassOids().get( 0 ) );
// AUX single descr
value = "( 1.1 AUX ( A-Z-0-9 ) )";
ditContentRule = parser.parse( value );
assertEquals( 1, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "A-Z-0-9", ditContentRule.getAuxObjectClassOids().get( 0 ) );
// AUX multi numericoid
value = "( 1.1 AUX ( 1.2.3 $ 1.2.3.4.5 ) )";
ditContentRule = parser.parse( value );
assertEquals( 2, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "1.2.3", ditContentRule.getAuxObjectClassOids().get( 0 ) );
assertEquals( "1.2.3.4.5", ditContentRule.getAuxObjectClassOids().get( 1 ) );
// AUX multi descr
value = "( 1.1 AUX ( top1 $ top2 ) )";
ditContentRule = parser.parse( value );
assertEquals( 2, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "top1", ditContentRule.getAuxObjectClassOids().get( 0 ) );
assertEquals( "top2", ditContentRule.getAuxObjectClassOids().get( 1 ) );
// AUX multi mixed
value = "( 1.1 AUX ( top1 $ 1.2.3.4 $ top2 ) )";
ditContentRule = parser.parse( value );
assertEquals( 3, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "top1", ditContentRule.getAuxObjectClassOids().get( 0 ) );
assertEquals( "1.2.3.4", ditContentRule.getAuxObjectClassOids().get( 1 ) );
assertEquals( "top2", ditContentRule.getAuxObjectClassOids().get( 2 ) );
// AUX multi mixed no space
value = "(1.1 AUX(TOP-1$1.2.3.4$TOP-2))";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, space expected" );
}
catch ( ParseException pe )
{
// expected
}
// AUX multi mixed many spaces
value = "( 1.1 AUX ( top1 $ 1.2.3.4$top2 ) )";
ditContentRule = parser.parse( value );
assertEquals( 3, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "top1", ditContentRule.getAuxObjectClassOids().get( 0 ) );
assertEquals( "1.2.3.4", ditContentRule.getAuxObjectClassOids().get( 1 ) );
assertEquals( "top2", ditContentRule.getAuxObjectClassOids().get( 2 ) );
// no quote allowed
value = "( 1.1 AUX 'top' )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, no quote allowed" );
}
catch ( ParseException pe )
{
// expected
}
// quoted value
value = "( 1.1 AUX '1.2.3.4' )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, no quote allowed" );
}
catch ( ParseException pe )
{
// expected
}
// no $ separator
value = "( 1.1 AUX ( top1 top2 ) )";
ditContentRule = parser.parse( value );
assertEquals( 2, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "top1", ditContentRule.getAuxObjectClassOids().get( 0 ) );
assertEquals( "top2", ditContentRule.getAuxObjectClassOids().get( 1 ) );
// invalid character
value = "( 1.1 AUX 1.2.3.4.A )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, invalid AUX '1.2.3.4.A' (invalid character)" );
}
catch ( ParseException pe )
{
// expected
}
// empty AUX
value = "( 1.1 AUX )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, no AUX value" );
}
catch ( ParseException pe )
{
// expected
}
// invalid start
value = "( 1.1 AUX ( top1 $ -top2 ) )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, invalid AUX '-top' (starts with hypen)" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Test MUST and its values.
* Very similar to AUX, so here are less test cases.
*
* @throws ParseException
*/
@Test
public void testMust() throws ParseException
{
String value = null;
DitContentRule ditContentRule = null;
// no MUST
value = "( 1.1 )";
ditContentRule = parser.parse( value );
assertEquals( 0, ditContentRule.getMustAttributeTypeOids().size() );
// MUST simple numericoid
value = "( 1.1 MUST 1.2.3 )";
ditContentRule = parser.parse( value );
assertEquals( 1, ditContentRule.getMustAttributeTypeOids().size() );
assertEquals( "1.2.3", ditContentRule.getMustAttributeTypeOids().get( 0 ) );
// MUST mulitple
value = "(1.1 MUST (cn\rsn $1.22.33.44.55 objectClass\t))";
ditContentRule = parser.parse( value );
assertEquals( 4, ditContentRule.getMustAttributeTypeOids().size() );
assertEquals( "cn", ditContentRule.getMustAttributeTypeOids().get( 0 ) );
assertEquals( "sn", ditContentRule.getMustAttributeTypeOids().get( 1 ) );
assertEquals( "1.22.33.44.55", ditContentRule.getMustAttributeTypeOids().get( 2 ) );
assertEquals( "objectClass", ditContentRule.getMustAttributeTypeOids().get( 3 ) );
// no MUST values
value = "( 1.1 MUST )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, no MUST value" );
}
catch ( ParseException pe )
{
// expected
}
// invalid value
value = "( 1.1 MUST ( c_n ) )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, invalid value c_n" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Test MAY and its values.
* Very similar to AUX, so here are less test cases.
*
* @throws ParseException
*/
@Test
public void testMay() throws ParseException
{
String value = null;
DitContentRule ditContentRule = null;
// no MAY
value = "( 1.1 )";
ditContentRule = parser.parse( value );
assertEquals( 0, ditContentRule.getMayAttributeTypeOids().size() );
// MAY simple numericoid
value = "( 1.1 MAY 1.2.3 )";
ditContentRule = parser.parse( value );
assertEquals( 1, ditContentRule.getMayAttributeTypeOids().size() );
assertEquals( "1.2.3", ditContentRule.getMayAttributeTypeOids().get( 0 ) );
// MAY mulitple
value = "(1.1 MAY (cn$sn $1.22.33.44.55 $ objectClass ))";
ditContentRule = parser.parse( value );
assertEquals( 4, ditContentRule.getMayAttributeTypeOids().size() );
assertEquals( "cn", ditContentRule.getMayAttributeTypeOids().get( 0 ) );
assertEquals( "sn", ditContentRule.getMayAttributeTypeOids().get( 1 ) );
assertEquals( "1.22.33.44.55", ditContentRule.getMayAttributeTypeOids().get( 2 ) );
assertEquals( "objectClass", ditContentRule.getMayAttributeTypeOids().get( 3 ) );
// invalid value
value = "( 1.1 MAY ( c_n ) )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, invalid value c_n" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Test NOT and its values.
* Very similar to AUX, so here are less test cases.
*
* @throws ParseException
*/
@Test
public void testNot() throws ParseException
{
String value = null;
DitContentRule ditContentRule = null;
// no NOT
value = "( 1.1 )";
ditContentRule = parser.parse( value );
assertEquals( 0, ditContentRule.getNotAttributeTypeOids().size() );
// NOT simple numericoid
value = "( 1.1 NOT 1.2.3 )";
ditContentRule = parser.parse( value );
assertEquals( 1, ditContentRule.getNotAttributeTypeOids().size() );
assertEquals( "1.2.3", ditContentRule.getNotAttributeTypeOids().get( 0 ) );
// NOT mulitple
value = "(1.1 NOT (cn\nsn\t$1.22.33.44.55 $ objectClass ))";
ditContentRule = parser.parse( value );
assertEquals( 4, ditContentRule.getNotAttributeTypeOids().size() );
assertEquals( "cn", ditContentRule.getNotAttributeTypeOids().get( 0 ) );
assertEquals( "sn", ditContentRule.getNotAttributeTypeOids().get( 1 ) );
assertEquals( "1.22.33.44.55", ditContentRule.getNotAttributeTypeOids().get( 2 ) );
assertEquals( "objectClass", ditContentRule.getNotAttributeTypeOids().get( 3 ) );
// invalid value
value = "( 1.1 NOT ( c_n ) )";
try
{
ditContentRule = parser.parse( value );
fail( "Exception expected, invalid value c_n" );
}
catch ( ParseException pe )
{
// expected
}
}
/**
* Test extensions.
*
* @throws ParseException
*/
@Test
public void testExtensions() throws ParseException
{
SchemaParserTestUtils.testExtensions( parser, "1.1", "" );
}
/**
* Test full object class description.
*
* @throws ParseException
*/
@Test
public void testFull() throws ParseException
{
String value = null;
DitContentRule ditContentRule = null;
value = "( 1.2.3.4.5.6.7.8.9.0 NAME ( 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789' 'test' ) DESC 'Descripton \u00E4\u00F6\u00FC\u00DF \u90E8\u9577' OBSOLETE AUX ( 2.3.4.5.6.7.8.9.0.1 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) MUST ( 2.3.4.5.6.7.8.9.0.1.2 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) MAY ( 2.3.4.5.6.7.8.9.0.1.2.3 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) NOT ( 2.3.4.5.6.7.8.9.0.1.2.3.4 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) X-TEST-a ('test1-1' 'test1-2') X-TEST-b ('test2-1' 'test2-2') )";
ditContentRule = parser.parse( value );
assertEquals( "1.2.3.4.5.6.7.8.9.0", ditContentRule.getOid() );
assertEquals( 2, ditContentRule.getNames().size() );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", ditContentRule.getNames()
.get( 0 ) );
assertEquals( "test", ditContentRule.getNames().get( 1 ) );
assertEquals( "Descripton \u00E4\u00F6\u00FC\u00DF \u90E8\u9577", ditContentRule.getDescription() );
assertTrue( ditContentRule.isObsolete() );
assertEquals( 2, ditContentRule.getAuxObjectClassOids().size() );
assertEquals( "2.3.4.5.6.7.8.9.0.1", ditContentRule.getAuxObjectClassOids().get( 0 ) );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", ditContentRule
.getAuxObjectClassOids().get( 1 ) );
assertEquals( 2, ditContentRule.getMustAttributeTypeOids().size() );
assertEquals( "2.3.4.5.6.7.8.9.0.1.2", ditContentRule.getMustAttributeTypeOids().get( 0 ) );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", ditContentRule
.getMustAttributeTypeOids()
.get( 1 ) );
assertEquals( 2, ditContentRule.getMayAttributeTypeOids().size() );
assertEquals( "2.3.4.5.6.7.8.9.0.1.2.3", ditContentRule.getMayAttributeTypeOids().get( 0 ) );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", ditContentRule
.getMayAttributeTypeOids()
.get( 1 ) );
assertEquals( 2, ditContentRule.getNotAttributeTypeOids().size() );
assertEquals( "2.3.4.5.6.7.8.9.0.1.2.3.4", ditContentRule.getNotAttributeTypeOids().get( 0 ) );
assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", ditContentRule
.getNotAttributeTypeOids()
.get( 1 ) );
assertEquals( 2, ditContentRule.getExtensions().size() );
assertNotNull( ditContentRule.getExtension( "X-TEST-a" ) );
assertEquals( 2, ditContentRule.getExtension( "X-TEST-a" ).size() );
assertEquals( "test1-1", ditContentRule.getExtension( "X-TEST-a" ).get( 0 ) );
assertEquals( "test1-2", ditContentRule.getExtension( "X-TEST-a" ).get( 1 ) );
assertNotNull( ditContentRule.getExtension( "X-TEST-b" ) );
assertEquals( 2, ditContentRule.getExtension( "X-TEST-b" ).size() );
assertEquals( "test2-1", ditContentRule.getExtension( "X-TEST-b" ).get( 0 ) );
assertEquals( "test2-2", ditContentRule.getExtension( "X-TEST-b" ).get( 1 ) );
}
/**
* Test unique elements.
*
* @throws ParseException
*/
@Test
public void testUniqueElements()
{
String[] testValues = new String[]
{ "( 1.1 NAME 'test1' NAME 'test2' )", "( 1.1 DESC 'test1' DESC 'test2' )", "( 1.1 OBSOLETE OBSOLETE )",
"( 1.1 AUX test1 AUX test2 )", "( 1.1 MUST test1 MUST test2 )", "( 1.1 MAY test1 MAY test2 )",
"( 1.1 NOT test1 NOT test2 )", "( 1.1 X-TEST 'test1' X-TEST 'test2' )" };
SchemaParserTestUtils.testUnique( parser, testValues );
}
/**
* Tests the multithreaded use of a single parser.
*/
@Test
public void testMultiThreaded() throws ParseException
{
String[] testValues = new String[]
{
"( 1.1 )",
"( 2.5.6.4 DESC 'content rule for organization' NOT ( x121Address $ telexNumber ) )",
"( 2.5.6.4 DESC 'content rule for organization' NOT ( x121Address $ telexNumber ) )",
"( 1.2.3.4.5.6.7.8.9.0 NAME ( 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789' 'test' ) DESC 'Descripton \u00E4\u00F6\u00FC\u00DF \u90E8\u9577' OBSOLETE AUX ( 2.3.4.5.6.7.8.9.0.1 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) MUST ( 2.3.4.5.6.7.8.9.0.1.2 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) MAY ( 2.3.4.5.6.7.8.9.0.1.2.3 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) NOT ( 2.3.4.5.6.7.8.9.0.1.2.3.4 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) X-TEST-a ('test1-1' 'test1-2') X-TEST-b ('test2-1' 'test2-2') )" };
SchemaParserTestUtils.testMultiThreaded( parser, testValues );
}
}