package com.griddynamics.jagger.user.test.configurations.load;
import com.griddynamics.jagger.user.test.configurations.load.auxiliary.NumberOfUsers;
import java.util.Objects;
/**
* This class represents a group of virtual users.
* Available attributes:<p>
* - numberOfUsers - A goal number of threads.<p>
* - lifeTimeInSeconds - Describes how long threads will be alive. Default is 2 days.<p>
* - startDelayInSeconds - Delay before first thread will start. Default is 0.<p>
* - slewRateUsersPerSecond - Describes how many threads to start during every iteration. Default is numberOfUsers value.<p>
*
* Examples: @n
* @code
* JLoadProfileUsers u = JLoadProfileUsers.builder(NumberOfUsers.of(5)).withStartDelayInSeconds(10).build();
* @endcode
* @image html load_GroupWithDelay.png "User group load with start delay"
* @n
* @code
* JLoadProfileUsers u = JLoadProfileUsers.builder(NumberOfUsers.of(20)).withSlewRateUsersPerSecond(1).build();
* @endcode
* @image html load_GroupSlewRate.png "User group load with slew rate"
*
* @ingroup Main_Load_profiles_group
*/
public class JLoadProfileUsers {
private final long numberOfUsers;
private final long lifeTimeInSeconds;
private final long startDelayInSeconds;
private final double slewRateUsersPerSecond;
private JLoadProfileUsers(Builder builder) {
this.numberOfUsers = builder.numberOfUsers.value();
this.lifeTimeInSeconds = builder.lifeTimeInSeconds;
this.startDelayInSeconds = builder.startDelayInSeconds;
this.slewRateUsersPerSecond = builder.slewRateUsersPerSecond;
}
/** Builder of the JLoadProfileUsers
* @n
* @details Constructor parameters are mandatory for the JLoadProfileUsers. All parameters, set by setters are optional
* @n
* @param numberOfUsers - The number of users in user group
*/
public static Builder builder(NumberOfUsers numberOfUsers) {
return new Builder(numberOfUsers);
}
public static class Builder {
private final NumberOfUsers numberOfUsers;
private long lifeTimeInSeconds;
private long startDelayInSeconds;
private double slewRateUsersPerSecond;
/** Builder of the JLoadProfileUsers
* @n
* @details Constructor parameters are mandatory for the JLoadProfileUsers. All parameters, set by setters are optional
* @n
* @param numberOfUsers - The number of users in user group
*/
private Builder(NumberOfUsers numberOfUsers) {
Objects.requireNonNull(numberOfUsers);
this.numberOfUsers = numberOfUsers;
this.lifeTimeInSeconds = 60 * 60 * 48; // 2 days
this.slewRateUsersPerSecond = numberOfUsers.value();
}
/** Creates an object of JLoadProfileUsers type with custom parameters.
* @return JLoadProfileUsers object.
*/
public JLoadProfileUsers build() {
return new JLoadProfileUsers(this);
}
/**
* Optional: Life time in seconds. Default is 2 days.
* @param lifeTimeInSeconds Describes how long threads will be alive
*/
public Builder withLifeTimeInSeconds(long lifeTimeInSeconds) {
if (lifeTimeInSeconds <= 0) {
throw new IllegalArgumentException(String.format("Life time must be > 0. Provided value is %s", lifeTimeInSeconds));
}
this.lifeTimeInSeconds = lifeTimeInSeconds;
return this;
}
/**
* Optional: Start delay in secondsStart delay in seconds. Default is 0.
* @param startDelayInSeconds Delay before first thread will start
*/
public Builder withStartDelayInSeconds(long startDelayInSeconds) {
if (startDelayInSeconds < 0) {
throw new IllegalArgumentException(String.format("Start delay must be >= 0. Provided value is %s", startDelayInSeconds));
}
this.startDelayInSeconds = startDelayInSeconds;
return this;
}
/**
* Optional: Slew rate users per second. Default is numberOfUsers value.
* @param slewRateUsersPerSecond Describes how many threads to start during every iteration
*/
public Builder withSlewRateUsersPerSecond(double slewRateUsersPerSecond) {
if (slewRateUsersPerSecond <= 0) {
throw new IllegalArgumentException(
String.format("Slew rate users per second must be > 0. Provided value is %s", slewRateUsersPerSecond));
}
this.slewRateUsersPerSecond = slewRateUsersPerSecond;
return this;
}
}
public long getNumberOfUsers() {
return numberOfUsers;
}
public long getLifeTimeInSeconds() {
return lifeTimeInSeconds;
}
public long getStartDelayInSeconds() {
return startDelayInSeconds;
}
public double getSlewRateUsersPerSecond() {
return slewRateUsersPerSecond;
}
}