package com.griddynamics.jagger.user.test.configurations;
import com.google.common.collect.Lists;
import com.griddynamics.jagger.engine.e1.Provider;
import com.griddynamics.jagger.engine.e1.collector.test.TestListener;
import com.griddynamics.jagger.user.test.configurations.auxiliary.Id;
import com.griddynamics.jagger.user.test.configurations.limits.JLimit;
import com.griddynamics.jagger.user.test.configurations.load.JLoadProfile;
import com.griddynamics.jagger.user.test.configurations.termination.JTerminationCriteria;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
/**
* @brief Describes the instance of a load test performed by Jagger
* @n
* @par Details:
* @details JLoadTest describes an instance of the load test, build with JTestDefinition. JLoadTest sets following parameters:
* @li load strategy - how load will be applied
* @li termination criteria - when load should be terminated
*
* See @ref section_writing_test_load_scenario for more details @n
* @n
* More information on the parameter of the test definition, you can find in the Builder documentation @n
* @n
* Code example:
* @dontinclude SimpleJLoadScenarioProvider.java
* @skip begin: following section is used for docu generation - Load test scenario configuration
* @until end: following section is used for docu generation - Load test scenario configuration
*/
public class JLoadTest {
private final String id;
private final JLoadProfile load;
private final JTestDefinition testDescription;
private final JTerminationCriteria termination;
private final List<JLimit> limits;
private final List<Provider<TestListener>> listeners;
private JLoadTest(Builder builder) {
this.id = builder.id.value();
this.testDescription = builder.jTestDefinition;
this.load = builder.load;
this.termination = builder.termination;
this.limits = builder.limits;
this.listeners = builder.listeners;
}
/**
* Builder of the JLoadTest
* @param id - Unique id of the test definition
* @param definition - Definition of the load test (sources of the test data and used protocol)
* @param load - Load strategy for this load test (Virtual users, Requests per seconds, etc)
* @param termination - Termination criteria for this load test (when load test should be finished)
* @n
* @details Constructor parameters are mandatory for the JLoadTest. JLoadTest parameters, set by setters are optional
* @n
*/
public static Builder builder(Id id, JTestDefinition definition, JLoadProfile load, JTerminationCriteria termination) {
return new Builder(id, definition, load, termination);
}
public static class Builder {
private final Id id;
private final JTestDefinition jTestDefinition;
private final JLoadProfile load;
private final JTerminationCriteria termination;
private List<JLimit> limits;
private List<Provider<TestListener>> listeners = Lists.newArrayList();
private Builder(Id id, JTestDefinition jTestDefinition, JLoadProfile load, JTerminationCriteria termination) {
this.id = id;
this.jTestDefinition = jTestDefinition;
this.load = load;
this.termination = termination;
this.limits = new LinkedList<>();
}
/**
* Optional: Adds instances of subtypes of {@link com.griddynamics.jagger.engine.e1.Provider<TestListener>}
* Listeners will be executed before, after and periodically during a test
* @n
* Example:
* @code
* addListeners(Arrays.asList(new CollectThreadsTestListener()))
* @endcode
* @see com.griddynamics.jagger.engine.e1.collector.CollectThreadsTestListener for example
*/
public Builder addListeners(List<Provider<TestListener>> listeners) {
this.listeners.addAll(listeners);
return this;
}
/**
* Optional: Adds a subtype instance of {@link com.griddynamics.jagger.engine.e1.Provider<TestListener>}
* Listener will be executed before, after and periodically during a test
* @n
* Example:
* @code
* addListener(new CollectThreadsTestListener())
* @endcode
* @see com.griddynamics.jagger.engine.e1.collector.CollectThreadsTestListener for example
*/
public Builder addListener(Provider<TestListener> listener) {
this.listeners.add(listener);
return this;
}
/**
* Optional: Set limits for a test.
*
* @param limits array of {@link JLimit}.
*/
public Builder withLimits(JLimit... limits) {
Objects.requireNonNull(limits);
this.limits = Arrays.asList(limits);
return this;
}
/**
* Optional: Set limits for a test.
*
* @param limits list of {@link JLimit}.
*/
public Builder withLimits(List<JLimit> limits) {
Objects.requireNonNull(limits);
this.limits = limits;
return this;
}
/**
* Optional: Add limits for a test.
*
* @param limits array of {@link JLimit}.
*/
public Builder addLimits(JLimit... limits){
Objects.requireNonNull(limits);
this.limits.addAll(Arrays.asList(limits));
return this;
}
/**
* Optional: Add limits for a test.
*
* @param limits list of {@link JLimit}.
*/
public Builder addLimits(List<JLimit> limits){
Objects.requireNonNull(limits);
this.limits.addAll(limits);
return this;
}
/**
* Create the object of JLoadTest with custom parameters.
*
* @return JLoadTest object.
*/
public JLoadTest build() {
return new JLoadTest(this);
}
}
public String getId() {
return id;
}
public JTestDefinition getTestDescription() {
return testDescription;
}
public JLoadProfile getLoad() {
return load;
}
public JTerminationCriteria getTermination() {
return termination;
}
public List<JLimit> getLimits() {
return limits;
}
public List<Provider<TestListener>> getListeners() {
return listeners;
}
}