package io.vertx.ext.unit;
import io.vertx.core.Handler;
import io.vertx.core.eventbus.MessageConsumer;
import io.vertx.core.file.FileProps;
import io.vertx.core.file.FileSystem;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.unit.collect.EventBusCollector;
import io.vertx.ext.unit.report.ReportOptions;
import io.vertx.ext.unit.report.impl.JunitXmlFormatter;
import io.vertx.ext.unit.report.Reporter;
import io.vertx.ext.unit.report.impl.SimpleFormatter;
import io.vertx.test.core.VertxTestBase;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintStream;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import java.util.logging.StreamHandler;
/**
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
*/
public class ReportingTest extends VertxTestBase {
private String testSystemOut(Runnable runnable) {
PrintStream prevOut = System.out;
Thread t = Thread.currentThread();
ByteArrayOutputStream out = new ByteArrayOutputStream() {
@Override
public synchronized void write(int b) {
if (Thread.currentThread() == t) {
super.write(b);
}
}
@Override
public synchronized void write(byte[] b, int off, int len) {
if (Thread.currentThread() == t) {
super.write(b, off, len);
}
}
};
System.setOut(new PrintStream(out));
try {
runnable.run();
System.out.flush();
return out.toString();
} finally {
System.setOut(prevOut);
}
}
private String testLog(String name, Runnable runnable) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
StreamHandler handler = new StreamHandler(buffer, new java.util.logging.SimpleFormatter());
Logger logger = Logger.getLogger(name);
logger.addHandler(handler);
try {
runnable.run();
handler.flush();
return buffer.toString();
} finally {
logger.removeHandler(handler);
}
}
private static final TestSuite suite = TestSuite.create("my_suite").test("my_test", context -> {});
@org.junit.Test
public void testReportWithDefaultOptions() {
String s = testSystemOut(() -> {
suite.run(new TestOptions().addReporter(new ReportOptions()));
});
assertTrue(s.length() > 0);
}
@org.junit.Test
public void testReportToConsole() {
String s = testSystemOut(() -> {
Reporter<?> reporter = Reporter.reporter(vertx, new ReportOptions().setTo("console"));
assertTrue(reporter instanceof SimpleFormatter);
suite.run(new TestOptions().addReporter(new ReportOptions().setTo("console")));
});
assertTrue(s.length() > 0);
}
@org.junit.Test
public void testReportToLog() {
String s = testLog("mylogger", () -> {
Reporter<?> reporter = Reporter.reporter(vertx, new ReportOptions().setTo("log:mylogger"));
assertTrue(reporter instanceof SimpleFormatter);
suite.run(new TestOptions().addReporter(new ReportOptions().setTo("log:mylogger")));
});
assertTrue(s.length() > 0);
}
@org.junit.Test
public void testReportToFile() {
FileSystem fs = vertx.fileSystem();
String file = "target";
assertTrue(fs.existsBlocking(file));
assertTrue(fs.propsBlocking(file).isDirectory());
suite.run(vertx, new TestOptions().addReporter(new ReportOptions().setTo("file:" + file)));
String path = file + File.separator + "my_suite.txt";
assertTrue(fs.existsBlocking(path));
int count = 1000;
while (true) {
FileProps props = fs.propsBlocking(path);
if (props.isRegularFile() && props.size() > 0) {
break;
} else {
if (count-- > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException ignore) {
}
} else {
fail();
}
}
}
}
@org.junit.Test
public void testReportToEventBus() {
MessageConsumer<JsonObject> consumer = vertx.eventBus().<JsonObject>consumer("the_address");
consumer.handler(msg -> {
if (msg.body().getString("type").equals(EventBusCollector.EVENT_TEST_SUITE_END)) {
consumer.unregister();
testComplete();
}
});
consumer.completionHandler(ar -> {
assertTrue(ar.succeeded());
suite.run(vertx, new TestOptions().addReporter(new ReportOptions().setTo("bus:the_address")));
});
await();
}
@org.junit.Test
public void testSimpleFormatReporter() {
Reporter<?> reporter = Reporter.reporter(vertx, new ReportOptions().setFormat("simple"));
assertTrue(reporter instanceof SimpleFormatter);
}
@org.junit.Test
public void testJunitFormatReporter() {
Reporter<?> reporter = Reporter.reporter(vertx, new ReportOptions().setFormat("junit"));
assertTrue(reporter instanceof JunitXmlFormatter);
}
@org.junit.Test
public void testReportSucceededToCompletionHandler() {
TestSuite suite = TestSuite.create("my_suite").test("first_test", context -> {});
suite.run(new TestOptions()).handler(ar -> {
assertTrue(ar.succeeded());
testComplete();
});
await();
}
@org.junit.Test
public void testReportToFailureCompletionHandler() {
RuntimeException e = new RuntimeException();
Handler<TestContext> fails = context -> { throw e; };
Handler<TestContext> pass = context -> { };
TestSuite[] suites = {
TestSuite.create("my_suite").test("first_test", fails),
TestSuite.create("my_suite").before(fails).test("first_test", pass),
TestSuite.create("my_suite").test("first_test", pass).after(fails)
};
AtomicInteger count = new AtomicInteger();
for (TestSuite suite : suites) {
suite.run(new TestOptions()).handler(ar -> {
assertTrue(ar.failed());
assertSame(e, ar.cause());
if (count.incrementAndGet() == 3) {
testComplete();
}
});
}
await();
}
}