/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 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 implements DatabaseEventListener { public static Connection conn; static final int OPEN_WITH_CLOSE_ON_EXIT = 1, OPEN_WITHOUT_CLOSE_ON_EXIT = 2; public void test() throws Exception { if (config.codeCoverage || config.networked) { return; } if (getBaseDir().indexOf(':') > 0) { return; } deleteDb("exit"); String selfDestruct = SelfDestructor.getPropertyString(60); String[] procDef = { "java", selfDestruct, "-cp", getClassPath(), getClass().getName(), "" + OPEN_WITH_CLOSE_ON_EXIT }; 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"); } procDef = new String[] { "java", "-cp", getClassPath(), getClass().getName(), "" + OPEN_WITHOUT_CLOSE_ON_EXIT }; proc = Runtime.getRuntime().exec(procDef); proc.waitFor(); Thread.sleep(100); if (getClosedFile().exists()) { fail("closed database"); } deleteDb("exit"); } /** * 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); } int action = Integer.parseInt(args[0]); TestExit app = new TestExit(); app.execute(action); } private void execute(int action) throws SQLException { org.h2.Driver.load(); String url = ""; switch (action) { case OPEN_WITH_CLOSE_ON_EXIT: url = "jdbc:h2:" + getBaseDir() + "/exit;database_event_listener='" + getClass().getName() + "';db_close_on_exit=true"; break; case OPEN_WITHOUT_CLOSE_ON_EXIT: url = "jdbc:h2:" + getBaseDir() + "/exit;database_event_listener='" + getClass().getName() + "';db_close_on_exit=false"; break; default: } conn = open(url); Connection conn2 = open(url); conn2.close(); } private static Connection open(String url) throws SQLException { getClosedFile().delete(); return DriverManager.getConnection(url, "sa", ""); } public void exceptionThrown(SQLException e, String sql) { // nothing to do } public void closingDatabase() { try { getClosedFile().createNewFile(); } catch (IOException e) { TestBase.logError("error", e); } } private static File getClosedFile() { return new File(TestBase.BASE_TEST_DIR + "/closed.txt"); } public void setProgress(int state, String name, int x, int max) { // nothing to do } public void init(String url) { // nothing to do } public void opened() { // nothing to do } }