/*
 *  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;


import org.apache.directory.server.unit.AbstractServerTest;

import netscape.ldap.LDAPAttribute;
import netscape.ldap.LDAPAttributeSet;
import netscape.ldap.LDAPConnection;
import netscape.ldap.LDAPEntry;
import netscape.ldap.LDAPException;
import netscape.ldap.LDAPModification;


/** 
 * A test taken from DIRSERVER-630: If one tries to add an attribute to an 
 * entry, and does not provide a value, it is assumed that the server does 
 * not modify the entry. We have a situation here using Sun ONE Directory 
 * SDK for Java, where adding a description attribute without value to a 
 * person entry like this,
 * <code>
 * dn: cn=Kate Bush,dc=example,dc=com
 * objectclass: person
 * objectclass: top
 * sn: Bush
 * cn: Kate Bush
 * </code> 
 * does not fail (modify call does not result in an exception). Instead, a 
 * description attribute is created within the entry. At least the new 
 * attribute is readable with Netscape SDK (it is not visible to most UIs, 
 * because it is invalid ...). 
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 * @version $Rev: $
 */
public class IllegalModificationITest extends AbstractServerTest
{
    static final String DN = "cn=Kate Bush,ou=system";
    static final String USER = "uid=admin,ou=system";
    static final String PASSWORD = "secret";
    static final String HOST = "localhost";

    private LDAPConnection con = null;


    protected void setUp() throws Exception
    {
        super.setUp();
        con = new LDAPConnection();
        con.connect( 3, HOST, super.port, USER, PASSWORD );

        // Create a person entry
        LDAPAttributeSet attrs = new LDAPAttributeSet();
        attrs.add( new LDAPAttribute( "sn", "Bush" ) );
        attrs.add( new LDAPAttribute( "cn", "Kate Bush" ) );
        LDAPAttribute oc = new LDAPAttribute( "objectClass" );
        oc.addValue( "top" );
        oc.addValue( "person" );
        attrs.add( oc );
        LDAPEntry entry = new LDAPEntry( DN, attrs );
        con.add( entry );
    }


    protected void tearDown() throws Exception
    {
        // Remove the person entry and disconnect
        con.delete( DN );
        con.disconnect();
        super.tearDown();
    }


    public void testIllegalModification() throws LDAPException
    {
        LDAPAttribute attr = new LDAPAttribute( "description" );
        LDAPModification mod = new LDAPModification( LDAPModification.ADD, attr );

        try
        {
            con.modify( "cn=Kate Bush,ou=system", mod );
            fail( "error expected due to empty attribute value" );
        }
        catch ( LDAPException e )
        {
            // expected
        }

        // Check whether entry is unmodified, i.e. no description
        LDAPEntry entry = con.read( DN );
        assertEquals( "description exists?", null, entry.getAttribute( "description" ) );
    }
    
    
    public void testIllegalModification2() throws LDAPException
    {
        // first a valid attribute
        LDAPAttribute attr = new LDAPAttribute( "description", "The description" );
        LDAPModification mod = new LDAPModification( LDAPModification.ADD, attr );
        // then an invalid one without any value
        attr = new LDAPAttribute( "displayName" );
        LDAPModification mod2 = new LDAPModification( LDAPModification.ADD, attr );

        try
        {
            con.modify( "cn=Kate Bush,ou=system", new LDAPModification[] { mod, mod2 } );
            fail( "error expected due to empty attribute value" );
        }
        catch ( LDAPException e )
        {
            // expected
        }

        // Check whether entry is unmodified, i.e. no displayName
        LDAPEntry entry = con.read( DN );
        assertEquals( "displayName exists?", null, entry.getAttribute( "displayName" ) );
    }
}
