package io.dropwizard.jdbi.timestamps;
import org.h2.tools.Server;
import org.junit.rules.ExternalResource;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
/**
* Run an instance of the H2 database in an another time zone
*/
public class DatabaseInTimeZone extends ExternalResource {
private final TemporaryFolder temporaryFolder;
private final TimeZone timeZone;
private Process process;
public DatabaseInTimeZone(TemporaryFolder temporaryFolder, TimeZone timeZone) {
this.temporaryFolder = temporaryFolder;
this.timeZone = timeZone;
}
@Override
protected void before() throws Throwable {
String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
File h2jar = new File(Server.class.getProtectionDomain().getCodeSource().getLocation().toURI());
String vmArguments = "-Duser.timezone=" + timeZone.getID();
ProcessBuilder pb = new ProcessBuilder(java, vmArguments, "-cp", h2jar.getAbsolutePath(), Server.class.getName(),
"-tcp", "-baseDir", temporaryFolder.newFolder().getAbsolutePath());
process = pb.start();
}
@Override
protected void after() {
try {
// Graceful shutdown of the database
Server.shutdownTcpServer("tcp://localhost:9092", "", true, false);
boolean exited = waitFor(process, 1, TimeUnit.SECONDS);
if (!exited) {
process.destroy();
}
} catch (Exception e) {
throw new IllegalStateException("Unable shutdown DB", e);
}
}
private static boolean waitFor(Process process, long timeout, TimeUnit unit) throws InterruptedException {
long startTime = System.nanoTime();
while (true) {
try {
process.exitValue();
return true;
} catch (IllegalThreadStateException ex) {
Thread.sleep(100);
}
if (System.nanoTime() - startTime > unit.toNanos(timeout)) {
return false;
}
}
}
}