You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by dj...@apache.org on 2005/04/28 18:23:11 UTC

svn commit: r165157 - in /incubator/derby/code/trunk: build.xml java/testing/org/apache/derbyTesting/upgradeTests/ java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh

Author: djd
Date: Thu Apr 28 09:23:10 2005
New Revision: 165157

URL: http://svn.apache.org/viewcvs?rev=165157&view=rev
Log:
Add some an upgrade test, more framework at this point.
Look at the shell script java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh
for instructions on how to run.

Added:
    incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/
    incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java   (with props)
    incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh   (with props)
Modified:
    incubator/derby/code/trunk/build.xml

Modified: incubator/derby/code/trunk/build.xml
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/build.xml?rev=165157&r1=165156&r2=165157&view=diff
==============================================================================
--- incubator/derby/code/trunk/build.xml (original)
+++ incubator/derby/code/trunk/build.xml Thu Apr 28 09:23:10 2005
@@ -974,7 +974,7 @@
 
   <target name="derbytestingjar" depends="initjars,ckderbytesting" if="derbyTesting.available">
     <zip destfile="${derby.jar.dir}/derbyTesting.jar" filesonly="true" compress="true">
-      <fileset dir="${out.dir}" includes="org/apache/derbyTesting/functionTests/**,SimpleApp*,org/apache/derby/impl/tools/ij/mt*.class,org/apache/derby/impl/tools/ij/SimpleCharStream.class,org/apache/derby/impl/drda/TestProto.class,org/apache/derbyTesting/unitTests/*/*,org/apache/derby/iapi/services/diag/DiagnosticUtil.class,org/apache/derby/iapi/services/diag/Diagnosticable.class,org/apache/derby/iapi/services/diag/DiagnosticableGeneric.class,org/apache/derby/impl/store/access/conglomerate/QualifierUtil.class,org/apache/derby/loc/m*_qq_PP_testOnly*"/>
+      <fileset dir="${out.dir}" includes="org/apache/derbyTesting/**,SimpleApp*,org/apache/derby/impl/tools/ij/mt*.class,org/apache/derby/impl/tools/ij/SimpleCharStream.class,org/apache/derby/impl/drda/TestProto.class,org/apache/derby/iapi/services/diag/DiagnosticUtil.class,org/apache/derby/iapi/services/diag/Diagnosticable.class,org/apache/derby/iapi/services/diag/DiagnosticableGeneric.class,org/apache/derby/impl/store/access/conglomerate/QualifierUtil.class,org/apache/derby/loc/m*_qq_PP_testOnly*"/>
     </zip>
   </target>
 

Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java?rev=165157&view=auto
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java Thu Apr 28 09:23:10 2005
@@ -0,0 +1,396 @@
+/* IBM Confidential
+ *
+ * Product ID: 5697-F53
+ *
+ * (C) Copyright IBM Corp. 2003.
+ *
+ * The source code for this program is not published or otherwise divested
+ * of its trade secrets, irrespective of what has been deposited with the
+ * U.S. Copyright Office.
+ */
+
+package org.apache.derbyTesting.upgradeTests;
+
+import java.sql.*;
+
+
+/**
+	Tests upgrades including soft upgrade.
+	
+	Test is broken into phases, by running this main java program separately
+	each time, with either the old release or the new release in the class
+	path and the indication of the phase. The phases are:
+	<OL>
+	<LI> Create database with the <B>old</B> release.
+	<LI> Boot the database with the <B>new</B> release in soft upgrade mode.
+	Try to execute functionality that is not allowed in soft upgrade.
+	<LI> Boot the database with the <B>old</B> release to ensure the
+	database can be booted by the old release after soft upgrade.
+	<LI> Boot the database with the <B>new</B> release in hard upgrade mode,
+	specifying the upgrade=true attribute.
+	<LI> Boot the database with the <B>old</B> release to ensure the
+	database can not be booted by the old release after hard upgrade.
+	</OL>
+	<P>
+	That's the general idea for GA releases. Alpha/beta releases do not
+	support upgrade unless the derby.database.allowPreReleaseUpgrade
+	property is set to true, in which case this program modifies the expected
+	behaviour.
+	<P>
+	A script is provided runphases.ksh to run the phases with
+	correct old and new classpaths and phase numbers. Currently
+	checking for pass/failure is a manual process of looking
+	at the output.
+	
+    <P>
+	This tests the following specifically.
+
+	10.1 Upgrade issues
+
+	<UL>
+	<LI> Routines with explicit Java signatures.
+	</UL>
+*/
+
+
+
+public class phaseTester {
+
+	private static final String[] PHASES =
+	{"CREATE", "SOFT UPGRADE", "POST SOFT UPGRADE", "UPGRADE", "POST UPGRADE"};
+
+	/** test run at create of original database with old version */
+	static final int PH_CREATE = 0;
+	/** test run in soft upgrade mode with new version */
+	static final int PH_SOFT_UPGRADE = 1;
+	/** test run in post soft upgrade mode with old version */
+	static final int PH_POST_SOFT = 2;
+	/** test run in hard upgrade mode with new version */
+	static final int PH_HARD_UPGRADE = 3;
+	/** test run in post hard upgrade mode with old version */
+	static final int PH_POST_HARD_UPGRADE = 4;
+
+	/**
+		arg0 = jdbc url
+		arg1 = phase
+		arg2 = dbmajor version (of original database)
+		arg3 = dbminor version (of original database)
+		arg4 = tempdbname (just for version checking)
+	*/
+	public static void main(String[] args) throws Exception {
+
+		String dbName = args[0];
+		int phase = Integer.valueOf(args[1]).intValue();
+		int dbMajor = Integer.valueOf(args[2]).intValue();
+		int dbMinor = Integer.valueOf(args[3]).intValue();
+		String tempDbName = args[4].concat(args[1]);
+
+
+		new org.apache.derby.jdbc.EmbeddedDriver();
+
+		String url;
+		switch (phase) {
+		case PH_CREATE:
+			url = "jdbc:derby:" + dbName + ";create=true";
+			break;
+		case PH_SOFT_UPGRADE:
+		case PH_POST_SOFT:
+		case PH_POST_HARD_UPGRADE:
+			url = "jdbc:derby:" + dbName;
+			break;
+		case PH_HARD_UPGRADE:
+			url = "jdbc:derby:" + dbName + ";upgrade=true";
+			break;
+		default:
+			url = "jdbc:unknownphase:";
+			break;
+		}
+
+		System.out.println("\n\nSTART - phase " + PHASES[phase] + " db version " + dbMajor + "." + dbMinor);
+
+		Connection conn;
+		
+		try {
+			conn = DriverManager.getConnection(url);
+		} catch (SQLException sqle) {
+			do {
+				System.out.println(sqle.toString());
+				//sqle.printStackTrace(System.out);
+				sqle = sqle.getNextException();
+			} while (sqle != null);
+			conn = null;
+		}
+
+		String pvs;
+		if (conn != null) {
+
+			pvs = conn.getMetaData().getDatabaseProductVersion();
+			System.out.println("Engine " + conn.getMetaData().getDatabaseProductName() + " " + pvs);
+		} else {
+			// just create a database with this engine to get the version info.
+			Connection ct = DriverManager.getConnection("jdbc:derby:" + tempDbName + ";create=true");
+
+			pvs = ct.getMetaData().getDatabaseProductVersion();
+			System.out.println("Engine " + ct.getMetaData().getDatabaseProductName() + " " + pvs);
+			ct.close();
+		}
+
+		pvs = pvs.toLowerCase();
+
+		boolean isBeta = pvs.indexOf("beta") != -1 || pvs.indexOf("alpha") != -1;
+		
+		if (isBeta) {
+			
+			boolean allowPreReleaseUpgrade = 
+				Boolean.getBoolean("derby.database.allowPreReleaseUpgrade");
+			
+			System.out.println("Pre-release Software - derby.database.allowPreReleaseUpgrade="
+					+ allowPreReleaseUpgrade);
+			
+			if (allowPreReleaseUpgrade)
+				isBeta = false;
+		}
+
+
+		/*
+		** Now run the tests.
+		*/
+
+		boolean passed = true;
+
+		passed = caseConnectionCheck(conn, phase, dbMajor, dbMinor, isBeta) && passed;
+
+		if (conn != null && !conn.isClosed()) {
+
+			passed = caseInitialize(conn, phase, dbMajor, dbMinor, isBeta) && passed;
+			passed = caseProcedures(conn, phase, dbMajor, dbMinor, isBeta) && passed;
+
+			setPhaseComplete(conn, phase, passed);
+
+		}
+
+		System.out.println("END - " + (passed ? "PASS" : "FAIL") + " - phase " + PHASES[phase] + " db version " + dbMajor + "." + dbMinor);
+
+		if (conn != null && !conn.isClosed())
+			conn.close();
+
+	}
+
+
+	/**
+		Test case template
+	*/
+	static boolean caseTemplate(Connection conn, int phase, int dbMajor, int dbMinor, boolean isBeta)
+		throws SQLException {
+
+		boolean passed = true;
+
+		switch (phase) {
+		case PH_CREATE:
+			break;
+		case PH_SOFT_UPGRADE:
+			break;
+		case PH_POST_SOFT:
+			break;
+		case PH_HARD_UPGRADE:
+			break;
+		default:
+			passed = false;
+			break;
+		}
+
+		System.out.println("complete caseTemplate - passed " + passed);
+		return passed;
+	}
+
+
+	static boolean caseConnectionCheck(Connection conn, int phase, int dbMajor, int dbMinor, boolean isBeta)
+		throws SQLException {
+
+		boolean passed = true;
+		boolean needConn;
+
+		switch (phase) {
+		case PH_CREATE:
+			needConn = true;
+			break;
+
+		case PH_SOFT_UPGRADE:
+			needConn = !isBeta;
+			break;
+	
+		case PH_POST_SOFT:
+			needConn = true;
+			break;
+			
+		case PH_HARD_UPGRADE:
+			needConn = !isBeta;
+			break;
+
+		case PH_POST_HARD_UPGRADE:
+			needConn = false;
+			break;
+
+		default:
+			needConn = false;
+			passed = false;
+			break;
+		}
+
+		if (needConn)
+		{
+			if (conn == null) {
+				System.out.println("FAIL - NO CONNECTION");
+				passed = false;
+			}
+		}
+		else
+		{
+			if (conn != null) {
+				System.out.println("FAIL - CONNECTION SUCCEEDED");
+				passed = false;
+				conn.close();				conn = null;
+			}
+		}
+
+		System.out.println("complete caseConnectionCheck - passed " + passed);
+		return passed;
+	}
+
+	/**
+	*/
+	static boolean caseInitialize(Connection conn, int phase, int dbMajor, int dbMinor, boolean isBeta)
+		throws SQLException {
+
+		boolean passed = true;
+
+		switch (phase) {
+		case PH_CREATE:
+			conn.createStatement().executeUpdate("CREATE TABLE PHASE(id INT NOT NULL, ok INT)");
+			conn.createStatement().executeUpdate("CREATE TABLE T1(id INT NOT NULL PRIMARY KEY, name varchar(200))");
+			break;
+		case PH_SOFT_UPGRADE:
+			break;
+		case PH_POST_SOFT:
+			break;
+		case PH_HARD_UPGRADE:
+			break;
+		default:
+			passed = false;
+			break;
+		}
+
+		PreparedStatement ps = conn.prepareStatement("INSERT INTO PHASE(id) VALUES (?)");
+		ps.setInt(1, phase);
+		ps.executeUpdate();
+		ps.close();
+		
+		// perform some transactions
+		ps = conn.prepareStatement("INSERT INTO T1 VALUES (?, ?)");
+		for (int i = 1; i < 20; i++)
+		{
+			ps.setInt(1, i + (phase * 100));
+			ps.setString(2, "p" + phase + "i" + i);
+			ps.executeUpdate();
+		}
+		ps.close();
+		ps = conn.prepareStatement("UPDATE T1 set name = name || 'U' where id = ?");
+		for (int i = 1; i < 20; i+=3)
+		{
+			ps.setInt(1, i + (phase * 100));
+			ps.executeUpdate();
+		}
+		ps.close();
+		ps = conn.prepareStatement("DELETE FROM T1 where id = ?");
+		for (int i = 1; i < 20; i+=4)
+		{
+			ps.setInt(1, i + (phase * 100));
+			ps.executeUpdate();
+		}
+		ps.close();
+		System.out.println("complete caseInitialize - passed " + passed);
+		return passed;
+	}
+
+	static void setPhaseComplete(Connection conn, int phase, boolean passed) throws SQLException {
+
+		PreparedStatement ps = conn.prepareStatement("UPDATE PHASE SET ok = ? where id = ?");
+		ps.setInt(1, passed ? 1 : 0);
+		ps.setInt(2, phase);
+		ps.executeUpdate();
+		ps.close();
+	}
+	static boolean checkPhaseComplete(Connection conn, int phase) throws SQLException {
+
+		PreparedStatement ps = conn.prepareStatement("SELECT COUNT(*) FROM PHASE where id = ? and ok = 1");
+		ps.setInt(1, phase);
+		ResultSet rs = ps.executeQuery();
+		rs.next();
+		int count = rs.getInt(1);
+		rs.close();
+		ps.close();
+		return count == 1;
+	}
+
+
+	/*
+	** Procedures
+	*  10.1 - Check that a procedure with a signature can not be added if the
+	*  on-disk database version is 10.0.
+	*/
+
+	static boolean caseProcedures(Connection conn, int phase, int dbMajor, int dbMinor, boolean isBeta)
+		throws SQLException {
+		
+		boolean signaturesAllowedInOldRelease =
+			dbMajor > 10 || (dbMajor == 10 && dbMinor >= 1);
+
+		boolean passed = true;
+
+		switch (phase) {
+		case PH_CREATE:
+			break;
+		case PH_SOFT_UPGRADE:
+			
+			try {
+				conn.createStatement().execute("CREATE PROCEDURE GC() LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'java.lang.System.gc()'");
+				if (!signaturesAllowedInOldRelease)
+				{
+					System.out.println("FAIL : created procedure with signature");
+					passed = false;
+				}
+			} catch (SQLException sqle) {
+				if (signaturesAllowedInOldRelease || !"XCL47".equals(sqle.getSQLState())) {
+					System.out.println("FAIL " + sqle.getSQLState() + " -- " + sqle.getMessage());
+					passed = false;
+				}
+			}
+			break;
+		case PH_POST_SOFT:
+			try {
+				conn.createStatement().execute("CALL GC()");
+				if (!signaturesAllowedInOldRelease)
+					System.out.println("FAIL : procedure was created in soft upgrade!");
+					
+			} catch (SQLException sqle)
+			{
+				if (signaturesAllowedInOldRelease)
+					System.out.println("FAIL : procedure was created not in soft upgrade!" + sqle.getMessage());
+			}
+			break;
+		case PH_HARD_UPGRADE:
+			if (!signaturesAllowedInOldRelease)
+				conn.createStatement().execute("CREATE PROCEDURE GC() LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'java.lang.System.gc()'");
+			conn.createStatement().execute("CALL GC()");
+			break;
+		default:
+			passed = false;
+			break;
+		}
+
+		System.out.println("complete caseProcedures - passed " + passed);
+		return passed;
+	}
+
+
+}

