You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2007/12/09 06:15:07 UTC

svn commit: r602637 - in /directory/apacheds/branches/bigbang: core-integ/src/test/java/org/apache/directory/server/core/ core-integ/src/test/java/org/apache/directory/server/core/changelog/ core-unit/src/test/java/org/apache/directory/server/core/chan...

Author: akarasulu
Date: Sat Dec  8 21:15:02 2007
New Revision: 602637

URL: http://svn.apache.org/viewvc?rev=602637&view=rev
Log:
moved final core unit test over to new framework in core integ

Added:
    directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/changelog/
      - copied from r602630, directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/
    directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogIT.java
Removed:
    directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogITest.java
    directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/
Modified:
    directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/StockCoreISuite.java

Modified: directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/StockCoreISuite.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/StockCoreISuite.java?rev=602637&r1=602636&r2=602637&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/StockCoreISuite.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/StockCoreISuite.java Sat Dec  8 21:15:02 2007
@@ -19,6 +19,7 @@
 package org.apache.directory.server.core;
 
 import org.apache.directory.server.core.authn.SimpleAuthenticationIT;
+import org.apache.directory.server.core.changelog.DefaultChangeLogIT;
 import org.apache.directory.server.core.collective.CollectiveAttributeServiceIT;
 import org.apache.directory.server.core.configuration.PartitionConfigurationIT;
 import org.apache.directory.server.core.event.EventServiceIT;
@@ -80,6 +81,7 @@
         SubentryServiceIT.class,
         LdapClassLoaderIT.class,
         NormalizationServiceIT.class,
+        DefaultChangeLogIT.class,
         ReferralIT.class,
         PartitionConfigurationIT.class  // Leaves the server in a bad state (partition removal is incomplete)
         } )

