blob: 788e5b1cc045aa5b23b85a0e2bd31c9c6a27a454 [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.ldif;
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 java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.directory.api.ldap.model.entry.*;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.ldif.ChangeType;
import org.apache.directory.api.ldap.model.ldif.LdifEntry;
import org.apache.directory.api.ldap.model.ldif.LdifReader;
import org.apache.directory.api.ldap.model.ldif.LdifRevertor;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.ldap.model.name.Rdn;
import org.apache.directory.api.util.Strings;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
/**
* Tests the LdifReverter methods
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@Execution(ExecutionMode.CONCURRENT)
public class LdifRevertorTest
{
/**
* Helper method to build a basic entry used by the Modify tests
*/
private Entry buildEntry() throws LdapException
{
Entry entry = new DefaultEntry( "",
"objectclass: top",
"objectclass: person",
"cn: test",
"sn: joe doe",
"l: USA" );
return entry;
}
/**
* Test a AddRequest reverse
*
* @throws LdapInvalidDnException
*/
@Test
public void testReverseAdd() throws LdapInvalidDnException
{
Dn dn = new Dn( "dc=apache, dc=com" );
LdifEntry reversed = LdifRevertor.reverseAdd( dn );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Delete, reversed.getChangeType() );
assertNull( reversed.getEntry() );
}
/**
* Test a DelRequest reverse
* @throws LdapException
*/
@Test
public void testReverseDel() throws LdapException
{
Dn dn = new Dn( "dc=apache, dc=com" );
Entry deletedEntry = new DefaultEntry( dn ,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: apache",
"dc: apache" );
LdifEntry reversed = LdifRevertor.reverseDel( dn, deletedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Add, reversed.getChangeType() );
assertNotNull( reversed.getEntry() );
assertEquals( deletedEntry, reversed.getEntry() );
}
/**
* Test a reversed Modify adding a existing value from an existing attribute
*/
@Test
public void testReverseModifyDelExistingOuValue() throws LdapException
{
Entry modifiedEntry = buildEntry();
modifiedEntry.put( "ou", "apache", "acme corp" );
Dn dn = new Dn( "cn=test, ou=system" );
Modification mod = new DefaultModification(
ModificationOperation.REMOVE_ATTRIBUTE,
new DefaultAttribute( "ou", "acme corp" ) );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.ADD_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( "ou", attr.getId() );
assertEquals( "acme corp", attr.getString() );
}
/**
* Test a reversed Modify deleting an existing attribute
*/
@Test
public void testReverseModifyDeleteOU() throws LdapException
{
Entry modifiedEntry = buildEntry();
modifiedEntry.put( "ou", "apache", "acme corp" );
Dn dn = new Dn( "cn=test, ou=system" );
Modification mod = new DefaultModification(
ModificationOperation.REMOVE_ATTRIBUTE,
new DefaultAttribute( "ou" ) );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.ADD_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( "ou", attr.getId() );
assertTrue( attr.contains( "apache", "acme corp" ) );
}
/**
* Test a reversed Modify deleting all values of an existing attribute
*/
@Test
public void testReverseModifyDelExistingOuWithAllValues() throws LdapException
{
Entry modifiedEntry = buildEntry();
Attribute ou = new DefaultAttribute( "ou", "apache", "acme corp" );
modifiedEntry.put( ou );
Dn dn = new Dn( "cn=test, ou=system" );
Modification mod = new DefaultModification(
ModificationOperation.REMOVE_ATTRIBUTE, ou );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.ADD_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( "ou", attr.getId() );
assertTrue( ou.contains( "apache", "acme corp" ) );
}
/**
* Test a reversed Modify replacing existing values with new values
*/
@Test
public void testReverseModifyReplaceExistingOuValues() throws LdapException
{
Entry modifiedEntry = buildEntry();
Attribute ou = new DefaultAttribute( "ou", "apache", "acme corp" );
modifiedEntry.put( ou );
Dn dn = new Dn( "cn=test, ou=system" );
Attribute ouModified = new DefaultAttribute( "ou", "directory", "BigCompany inc." );
Modification mod = new DefaultModification(
ModificationOperation.REPLACE_ATTRIBUTE, ouModified );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.REPLACE_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( ou, attr );
}
/**
* Test a reversed Modify replace by injecting a new attribute
*/
@Test
public void testReverseModifyReplaceNewAttribute() throws LdapException
{
Entry modifiedEntry = buildEntry();
Dn dn = new Dn( "cn=test, ou=system" );
Attribute newOu = new DefaultAttribute( "ou", "apache", "acme corp" );
Modification mod = new DefaultModification(
ModificationOperation.REPLACE_ATTRIBUTE, newOu );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.REPLACE_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( "ou", attr.getId() );
assertNull( attr.get() );
}
/**
* Test a reversed Modify replace by removing an attribute
*/
@Test
public void testReverseModifyReplaceExistingOuWithNothing() throws LdapException
{
Entry modifiedEntry = buildEntry();
modifiedEntry.put( "ou", "apache", "acme corp" );
Dn dn = new Dn( "cn=test, ou=system" );
Modification mod = new DefaultModification(
ModificationOperation.REPLACE_ATTRIBUTE, new DefaultAttribute( "ou" ) );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.REPLACE_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( "ou", attr.getId() );
assertTrue( attr.contains( "apache", "acme corp" ) );
}
/**
* Test a multiple modifications reverse.
*
* On the following entry :
* dn: cn=test, ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: joe doe
* l: USA
* ou: apache
* ou: acme corp
*
* We will :
* - add an 'ou' value 'BigCompany inc.'
* - delete the 'l' attribute
* - add the 'l=FR' attribute
* - replace the 'l=FR' by a 'l=USA' attribute
* - replace the 'ou' attribute with 'apache' value.
*
* The modify ldif will be :
*
* dn: cn=test, ou=system
* changetype: modify
* add: ou
* ou: BigCompany inc.
* -
* delete: l
* -
* add: l
* l: FR
* -
* replace: l
* l: USA
* -
* replace: ou
* ou: apache
* -
*
* At the end, the entry will looks like :
* dn: cn=test, ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: joe doe
* l: USA
* ou: apache
*
* and the reversed LDIF will be :
*
* dn: cn=test, ou=system
* changetype: modify
* replace: ou
* ou: apache
* ou: acme corp
* -
* replace: l
* l: USA
* -
* delete: l
* l: FR
* -
* add: l
* l: USA
* -
* delete: ou
* ou: BigCompany inc.
* -
*
*/
@Test
public void testReverseMultipleModifications() throws Exception
{
String initialEntryLdif =
"dn: cn=test, ou=system\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"cn: test\n" +
"sn: joe doe\n" +
"l: USA\n" +
"ou: apache\n" +
"ou: acme corp\n";
LdifReader reader = new LdifReader();
List<LdifEntry> entries = reader.parseLdif( initialEntryLdif );
reader.close();
LdifEntry initialEntry = entries.get( 0 );
// We will :
// - add an 'ou' value 'BigCompany inc.'
// - delete the 'l' attribute
// - add the 'l=FR' attribute
// - replace the 'l=FR' by a 'l=USA' attribute
// - replace the 'ou' attribute with 'apache' value.
Dn dn = new Dn( "cn=test, ou=system" );
List<Modification> modifications = new ArrayList<Modification>();
// First, inject the 'ou'
Modification mod = new DefaultModification(
ModificationOperation.ADD_ATTRIBUTE, new DefaultAttribute( "ou", "BigCompany inc." ) );
modifications.add( mod );
// Remove the 'l'
mod = new DefaultModification(
ModificationOperation.REMOVE_ATTRIBUTE, new DefaultAttribute( "l" ) );
modifications.add( mod );
// Add 'l=FR'
mod = new DefaultModification(
ModificationOperation.ADD_ATTRIBUTE, new DefaultAttribute( "l", "FR" ) );
modifications.add( mod );
// Replace it with 'l=USA'
mod = new DefaultModification(
ModificationOperation.REPLACE_ATTRIBUTE, new DefaultAttribute( "l", "USA" ) );
modifications.add( mod );
// Replace the ou value
mod = new DefaultModification(
ModificationOperation.REPLACE_ATTRIBUTE, new DefaultAttribute( "ou", "apache" ) );
modifications.add( mod );
LdifEntry reversedEntry = LdifRevertor.reverseModify( dn, modifications, initialEntry.getEntry() );
String expectedEntryLdif =
"dn: cn=test, ou=system\n" +
"changetype: modify\n" +
"replace: ou\n" +
"ou: apache\n" +
"ou: acme corp\n" +
"ou: BigCompany inc.\n" +
"-\n" +
"replace: l\n" +
"l: FR\n" +
"-\n" +
"delete: l\n" +
"l: FR\n" +
"-\n" +
"add: l\n" +
"l: USA\n" +
"-\n" +
"delete: ou\n" +
"ou: BigCompany inc.\n" +
"-\n\n";
reader = new LdifReader();
entries = reader.parseLdif( expectedEntryLdif );
reader.close();
LdifEntry expectedEntry = entries.get( 0 );
assertEquals( expectedEntry, reversedEntry );
}
/**
* Test a reversed Modify adding a new attribute value
* in an exiting attribute
*/
@Test
public void testReverseModifyAddNewOuValue() throws LdapException
{
Entry modifiedEntry = buildEntry();
modifiedEntry.put( "ou", "apache", "acme corp" );
Dn dn = new Dn( "cn=test, ou=system" );
Modification mod = new DefaultModification(
ModificationOperation.ADD_ATTRIBUTE,
new DefaultAttribute( "ou", "BigCompany inc." ) );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( "ou", attr.getId() );
assertEquals( "BigCompany inc.", attr.getString() );
}
/**
* Test a reversed Modify adding a new attribute
*/
@Test
public void testReverseModifyAddNewOu() throws LdapException
{
Entry modifiedEntry = buildEntry();
Dn dn = new Dn( "cn=test, ou=system" );
Modification mod = new DefaultModification(
ModificationOperation.ADD_ATTRIBUTE,
new DefaultAttribute( "ou", "BigCompany inc." ) );
LdifEntry reversed = LdifRevertor.reverseModify( dn,
Collections.<Modification> singletonList( mod ), modifiedEntry );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
assertNull( reversed.getEntry() );
List<Modification> mods = reversed.getModifications();
assertNotNull( mods );
assertEquals( 1, mods.size() );
Modification modif = mods.get( 0 );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, modif.getOperation() );
Attribute attr = modif.getAttribute();
assertNotNull( attr );
assertEquals( "ou", attr.getId() );
assertEquals( "BigCompany inc.", attr.getString() );
}
/**
* Test a AddRequest reverse where the Dn is to be base64 encoded
*
* @throws LdapException
*/
@Test
public void testReverseAddBase64DN() throws LdapException
{
Dn dn = new Dn( "dc=Emmanuel L\u00c9charny" );
LdifEntry reversed = LdifRevertor.reverseAdd( dn );
assertNotNull( reversed );
assertEquals( dn.getName(), reversed.getDn().getName() );
assertEquals( ChangeType.Delete, reversed.getChangeType() );
assertNull( reversed.getEntry() );
}
/**
* Test a reversed move ModifyDN
*
* @throws LdapException on error
*/
@Test
public void testReverseModifyDNMove() throws LdapException
{
Dn dn = new Dn( "cn=john doe, dc=example, dc=com" );
Dn newSuperior = new Dn( "ou=system" );
Rdn rdn = new Rdn( "cn=john doe" );
LdifEntry reversed = LdifRevertor.reverseMove( newSuperior, dn );
assertNotNull( reversed );
assertEquals( "cn=john doe,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModDn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( rdn.getName(), reversed.getNewRdn() );
assertEquals( "dc=example, dc=com", Strings.trim( reversed.getNewSuperior() ) );
assertNull( reversed.getEntry() );
}
/**
* Test a reversed rename ModifyDN, where the Rdn are both simple, not overlapping,
* with deleteOldRdn = false, and the Ava not present in the initial entry?
*
* Covers case 1.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: This is a test
*
* new Rdn : cn=joe
*
* @throws LdapException on error
*/
@Test
public void test11ReverseRenameSimpleSimpleNotOverlappingKeepOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=joe" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the Rdn are both simple, not overlapping,
* with deleteOldRdn = false, and with a Ava present in the initial entry.
*
* Covers case 1.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: small
* sn: This is a test
*
* new Rdn : cn=small
*
* @throws LdapException on error
*/
@Test
public void test12ReverseRenameSimpleSimpleNotOverlappingKeepOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=small" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=small,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the Rdn are both simple, not overlapping,
* with deleteOldRdn = true, and the Ava not present in the initial entry
*
* Covers case 2.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: This is a test
*
* new Rdn : cn=joe
*
* @throws LdapException on error
*/
@Test
public void test21ReverseRenameSimpleSimpleNotOverlappingDeleteOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=joe" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the Rdn are both simple, not overlapping,
* with deleteOldRdn = true, and with a Ava present in the initial entry.
*
* Covers case 2.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: small
* sn: This is a test
*
* new Rdn : cn=small
*
* @throws LdapException on error
*/
@Test
public void test22ReverseRenameSimpleSimpleNotOverlappingDeleteOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=small" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=small,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is simple, not overlapping, with deleteOldRdn = false, and
* with a Ava not present in the initial entry.
*
* Covers case 3 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe
*
* @throws LdapException on error
*/
@Test
public void test3ReverseRenameCompositeSimpleNotOverlappingKeepOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=joe" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is simple, not overlapping, with deleteOldRdn = false, and
* with an Ava present in the initial entry.
*
* Covers case 3 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: small
* sn: This is a test
*
* new Rdn : cn=big
*
* @throws LdapException on error
*/
@Test
public void test3ReverseRenameCompositeSimpleNotOverlappingKeepOldRdnExistsInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=big" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=big,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is simple, not overlapping, with deleteOldRdn = true, and
* with an Ava not present in the initial entry.
*
* Covers case 4 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe
*
* @throws LdapException on error
*/
@Test
public void test4ReverseRenameCompositeSimpleNotOverlappingDeleteOldRdnDontExistsInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=joe" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is simple, not overlapping, with deleteOldRdn = true, and
* with an Ava present in the initial entry.
*
* Covers case 4 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: small
* sn: This is a test
*
* new Rdn : cn=big
*
* @throws LdapException on error
*/
@Test
public void test4ReverseRenameCompositeSimpleNotOverlappingDeleteOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=big" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=big,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is simple, they overlap, with deleteOldRdn = false.
*
* Covers case 5 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: small
* sn: This is a test
*
* new Rdn : cn=test
*
* @throws LdapException on error
*/
@Test
public void test5ReverseRenameCompositeSimpleOverlappingKeepOldRdn() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is simple, they overlap, with deleteOldRdn = true.
*
* Covers case 5 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: small
* sn: This is a test
*
* new Rdn : cn=test
*
* @throws LdapException on error
*/
@Test
public void test5ReverseRenameCompositeSimpleOverlappingDeleteOldRdn() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = false, and
* the new values don't exist in the entry.
*
* Covers case 6.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: small
* sn: This is a test
*
* new Rdn : cn=joe+sn=plumber
*
* @throws LdapException on error
*/
@Test
public void test61ReverseRenameSimpleCompositeNotOverlappingKeepOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=joe+sn=plumber" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe+sn=plumber,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = false, and
* the new values exists in the entry.
*
* Covers case 6.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe+sn=small
*
* @throws LdapException on error
*/
@Test
public void test62ReverseRenameSimpleCompositeNotOverlappingKeepOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=joe+sn=small" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 2, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe+sn=small,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
reversed = reverseds.get( 1 );
assertEquals( "cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
Modification[] mods = reversed.getModificationArray();
assertNotNull( mods );
assertEquals( 1, mods.length );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, mods[0].getOperation() );
assertNotNull( mods[0].getAttribute() );
assertEquals( "cn", mods[0].getAttribute().getId() );
assertEquals( "joe", mods[0].getAttribute().getString() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = true, and
* none of new values exists in the entry.
*
* Covers case 7.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: small
* sn: This is a test
*
* new Rdn : cn=joe+sn=plumber
*
* @throws LdapException on error
*/
@Test
public void test71ReverseRenameSimpleCompositeNotOverlappingDeleteOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=joe+sn=plumber" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe+sn=plumber,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = true, and
* some of new values exists in the entry.
*
* Covers case 7.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe+sn=small
*
* @throws LdapException on error
*/
@Test
public void test72ReverseRenameSimpleCompositeNotOverlappingDeleteOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "cn=joe+sn=small" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 2, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe+sn=small,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
reversed = reverseds.get( 1 );
assertEquals( "cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
Modification[] mods = reversed.getModificationArray();
assertNotNull( mods );
assertEquals( 1, mods.length );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, mods[0].getOperation() );
assertNotNull( mods[0].getAttribute() );
assertEquals( "cn", mods[0].getAttribute().getId() );
assertEquals( "joe", mods[0].getAttribute().getString() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they overlap, with deleteOldRdn = false, and
* none of new values exists in the entry.
*
* Covers case 8.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: This is a test
*
* new Rdn : sn=small+cn=test
*
* @throws LdapException on error
*/
@Test
public void test81ReverseRenameSimpleCompositeOverlappingKeepOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "sn=small+cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=small+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they overlap, with deleteOldRdn = false, and
* some of the new values exist in the entry.
*
* Covers case 8.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: This is a test
* seeAlso: big
*
* new Rdn : sn=small+cn=test+seeAlso=big
*
* @throws LdapException on error
*/
@Test
public void test82ReverseRenameSimpleCompositeOverlappingKeepOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "sn=small+cn=test+seeAlso=big" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"seeAlso: big",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 2, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=small+cn=test+seeAlso=big,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
reversed = reverseds.get( 1 );
assertEquals( "cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
Modification[] mods = reversed.getModificationArray();
assertNotNull( mods );
assertEquals( 1, mods.length );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, mods[0].getOperation() );
assertNotNull( mods[0].getAttribute() );
assertEquals( "sn", mods[0].getAttribute().getId() );
assertEquals( "small", mods[0].getAttribute().getString() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they overlap, with deleteOldRdn = true, and
* none of new values exists in the entry.
*
* Covers case 9.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: This is a test
*
* new Rdn : sn=small+cn=test
*
* @throws LdapException on error
*/
@Test
public void test91ReverseRenameSimpleCompositeOverlappingDeleteOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "sn=small+cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=small+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is simple,
* the new Rdn is composite, they overlap, with deleteOldRdn = true, and
* some of the new values exists in the entry.
*
* Covers case 9.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* seeAlso: big
* sn: This is a test
*
* new Rdn : cn=small+cn=test+cn=big
*
* @throws LdapException on error
*/
@Test
public void test92ReverseRenameSimpleCompositeOverlappingDeleteOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "cn=test,ou=system" );
Rdn oldRdn = new Rdn( "cn=test" );
Rdn newRdn = new Rdn( "sn=small+cn=test+seeAlso=big" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"seeAlso: big",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 2, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=small+cn=test+seeAlso=big,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
reversed = reverseds.get( 1 );
assertEquals( "cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
Modification[] mods = reversed.getModificationArray();
assertNotNull( mods );
assertEquals( 1, mods.length );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, mods[0].getOperation() );
assertNotNull( mods[0].getAttribute() );
assertEquals( "sn", mods[0].getAttribute().getId() );
assertEquals( "small", mods[0].getAttribute().getString() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = false, and
* none of new values exists in the entry.
*
* Covers case 10.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe+cn=plumber
*
* @throws LdapException on error
*/
@Test
public void test101ReverseRenameCompositeCompositeNotOverlappingKeepOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=joe+sn=plumber" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe+sn=plumber,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = false, and
* some of the new values exists in the entry.
*
* Covers case 10.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: small
* sn: This is a test
*
* new Rdn : sn=joe+cn=big
*
* @throws LdapException on error
*/
@Test
public void test102ReverseRenameCompositeCompositeNotOverlappingKeepOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "sn=joe+cn=big" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 2, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=joe+cn=big,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
reversed = reverseds.get( 1 );
assertEquals( "sn=small+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
Modification[] mods = reversed.getModificationArray();
assertNotNull( mods );
assertEquals( 1, mods.length );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, mods[0].getOperation() );
assertNotNull( mods[0].getAttribute() );
assertEquals( "sn", mods[0].getAttribute().getId() );
assertEquals( "joe", mods[0].getAttribute().getString() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = true, and
* none of new values exists in the entry.
*
* Covers case 11.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: big
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe+sn=plumber
*
* @throws LdapException on error
*/
@Test
public void test111ReverseRenameCompositeCompositeNotOverlappingDeleteOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=joe+sn=plumber" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe+sn=plumber,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they don't overlap, with deleteOldRdn = true, and
* some of the new values exists in the entry.
*
* Covers case 11.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: big
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe+sn=big
*
* @throws LdapException on error
*/
@Test
public void test112ReverseRenameCompositeCompositeNotOverlappingDeleteOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "cn=joe+sn=big" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 2, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "cn=joe+sn=big,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
reversed = reverseds.get( 1 );
assertEquals( "sn=small+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.Modify, reversed.getChangeType() );
Modification[] mods = reversed.getModificationArray();
assertNotNull( mods );
assertEquals( 1, mods.length );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, mods[0].getOperation() );
assertNotNull( mods[0].getAttribute() );
assertEquals( "cn", mods[0].getAttribute().getId() );
assertEquals( "joe", mods[0].getAttribute().getString() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they are overlapping, with deleteOldRdn = false, and
* none of new values exists in the entry.
*
* Covers case 12.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: small
* sn: This is a test
*
* new Rdn : cn=joe+cn=test
*
* @throws LdapException on error
*/
@Test
public void test121ReverseRenameCompositeCompositeOverlappingKeepOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "sn=joe+cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=joe+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they are overlapping, with deleteOldRdn = false, and
* some of the new values exists in the entry.
*
* Covers case 12.2 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: big
* sn: small
* sn: This is a test
*
* new Rdn : sn=big+cn=test
*
* @throws LdapException on error
*/
@Test
public void test122ReverseRenameCompositeCompositeOverlappingKeepOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "sn=big+cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.KEEP_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=big+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they are overlapping, with deleteOldRdn = true, and
* none of new values exists in the entry.
*
* Covers case 13.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* cn: big
* sn: small
* sn: This is a test
*
* new Rdn : sn=joe+cn=test
*
* @throws LdapException on error
*/
@Test
public void test131ReverseRenameCompositeCompositeOverlappingDeleteOldRdnDontExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "sn=joe+cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"cn: big",
"sn: small",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=joe+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertTrue( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
/**
* Test a reversed rename ModifyDN, where the initial Rdn is composite,
* the new Rdn is composite, they are overlapping, with deleteOldRdn = true, and
* some of the new values exists in the entry.
*
* Covers case 13.1 of https://cwiki.apache.org/confluence/display/DIRxSRVx11/Reverse+LDIF
*
* Initial entry
* dn: sn=small+cn=test,ou=system
* objectclass: top
* objectclass: person
* cn: test
* sn: small
* sn: big
* sn: This is a test
*
* new Rdn : sn=big+cn=test
*
* @throws LdapException on error
*/
@Test
public void test132ReverseRenameCompositeCompositeOverlappingDeleteOldRdnExistInEntry() throws LdapException
{
Dn dn = new Dn( "sn=small+cn=test,ou=system" );
Rdn oldRdn = new Rdn( "sn=small+cn=test" );
Rdn newRdn = new Rdn( "sn=big+cn=test" );
Entry entry = new DefaultEntry( dn,
"objectClass: top",
"objectClass: person",
"cn: test",
"sn: small",
"sn: big",
"sn: this is a test" );
List<LdifEntry> reverseds = LdifRevertor.reverseRename( entry, newRdn, LdifRevertor.DELETE_OLD_RDN );
assertNotNull( reverseds );
assertEquals( 1, reverseds.size() );
LdifEntry reversed = reverseds.get( 0 );
assertEquals( "sn=big+cn=test,ou=system", reversed.getDn().getName() );
assertEquals( ChangeType.ModRdn, reversed.getChangeType() );
assertFalse( reversed.isDeleteOldRdn() );
assertEquals( oldRdn.getName(), reversed.getNewRdn() );
assertNull( reversed.getNewSuperior() );
}
}