blob: 4d203b0a52b8c87136e8650ad60d495cd8f74945 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.directory.server.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();
}
}
}