/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.ejb3.test.common.unit;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import junit.extensions.TestSetup;
import junit.framework.Test;
/** A TestSetup that starts hypersonic before the testcase with a tcp
* listening port at 1701.
*
* @author Scott.Stark@jboss.org
* @version $Revison:$
*/
public class DBSetup extends TestSetup
{
public DBSetup(Test test)
{
super(test);
}
protected void setUp() throws Exception
{
File hypersoniDir = new File("output/hypersonic");
if (!hypersoniDir.exists())
{
hypersoniDir.mkdirs();
}
if (!hypersoniDir.isDirectory())
{
throw new IOException("Failed to create directory: " + hypersoniDir);
}
File dbPath = new File(hypersoniDir, "clusteredentity-db");
// Start DB in new thread, or else it will block us
DBThread serverThread = new DBThread(dbPath);
serverThread.start();
int elapsed = 0;
while (!serverThread.isStarted() && elapsed < 15000)
{
try
{
Thread.sleep(100);
elapsed += 100;
}
catch (InterruptedException ie)
{
System.out.println("Interrupted while waiting for Hypersonic");
}
}
if (!serverThread.isStarted())
System.out.println("Hypersonic failed to start in a timely fashion");
}
protected void tearDown() throws Exception
{
Class.forName("org.hsqldb.jdbcDriver");
String dbURL = "jdbc:hsqldb:hsql://" + System.getProperty("jbosstest.server.host", "localhost") + ":1701";
Connection conn = DriverManager.getConnection(dbURL, "sa", "");
Statement statement = conn.createStatement();
statement.executeQuery("SHUTDOWN COMPACT");
}
public static void main(String[] args) throws Exception
{
DBSetup setup = new DBSetup(null);
setup.setUp();
Thread.sleep(120*1000);
setup.tearDown();
}
class DBThread extends Thread
{
boolean started;
File dbPath;
DBThread(File dbPath)
{
super("hypersonic");
this.dbPath = dbPath;
}
boolean isStarted()
{
return started;
}
public void run()
{
try
{
// Create startup arguments
// BES 2007/09/25 We use -silent true to avoid
// http://sourceforge.net/tracker/index.php?func=detail&aid=1673747&group_id=23316&atid=378131
String[] args = {
"-database",
dbPath.toString(),
"-port",
String.valueOf(1701),
"-silent",
"true",
"-trace",
"false",
"-no_system_exit",
"true",
};
System.out.println("Starting hsqldb");
// HACK Do this by reflection for now until we determine how
// we want to handle this in EJB3
Class clazz = Thread.currentThread().getContextClassLoader().loadClass("org.hsqldb.Server");
Method main = clazz.getDeclaredMethod("main", new Class[] { String[].class });
main.invoke(null, new Object[] { args });
// org.hsqldb.Server.main(args);
System.out.println("Done");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
started = true;
}
}
}
}