/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* Licensed 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 com.datastax.driver.core;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* The configuration to use when running tests with {@link CCMTestsSupport}.
* <p/>
* This annotation can be used at the class level, or at the method level if you annotate the class with
* {@code @CreateCCM(PER_METHOD)}.
*/
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface CCMConfig {
final class Undefined {
}
/**
* The number of nodes to create, per data center.
* If not set, this defaults to {@code {1}}, i.e., one data center with one node.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return The number of nodes to create, per data center.
*/
int[] numberOfNodes() default {};
/**
* The C* or DSE version to use; defaults to the version defined by
* the System property {@code cassandra.version}.
* <p/>
* Note that setting this attribute completely
* overrides the System properties {@code cassandra.version}
* and {@code cassandra.directory}.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return The C* or DSE version to use
* @see CCMBridge#getCassandraVersion()
*/
String version() default "";
/**
* Whether to launch a DSE instance rather than an OSS C*.
* <p/>
* Note that setting this attribute completely
* overrides the System property {@code dse}.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return {@code true} to launch a DSE instance, {@code false} to launch an OSS C* instance (default).
*/
boolean[] dse() default {};
/**
* Configuration items to add to cassandra.yaml configuration file.
* Each configuration item must be in the form {@code key:value}.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return Configuration items to add to cassandra.yaml configuration file.
*/
String[] config() default {};
/**
* Configuration items to add to dse.yaml configuration file.
* Each configuration item must be in the form {@code key:value}.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return Configuration items to add to dse.yaml configuration file.
*/
String[] dseConfig() default {};
/**
* JVM args to use when starting hosts.
* System properties should be provided one by one, in the form
* {@code -Dname=value}.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return JVM args to use when starting hosts.
*/
String[] jvmArgs() default {};
/**
* Free-form options that will be added at the end of the {@code ccm create} command.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return Free-form options that will be added at the end of the {@code ccm create} command.
*/
String[] options() default {};
/**
* Whether to use SSL encryption.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return {@code true} to use encryption, {@code false} to use unencrypted communication (default).
*/
boolean[] ssl() default {};
/**
* Whether to use authentication. Implies the use of SSL encryption.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return {@code true} to use authentication, {@code false} to use unauthenticated communication (default).
*/
boolean[] auth() default {};
/**
* The workloads to assign to each node. If this attribute is defined,
* the number of its elements must be lesser than or equal to the number of nodes in the cluster.
* <p/>
* This attribute is ignored if {@link #ccmProvider()} is defined.
*
* @return The workloads to assign to each node.
*/
CCMWorkload[] workloads() default {};
/**
* Returns {@code true} if a {@link CCMBridge} instance should be automatically created, {@code false} otherwise.
* <p/>
* If {@code true}, a CCM cluster builder will be created or retrieved from the cache.
* If {@code false}, no CCM cluster will be activated for this test; this can be useful
* when some tests in a test class require CCM, while others don't but are in one of the allowed
* CCM test groups ("short" for example).
* <p/>
* The cluster will be created once for the whole class if CCM test mode is {@link CreateCCM.TestMode#PER_CLASS},
* or once per test method, if the CCM test mode is {@link CreateCCM.TestMode#PER_METHOD},
*
* @return {@code true} if a {@link Cluster} instance should be automatically created, {@code false} otherwise.
*/
boolean[] createCcm() default {};
/**
* Returns {@code true} if a {@link Cluster} instance should be automatically created, {@code false} otherwise.
* <p/>
* If {@code true}, a cluster builder will be obtained by invoking the method
* specified by {@link #clusterProvider()} and {@link #clusterProviderClass()}.
* <p/>
* The CCM cluster will be created once for the whole class if CCM test mode is {@link CreateCCM.TestMode#PER_CLASS},
* or once per test method, if the CCM test mode is {@link CreateCCM.TestMode#PER_METHOD},
*
* @return {@code true} if a {@link Cluster} instance should be automatically created, {@code false} otherwise.
*/
boolean[] createCluster() default {};
/**
* Returns {@code true} if a {@link Session} instance should be automatically created, {@code false} otherwise.
* <p/>
* If {@code true}, a cluster builder will be obtained by invoking the method
* specified by {@link #clusterProvider()} and {@link #clusterProviderClass()},
* and then the session will be created through {@link Cluster#connect()}.
* <p/>
* The session will be created once for the whole class if CCM test mode is {@link CreateCCM.TestMode#PER_CLASS},
* or once per test method, if the CCM test mode is {@link CreateCCM.TestMode#PER_METHOD},
*
* @return {@code true} if a {@link Session} instance should be automatically created, {@code false} otherwise.
*/
boolean[] createSession() default {};
/**
* Returns {@code true} if a test keyspace should be automatically created, {@code false} otherwise.
* <p/>
* If {@code true}, a cluster builder will be obtained by invoking the method
* specified by {@link #clusterProvider()} and {@link #clusterProviderClass()},
* then a session will be created through {@link Cluster#connect()},
* and this session will be used to create the test keyspace.
* <p/>
* The keyspace will be created once for the whole class if CCM test mode is {@link CreateCCM.TestMode#PER_CLASS},
* or once per test method, if the CCM test mode is {@link CreateCCM.TestMode#PER_METHOD}.
* <p/>
* The test keyspace will be automatically populated upon creation with fixtures provided by
* {@link #testInitializer()} and {@link #testInitializerClass()}.
*
* @return {@code true} if a test keyspace should be automatically created, {@code false} otherwise.
*/
boolean[] createKeyspace() default {};
/**
* Returns {@code true} if the test class or the test method alters the CCM cluster,
* e.g. by adding or removing nodes,
* in which case, it should not be reused after the test is finished.
* <p/>
* If {@code true}, CCM cluster will be destroyed after the test method if test mode is
* {@link CreateCCM.TestMode#PER_METHOD}, or after the test class, if test mode
* is {@link CreateCCM.TestMode#PER_CLASS}.
*
* @return {@code true} if the test class or the test method alters the CCM cluster used,
* {@code false} otherwise.
*/
boolean[] dirtiesContext() default {};
/**
* Returns the name of the method that should be invoked to obtain
* a {@link com.datastax.driver.core.CCMBridge.Builder} instance.
* <p/>
* This method should be declared in {@link #ccmProviderClass()},
* or if that attribute is not set,
* it will be looked up on the test class itself.
* <p/>
* The method should not have parameters. It can be static or not,
* and have any visibility.
* <p/>
* By default, a {@link com.datastax.driver.core.CCMBridge.Builder} instance
* is obtained by parsing other attributes of this annotation.
*
* @return The name of the method that should be invoked to obtain a
* {@link com.datastax.driver.core.CCMBridge.Builder} instance.
*/
String ccmProvider() default "";
/**
* Returns the name of the class that should be invoked to obtain
* a {@link com.datastax.driver.core.CCMBridge.Builder} instance.
* <p/>
* This class should contain a method named after {@link #ccmProvider()};
* if this attribute is not set,
* it will default to the test class itself.
*
* @return The name of the class that should be invoked to obtain a
* {@link com.datastax.driver.core.CCMBridge.Builder} instance.
*/
Class<?> ccmProviderClass() default Undefined.class;
/**
* Returns the name of the method that should be invoked to obtain
* a {@link com.datastax.driver.core.Cluster.Builder} instance.
* <p/>
* This method should be declared in {@link #clusterProviderClass()},
* or if that attribute is not set,
* it will be looked up on the test class itself.
* <p/>
* The method should not have parameters. It can be static or not,
* and have any visibility.
* <p/>
* By default, the test will look for a method named after {@code createClusterBuilder}.
*
* @return The name of the method that should be invoked to obtain a
* {@link com.datastax.driver.core.Cluster.Builder} instance.
*/
String clusterProvider() default "";
/**
* Returns the name of the class that should be invoked to obtain
* a {@link com.datastax.driver.core.Cluster.Builder} instance.
* <p/>
* This class should contain a method named after {@link #clusterProvider()};
* if this attribute is not set,
* it will default to the test class itself.
*
* @return The name of the class that should be invoked to obtain a
* {@link com.datastax.driver.core.Cluster.Builder} instance.
*/
Class<?> clusterProviderClass() default Undefined.class;
/**
* Returns the name of the method that should be invoked once the test context
* is initialized.
* <p/>
* This method should be declared in {@link #testInitializerClass()},
* or if that attribute is not set,
* it will be looked up on the test class itself.
* <p/>
* The method should not have parameters. It can be static or not,
* and have any visibility.
* <p/>
* By default, the framework will look for a method named
* {@code onTestContextInitialized}.
*
* @return The name of the method that should be invoked once the test context
* is initialized.
*/
String testInitializer() default "";
/**
* Returns the name of the class that should be invoked once the test context
* is initialized.
* <p/>
* This class should contain a method named after {@link #testInitializer()};
* if this attribute is not set,
* it will default to the test class itself.
*
* @return The name of the class that should be invoked once the test context
* is initialized.
*/
Class<?> testInitializerClass() default Undefined.class;
}