You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2008/06/06 18:21:35 UTC

svn commit: r664015 [1/2] - in /directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ: ./ state/

Author: elecharny
Date: Fri Jun  6 09:21:35 2008
New Revision: 664015

URL: http://svn.apache.org/viewvc?rev=664015&view=rev
Log:
o Merged with Alex's changes
o Changed the states to have less of those guys
o Added the @ApplyLdifs mechanism
o Added Javadoc

Added:
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/AbstractState.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedNormalState.java
      - copied, changed from r661995, directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedRevertedState.java
Removed:
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedDirtyState.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedRevertedState.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StoppedDirtyState.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StoppedPristineState.java
Modified:
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiRunner.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiSuite.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/InheritableSettings.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/IntegrationUtils.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/NonExistentState.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedPristineState.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/TestServiceContext.java
    directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/TestServiceState.java

Modified: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiRunner.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiRunner.java?rev=664015&r1=664014&r2=664015&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiRunner.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiRunner.java Fri Jun  6 09:21:35 2008
@@ -1,133 +1,134 @@
-/*
- * 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.integ;
-
-
-//port static org.apache.directory.server.core.integ.state.TestServiceContext.shutdown;
-import static org.apache.directory.server.core.integ.state.TestServiceContext.cleanup;
-import static org.apache.directory.server.core.integ.state.TestServiceContext.destroy;
-import static org.apache.directory.server.core.integ.state.TestServiceContext.test;
-import static org.apache.directory.server.core.integ.state.TestServiceContext.shutdown;
-import org.junit.internal.runners.InitializationError;
-import org.junit.internal.runners.JUnit4ClassRunner;
-import org.junit.runner.Description;
-import org.junit.runner.notification.Failure;
-import org.junit.runner.notification.RunNotifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Method;
-
-
-/**
- * A test runner for ApacheDS Core integration tests.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class CiRunner extends JUnit4ClassRunner
-{
-    private static final Logger LOG = LoggerFactory.getLogger( CiRunner.class );
-    private CiSuite suite;
-    private InheritableSettings settings;
-
-
-    public CiRunner( Class<?> clazz ) throws InitializationError
-    {
-        super( clazz );
-    }
-
-
-    protected InheritableSettings getSettings()
-    {
-        if ( settings != null )
-        {
-            return settings;
-        }
-
-        if ( suite == null )
-        {
-            settings = new InheritableSettings( getDescription(), null );
-        }
-
-        return settings;
-    }
-
-
-    @Override
-    public void run( final RunNotifier notifier )
-    {
-        super.run( notifier );
-        Level cleanupLevel = getSettings().getCleanupLevel();
-        if ( cleanupLevel == Level.CLASS )
-        {
-            try
-            {
-                shutdown();
-                cleanup();
-                destroy();
-            }
-            catch ( Exception e )
-            {
-                LOG.error( "Encountered exception while trying to cleanup after test class: "
-                        + this.getDescription().getDisplayName(), e );
-                notifier.fireTestFailure( new Failure( getDescription(), e ) );
-            }
-        }
-    }
-
-
-    @Override
-    protected void invokeTestMethod( Method method, final RunNotifier notifier )
-    {
-        LOG.debug( "About to invoke test method {}", method.getName() );
-        Description description = methodDescription( method );
-        test( getTestClass(), wrapMethod( method ), notifier, new InheritableSettings( description, getSettings() ) );
-
-        Level cleanupLevel = getSettings().getCleanupLevel();
-        if ( cleanupLevel == Level.METHOD )
-        {
-            try
-            {
-                shutdown();
-                cleanup();
-                destroy();
-            }
-            catch ( Exception e )
-            {
-                LOG.error( "Encountered exception while trying to cleanup after test class: "
-                        + this.getDescription().getDisplayName(), e );
-                notifier.fireTestFailure( new Failure( getDescription(), e ) );
-            }
-        }
-    }
-
-
-    public void setSuite( CiSuite suite )
-    {
-        this.suite = suite;
-        this.settings = new InheritableSettings( getDescription(), suite.getSettings() );
-    }
-
-
-    public CiSuite getSuite()
-    {
-        return suite;
-    }
-}
+/*
+ * 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.integ;
+
+
+import java.lang.reflect.Method;
+
+import static org.apache.directory.server.core.integ.state.TestServiceContext.cleanup;
+import static org.apache.directory.server.core.integ.state.TestServiceContext.destroy;
+import static org.apache.directory.server.core.integ.state.TestServiceContext.shutdown;
+import static org.apache.directory.server.core.integ.state.TestServiceContext.test;
+import org.junit.internal.runners.InitializationError;
+import org.junit.internal.runners.JUnit4ClassRunner;
+import org.junit.runner.Description;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunNotifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * A test runner for ApacheDS Core integration tests.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CiRunner extends JUnit4ClassRunner
+{
+    private static final Logger LOG = LoggerFactory.getLogger( CiRunner.class );
+    private CiSuite suite;
+    private InheritableSettings settings;
+
+
+    public CiRunner( Class<?> clazz ) throws InitializationError
+    {
+        super( clazz );
+    }
+
+
+    protected InheritableSettings getSettings()
+    {
+        if ( settings != null )
+        {
+            return settings;
+        }
+
+        if ( suite == null )
+        {
+            settings = new InheritableSettings( getDescription(), null );
+        }
+
+        return settings;
+    }
+
+
+    @Override
+    public void run( final RunNotifier notifier )
+    {
+        super.run( notifier );
+        Level cleanupLevel = getSettings().getCleanupLevel();
+        
+        if ( cleanupLevel == Level.CLASS )
+        {
+            try
+            {
+                shutdown();
+                cleanup();
+                destroy();
+            }
+            catch ( Exception e )
+            {
+                LOG.error( "Encountered exception while trying to cleanup after test class: "
+                        + this.getDescription().getDisplayName(), e );
+                notifier.fireTestFailure( new Failure( getDescription(), e ) );
+            }
+        }
+    }
+
+
+    @Override
+    protected void invokeTestMethod( Method method, final RunNotifier notifier )
+    {
+        LOG.debug( "About to invoke test method {}", method.getName() );
+        Description description = methodDescription( method );
+        test( getTestClass(), wrapMethod( method ), notifier, new InheritableSettings( description, getSettings() ) );
+
+        Level cleanupLevel = getSettings().getCleanupLevel();
+        
+        if ( cleanupLevel == Level.METHOD )
+        {
+            try
+            {
+                shutdown();
+                cleanup();
+                destroy();
+            }
+            catch ( Exception e )
+            {
+                LOG.error( "Encountered exception while trying to cleanup after test class: "
+                        + this.getDescription().getDisplayName(), e );
+                notifier.fireTestFailure( new Failure( getDescription(), e ) );
+            }
+        }
+    }
+
+
+    public void setSuite( CiSuite suite )
+    {
+        this.suite = suite;
+        this.settings = new InheritableSettings( getDescription(), suite.getSettings() );
+    }
+
+
+    public CiSuite getSuite()
+    {
+        return suite;
+    }
+}

Modified: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiSuite.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiSuite.java?rev=664015&r1=664014&r2=664015&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiSuite.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/CiSuite.java Fri Jun  6 09:21:35 2008
@@ -1,135 +1,135 @@
-/*
- * 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.integ;
-
-
-import static org.apache.directory.server.core.integ.state.TestServiceContext.shutdown;
-import static org.apache.directory.server.core.integ.state.TestServiceContext.cleanup;
-import static org.apache.directory.server.core.integ.state.TestServiceContext.destroy;
-import org.junit.internal.requests.IgnoredClassRunner;
-import org.junit.internal.runners.InitializationError;
-import org.junit.runner.Runner;
-import org.junit.runner.notification.Failure;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.Suite;
-
-import java.util.List;
-
-
-/**
- * A replacement for standard JUnit 4 suites. Note that this test suite
- * will not startup an DirectoryService instance but will clean it up if
- * one remains.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class CiSuite extends Suite
-{
-    private InheritableSettings settings;
-
-
-    public CiSuite( Class<?> clazz ) throws InitializationError
-    {
-        super( clazz );
-        settings = new InheritableSettings( getDescription() );
-    }
-
-
-    public void addAll( List<? extends Runner> runners )
-    {
-        for ( Runner runner : getRunners() )
-        {
-            if ( runner instanceof CiRunner )
-            {
-                CiRunner cir = ( CiRunner) runner;
-                cir.setSuite( this );
-            }
-            else if ( runner instanceof IgnoredClassRunner )
-            {
-                // allow this one
-            }
-            else
-            {
-                throw new IllegalArgumentException( String.format( "Unexpected runner type \"%s\".  " +
-                        "Test classes within CiSuites must use CiRunners.", runner ) );
-            }
-        }
-
-        super.addAll( runners );
-    }
-
-
-    public void add( Runner runner )
-    {
-        if ( runner instanceof CiRunner )
-        {
-            CiRunner cir = ( CiRunner) runner;
-            cir.setSuite( this );
-            super.add( runner );
-        }
-        else if ( runner instanceof IgnoredClassRunner )
-        {
-            // allow this one
-        }
-        else
-        {
-            throw new IllegalArgumentException( String.format( "Unexpected runner type \"%s\".  " +
-                    "Test classes within CiSuites must use CiRunners.", runner ) );
-        }
-    }
-
-
-    @Override
-    public void run( final RunNotifier notifier )
-    {
-        super.run( notifier );
-
-        /*
-         * For any service scope other than test system scope, we must have to
-         * shutdown the sevice and cleanup the working directory.  Failures to
-         * do this without exception shows that something is wrong with the
-         * server and so the entire test should be marked as failed.  So we
-         * presume that tests have failed in the suite if the fixture is in an
-         * inconsistent state.  Who knows if this inconsistent state of the
-         * service could have made it so false results were acquired while
-         * running tests.
-         */
-
-        if ( settings.getCleanupLevel() != Level.SYSTEM )
-        {
-            try
-            {
-                shutdown();
-                cleanup();
-                destroy();
-            }
-            catch ( Exception e )
-            {
-                notifier.fireTestFailure( new Failure( getDescription(), e ) );
-            }
-        }
-    }
-
-
-    public InheritableSettings getSettings()
-    {
-        return settings;
-    }
-}
+/*
+ * 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.integ;
+
+
+import java.util.List;
+
+import static org.apache.directory.server.core.integ.state.TestServiceContext.cleanup;
+import static org.apache.directory.server.core.integ.state.TestServiceContext.destroy;
+import static org.apache.directory.server.core.integ.state.TestServiceContext.shutdown;
+import org.junit.internal.requests.IgnoredClassRunner;
+import org.junit.internal.runners.InitializationError;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.Suite;
+
+
+/**
+ * A replacement for standard JUnit 4 suites. Note that this test suite
+ * will not startup an DirectoryService instance but will clean it up if
+ * one remains.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CiSuite extends Suite
+{
+    private InheritableSettings settings;
+
+
+    public CiSuite( Class<?> clazz ) throws InitializationError
+    {
+        super( clazz );
+        settings = new InheritableSettings( getDescription() );
+    }
+
+
+    public void addAll( List<? extends Runner> runners )
+    {
+        for ( Runner runner : getRunners() )
+        {
+            if ( runner instanceof CiRunner )
+            {
+                CiRunner cir = ( CiRunner) runner;
+                cir.setSuite( this );
+            }
+            else if ( runner instanceof IgnoredClassRunner )
+            {
+                // allow this one
+            }
+            else
+            {
+                throw new IllegalArgumentException( String.format( "Unexpected runner type \"%s\".  " +
+                        "Test classes within CiSuites must use CiRunners.", runner ) );
+            }
+        }
+
+        super.addAll( runners );
+    }
+
+
+    public void add( Runner runner )
+    {
+        if ( runner instanceof CiRunner )
+        {
+            CiRunner cir = ( CiRunner) runner;
+            cir.setSuite( this );
+            super.add( runner );
+        }
+        else if ( runner instanceof IgnoredClassRunner )
+        {
+            // allow this one
+        }
+        else
+        {
+            throw new IllegalArgumentException( String.format( "Unexpected runner type \"%s\".  " +
+                    "Test classes within CiSuites must use CiRunners.", runner ) );
+        }
+    }
+
+
+    @Override
+    public void run( final RunNotifier notifier )
+    {
+        super.run( notifier );
+
+        /*
+         * For any service scope other than test system scope, we must have to
+         * shutdown the sevice and cleanup the working directory.  Failures to
+         * do this without exception shows that something is wrong with the
+         * server and so the entire test should be marked as failed.  So we
+         * presume that tests have failed in the suite if the fixture is in an
+         * inconsistent state.  Who knows if this inconsistent state of the
+         * service could have made it so false results were acquired while
+         * running tests.
+         */
+
+        if ( settings.getCleanupLevel() != Level.SYSTEM )
+        {
+            try
+            {
+                shutdown();
+                cleanup();
+                destroy();
+            }
+            catch ( Exception e )
+            {
+                notifier.fireTestFailure( new Failure( getDescription(), e ) );
+            }
+        }
+    }
+
+
+    public InheritableSettings getSettings()
+    {
+        return settings;
+    }
+}