Added: directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogIT.java?rev=602637&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogIT.java (added)
+++ directory/apacheds/branches/bigbang/core-integ/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogIT.java Sat Dec  8 21:15:02 2007
@@ -0,0 +1,405 @@
+/*
+ * 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.core.changelog;
+
+
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.integ.CiRunner;
+import static org.apache.directory.server.core.integ.IntegrationUtils.getSystemContext;
+import org.apache.directory.shared.ldap.exception.LdapNameNotFoundException;
+import org.apache.directory.shared.ldap.message.AttributeImpl;
+import org.apache.directory.shared.ldap.message.AttributesImpl;
+import org.apache.directory.shared.ldap.message.ModificationItemImpl;
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
+import javax.naming.ldap.LdapContext;
+import java.util.Arrays;
+
+
+/**
+ * Used to test the default change log implementation with an in memory
+ * change log store.  Note that this will probably be removed since this
+ * functionality will be used and tested anyway in all other test cases.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+@RunWith ( CiRunner.class )
+public class DefaultChangeLogIT
+{
+    public static final Logger LOG = LoggerFactory.getLogger( DefaultChangeLogIT.class );
+
+    public static DirectoryService service;
+
+
+//    service.setShutdownHookEnabled( false );
+
+    @Test
+    public void testManyTagsPersistenceAcrossRestarts() throws NamingException, InterruptedException
+    {
+        LdapContext sysRoot = getSystemContext( service );
+        long revision = service.getChangeLog().getCurrentRevision();
+
+        // add new test entry
+        AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test0" );
+        sysRoot.createSubcontext( "ou=test0", attrs );
+        assertEquals( revision + 1, service.getChangeLog().getCurrentRevision() );
+
+        Tag t0 = service.getChangeLog().tag();
+        assertEquals( t0, service.getChangeLog().getLatest() );
+        assertEquals( revision + 1, service.getChangeLog().getCurrentRevision() );
+        assertEquals( revision + 1, t0.getRevision() );
+
+        // add another test entry
+        attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test1" );
+        sysRoot.createSubcontext( "ou=test1", attrs );
+        assertEquals( revision + 2, service.getChangeLog().getCurrentRevision() );
+
+        Tag t1 = service.getChangeLog().tag();
+        assertEquals( t1, service.getChangeLog().getLatest() );
+        assertEquals( revision + 2, service.getChangeLog().getCurrentRevision() );
+        assertEquals( revision + 2, t1.getRevision() );
+
+        service.sync();
+        service.shutdown();
+        service.startup();
+
+        assertEquals( revision + 2, service.getChangeLog().getCurrentRevision() );
+        assertEquals( t1, service.getChangeLog().getLatest() );
+        assertEquals( revision + 2, t1.getRevision() );
+
+        // add third test entry
+        attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test2" );
+        sysRoot.createSubcontext( "ou=test2", attrs );
+        assertEquals( revision + 3, service.getChangeLog().getCurrentRevision() );
+
+        service.revert();
+        sysRoot.getAttributes( "ou=test0" ); // test present
+        sysRoot.getAttributes( "ou=test1" ); // test present
+        assertNotPresent( sysRoot, "ou=test2" );
+        assertEquals( revision + 4, service.getChangeLog().getCurrentRevision() );
+        assertEquals( t1, service.getChangeLog().getLatest() );
+
+        service.revert( t0.getRevision() );
+        sysRoot.getAttributes( "ou=test0" ); // test present
+        assertNotPresent( sysRoot, "ou=test1" );
+        assertNotPresent( sysRoot, "ou=test2" );
+        assertEquals( revision + 7, service.getChangeLog().getCurrentRevision() );
+        assertEquals( t1, service.getChangeLog().getLatest() );
+
+        // no sync this time but should happen automatically
+        service.shutdown();
+        service.startup();
+        assertEquals( revision + 7, service.getChangeLog().getCurrentRevision() );
+        assertEquals( t1, service.getChangeLog().getLatest() );
+        assertEquals( revision + 2, t1.getRevision() );
+
+        service.revert( revision );
+        assertNotPresent( sysRoot, "ou=test0" );
+        assertNotPresent( sysRoot, "ou=test1" );
+        assertNotPresent( sysRoot, "ou=test2" );
+        assertEquals( revision + 14, service.getChangeLog().getCurrentRevision() );
+        assertEquals( t1, service.getChangeLog().getLatest() );
+    }
+
+
+    @Test
+    public void testTagPersistenceAcrossRestarts() throws NamingException, InterruptedException
+    {
+        LdapContext sysRoot = getSystemContext( service );
+        long revision = service.getChangeLog().getCurrentRevision();
+
+        Tag t0 = service.getChangeLog().tag();
+        assertEquals( t0, service.getChangeLog().getLatest() );
+        assertEquals( revision, service.getChangeLog().getCurrentRevision() );
+
+        // add new test entry
+        AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test" );
+        sysRoot.createSubcontext( "ou=test", attrs );
+        assertEquals( revision + 1, service.getChangeLog().getCurrentRevision() );
+
+        service.sync();
+        service.shutdown();
+
+        service.startup();
+        assertEquals( revision + 1, service.getChangeLog().getCurrentRevision() );
+        assertEquals( t0, service.getChangeLog().getLatest() );
+
+        service.revert();
+        assertNotPresent( sysRoot, "ou=test" );
+        assertEquals( revision + 2, service.getChangeLog().getCurrentRevision() );
+        assertEquals( t0, service.getChangeLog().getLatest() );
+    }
+
+
+    @Test
+    public void testRevertAddOperations() throws NamingException
+    {
+        LdapContext sysRoot = getSystemContext( service );
+        Tag t0 = service.getChangeLog().tag();
+        AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test" );
+        sysRoot.createSubcontext( "ou=test", attrs );
+
+        assertNotNull( sysRoot.getAttributes( "ou=test" ) );
+        service.revert( t0.getRevision() );
+
+        try
+        {
+            sysRoot.getAttributes( "ou=test" );
+            fail( "Should not be able to find the entry!" );
+        }
+        catch ( NamingException ne )
+        {
+            assertTrue( ne instanceof LdapNameNotFoundException );
+        }
+    }
+
+
+    @Test
+    public void testRevertAddAndDeleteOperations() throws NamingException
+    {
+        LdapContext sysRoot = getSystemContext( service );
+        Tag t0 = service.getChangeLog().tag();
+
+        // add new test entry
+        AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test" );
+        sysRoot.createSubcontext( "ou=test", attrs );
+
+        // assert presence
+        assertNotNull( sysRoot.getAttributes( "ou=test" ) );
+
+        // delete the test entry and test that it is gone
+        sysRoot.destroySubcontext( "ou=test" );
+        assertNotPresent( sysRoot, "ou=test" );
+
+        // now revert back to begining the added entry is still gone
+        service.revert( t0.getRevision() );
+        assertNotPresent( sysRoot, "ou=test" );
+    }
+
+
+    @Test
+    public void testRevertDeleteOperations() throws NamingException
+    {
+        LdapContext sysRoot = getSystemContext( service );
+        AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test" );
+        sysRoot.createSubcontext( "ou=test", attrs );
+
+        // tag after the addition before deletion
+        Tag t0 = service.getChangeLog().tag();
+        assertNotNull( sysRoot.getAttributes( "ou=test" ) );
+
+        // delete the test entry and test that it is gone
+        sysRoot.destroySubcontext( "ou=test" );
+        assertNotPresent( sysRoot, "ou=test" );
+
+        // now revert and assert that the added entry re-appears
+        service.revert( t0.getRevision() );
+        assertNotNull( sysRoot.getAttributes( "ou=test" ) );
+    }
+
+
+    @Test
+    public void testRevertRenameOperations() throws NamingException
+    {
+        LdapContext sysRoot = getSystemContext( service );
+        AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "oldname" );
+        sysRoot.createSubcontext( "ou=oldname", attrs );
+
+        // tag after the addition before rename
+        Tag t0 = service.getChangeLog().tag();
+        assertNotNull( sysRoot.getAttributes( "ou=oldname" ) );
+
+        // rename the test entry and test that the rename occurred
+        sysRoot.rename( "ou=oldname", "ou=newname" );
+        assertNotPresent( sysRoot, "ou=oldname" );
+        assertNotNull( sysRoot.getAttributes( "ou=newname" ) );
+
+        // now revert and assert that the rename was reversed
+        service.revert( t0.getRevision() );
+        assertNotPresent( sysRoot, "ou=newname" );
+        assertNotNull( sysRoot.getAttributes( "ou=oldname" ) );
+    }
+
+
+    @Test
+    public void testRevertModifyOperations() throws NamingException
+    {
+        LdapContext sysRoot = getSystemContext( service );
+        AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true );
+        attrs.put( "ou", "test5" );
+        sysRoot.createSubcontext( "ou=test5", attrs );
+
+        // -------------------------------------------------------------------
+        // Modify ADD Test
+        // -------------------------------------------------------------------
+
+        // tag after the addition before modify ADD
+        Tag t0 = service.getChangeLog().tag();
+        assertNotNull( sysRoot.getAttributes( "ou=test5" ) );
+
+        // modify the test entry to add description and test new attr appears
+        sysRoot.modifyAttributes( "ou=test5", DirContext.ADD_ATTRIBUTE,
+                new AttributesImpl( "description", "a desc value", true ) );
+        Attributes resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        Attribute description = resusitated.get( "description" );
+        assertNotNull( description );
+        assertEquals( "a desc value", description.get() );
+
+        // now revert and assert that the added entry re-appears
+        service.revert( t0.getRevision() );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        assertNull( resusitated.get( "description" ) );
+
+        // -------------------------------------------------------------------
+        // Modify REPLACE Test
+        // -------------------------------------------------------------------
+
+        // add the attribute again and make sure it is old value
+        sysRoot.modifyAttributes( "ou=test5", DirContext.ADD_ATTRIBUTE,
+                new AttributesImpl( "description", "old value", true ) );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        description = resusitated.get( "description" );
+        assertNotNull( description );
+        assertEquals( description.get(), "old value" );
+
+        // now tag then replace the value to "new value" and confirm
+        Tag t1 = service.getChangeLog().tag();
+        sysRoot.modifyAttributes( "ou=test5", DirContext.REPLACE_ATTRIBUTE,
+                new AttributesImpl( "description", "new value", true ) );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        description = resusitated.get( "description" );
+        assertNotNull( description );
+        assertEquals( description.get(), "new value" );
+
+        // now revert and assert the old value is now reverted
+        service.revert( t1.getRevision() );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        description = resusitated.get( "description" );
+        assertNotNull( description );
+        assertEquals( description.get(), "old value" );
+
+
+        // -------------------------------------------------------------------
+        // Modify REMOVE Test
+        // -------------------------------------------------------------------
+
+        Tag t2 = service.getChangeLog().tag();
+        sysRoot.modifyAttributes( "ou=test5", DirContext.REMOVE_ATTRIBUTE,
+                new AttributesImpl( "description", "old value", true ) );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        description = resusitated.get( "description" );
+        assertNull( description );
+
+        // now revert and assert the old value is now reverted
+        service.revert( t2.getRevision() );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        description = resusitated.get( "description" );
+        assertNotNull( description );
+        assertEquals( description.get(), "old value" );
+
+        // -------------------------------------------------------------------
+        // Modify Multi Operation Test
+        // -------------------------------------------------------------------
+
+        // add a userPassword attribute so we can test replacing it
+        sysRoot.modifyAttributes( "ou=test5", DirContext.ADD_ATTRIBUTE,
+                new AttributesImpl( "userPassword", "to be replaced", true ) );
+        assertPassword( sysRoot.getAttributes( "ou=test5" ), "to be replaced" );
+
+        ModificationItemImpl[] mods = new ModificationItemImpl[]
+        {
+            new ModificationItemImpl( DirContext.REMOVE_ATTRIBUTE,
+                    new AttributeImpl( "description", "old value" ) ),
+            new ModificationItemImpl( DirContext.ADD_ATTRIBUTE,
+                    new AttributeImpl( "seeAlso", "ou=added" ) ),
+            new ModificationItemImpl( DirContext.REPLACE_ATTRIBUTE,
+                    new AttributeImpl( "userPassword", "a replaced value" ) )
+        };
+        Tag t3 = service.getChangeLog().tag();
+
+        // now make the modification and check that description is gone,
+        // seeAlso is added, and that the userPassword has been replaced
+        sysRoot.modifyAttributes( "ou=test5", mods );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        description = resusitated.get( "description" );
+        assertNull( description );
+        assertPassword( resusitated, "a replaced value" );
+        Attribute seeAlso = resusitated.get( "seeAlso" );
+        assertNotNull( seeAlso );
+        assertEquals( seeAlso.get(), "ou=added" );
+
+        // now we revert and make sure the old values are as they were
+        service.revert( t3.getRevision() );
+        resusitated = sysRoot.getAttributes( "ou=test5" );
+        assertNotNull( resusitated );
+        description = resusitated.get( "description" );
+        assertNotNull( description );
+        assertEquals( description.get(), "old value" );
+        assertPassword( resusitated, "to be replaced" );
+        seeAlso = resusitated.get( "seeAlso" );
+        assertNull( seeAlso );
+    }
+
+
+    private void assertPassword( Attributes entry, String password ) throws NamingException
+    {
+        Attribute userPassword = entry.get( "userPassword" );
+        assertNotNull( userPassword );
+        Arrays.equals( password.getBytes(), ( byte[] ) userPassword.get() );
+    }
+
+
+    private void assertNotPresent( DirContext ctx, String dn ) throws NamingException
+    {
+        try
+        {
+            ctx.getAttributes( dn );
+            fail( "Should not be able to find the entry " + dn + " but it is still there." );
+        }
+        catch ( NamingException ne )
+        {
+            assertTrue( ne instanceof LdapNameNotFoundException );
+        }
+    }
+}