package ${package}.simple.examples;
import static java.util.Collections.singletonList;
import com.griddynamics.jagger.engine.e1.collector.CollectThreadsTestListener;
import com.griddynamics.jagger.engine.e1.collector.ExampleResponseValidatorProvider;
import com.griddynamics.jagger.engine.e1.collector.NotNullResponseValidator;
import com.griddynamics.jagger.engine.e1.collector.DefaultResponseValidatorProvider;
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.invoker.RoundRobinLoadBalancer;
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.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 ${package}.util.JaggerPropertiesProvider;
import static com.griddynamics.jagger.user.test.configurations.loadbalancer.JLoadBalancer.DefaultLoadBalancer.ROUND_ROBIN;
import java.util.Arrays;
// begin: following section is used for docu generation - Detailed load test scenario configuration
/**
* By extending {@link JaggerPropertiesProvider} you get access to all Jagger properties and test properties. You can use them for configuration of JLoadScenario.<p>
* Benefit of this approach is that you can change JLoadScenario configuration by changing properties file and no recompilation is needed.<p>
* Properties in test.properties do not override properties from environment.properties.
*/
@Configuration
public class JLoadScenarioProvider extends JaggerPropertiesProvider {
@Bean
public JLoadScenario exampleJaggerLoadScenario() {
// Example of using JaggerPropertiesProvider
String testDefinitionComment = getTestPropertyValue("example.jagger.test.definition.comment");
JTestDefinition jTestDefinition = JTestDefinition
.builder(Id.of("exampleJaggerTestDefinition"), new EndpointsProvider())
// optional
.withComment(testDefinitionComment)
.withInvoker(CustomHttpInvokerProvider.nonVerbose())
.withQueryProvider(new QueriesProvider())
.withLoadBalancer(JLoadBalancer.builder(ROUND_ROBIN).withRandomSeed(42).build())
.addValidator(new ExampleResponseValidatorProvider("we are always good"))
.addValidator(DefaultResponseValidatorProvider.of(NotNullResponseValidator.class))
.addListener(new NotNullInvocationListener())
.build();
// Example of using JaggerPropertiesProvider
Long iterationsNumber = Long.valueOf(getTestPropertyValue("example.jagger.load.scenario.termination.iterations"));
Long maxDurationInSeconds = Long.valueOf(getTestPropertyValue("example.jagger.load.scenario.termination.max.duration.seconds"));
JTerminationCriteria jTerminationCriteria = JTerminationCriteriaIterations
.of(IterationsNumber.of(iterationsNumber), MaxDurationInSeconds.of(maxDurationInSeconds));
JLoadProfile jLoadProfileRps = JLoadProfileRps
.builder(RequestsPerSecond.of(10))
.withMaxLoadThreads(10)
.withWarmUpTimeInMilliseconds(10000)
.build();
// For standard metrics use JMetricName.
// JLimitVsRefValue is used to compare the results with the referenced value.
JLimit successRateLimit = JLimitVsRefValue.builder(JMetricName.PERF_SUCCESS_RATE_OK, RefValue.of(1D))
// the threshold is relative.
.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.
JLimit throughputLimit = JLimitVsBaseline.builder(JMetricName.PERF_THROUGHPUT)
// the threshold is relative.
.withOnlyErrors(LowErrThresh.of(0.99), UpErrThresh.of(1.00001))
.build();
// For standard metrics use JMetricName.
// JMetricName.PERF_LATENCY_PERCENTILE is used to set limits for latency percentile metrics.
JLimit latencyPercentileLimit = JLimitVsRefValue.builder(JMetricName.PERF_LATENCY_PERCENTILE(95D), RefValue.of(0.1D))
// the threshold is relative.
.withOnlyWarnings(LowWarnThresh.of(0.50), UpWarnThresh.of(1.5))
.build();
JLoadTest jLoadTest = JLoadTest
.builder(Id.of("exampleJaggerLoadTest"), jTestDefinition, jLoadProfileRps, jTerminationCriteria)
.addListener(new CollectThreadsTestListener())
.withLimits(successRateLimit, throughputLimit, latencyPercentileLimit)
.build();
JParallelTestsGroup jParallelTestsGroup = JParallelTestsGroup
.builder(Id.of("exampleJaggerParallelTestsGroup"), jLoadTest)
.addListener(new ExampleTestGroupListener())
.build();
// 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())
.withLatencyPercentiles(Arrays.asList(10D, 25.5D, 42D, 95D))
.build();
}
// end: following section is used for docu generation - Detailed load test scenario configuration
@Bean
public JLoadScenario myFirstJaggerLoadScenario() {
JTestDefinition description = JTestDefinition
.builder(Id.of("myFirstJaggerTestDefinition"), new EndpointsProvider())
// optional
.withComment("no comments")
.withQueryProvider(new QueriesProvider())
.addValidators(singletonList(DefaultResponseValidatorProvider.of(NotNullResponseValidator.class)))
.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();
}
}