Modified: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/InheritableSettings.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/InheritableSettings.java?rev=664015&r1=664014&r2=664015&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/InheritableSettings.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/InheritableSettings.java Fri Jun  6 09:21:35 2008
@@ -1,215 +1,271 @@
-/*
- * 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.integ;
-
-
-import org.apache.directory.server.core.integ.annotations.*;
-import org.junit.runner.Description;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * Inheritable settings of a test suite, test class, or test method.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class InheritableSettings
-{
-    /** the default setup mode to use if inheritence leads to null value */
-    public static final SetupMode DEFAULT_MODE = SetupMode.ROLLBACK;
-    /** the default factory to use if inheritence leads to a null value */
-    public static final DirectoryServiceFactory DEFAULT_FACTORY = DirectoryServiceFactory.DEFAULT;
-
-    /** parent settings to inherit from */
-    private final InheritableSettings parent;
-    /** junit test description containing all annotations queried */
-    private final Description description;
-    /** default level at which a service is cleaned up */
-    private static final Level DEFAULT_CLEANUP_LEVEL = Level.SUITE;
-
-
-    /**
-     * Creates a new InheritableSettings instance for test suites description.
-     *
-     * @param description junit description for the suite
-     */
-    public InheritableSettings( Description description )
-    {
-        this.description = description;
-        this.parent = null;
-    }
-
-
-    /**
-     * Creates a new InheritableSettings instance based on a test object's
-     * description and it's parent's settings.
-     *
-     * @param description junit description for the test object
-     * @param parent the parent settings or null if the test entity is a suite
-     */
-    public InheritableSettings( Description description, InheritableSettings parent )
-    {
-        this.description = description;
-        this.parent = parent;
-
-        if ( description.isSuite() && ! isSuiteLevel() )
-        {
-            throw new IllegalStateException( String.format( "The parent must be null for %s suite",
-                    description.getDisplayName() ) );
-        }
-    }
-
-
-    public Description getDescription()
-    {
-        return description;
-    }
-
-
-    public InheritableSettings getParent()
-    {
-        return parent;
-    }
-
-
-    public boolean isSuiteLevel()
-    {
-        return parent == null;
-    }
-
-
-    public boolean isClassLevel()
-    {
-        return parent != null && parent.getParent() == null;
-    }
-
-
-    public boolean isMethodLevel()
-    {
-        return parent != null && parent.getParent() != null;
-    }
-
-
-    public SetupMode getMode()
-    {
-        SetupMode parentMode = DEFAULT_MODE;
-        if ( parent != null )
-        {
-            parentMode = parent.getMode();
-        }
-
-        Mode annotation = description.getAnnotation( Mode.class );
-        if ( annotation == null )
-        {
-            return parentMode;
-        }
-        else
-        {
-            return annotation.value();
-        }
-    }
-
-
-    public DirectoryServiceFactory getFactory() throws IllegalAccessException, InstantiationException
-    {
-        DirectoryServiceFactory parentFactory = DEFAULT_FACTORY;
-        if ( parent != null )
-        {
-            parentFactory = parent.getFactory();
-        }
-
-        Factory annotation = description.getAnnotation( Factory.class );
-        if ( annotation == null )
-        {
-            return parentFactory;
-        }
-        else
-        {
-            return ( DirectoryServiceFactory ) annotation.value().newInstance();
-        }
-    }
-
-
-    public List<String> getLdifs( List<String> ldifs )
-    {
-        if ( ldifs == null )
-        {
-            ldifs = new ArrayList<String>();
-        }
-
-        if ( parent != null )
-        {
-            parent.getLdifs( ldifs );
-        }
-
-        ApplyLdifs annotation = description.getAnnotation( ApplyLdifs.class );
-        if ( annotation != null && annotation.value() != null )
-        {
-            ldifs.addAll( Arrays.asList( annotation.value() ) );
-        }
-
-        return ldifs;
-    }
-
-
-    public List<String> getLdifFiles( List<String> ldifFiles )
-    {
-        if ( ldifFiles == null )
-        {
-            ldifFiles = new ArrayList<String>();
-        }
-
-        if ( parent != null )
-        {
-            parent.getLdifFiles( ldifFiles );
-        }
-
-        ApplyLdifFiles annotation = description.getAnnotation( ApplyLdifFiles.class );
-        if ( annotation != null && annotation.value() != null )
-        {
-            ldifFiles.addAll( Arrays.asList( annotation.value() ) );
-        }
-
-        return ldifFiles;
-    }
-
-
-    public Level getCleanupLevel()
-    {
-        Level parentCleanupLevel = DEFAULT_CLEANUP_LEVEL;
-        if ( parent != null )
-        {
-            parentCleanupLevel = parent.getCleanupLevel();
-        }
-
-        CleanupLevel annotation = description.getAnnotation( CleanupLevel.class );
-        if ( annotation == null )
-        {
-            return parentCleanupLevel;
-        }
-        else
-        {
-            return annotation.value();
-        }
-    }
-}
+/*
+ * 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.integ;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.directory.server.core.integ.annotations.ApplyLdifFiles;
+import org.apache.directory.server.core.integ.annotations.ApplyLdifs;
+import org.apache.directory.server.core.integ.annotations.CleanupLevel;
+import org.apache.directory.server.core.integ.annotations.Factory;
+import org.apache.directory.server.core.integ.annotations.Mode;
+
+
+import org.junit.runner.Description;
+
+
+/**
+ * Inheritable settings of a test suite, test class, or test method.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class InheritableSettings
+{
+    /** the default setup mode to use if inheritance leads to null value */
+    public static final SetupMode DEFAULT_MODE = SetupMode.ROLLBACK;
+    
+    /** the default factory to use if inheritance leads to a null value */
+    public static final DirectoryServiceFactory DEFAULT_FACTORY = DirectoryServiceFactory.DEFAULT;
+
+    /** parent settings to inherit from */
+    private final InheritableSettings parent;
+    
+    /** JUnit test description containing all annotations queried */
+    private final Description description;
+    
+    /** default level at which a service is cleaned up */
+    private static final Level DEFAULT_CLEANUP_LEVEL = Level.SUITE;
+
+
+    /**
+     * Creates a new InheritableSettings instance for test suites description.
+     *
+     * @param description JUnit description for the suite
+     */
+    public InheritableSettings( Description description )
+    {
+        this.description = description;
+        this.parent = null;
+    }
+
+
+    /**
+     * Creates a new InheritableSettings instance based on a test object's
+     * description and it's parent's settings.
+     *
+     * @param description JUnit description for the test object
+     * @param parent the parent settings or null if the test entity is a suite
+     */
+    public InheritableSettings( Description description, InheritableSettings parent )
+    {
+        this.description = description;
+        this.parent = parent;
+
+        if ( description.isSuite() && ! isSuiteLevel() )
+        {
+            throw new IllegalStateException( String.format( "The parent must be null for %s suite",
+                    description.getDisplayName() ) );
+        }
+    }
+
+
+    /**
+     * @return the description of the running test
+     */
+    public Description getDescription()
+    {
+        return description;
+    }
+
+
+    /**
+     * @return the settings inherited from the parent
+     */
+    public InheritableSettings getParent()
+    {
+        return parent;
+    }
+
+
+    /**
+     * @return <code>true</code> if we are at the suite level
+     */
+    public boolean isSuiteLevel()
+    {
+        return parent == null;
+    }
+
+
+    /**
+     * @return <code>true</code> if we are at the class level
+     */
+    public boolean isClassLevel()
+    {
+        return ( parent != null ) && ( parent.getParent() == null );
+    }
+
+
+    /**
+     * @return <code>true</code> if we are at the method level
+     */
+    public boolean isMethodLevel()
+    {
+        return ( parent != null ) && ( parent.getParent() != null );
+    }
+
+
+    /**
+     * @return the test mode. Default to ROLLBACK
+     */
+    public SetupMode getMode()
+    {
+        SetupMode parentMode = DEFAULT_MODE;
+        
+        if ( parent != null )
+        {
+            parentMode = parent.getMode();
+        }
+
+        // Get the @Mode annotation
+        Mode annotation = description.getAnnotation( Mode.class );
+        
+        if ( annotation == null )
+        {
+            return parentMode;
+        }
+        else
+        {
+            return annotation.value();
+        }
+    }
+
+
+    /**
+     * @return the DirectoryService factory 
+     * @throws IllegalAccessException if we can't access the factory
+     * @throws InstantiationException if the DirectoryService can't be instanciated
+     */
+    public DirectoryServiceFactory getFactory() throws IllegalAccessException, InstantiationException
+    {
+        DirectoryServiceFactory parentFactory = DEFAULT_FACTORY;
+        
+        if ( parent != null )
+        {
+            parentFactory = parent.getFactory();
+        }
+
+        Factory annotation = description.getAnnotation( Factory.class );
+        
+        if ( annotation == null )
+        {
+            return parentFactory;
+        }
+        else
+        {
+            return ( DirectoryServiceFactory ) annotation.value().newInstance();
+        }
+    }
+
+
+    /**
+     * Get a list of entries from a LDIF declared as an annotation
+     *
+     * @param ldifs the list of LDIFs we want to feed  
+     * @return a list of entries described using a LDIF format
+     */
+    public List<String> getLdifs( List<String> ldifs )
+    {
+        if ( ldifs == null )
+        {
+            ldifs = new ArrayList<String>();
+        }
+
+        if ( parent != null )
+        {
+            parent.getLdifs( ldifs );
+        }
+
+        ApplyLdifs annotation = description.getAnnotation( ApplyLdifs.class );
+        
+        if ( ( annotation != null ) && ( annotation.value() != null ) )
+        {
+            ldifs.addAll( Arrays.asList( annotation.value() ) );
+        }
+
+        return ldifs;
+    }
+
+
+    /**
+     * Get a list of files containing entries described using the LDIF format.
+     *
+     * @param ldifFiles the list to feed
+     * @return a list of files containing some LDIF data
+     */
+    public List<String> getLdifFiles( List<String> ldifFiles )
+    {
+        if ( ldifFiles == null )
+        {
+            ldifFiles = new ArrayList<String>();
+        }
+
+        if ( parent != null )
+        {
+            parent.getLdifFiles( ldifFiles );
+        }
+
+        ApplyLdifFiles annotation = description.getAnnotation( ApplyLdifFiles.class );
+        
+        if ( annotation != null && annotation.value() != null )
+        {
+            ldifFiles.addAll( Arrays.asList( annotation.value() ) );
+        }
+
+        return ldifFiles;
+    }
+
+
+    /**
+     * @return teh cleanup level. Defualt to SUITE
+     */
+    public Level getCleanupLevel()
+    {
+        Level parentCleanupLevel = DEFAULT_CLEANUP_LEVEL;
+        
+        if ( parent != null )
+        {
+            parentCleanupLevel = parent.getCleanupLevel();
+        }
+
+        CleanupLevel annotation = description.getAnnotation( CleanupLevel.class );
+        
+        if ( annotation == null )
+        {
+            return parentCleanupLevel;
+        }
+        else
+        {
+            return annotation.value();
+        }
+    }
+}