Propchange: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh?rev=165157&view=auto
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh Thu Apr 28 09:23:10 2005
@@ -0,0 +1,44 @@
+
+#
+#
+# runphases old_major old_minor old_engine new_engine
+#
+# e.g.
+#
+# runphases 10 0 c:/derby/10.0.2.1/lib c:/derby/trunk/jars/sane
+
+omajor=$1
+ominor=$2
+ocs=$3
+ncs=$4
+
+jvm=java
+
+# classpaths
+
+ocp="${ocs}/derby.jar;${ncs}/derbyTesting.jar"
+ncp="${ncs}/derby.jar;${ncs}/derbyTesting.jar"
+
+# database name
+dbdir=updtest_${omajor}_${ominor}
+db=${dbdir}/su_${omajor}_${ominor}
+tempdb=${dbdir}/tdb
+rm -fr ${dbdir}
+
+set -x
+
+# Phase 0 - create the old database
+$jvm -classpath $ocp org.apache.derbyTesting.upgradeTests.phaseTester ${db} 0 ${omajor} ${ominor} ${tempdb}
+
+# Phase 1 - soft upgrade mode with new version
+$jvm -Dderby.database.allowPreReleaseUpgrade=true -classpath $ncp org.apache.derbyTesting.upgradeTests.phaseTester ${db} 1 ${omajor} ${ominor} ${tempdb}
+
+# Phase 2 - post soft upgrade mode with old version
+$jvm -classpath $ocp org.apache.derbyTesting.upgradeTests.phaseTester ${db} 2 ${omajor} ${ominor} ${tempdb}
+
+# Phase 3 - hard upgrade mode with new version
+$jvm -Dderby.database.allowPreReleaseUpgrade=true -classpath $ncp org.apache.derbyTesting.upgradeTests.phaseTester ${db} 3 ${omajor} ${ominor} ${tempdb}
+
+# Phase 4 - post hard upgrade mode with old version 
+$jvm -classpath $ocp org.apache.derbyTesting.upgradeTests.phaseTester ${db} 4 ${omajor} ${ominor} ${tempdb}
+

Propchange: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/upgradeTests/runphases.ksh
------------------------------------------------------------------------------
    svn:eol-style = native