/* * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, * and the EPL 1.0 (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.unit; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.h2.api.DatabaseEventListener; import org.h2.test.TestBase; import org.h2.test.utils.SelfDestructor; /** * Tests the flag db_close_on_exit. A new process is started. */ public class TestExit extends TestBase { private static Connection conn; private static final int OPEN_WITH_CLOSE_ON_EXIT = 1, OPEN_WITHOUT_CLOSE_ON_EXIT = 2; @Override public void test() throws Exception { if (config.codeCoverage || config.networked) { return; } if (getBaseDir().indexOf(':') > 0) { return; } deleteDb("exit"); String url = getURL(OPEN_WITH_CLOSE_ON_EXIT); String selfDestruct = SelfDestructor.getPropertyString(60); String[] procDef = { "java", selfDestruct, "-cp", getClassPath(), getClass().getName(), url }; Process proc = Runtime.getRuntime().exec(procDef); while (true) { int ch = proc.getErrorStream().read(); if (ch < 0) { break; } System.out.print((char) ch); } while (true) { int ch = proc.getInputStream().read(); if (ch < 0) { break; } System.out.print((char) ch); } proc.waitFor(); Thread.sleep(100); if (!getClosedFile().exists()) { fail("did not close database"); } url = getURL(OPEN_WITHOUT_CLOSE_ON_EXIT); procDef = new String[] { "java", "-cp", getClassPath(), getClass().getName(), url }; proc = Runtime.getRuntime().exec(procDef); proc.waitFor(); Thread.sleep(100); if (getClosedFile().exists()) { fail("closed database"); } deleteDb("exit"); } private String getURL(int action) { String url = ""; switch (action) { case OPEN_WITH_CLOSE_ON_EXIT: url = "jdbc:h2:" + getBaseDir() + "/exit;database_event_listener='" + MyDatabaseEventListener.class.getName() + "';db_close_on_exit=true"; break; case OPEN_WITHOUT_CLOSE_ON_EXIT: url = "jdbc:h2:" + getBaseDir() + "/exit;database_event_listener='" + MyDatabaseEventListener.class.getName() + "';db_close_on_exit=false"; break; default: } url = getURL(url, true); return url; } /** * This method is called when executing this application from the command * line. * * @param args the command line parameters */ public static void main(String... args) throws SQLException { SelfDestructor.startCountdown(60); if (args.length == 0) { System.exit(1); } String url = args[0]; TestExit.execute(url); } private static void execute(String url) throws SQLException { org.h2.Driver.load(); conn = open(url); Connection conn2 = open(url); conn2.close(); // do not close conn.isClosed(); } private static Connection open(String url) throws SQLException { getClosedFile().delete(); return DriverManager.getConnection(url, "sa", ""); } static File getClosedFile() { return new File(TestBase.BASE_TEST_DIR + "/closed.txt"); } /** * A database event listener used in this test. */ public static final class MyDatabaseEventListener implements DatabaseEventListener { @Override public void exceptionThrown(SQLException e, String sql) { // nothing to do } @Override public void closingDatabase() { try { getClosedFile().createNewFile(); } catch (IOException e) { TestBase.logError("error", e); } } @Override public void setProgress(int state, String name, int x, int max) { // nothing to do } @Override public void init(String url) { // nothing to do } @Override public void opened() { // nothing to do } } }