Modified: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/IntegrationUtils.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/IntegrationUtils.java?rev=664015&r1=664014&r2=664015&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/IntegrationUtils.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/IntegrationUtils.java Fri Jun  6 09:21:35 2008
@@ -19,27 +19,28 @@
 package org.apache.directory.server.core.integ;
 
 
-import org.apache.commons.io.FileUtils;
-import org.apache.directory.server.constants.ServerDNConstants;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import javax.naming.InvalidNameException;
+import javax.naming.NamingException;
+import javax.naming.ldap.LdapContext;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.authn.LdapPrincipal;
+import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
+import org.apache.directory.shared.ldap.ldif.ChangeType;
+import org.apache.directory.shared.ldap.ldif.LdifEntry;
+import org.apache.directory.shared.ldap.ldif.LdifReader;
+import org.apache.directory.shared.ldap.message.AttributeImpl;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.directory.server.core.CoreSession;
-import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.authn.LdapPrincipal;
 import org.apache.directory.server.core.jndi.ServerLdapContext;
-import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
-import org.apache.directory.shared.ldap.ldif.ChangeType;
-import org.apache.directory.shared.ldap.ldif.LdifEntry;
-import org.apache.directory.shared.ldap.ldif.LdifReader;
-import org.apache.directory.shared.ldap.message.AttributeImpl;
-import org.apache.directory.shared.ldap.name.LdapDN;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.naming.InvalidNameException;
-import javax.naming.NamingException;
-import javax.naming.ldap.LdapContext;
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
 
 
 /**
@@ -49,7 +50,8 @@
  * @version $Rev$, $Date$
  */
 public class IntegrationUtils
