package io.vertx.ext.unit.collect.impl;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.Message;
import io.vertx.core.eventbus.MessageConsumer;
import io.vertx.core.json.JsonObject;
import io.vertx.core.streams.ReadStream;
import io.vertx.ext.unit.collect.EventBusCollector;
import io.vertx.ext.unit.impl.FailureImpl;
import io.vertx.ext.unit.impl.TestResultImpl;
import io.vertx.ext.unit.report.Failure;
import io.vertx.ext.unit.report.TestCaseReport;
import io.vertx.ext.unit.report.TestResult;
import io.vertx.ext.unit.report.TestSuiteReport;
Author: Julien Viet
/**
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
*/
public class EventBusCollectorImpl implements EventBusCollector, Handler<Message<JsonObject>> {
private final Vertx vertx;
private final Handler<TestSuiteReport> reporter;
private Handler<TestCaseReport> testCaseRunnerHandler;
private Handler<Throwable> exceptionHandler;
private Handler<Void> endHandler;
private TestSuiteReport runner;
private Handler<TestResult> testCaseHandler;
public EventBusCollectorImpl(Vertx vertx, Handler<TestSuiteReport> reporter) {
this.reporter = reporter;
this.vertx = vertx;
}
@Override
public void handle(Message<JsonObject> event) {
JsonObject body = event.body();
String type = body.getString("type", "");
String name = body.getString("name");
switch (type) {
case EVENT_TEST_SUITE_BEGIN: {
runner = new TestSuiteReport() {
@Override
public String name() {
return name;
}
@Override
public TestSuiteReport exceptionHandler(Handler<Throwable> handler) {
exceptionHandler = handler;
return this;
}
@Override
public TestSuiteReport handler(Handler<TestCaseReport> handler) {
testCaseRunnerHandler = handler;
return this;
}
@Override
public ReadStream<TestCaseReport> fetch(long amount) {
return this;
}
@Override
public TestSuiteReport pause() {
return this;
}
@Override
public TestSuiteReport resume() {
return this;
}
@Override
public TestSuiteReport endHandler(Handler<Void> handler) {
endHandler = handler;
return this;
}
};
reporter.handle(runner);
break;
}
case EVENT_TEST_CASE_BEGIN: {
if (testCaseRunnerHandler != null) {
testCaseRunnerHandler.handle(new TestCaseReport() {
@Override
public String name() {
return name;
}
@Override
public TestCaseReport endHandler(Handler<TestResult> handler) {
testCaseHandler = handler;
return this;
}
});
}
break;
}
case EVENT_TEST_SUITE_ERROR: {
JsonObject failureJson = body.getJsonObject("failure");
if (failureJson != null && exceptionHandler != null) {
FailureImpl failure = new FailureImpl(failureJson);
Throwable cause = failure.cause();
if (cause == null) {
// Best effort
cause = new Exception(failureJson.getString("message"));
}
exceptionHandler.handle(cause);
}
break;
}
case EVENT_TEST_CASE_END: {
if (testCaseHandler != null) {
JsonObject failureJson = body.getJsonObject("failure");
Failure failure = null;
if (failureJson != null) {
failure = new FailureImpl(failureJson);
}
TestResult result = new TestResultImpl(name, body.getLong("beginTime", 0L), body.getLong("durationTime", 0L), failure);
testCaseHandler.handle(result);
testCaseHandler = null;
}
break;
}
case EVENT_TEST_SUITE_END: {
if (endHandler != null) {
endHandler.handle(null);
}
break;
}
}
}
@Override
public MessageConsumer<JsonObject> register(String address) {
return vertx.eventBus().consumer(address, this);
}
@Override
public Handler<Message<JsonObject>> asMessageHandler() {
return this;
}
}