package integration_tests;
import com.loadimpact.eval.*;
import com.loadimpact.resource.Test;
import com.loadimpact.resource.TestConfiguration;
import com.loadimpact.resource.UserScenario;
import com.loadimpact.util.Debug;
import java.io.PrintWriter;
import java.io.StringWriter;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
/**
* Runs a load-test with progress monitoring.
*
* @user jens
* @date 2015-05-25
*/
public class RunningLoadTestsWithProgressTracking extends AbstractIntegrationTestBase {
public static final int SECONDS = 1;
@org.junit.Test
public void start_a_loadtest_with_monitoring_by_LoadTestListener_should_pass() throws Exception {
// Debug.setEnabled(true);
// client.setDebug(true, 100000);
final UserScenario scenario = createScenario();
final TestConfiguration testConfig = createTestConfig(TARGET_URL, scenario.id);
try {
final int testId = client.startTest(testConfig.id);
assertThat(testId, greaterThan(0));
Test test = client.getTest(testId);
assertThat(test, notNullValue());
assertThat(test.id, is(testId));
waitFor("load-test has state==running", new WaitForClosure() {
@Override
public boolean isDone() {
return client.getTest(testId).status.isRunning();
}
});
DummyLoadTestParameters params = new DummyLoadTestParameters(testConfig);
DummyLoadTestLogger logger = new DummyLoadTestLogger();
DummyLoadTestResultListener resultListener = new DummyLoadTestResultListener();
LoadTestListener loadTestListener = new LoadTestListener(params, logger, resultListener);
loadTestListener.onSetup(testConfig, client);
Test monitoredTest = client.monitorTest(testId, 5 * SECONDS, loadTestListener);
assertThat(monitoredTest, notNullValue());
assertThat(monitoredTest.status.isSuccessful(), is(true));
String log = logger.getText();
assertThat(log, containsString("Load-Test Completed"));
} finally {
client.deleteTestConfiguration(testConfig.id);
client.deleteUserScenario(scenario.id);
}
}
static class DummyLoadTestLogger implements LoadTestLogger {
private StringWriter buf = new StringWriter(100000);
private PrintWriter log = new PrintWriter(buf, false);
private void emit(String label, String msg) {
System.out.printf("[%s] %s%n", label, msg);
System.out.flush();
log.printf("[%s] %s%n", label, msg);
}
public String getText() {
log.flush();
return buf.toString();
}
@Override
public void started(String msg) {
emit("started", msg);
}
@Override
public void finished(String msg) {
emit("finished", msg);
}
@Override
public void failure(String reason) {
emit("failure", reason);
}
@Override
public void message(String msg) {
emit("progress", msg);
}
@Override
public void message(String fmt, Object... args) {
message(String.format(fmt, args));
}
}
static class DummyLoadTestParameters implements LoadTestParameters {
private TestConfiguration testConfig;
public DummyLoadTestParameters(TestConfiguration testConfig) {
this.testConfig = testConfig;
}
@Override
public String getApiToken() {
fail("unexpected call to LoadTestParameters::getApiToken()");
return null;
}
@Override
public int getTestConfigurationId() {
return testConfig.id;
}
@Override
public Threshold[] getThresholds() {
return new Threshold[0];
}
@Override
public DelayUnit getDelayUnit() {
return DelayUnit.seconds;
}
@Override
public int getDelayValue() {
return 3;
}
@Override
public int getDelaySize() {
return 0;
}
@Override
public boolean isAbortAtFailure() {
return true;
}
@Override
public int getPollInterval() {
return 5;
}
@Override
public boolean isLogHttp() {
return true;
}
@Override
public boolean isLogReplies() {
return true;
}
@Override
public boolean isLogDebug() {
return true;
}
}
static class DummyLoadTestResultListener implements LoadTestResultListener {
private LoadTestResult result;
private String reason;
@Override
public void markAs(LoadTestResult result, String reason) {
this.result = result;
this.reason = reason;
}
@Override
public LoadTestResult getResult() {
return result;
}
@Override
public String getReason() {
return reason;
}
@Override
public void stopBuild() {
System.out.println("*** stopBuild()");
}
@Override
public boolean isFailure() {
return false;
}
@Override
public boolean isNonSuccessful() {
return false;
}
}
}