-{
+{
+    /** The class logger */
     private static final Logger LOG = LoggerFactory.getLogger( IntegrationUtils.class );
 
 
@@ -78,7 +80,7 @@
         }
     }
 
-
+
     /**
      * Inject an ldif String into the server. DN must be relative to the
      * root.
@@ -155,10 +157,12 @@
         {
             case( ChangeType.ADD_ORDINAL ):
                 root.createSubcontext( dn, entry.getAttributes() );
-                break;
+                break;
+                
             case( ChangeType.DELETE_ORDINAL ):
                 root.destroySubcontext( entry.getDn() );
-                break;
+                break;
+                
             case( ChangeType.MODDN_ORDINAL ):
                 LdapDN target = new LdapDN( entry.getNewSuperior() );
                 if ( entry.getNewRdn() != null )
@@ -180,7 +184,8 @@
                 }
 
                 root.rename( dn, target );
-                break;
+                break;
+                
             case( ChangeType.MODRDN_ORDINAL ):
                 target = ( LdapDN ) dn.clone();
                 target.remove( dn.size() - 1 );
@@ -197,6 +202,7 @@
 
                 root.rename( dn, target );
                 break;
+
             case( ChangeType.MODIFY_ORDINAL ):
                 root.modifyAttributes( dn, entry.getModificationItemsArray() );
                 break;

Added: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/AbstractState.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/AbstractState.java?rev=664015&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/AbstractState.java (added)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/AbstractState.java Fri Jun  6 09:21:35 2008
@@ -0,0 +1,204 @@
+/*
+ * 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.integ.state;
+
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.naming.NamingException;
+import javax.naming.ldap.LdapContext;
+
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.integ.InheritableSettings;
+import org.apache.directory.server.core.integ.IntegrationUtils;
+import org.apache.directory.shared.ldap.ldif.LdifEntry;
+import org.apache.directory.shared.ldap.ldif.LdifReader;
+import org.junit.internal.runners.TestClass;
+import org.junit.internal.runners.TestMethod;
+import org.junit.runner.notification.RunNotifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * The abstract state of a test service, containing the default state 
+ * transitions
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public abstract class AbstractState implements TestServiceState
+{
+    /** The class logger */
+    private static final Logger LOG = LoggerFactory.getLogger( AbstractState.class );
+
+    /** The context for this test */
+    protected final TestServiceContext context;
+
+    /** Error message when we can't destroy the service */
+    private static final String DESTROY_ERR = "Cannot destroy when service is in NonExistant state";
+    private static final String CLEANUP_ERROR = "Cannot cleanup when service is in NonExistant state";
+    private static final String STARTUP_ERR = "Cannot startup when service is in NonExistant state";
+    private static final String SHUTDOWN_ERR = "Cannot shutdown service in NonExistant state.";
+    private static final String REVERT_ERROR = "Cannot revert when service is in NonExistant state";
+
+    /**
+     * 
+     * Creates a new instance of AbstractState.
+     *
+     * @param context The associated context
+     */
+    protected AbstractState( TestServiceContext context )
+    {
+        this.context = context;
+    }
+
+
+    /**
+     * Action where an attempt is made to create the service.  Service
+     * creation in this system is the combined instantiation and
+     * configuration which takes place when the factory is used to get
+     * a new instance of the service.
+     *
+     * @param settings The inherited settings
+     * @throws NamingException if we can't create the service
+     */
+    public void create( InheritableSettings settings ) throws NamingException
+    {
+    }
+
+
+    /**
+     * Action where an attempt is made to destroy the service. This
+     * entails nulling out reference to it and triggering garbage
+     * collection.
+     */
+    public void destroy()
+    {
+        LOG.error( DESTROY_ERR );
+        throw new IllegalStateException( DESTROY_ERR );
+    }
+
+
+    /**
+     * Action where an attempt is made to erase the contents of the
+     * working directory used by the service for various files including
+     * partition database files.
+     *
+     * @throws IOException on errors while deleting the working directory
+     */
+    public void cleanup() throws  IOException
+    {
+        LOG.error( CLEANUP_ERROR );
+        throw new IllegalStateException( CLEANUP_ERROR );
+    }
+
+
+    /**
+     * Action where an attempt is made to start up the service.
+     *
+     * @throws Exception on failures to start the core directory service
+     */
+    public void startup() throws Exception
+    {
+        LOG.error( STARTUP_ERR );
+        throw new IllegalStateException( STARTUP_ERR );
+    }
+
+
+    /**
+     * Action where an attempt is made to shutdown the service.
+     *
+     * @throws Exception on failures to stop the core directory service
+     */
+    public void shutdown() throws Exception
+    {
+        LOG.error( SHUTDOWN_ERR );
+        throw new IllegalStateException( SHUTDOWN_ERR );
+    }
+
+
+    /**
+     * Action where an attempt is made to run a test against the service.
+     *
+     * All annotations should have already been processed for
+     * InheritableSettings yet they and others can be processed since we have
+     * access to the method annotations below
+     *
+     * @param testClass the class whose test method is to be run
+     * @param testMethod the test method which is to be run
+     * @param notifier a notifier to report failures to
+     * @param settings the inherited settings and annotations associated with
+     * the test method
+     */
+    public void test( TestClass testClass, TestMethod testMethod, RunNotifier notifier, InheritableSettings settings )
+    {
+    }
+
+
+    /**
+     * Action where an attempt is made to revert the service to it's
+     * initial start up state by using a previous snapshot.
+     *
+     * @throws Exception on failures to revert the state of the core
+     * directory service
+     */
+    public void revert() throws Exception
+    {
+        LOG.error( REVERT_ERROR );
+        throw new IllegalStateException( REVERT_ERROR );
+    }
+
+    
+    /**
+     * Inject the Ldifs if any
+     *
+     * @param service the instantiated directory service
+     * @param settings the settings containing the ldif
+     */
+    protected void injectLdifs( DirectoryService service, InheritableSettings settings )
+    {
+        List<String> ldifs = new ArrayList<String>();
+
+        ldifs =  settings.getLdifs( ldifs );
+        
+        if ( ldifs.size() != 0 )
+        {
+            for ( String ldif:ldifs )
+            {
+                try
+                {
+                    StringReader in = new StringReader( ldif );
+                    LdifReader ldifReader = new LdifReader( in );
+                    LdifEntry entry = ldifReader.next();
+                    
+                    LdapContext root = IntegrationUtils.getRootContext( service );
+                    root.createSubcontext( entry.getDn(), entry.getAttributes() );
+                }
+                catch ( Exception e )
+                {
+                    LOG.error( "Cannot inject the following entry : {}. Error : {}.", ldif, e.getMessage() );
+                }
+            }
+        }
+    }
+}

