blob: eee46aa93d3df5fa88964fce72e5e14986b5759b [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
*
* http://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.server.operations.modify;
import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import org.apache.directory.server.annotations.CreateLdapServer;
import org.apache.directory.server.annotations.CreateTransport;
import org.apache.directory.server.core.annotations.ApplyLdifs;
import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
import org.apache.directory.server.core.integ.FrameworkRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Test case with multiple modifications on a person entry.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@RunWith(FrameworkRunner.class)
//@CreateDS( name="ModifyMultipleChangesIT-class", enableChangeLog=false )
@CreateLdapServer(
transports =
{
@CreateTransport(protocol = "LDAP")
})
@ApplyLdifs(
{
// Entry # 1
"dn: cn=Tori Amos,ou=system",
"objectClass: inetOrgPerson",
"objectClass: organizationalPerson",
"objectClass: person",
"objectClass: top",
"description: an American singer-songwriter",
"cn: Tori Amos",
"sn: Amos",
// Entry # 2
"dn: cn=Debbie Harry,ou=system",
"objectClass: inetOrgPerson",
"objectClass: organizationalPerson",
"objectClass: person",
"objectClass: top",
"cn: Debbie Harry",
"sn: Harry" })
public class ModifyMultipleChangesIT extends AbstractLdapTestUnit
{
private static final String BASE = "ou=system";
private static final String RDN_TORI_AMOS = "cn=Tori Amos";
/**
* Creation of required attributes of a person entry.
*/
protected Attributes getPersonAttributes( String sn, String cn )
{
Attributes attributes = new BasicAttributes( true );
Attribute attribute = new BasicAttribute( "objectClass" );
attribute.add( "top" );
attribute.add( "person" );
attribute.add( "organizationalperson" );
attribute.add( "inetorgperson" );
attributes.put( attribute );
attributes.put( "cn", cn );
attributes.put( "sn", sn );
return attributes;
}
/**
* Add a new attribute with two values.
*/
@Test
public void testAddNewAttributeValues() throws Exception
{
DirContext ctx = ( DirContext ) getWiredContext( getLdapServer() ).lookup( BASE );
// Add telephoneNumber attribute
String[] newValues =
{ "1234567890", "999999999" };
Attribute attr = new BasicAttribute( "telephoneNumber" );
attr.add( newValues[0] );
attr.add( newValues[1] );
Attributes attrs = new BasicAttributes( true );
attrs.put( attr );
ctx.modifyAttributes( RDN_TORI_AMOS, DirContext.ADD_ATTRIBUTE, attrs );
// Verify, that
// - case of attribute description is correct
// - attribute values are present
attrs = ctx.getAttributes( RDN_TORI_AMOS );
attr = attrs.get( "telephoneNumber" );
assertNotNull( attr );
assertEquals( "telephoneNumber", attr.getID() );
assertTrue( attr.contains( newValues[0] ) );
assertTrue( attr.contains( newValues[1] ) );
assertEquals( newValues.length, attr.size() );
}
/**
* Create a person entry and perform a modify op, in which
* we modify an attribute two times.
*/
@Test
public void testAttributeValueMultiMofificationDIRSERVER_636() throws Exception
{
DirContext ctx = ( DirContext ) getWiredContext( getLdapServer() ).lookup( BASE );
// Create a person entry
Attributes attrs = getPersonAttributes( "Bush", "Kate Bush" );
String rdn = "cn=Kate Bush";
ctx.createSubcontext( rdn, attrs );
// Add a description with two values
String[] descriptions =
{
"Kate Bush is a British singer-songwriter.",
"She has become one of the most influential female artists of the twentieth century." };
Attribute desc1 = new BasicAttribute( "description" );
desc1.add( descriptions[0] );
desc1.add( descriptions[1] );
ModificationItem addModOp = new ModificationItem(
DirContext.ADD_ATTRIBUTE, desc1 );
Attribute desc2 = new BasicAttribute( "description" );
desc2.add( descriptions[1] );
ModificationItem delModOp = new ModificationItem(
DirContext.REMOVE_ATTRIBUTE, desc2 );
ctx.modifyAttributes( rdn, new ModificationItem[]
{ addModOp,
delModOp } );
SearchControls sctls = new SearchControls();
sctls.setSearchScope( SearchControls.SUBTREE_SCOPE );
String filter = "(cn=*Bush)";
String base = "";
// Check entry
NamingEnumeration<SearchResult> enm = ctx.search( base, filter, sctls );
assertTrue( enm.hasMore() );
while ( enm.hasMore() )
{
SearchResult sr = enm.next();
attrs = sr.getAttributes();
Attribute desc = sr.getAttributes().get( "description" );
assertEquals( 1, desc.size() );
assertTrue( desc.contains( descriptions[0] ) );
}
// Remove the person entry
ctx.destroySubcontext( rdn );
}
}