package com.griddynamics.jagger;
import com.griddynamics.jagger.engine.e1.collector.CollectThreadsTestListener;
import com.griddynamics.jagger.engine.e1.collector.DefaultResponseValidatorProvider;
import com.griddynamics.jagger.engine.e1.collector.ExampleResponseValidatorProvider;
import com.griddynamics.jagger.engine.e1.collector.JHttpResponseStatusValidatorProvider;
import com.griddynamics.jagger.engine.e1.collector.NotNullResponseValidator;
import com.griddynamics.jagger.engine.e1.collector.invocation.ExampleInvocationListener;
import com.griddynamics.jagger.engine.e1.collector.invocation.NotNullInvocationListener;
import com.griddynamics.jagger.engine.e1.collector.loadscenario.ExampleLoadScenarioListener;
import com.griddynamics.jagger.engine.e1.collector.testgroup.ExampleTestGroupListener;
import com.griddynamics.jagger.user.test.configurations.JLoadScenario;
import com.griddynamics.jagger.user.test.configurations.JLoadTest;
import com.griddynamics.jagger.user.test.configurations.JParallelTestsGroup;
import com.griddynamics.jagger.user.test.configurations.JTestDefinition;
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.limits.JLimitVsBaseline;
import com.griddynamics.jagger.user.test.configurations.limits.JLimitVsRefValue;
import com.griddynamics.jagger.user.test.configurations.limits.auxiliary.JMetricName;
import com.griddynamics.jagger.user.test.configurations.limits.auxiliary.LowErrThresh;
import com.griddynamics.jagger.user.test.configurations.limits.auxiliary.LowWarnThresh;
import com.griddynamics.jagger.user.test.configurations.limits.auxiliary.RefValue;
import com.griddynamics.jagger.user.test.configurations.limits.auxiliary.UpErrThresh;
import com.griddynamics.jagger.user.test.configurations.limits.auxiliary.UpWarnThresh;
import com.griddynamics.jagger.user.test.configurations.load.JLoadProfile;
import com.griddynamics.jagger.user.test.configurations.load.JLoadProfileRps;
import com.griddynamics.jagger.user.test.configurations.load.auxiliary.RequestsPerSecond;
import com.griddynamics.jagger.user.test.configurations.loadbalancer.JLoadBalancer;
import com.griddynamics.jagger.user.test.configurations.termination.JTerminationCriteria;
import com.griddynamics.jagger.user.test.configurations.termination.JTerminationCriteriaBackground;
import com.griddynamics.jagger.user.test.configurations.termination.JTerminationCriteriaIterations;
import com.griddynamics.jagger.user.test.configurations.termination.auxiliary.IterationsNumber;
import com.griddynamics.jagger.user.test.configurations.termination.auxiliary.MaxDurationInSeconds;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static com.griddynamics.jagger.user.test.configurations.loadbalancer.JLoadBalancer.DefaultLoadBalancer.ROUND_ROBIN;
@Configuration
public class ExampleJLoadScenarioProvider {
@Bean
public JLoadScenario exampleJaggerLoadScenario() {
// begin: following section is used for docu generation - example of the invocation listener
JTestDefinition jTestDefinition = JTestDefinition
.builder(Id.of("exampleJaggerTestDefinition"), new ExampleEndpointsProvider())
// optional
.withComment("no comments")
.withInvoker(ExampleCustomHttpInvokerProvider.nonVerbose())
.withQueryProvider(new ExampleQueriesProvider())
.addValidator(new ExampleResponseValidatorProvider("we are always good"))
.addValidator(DefaultResponseValidatorProvider.of(NotNullResponseValidator.class))
.addValidator(JHttpResponseStatusValidatorProvider.of(200, 201, 204))
.addListener(new NotNullInvocationListener())
.addListener(new ExampleInvocationListener())
.withLoadBalancer(JLoadBalancer.builder(ROUND_ROBIN).withRandomSeed(42).build())
.build();
// end: following section is used for docu generation - example of the invocation listener
JTerminationCriteria jTerminationCriteria = JTerminationCriteriaIterations.of(IterationsNumber.of(1000), MaxDurationInSeconds.of(20));
JLoadProfile jLoadProfileRps = JLoadProfileRps
.builder(RequestsPerSecond.of(10))
.withMaxLoadThreads(10)
.withWarmUpTimeInMilliseconds(10000)
.build();
// begin: following section is used for docu generation - example of the limits
// For standard metrics use JMetricName.
// JLimitVsRefValue is used to compare the results with the referenced value.
// Thresholds are relative values. In the example below, accepted range for the Success rate metric is:
// 0.99 * 1.0 <= Accepted values <= 1.0 * 1.01
JLimit successRateLimit = JLimitVsRefValue.builder(JMetricName.PERF_SUCCESS_RATE_OK, RefValue.of(1D))
.withOnlyWarnings(LowWarnThresh.of(0.99), UpWarnThresh.of(1.01))
.build();
// For standard metrics use JMetricName.
// JLimitVsBaseline is used to compare the results with the baseline.
// Use 'chassis.engine.e1.reporting.session.comparison.baseline.session.id' to set baseline.
// Thresholds are relative values. In the example below, accepted range for the Throughput metric is:
// 0.99 * Reference value from the baseline session <= Accepted values <= Ref value * 1.00001
JLimit throughputLimit = JLimitVsBaseline.builder(JMetricName.PERF_THROUGHPUT)
.withOnlyErrors(LowErrThresh.of(0.99), UpErrThresh.of(1.00001))
.build();
JLoadTest jLoadTest = JLoadTest
.builder(Id.of("exampleJaggerLoadTest"), jTestDefinition, jLoadProfileRps, jTerminationCriteria)
.addListener(new CollectThreadsTestListener())
.withLimits(successRateLimit, throughputLimit)
.build();
// end: following section is used for docu generation - example of the limits
// begin: following section is used for docu generation - example of the test group listener
JParallelTestsGroup jParallelTestsGroup = JParallelTestsGroup
.builder(Id.of("exampleJaggerParallelTestsGroup"), jLoadTest)
.addListener(new ExampleTestGroupListener())
.build();
// end: following section is used for docu generation - example of the test group listener
// For JLoadScenario which is supposed to be executed by Jagger its ID must be set to 'jagger.load.scenario.id.to.execute' property's value
return JLoadScenario.builder(Id.of("exampleJaggerLoadScenario"), jParallelTestsGroup)
.addListener(new ExampleLoadScenarioListener())
.build();
}
@Bean
public JLoadScenario myFirstJaggerLoadScenario() {
JTestDefinition description = JTestDefinition
.builder(Id.of("myFirstJaggerTestDefinition"), new ExampleEndpointsProvider())
// optional
.withComment("no comments")
.withQueryProvider(new ExampleQueriesProvider())
.addValidator(DefaultResponseValidatorProvider.of(NotNullResponseValidator.class))
.addValidator(JHttpResponseStatusValidatorProvider.of("(200|201|203)"))
.build();
JLoadProfile load = JLoadProfileRps.builder(RequestsPerSecond.of(10)).withMaxLoadThreads(10).withWarmUpTimeInMilliseconds(10000).build();
JLoadProfile load2 = JLoadProfileRps.builder(RequestsPerSecond.of(20)).withMaxLoadThreads(20).withWarmUpTimeInMilliseconds(20000).build();
JTerminationCriteria termination = JTerminationCriteriaIterations.of(IterationsNumber.of(500), MaxDurationInSeconds.of(60));
JTerminationCriteria terminationBackground = JTerminationCriteriaBackground.getInstance();
JLoadTest test1 = JLoadTest.builder(Id.of("my_first_test"), description, load, termination).build();
JLoadTest test2 = JLoadTest.builder(Id.of("yet_another_test"), description, load2, terminationBackground).build();
JParallelTestsGroup testGroup = JParallelTestsGroup.builder(Id.of("my_first_test_group"), test1, test2).build();
return JLoadScenario.builder(Id.of("myFirstJaggerLoadScenario"), testGroup).build();
}
}