/*
* 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.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Properties;
import org.h2.constant.ErrorCode;
import org.h2.test.TestBase;
import org.h2.tools.Server;
/**
* Tests the compatibility with older versions
*/
public class TestOldVersion extends TestBase {
private ClassLoader cl;
private Driver driver;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() throws Exception {
cl = getClassLoader("file:ext/h2-1.2.127.jar");
driver = getDriver(cl);
if (driver == null) {
println("not found: ext/h2-1.2.127.jar - test skipped");
return;
}
Connection conn = driver.connect("jdbc:h2:mem:", null);
assertEquals("1.2.127 (2010-01-15)", conn.getMetaData().getDatabaseProductVersion());
conn.close();
testLobInFiles();
testOldClientNewServer();
}
private void testLobInFiles() throws Exception {
deleteDb("oldVersion");
Connection conn;
Statement stat;
conn = driver.connect("jdbc:h2:" + getBaseDir() + "/oldVersion", null);
stat = conn.createStatement();
stat.execute("create table test(id int primary key, b blob, c clob)");
PreparedStatement prep = conn.prepareStatement("insert into test values(?, ?, ?)");
prep.setInt(1, 0);
prep.setNull(2, Types.BLOB);
prep.setNull(3, Types.CLOB);
prep.execute();
prep.setInt(1, 1);
prep.setBytes(2, new byte[0]);
prep.setString(3, "");
prep.execute();
prep.setInt(1, 2);
prep.setBytes(2, new byte[5]);
prep.setString(3, "\u1234\u1234\u1234\u1234\u1234");
prep.execute();
prep.setInt(1, 3);
prep.setBytes(2, new byte[100000]);
prep.setString(3, new String(new char[100000]));
prep.execute();
conn.close();
conn = DriverManager.getConnection("jdbc:h2:" + getBaseDir() + "/oldVersion", new Properties());
stat = conn.createStatement();
checkResult(stat.executeQuery("select * from test order by id"));
stat.execute("create table test2 as select * from test");
checkResult(stat.executeQuery("select * from test2 order by id"));
stat.execute("delete from test");
conn.close();
}
private void checkResult(ResultSet rs) throws SQLException {
rs.next();
assertEquals(0, rs.getInt(1));
assertEquals(null, rs.getBytes(2));
assertEquals(null, rs.getString(3));
rs.next();
assertEquals(1, rs.getInt(1));
assertEquals(new byte[0], rs.getBytes(2));
assertEquals("", rs.getString(3));
rs.next();
assertEquals(2, rs.getInt(1));
assertEquals(new byte[5], rs.getBytes(2));
assertEquals("\u1234\u1234\u1234\u1234\u1234", rs.getString(3));
rs.next();
assertEquals(3, rs.getInt(1));
assertEquals(new byte[100000], rs.getBytes(2));
assertEquals(new String(new char[100000]), rs.getString(3));
}
private void testOldClientNewServer() throws Exception {
Server server = org.h2.tools.Server.createTcpServer("-tcpPort", "9001");
server.start();
assertThrows(ErrorCode.DRIVER_VERSION_ERROR_2, driver).
connect("jdbc:h2:tcp://localhost:9001/mem:test", null);
server.stop();
Class<?> serverClass = cl.loadClass("org.h2.tools.Server");
Method m;
m = serverClass.getMethod("createTcpServer", String[].class);
Object serverOld = m.invoke(null, new Object[]{new String[]{"-tcpPort", "9001"}});
m = serverOld.getClass().getMethod("start");
m.invoke(serverOld);
Connection conn;
conn = org.h2.Driver.load().connect("jdbc:h2:mem:", null);
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("call 1");
rs.next();
assertEquals(1, rs.getInt(1));
conn.close();
m = serverOld.getClass().getMethod("stop");
m.invoke(serverOld);
}
private static ClassLoader getClassLoader(String jarFile) throws Exception {
URL[] urls = { new URL(jarFile) };
return new URLClassLoader(urls, null);
}
private static Driver getDriver(ClassLoader cl) throws Exception {
Class<?> driverClass;
try {
driverClass = cl.loadClass("org.h2.Driver");
} catch (ClassNotFoundException e) {
return null;
}
Method m = driverClass.getMethod("load");
Driver driver = (Driver) m.invoke(null);
return driver;
}
}