/* * 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.sql.Connection; import java.sql.DriverManager; import java.util.ArrayList; import org.h2.test.TestBase; import org.h2.test.utils.SelfDestructor; import org.h2.util.New; /** * Tests database file locking. * A new process is started. */ public class TestFileLockProcess extends TestBase { /** * 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 Exception { SelfDestructor.startCountdown(60); if (args.length == 0) { TestBase.createCaller().init().test(); return; } String url = args[0]; execute(url); } private static void execute(String url) { org.h2.Driver.load(); try { Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection(url); System.out.println("!"); conn.close(); } catch (Exception e) { // failed - expected } } public void test() throws Exception { if (config.codeCoverage || config.networked) { return; } if (getBaseDir().indexOf(':') > 0) { return; } deleteDb("lock"); String url = "jdbc:h2:"+getBaseDir()+"/lock"; println("socket"); test(4, url + ";file_lock=socket"); println("fs"); test(4, url + ";file_lock=fs"); println("default"); test(50, url); deleteDb("lock"); } private void test(int count, String url) throws Exception { Connection conn = DriverManager.getConnection(url); String selfDestruct = SelfDestructor.getPropertyString(60); String[] procDef = { "java", selfDestruct, "-cp", getClassPath(), getClass().getName(), url }; ArrayList<Process> processes = New.arrayList(); for (int i = 0; i < count; i++) { Thread.sleep(100); if (i % 10 == 0) { println(i + "/" + count); } Process proc = Runtime.getRuntime().exec(procDef); processes.add(proc); } for (int i = 0; i < count; i++) { Process proc = processes.get(i); StringBuilder buff = new StringBuilder(); while (true) { int ch = proc.getErrorStream().read(); if (ch < 0) { break; } System.out.print((char) ch); buff.append((char) ch); } while (true) { int ch = proc.getInputStream().read(); if (ch < 0) { break; } System.out.print((char) ch); buff.append((char) ch); } proc.waitFor(); assertEquals(0, proc.exitValue()); assertTrue(i + ": " + buff.toString(), buff.length() == 0); } Thread.sleep(100); conn.close(); } }