Modified: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/NonExistentState.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/NonExistentState.java?rev=664015&r1=664014&r2=664015&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/NonExistentState.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/NonExistentState.java Fri Jun  6 09:21:35 2008
@@ -1,160 +1,214 @@
-/*
- * 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.integ.state;
-
-import javax.naming.NamingException;
-
-import org.apache.directory.server.core.integ.DirectoryServiceFactory;
-import org.apache.directory.server.core.integ.InheritableSettings;
-import org.apache.directory.server.core.integ.SetupMode;
-import org.junit.internal.runners.TestClass;
-import org.junit.internal.runners.TestMethod;
-import org.junit.runner.notification.RunNotifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * The state of a test service when it has not yet been created.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class NonExistentState implements TestServiceState
-{
-    private static final Logger LOG = LoggerFactory.getLogger( NonExistentState.class );
-    private final TestServiceContext context;
-    private static final String DESTROY_ERR = "Cannot destroy when service is in NonExistant state";
-    private static final String CLEANUP_ERROR = "Cannot cleanup when service is in NonExistant state";
-    private static final String STARTUP_ERR = "Cannot startup when service is in NonExistant state";
-    private static final String SHUTDOWN_ERR = "Cannot shutdown service in NonExistant state.";
-    private static final String REVERT_ERROR = "Cannot revert when service is in NonExistant state";
-
-
-    public NonExistentState( TestServiceContext context )
-    {
-        this.context = context;
-    }
-
-
-    public void create( DirectoryServiceFactory factory ) throws NamingException
-    {
-        LOG.debug( "calling create()" );
-        context.setService( factory.newInstance() );
-        context.setState( context.getStoppedDirtyState() );
-    }
-
-
-    public void destroy()
-    {
-        LOG.error( DESTROY_ERR );
-        throw new IllegalStateException( DESTROY_ERR );
-    }
-
-
-    public void cleanup()
-    {
-        LOG.error( CLEANUP_ERROR );
-        throw new IllegalStateException( CLEANUP_ERROR );
-    }
-
-
-    public void startup()
-    {
-        LOG.error( STARTUP_ERR );
-        throw new IllegalStateException( STARTUP_ERR );
-    }
-
-
-    public void shutdown()
-    {
-        LOG.error( SHUTDOWN_ERR );
-        throw new IllegalStateException( SHUTDOWN_ERR );
-    }
-
-
-    /**
-     * This method is a bit different.  Consider this method to hold the logic
-     * which is needed to shift the context state from the present state to a
-     * started state so we can call test on the current state of the context.
-     *
-     * Basically if the service is not needed or the test is ignored, then we
-     * just invoke the test: if ignored the test is not dealt with by the
-     * MethodRoadie run method.
-     *
-     * In tests not ignored requiring setup modes RESTART and CUMULATIVE we
-     * simply create the service and start it up without a cleanup.  In the
-     * PRISTINE and ROLLBACK modes we do the same but cleanup() before a
-     * restart.
-     *
-     * @see TestServiceState#test(TestClass, TestMethod, RunNotifier, InheritableSettings) 
-     */
-    public void test( TestClass testClass, TestMethod testMethod, RunNotifier notifier, InheritableSettings settings )
-    {
-        LOG.debug( "calling test(): {}", settings.getDescription().getDisplayName() );
-
-        if ( settings.getMode() == SetupMode.NOSERVICE || testMethod.isIgnored() )
-        {
-            // no state change here
-            TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
-            return;
-        }
-
-        if ( settings.getMode() == SetupMode.RESTART || settings.getMode() == SetupMode.CUMULATIVE )
-        {
-            try
-            {
-                context.getState().create( settings.getFactory() );
-                context.getState().startup();
-            }
-            catch ( Exception e )
-            {
-                LOG.error( "Failed to create and start new server instance: " + e );
-                notifier.testAborted( settings.getDescription(), e );
-                return;
-            }
-        }
-
-        if ( settings.getMode() == SetupMode.PRISTINE || settings.getMode() == SetupMode.ROLLBACK )
-        {
-            try
-            {
-                context.getState().create( settings.getFactory() );
-                context.getState().cleanup();
-                context.getState().startup();
-            }
-            catch ( Exception e )
-            {
-                LOG.error( "Failed to create, cleanup and start new server instance: " + e );
-                notifier.testAborted( settings.getDescription(), e );
-                return;
-            }
-        }
-
-        // state object what ever it is will change state so we just return
-        context.getState().test( testClass, testMethod, notifier, settings );
-    }
-
-
-    public void revert()
-    {
-        LOG.error( REVERT_ERROR );
-        throw new IllegalStateException( REVERT_ERROR );
-    }
-}
+/*
+ * 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.integ.state;
+
+
+import java.io.IOException;
+
+import javax.naming.NamingException;
+
+import org.apache.directory.server.core.integ.DirectoryServiceFactory;
+import org.apache.directory.server.core.integ.InheritableSettings;
+import static org.apache.directory.server.core.integ.IntegrationUtils.doDelete;
+import org.junit.internal.runners.TestClass;
+import org.junit.internal.runners.TestMethod;
+import org.junit.runner.notification.RunNotifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * The state of a test service when it has not yet been created.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class NonExistentState extends AbstractState
+{
+    private static final Logger LOG = LoggerFactory.getLogger( NonExistentState.class );
+
+
+    /**
+     * Creates a new instance of NonExistentState.
+     *
+     * @param context the test context
+     */
+    public NonExistentState( TestServiceContext context )
+    {
+        super( context );
+    }
+
+
+    /**
+     * Action where an attempt is made to create the service.  Service
+     * creation in this system is the combined instantiation and
+     * configuration which takes place when the factory is used to get
+     * a new instance of the service.
+     *
+     * @param settings The inherited settings
+     * @throws NamingException if we can't create the service
+     */
+    public void create( InheritableSettings settings ) throws NamingException
+    {
+        LOG.debug( "calling create()" );
+
+        try
+        {
+            DirectoryServiceFactory factory = settings.getFactory();
+            context.setService( factory.newInstance() );
+        }
+        catch ( InstantiationException ie )
+        {
+            throw new NamingException( ie.getMessage() );
+        }
+        catch ( IllegalAccessException iae )
+        {
+            throw new NamingException( iae.getMessage() );
+        }
+    }
+
+
+    /**
+     * Action where an attempt is made to erase the contents of the
+     * working directory used by the service for various files including
+     * partition database files.
+     *
+     * @throws IOException on errors while deleting the working directory
+     */
+    public void cleanup() throws IOException
+    {
+        LOG.debug( "calling cleanup()" );
+        doDelete( context.getService().getWorkingDirectory() );
+    }
+
+
+    /**
+     * Action where an attempt is made to start up the service.
+     *
+     * @throws Exception on failures to start the core directory service
+     */
+    public void startup() throws Exception
+    {
+        LOG.debug( "calling startup()" );
+        context.getService().startup();
+    }
+
+
+    /**
+     * This method is a bit different.  Consider this method to hold the logic
+     * which is needed to shift the context state from the present state to a
+     * started state so we can call test on the current state of the context.
+     *
+     * Basically if the service is not needed or the test is ignored, then we
+     * just invoke the test: if ignored the test is not dealt with by the
+     * MethodRoadie run method.
+     *
+     * In tests not ignored requiring setup modes RESTART and CUMULATIVE we
+     * simply create the service and start it up without a cleanup.  In the
+     * PRISTINE and ROLLBACK modes we do the same but cleanup() before a
+     * restart.
+     *
+     * @see TestServiceState#test(TestClass, TestMethod, RunNotifier, InheritableSettings) 
+     */
+    public void test( TestClass testClass, TestMethod testMethod, RunNotifier notifier, InheritableSettings settings )
+    {
+        LOG.debug( "calling test(): {}, mode {}", settings.getDescription().getDisplayName(), settings.getMode() );
+
+        if ( testMethod.isIgnored() )
+        {
+            // The test is ignored
+            return;
+        }
+
+        switch ( settings.getMode() )
+        {
+            case CUMULATIVE:
+            case RESTART:
+                try
+                {
+                    create( settings );
+                }
+                catch ( NamingException ne )
+                {
+                    LOG.error( "Failed to create and start new server instance: " + ne );
+                    notifier.testAborted( settings.getDescription(), ne );
+                    return;
+                }
+
+                try
+                {
+                    startup();
+                }
+                catch ( Exception e )
+                {
+                    LOG.error( "Failed to create and start new server instance: " + e );
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+
+                
+                context.setState( context.getStartedNormalState() );
+                context.getState().test( testClass, testMethod, notifier, settings );
+                return;
+
+
+            case PRISTINE:
+            case ROLLBACK:
+                try
+                {
+                    create( settings );
+                }
+                catch ( NamingException ne )
+                {
+                    LOG.error( "Failed to create and start new server instance: " + ne );
+                    notifier.testAborted( settings.getDescription(), ne );
+                    return;
+                }
+
+                try
+                {
+                    cleanup();
+                }
+                catch ( IOException ioe )
+                {
+                    LOG.error( "Failed to create and start new server instance: " + ioe );
+                    notifier.testAborted( settings.getDescription(), ioe );
+                    return;
+                }
+
+                try
+                {
+                    startup();
+                }
+                catch ( Exception e )
+                {
+                    LOG.error( "Failed to create and start new server instance: " + e );
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+
+                context.setState( context.getStartedPristineState() );
+                context.getState().test( testClass, testMethod, notifier, settings );
+                return;
+
+            default:
+                return;
+        }
+    }
+}

Copied: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedNormalState.java (from r661995, directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedRevertedState.java)
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedNormalState.java?p2=directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedNormalState.java&p1=directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedRevertedState.java&r1=661995&r2=664015&rev=664015&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedRevertedState.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedNormalState.java Fri Jun  6 09:21:35 2008
@@ -1,154 +1,225 @@
-/*
- * 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.integ.state;
-
-
-import org.apache.directory.server.core.integ.DirectoryServiceFactory;
-import org.apache.directory.server.core.integ.InheritableSettings;
-import org.apache.directory.server.core.integ.SetupMode;
-import org.junit.internal.runners.TestClass;
-import org.junit.internal.runners.TestMethod;
-import org.junit.runner.notification.RunNotifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.naming.NamingException;
-
-
-/**
- * The state of a running test service which has been used for running
- * integration tests and has been reverted to contain the same content as it
- * did when created and started.  It is not really pristine however for all
- * practical purposes of integration testing it appears to be the same as
- * when first started.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class StartedRevertedState implements TestServiceState
-{
-    private static final Logger LOG = LoggerFactory.getLogger( StartedRevertedState.class );
-    private final TestServiceContext context;
-
-
-    public StartedRevertedState( TestServiceContext context )
-    {
-        this.context = context;
-    }
-
-
-    public void create( DirectoryServiceFactory factory )
-    {
-        throw new IllegalStateException( "Cannot create new instance while service is running." );
-    }
-
-
-    public void destroy()
-    {
-        throw new IllegalStateException( "Cannot destroy started service." );
-    }
-
-
-    public void cleanup()
-    {
-        throw new IllegalStateException( "Cannot cleanup started service." );
-    }
-
-
-    public void startup()
-    {
-        throw new IllegalStateException( "Cannot startup started service." );
-    }
-
-
-    public void shutdown() throws Exception
-    {
-        LOG.debug( "calling shutdown()" );
-        context.getService().shutdown();
-        context.setState( context.getStoppedDirtyState() );
-    }
-
-
-    public void test( TestClass testClass, TestMethod testMethod, RunNotifier notifier, InheritableSettings settings )
-    {
-        LOG.debug( "calling test(): {}", settings.getDescription().getDisplayName() );
-        if ( settings.getMode() == SetupMode.NOSERVICE || testMethod.isIgnored() )
-        {
-            // no state change here
-            TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
-            return;
-        }
-
-        if ( settings.getMode() == SetupMode.PRISTINE )
-        {
-            try
-            {
-                context.getState().shutdown();
-                context.getState().cleanup();
-
-                // @todo check if the factory changed here
-                if ( true ) // change this to check if factory changed since the last run
-                {
-                     context.getState().destroy();
-                     context.getState().create( settings.getFactory() );
-                }
-
-                context.getState().startup();
-            }
-            catch ( Exception e )
-            {
-                notifier.testAborted( settings.getDescription(), e );
-                return;
-            }
-
-            // state object what ever it is will handle tagging before test method
-            // invocation and it will also change the state so we can just return
-            context.getState().test( testClass, testMethod, notifier, settings );
-            return;
-        }
-
-        try
-        {
-            context.getService().getChangeLog().tag();
-        }
-        catch ( NamingException e )
-        {
-            // @TODO - we might want to check the revision of the service before
-            // we presume that it has been soiled.  Some tests may simply peform
-            // some read operations or checks on the service and may not alter it
-            context.setState( context.getStartedDirtyState() );
-
-            notifier.testAborted( settings.getDescription(), e );
-            return;
-        }
-
-        TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
-
-        // @TODO - we might want to check the revision of the service before
-        // we presume that it has been soiled.  Some tests may simply peform
-        // some read operations or checks on the service and may not alter it
-        context.setState( context.getStartedDirtyState() );
-    }
-
-
-    public void revert() throws NamingException
-    {
-        throw new IllegalStateException( "Cannot revert already reverted service." );
-    }
+/*
+ * 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.integ.state;
+
+
+import java.io.IOException;
+
+import javax.naming.NamingException;
+
+import org.apache.directory.server.core.integ.InheritableSettings;
+import static org.apache.directory.server.core.integ.IntegrationUtils.doDelete;
+import org.junit.internal.runners.TestClass;
+import org.junit.internal.runners.TestMethod;
+import org.junit.runner.notification.RunNotifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+
+/**
+ * The state of a running test service which has been used for running
+ * integration tests and has been reverted to contain the same content as it
+ * did when created and started.  It is not really pristine however for all
+ * practical purposes of integration testing it appears to be the same as
+ * when first started.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class StartedNormalState extends AbstractState
+{
+    private static final Logger LOG = LoggerFactory.getLogger( StartedNormalState.class );
+
+
+    /**
+     * 
+     * Creates a new instance of StartedNormalState.
+     *
+     * @param context the test's context
+     */
+    public StartedNormalState( TestServiceContext context )
+    {
+        super( context );
+    }
+
+
+    /**
+     * Action where an attempt is made to destroy the service. This
+     * entails nulling out reference to it and triggering garbage
+     * collection.
+     */
+    public void destroy()
+    {
+        LOG.debug( "calling destroy()" );
+        context.setService( null );
+        context.setState( context.getNonExistentState() );
+        System.gc();
+    }
+
+
+    /**
+     * Action where an attempt is made to erase the contents of the
+     * working directory used by the service for various files including
+     * partition database files.
+     *
+     * @throws IOException on errors while deleting the working directory
+     */
+    public void cleanup() throws IOException
+    {
+        LOG.debug( "calling cleanup()" );
+        doDelete( context.getService().getWorkingDirectory() );
+    }
+
+
+    /**
+     * Action where an attempt is made to start up the service.
+     *
+     * @throws Exception on failures to start the core directory service
+     */
+    public void startup() throws Exception
+    {
+        LOG.debug( "calling startup()" );
+        context.getService().startup();
+    }
+
+
+    /**
+     * Action where an attempt is made to shutdown the service.
+     *
+     * @throws Exception on failures to stop the core directory service
+     */
+    public void shutdown() throws Exception
+    {
+        LOG.debug( "calling shutdown()" );
+        context.getService().shutdown();
+    }
+
+
+    /**
+     * Action where an attempt is made to revert the service to it's
+     * initial start up state by using a previous snapshot.
+     *
+     * @throws Exception on failures to revert the state of the core
+     * directory service
+     */
+    public void revert() throws Exception
+    {
+        LOG.debug( "calling revert()" );
+        context.getService().revert();
+    }
+
+
+    /**
+     * Action where an attempt is made to run a test against the service.
+     *
+     * All annotations should have already been processed for
+     * InheritableSettings yet they and others can be processed since we have
+     * access to the method annotations below
+     *
+     * @param testClass the class whose test method is to be run
+     * @param testMethod the test method which is to be run
+     * @param notifier a notifier to report failures to
+     * @param settings the inherited settings and annotations associated with
+     * the test method
+     */
+    public void test( TestClass testClass, TestMethod testMethod, RunNotifier notifier, InheritableSettings settings )
+    {
+        LOG.debug( "calling test(): {}, mode {}", settings.getDescription().getDisplayName(), settings.getMode() );
+
+        if ( testMethod.isIgnored() )
+        {
+            // The test is ignored
+            return;
+        }
+
+        switch ( settings.getMode() )
+        {
+            case ROLLBACK:
+                try
+                {
+                    context.getService().getChangeLog().tag();
+                }
+                catch ( NamingException e )
+                {
+                    // @TODO - we might want to check the revision of the service before
+                    // we presume that it has been soiled.  Some tests may simply perform
+                    // some read operations or checks on the service and may not alter it
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+
+                // Inject the LDIFs, if any 
+                injectLdifs( context.getService(), settings );
+                
+                TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
+                
+                try
+                {
+                    revert();
+                }
+                catch ( Exception e )
+                {
+                    // @TODO - we might want to check the revision of the service before
+                    // we presume that it has been soiled.  Some tests may simply perform
+                    // some read operations or checks on the service and may not alter it
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+                
+                return;
+                
+            case RESTART :
+                // Inject the LDIFs, if any 
+                injectLdifs( context.getService(), settings );
+                
+
+                TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
+
+                try
+                {
+                    shutdown();
+                }
+                catch ( Exception e )
+                {
+                    // @TODO - we might want to check the revision of the service before
+                    // we presume that it has been soiled.  Some tests may simply perform
+                    // some read operations or checks on the service and may not alter it
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+                
+                try
+                {
+                    startup();
+                }
+                catch ( Exception e )
+                {
+                    LOG.error( "Failed to create and start new server instance: " + e );
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+                
+                return;
+                
+            default:
+                return;
+        }
+    }
 }
\ No newline at end of file

Modified: directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedPristineState.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedPristineState.java?rev=664015&r1=664014&r2=664015&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedPristineState.java (original)
+++ directory/apacheds/branches/bigbang/core-integ/src/main/java/org/apache/directory/server/core/integ/state/StartedPristineState.java Fri Jun  6 09:21:35 2008
@@ -1,124 +1,194 @@
-/*
- * 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.integ.state;
-
-
-import org.apache.directory.server.core.integ.DirectoryServiceFactory;
-import org.apache.directory.server.core.integ.InheritableSettings;
-import org.apache.directory.server.core.integ.SetupMode;
-import org.junit.internal.runners.TestClass;
-import org.junit.internal.runners.TestMethod;
-import org.junit.runner.notification.RunNotifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.naming.NamingException;
-
-
-/**
- * A test service state where the server is running and has not been used for
- * any integration test since it was created.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class StartedPristineState implements TestServiceState
-{
-    private static final Logger LOG = LoggerFactory.getLogger( StartedPristineState.class );
-    private final TestServiceContext context;
-
-
-    public StartedPristineState( TestServiceContext context )
-    {
-        this.context = context;
-    }
-
-
-    public void create( DirectoryServiceFactory factory )
-    {
-        throw new IllegalStateException( "Cannot create new instance while service is running." );
-    }
-
-
-    public void destroy()
-    {
-        throw new IllegalStateException( "Cannot destroy started service." );
-    }
-
-
-    public void cleanup()
-    {
-        throw new IllegalStateException( "Cannot cleanup started service." );
-    }
-
-
-    public void startup()
-    {
-        throw new IllegalStateException( "Cannot startup started service." );
-    }
-
-
-    public void shutdown() throws Exception
-    {
-        LOG.debug( "calling shutdown()" );
-        context.getService().shutdown();
-        context.setState( context.getStoppedPristineState() );
-    }
-
-
-    public void test( TestClass testClass, TestMethod testMethod, RunNotifier notifier, InheritableSettings settings )
-    {
-        LOG.debug( "calling test(): {}", settings.getDescription().getDisplayName() );
-
-        if ( settings.getMode() == SetupMode.NOSERVICE || testMethod.isIgnored() )
-        {
-            // no state change here
-            TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
-            return;
-        }
-
-        try
-        {
-            context.getService().getChangeLog().tag();
-        }
-        catch ( NamingException e )
-        {
-            // @TODO - we might want to check the revision of the service before
-            // we presume that it has been soiled.  Some tests may simply peform
-            // some read operations or checks on the service and may not alter it
-            context.setState( context.getStartedDirtyState() );
-
-            notifier.testAborted( settings.getDescription(), e );
-            return;
-        }
-
-        TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
-
-        // @TODO - we might want to check the revision of the service before
-        // we presume that it has been soiled.  Some tests may simply peform
-        // some read operations or checks on the service and may not alter it
-        context.setState( context.getStartedDirtyState() );
-    }
-
-
-    public void revert() throws NamingException
-    {
-        throw new IllegalStateException( "Cannot revert already pristine service." );
-    }
+/*
+ * 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.integ.state;
+
+
+import java.io.IOException;
+import javax.naming.NamingException;
+
+import org.apache.directory.server.core.integ.InheritableSettings;
+import static org.apache.directory.server.core.integ.IntegrationUtils.doDelete;
+import org.junit.internal.runners.TestClass;
+import org.junit.internal.runners.TestMethod;
+import org.junit.runner.notification.RunNotifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+
+/**
+ * A test service state where the server is running and has not been used for
+ * any integration test since it was created.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class StartedPristineState extends AbstractState
+{
+    private static final Logger LOG = LoggerFactory.getLogger( StartedPristineState.class );
+
+
+    /**
+     * 
+     * Creates a new instance of StartedPristineState.
+     *
+     * @param context the test's context
+     */
+    public StartedPristineState( TestServiceContext context )
+    {
+        super( context );
+    }
+
+
+    /**
+     * Action where an attempt is made to erase the contents of the
+     * working directory used by the service for various files including
+     * partition database files.
+     *
+     * @throws IOException on errors while deleting the working directory
+     */
+    public void cleanup() throws IOException
+    {
+        LOG.debug( "calling cleanup()" );
+        doDelete( context.getService().getWorkingDirectory() );
+    }
+
+
+    /**
+     * Action where an attempt is made to start up the service.
+     *
+     * @throws Exception on failures to start the core directory service
+     */
+    public void startup() throws Exception
+    {
+        LOG.debug( "calling startup()" );
+        context.getService().startup();
+    }
+
+
+    /**
+     * Action where an attempt is made to shutdown the service.
+     *
+     * @throws Exception on failures to stop the core directory service
+     */
+    public void shutdown() throws Exception
+    {
+        LOG.debug( "calling shutdown()" );
+        context.getService().shutdown();
+    }
+
+
+    /**
+     * Action where an attempt is made to run a test against the service.
+     *
+     * All annotations should have already been processed for
+     * InheritableSettings yet they and others can be processed since we have
+     * access to the method annotations below
+     *
+     * @param testClass the class whose test method is to be run
+     * @param testMethod the test method which is to be run
+     * @param notifier a notifier to report failures to
+     * @param settings the inherited settings and annotations associated with
+     * the test method
+     */
+    public void test( TestClass testClass, TestMethod testMethod, RunNotifier notifier, InheritableSettings settings )
+    {
+        LOG.debug( "calling test(): {}, mode {}", settings.getDescription().getDisplayName(), settings.getMode() );
+
+        if ( testMethod.isIgnored() )
+        {
+            // The test is ignored
+            return;
+        }
+
+        switch ( settings.getMode() )
+        {
+            case PRISTINE:
+                // Inject the LDIFs, if any 
+                injectLdifs( context.getService(), settings );
+                
+                TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
+                
+                try
+                {
+                    shutdown();
+                }
+                catch ( Exception e )
+                {
+                    // @TODO - we might want to check the revision of the service before
+                    // we presume that it has been soiled.  Some tests may simply perform
+                    // some read operations or checks on the service and may not alter it
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+                
+                try
+                {
+                    cleanup();
+                }
+                catch ( IOException ioe )
+                {
+                    LOG.error( "Failed to cleanup new server instance: " + ioe );
+                    notifier.testAborted( settings.getDescription(), ioe );
+                    return;
+                }
+
+                destroy();
+                context.setState( context.getNonExistentState() );
+                return;
+                
+            case ROLLBACK:
+                try
+                {
+                    context.getService().getChangeLog().tag();
+                }
+                catch ( NamingException e )
+                {
+                    // @TODO - we might want to check the revision of the service before
+                    // we presume that it has been soiled.  Some tests may simply perform
+                    // some read operations or checks on the service and may not alter it
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+
+                // Inject the LDIFs, if any 
+                injectLdifs( context.getService(), settings );
+                
+                TestServiceContext.invokeTest( testClass, testMethod, notifier, settings.getDescription() );
+                context.setState( context.getStartedNormalState() );
+
+                try
+                {
+                    context.getState().revert();
+                }
+                catch ( Exception e )
+                {
+                    // @TODO - we might want to check the revision of the service before
+                    // we presume that it has been soiled.  Some tests may simply perform
+                    // some read operations or checks on the service and may not alter it
+                    notifier.testAborted( settings.getDescription(), e );
+                    return;
+                }
+                return;
+
+            default:
+                return;
+        }
+    }
 }
\ No newline at end of file