package org.jboss.test.capedwarf.cluster.test;
import java.lang.reflect.Method;
import java.util.logging.Handler;
import java.util.logging.Logger;
import com.google.appengine.api.log.AppLogLine;
import com.google.appengine.api.log.LogQuery;
import com.google.appengine.api.log.LogService;
import com.google.appengine.api.log.LogServiceFactory;
import com.google.appengine.api.log.RequestLogs;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OperateOnDeployment;
import org.jboss.arquillian.container.test.api.TargetsContainer;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.junit.InSequence;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.test.capedwarf.common.support.JBoss;
import org.jboss.test.capedwarf.common.test.TestBase;
import org.jboss.test.capedwarf.common.test.TestContext;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Matej Lazar
*/
@RunWith(Arquillian.class)
@Category(JBoss.class)
public class LoggingTest extends TestBase {
@Deployment(name = "dep1") @TargetsContainer("container-1")
public static WebArchive getDeploymentA() {
return getDeployment();
}
@Deployment(name = "dep2") @TargetsContainer("container-2")
public static WebArchive getDeploymentB() {
return getDeployment();
}
public static WebArchive getDeployment() {
return getCapedwarfDeployment(TestContext.withLogging());
}
@InSequence(10)
@Test
@OperateOnDeployment("dep1")
public void writeLogOnDep1() {
clear(LogServiceFactory.getLogService());
assertLogDoesntContain("hello");
Logger log = Logger.getLogger(LoggingTest.class.getName());
log.info("hello");
flush(log);
}
@InSequence(15)
@Test
@OperateOnDeployment("dep1")
public void readLogOnDep1() {
waitForSync();
assertLogContains("hello");
}
@InSequence(20)
@Test
@OperateOnDeployment("dep2")
public void readLogOnDep2() {
waitForSync();
assertLogContains("hello");
}
@InSequence(1000)
@Test
@OperateOnDeployment("dep1")
public void shuttingDown1() {
//dummy test: waiting server to shutdown
sync();
}
@InSequence(2000)
@Test
@OperateOnDeployment("dep2")
public void shuttingDown2() {
//dummy test: waiting server to shutdown
sync();
}
protected void clear(LogService service) {
if (isJBossImpl(service)) {
try {
Class<?> clazz = service.getClass();
Method clearLog = clazz.getMethod("clearLog");
clearLog.invoke(service);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
private void assertLogDoesntContain(String text) {
assertFalse("log should not contain '" + text + "', but it does", logContains(text));
}
private void assertLogContains(String text) {
assertTrue("log should contain '" + text + "', but it does not", logContains(text));
}
private boolean logContains(String text) {
LogQuery logQuery = new LogQuery().includeAppLogs(true).includeIncomplete(true).minLogLevel(LogService.LogLevel.DEBUG);
Iterable<RequestLogs> iterable = LogServiceFactory.getLogService().fetch(logQuery);
for (RequestLogs logs : iterable) {
for (AppLogLine logLine : logs.getAppLogLines()) {
if (logLine.getLogMessage().contains(text)) {
return true;
}
}
}
return false;
}
protected void flush(Logger log) {
for (Handler handler : log.getHandlers()) {
handler.flush();
}
}
private void waitForSync() {
sync();
}
}