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 kr...@apache.org on 2012/10/01 17:05:48 UTC

svn commit: r1392375 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests: master/ suites/ tests/store/

Author: kristwaa
Date: Mon Oct  1 15:05:48 2012
New Revision: 1392375

URL: http://svn.apache.org/viewvc?rev=1392375&view=rev
Log:
DERBY-5934: Convert store.ReEncryptCrashRecovery

Converted old-style Java test to JUnit.
Changed the name of the test, since tests for database decryption are expected.

Patch file: derby-5934-1a-converted_to_junit.diff

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/CryptoCrashRecoveryTest.java
      - copied, changed from r1392364, db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/ReEncryptCrashRecovery.java
Removed:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ReEncryptCrashRecovery.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/ReEncryptCrashRecovery.java
Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/encryptionAll.runall
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/_Suite.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/encryptionAll.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/encryptionAll.runall?rev=1392375&r1=1392374&r2=1392375&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/encryptionAll.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/encryptionAll.runall Mon Oct  1 15:05:48 2012
@@ -3,4 +3,3 @@ store/encryptDatabaseTest1.sql
 store/encryptDatabaseTest2.sql
 store/encryptDatabaseTest3.sql
 store/encryptionKey_jar.sql
-store/ReEncryptCrashRecovery.java

Copied: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/CryptoCrashRecoveryTest.java (from r1392364, db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/ReEncryptCrashRecovery.java)
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/CryptoCrashRecoveryTest.java?p2=db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/CryptoCrashRecoveryTest.java&p1=db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/ReEncryptCrashRecovery.java&r1=1392364&r2=1392375&rev=1392375&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/ReEncryptCrashRecovery.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/CryptoCrashRecoveryTest.java Mon Oct  1 15:05:48 2012
@@ -1,6 +1,6 @@
 /*
 
-   Derby - Class org.apache.derbyTesting.functionTests.store.ReEncryptCrashRecovery
+   Derby - Class org.apache.derbyTesting.functionTests.store.CryptoCrashRecoveryTest
 
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -20,675 +20,588 @@
  */
 
 package org.apache.derbyTesting.functionTests.tests.store;
+
+import java.io.File;
 import java.sql.Connection;
 import java.sql.Statement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import org.apache.derby.tools.ij;
-import org.apache.derbyTesting.functionTests.util.TestUtil;
-import org.apache.derby.iapi.services.sanity.SanityManager;
+import javax.sql.DataSource;
 
-/*
- * This class tests crash/recovery scenarions during  (re) encryption of 
- * database. Debug flags are used to simulate crashes during the 
- * encrytpion of an un-encrypted database and re-encryption of an encrypted
- * database with new password/key. 
- *
- *  Unlike the other recovery tests which do a setup and recovery as different
- *  tests, Incase of re-encryption crash/recovery can be simulated in one 
- *  test itself because re-encryption is done at boot time. When debug flags are
- *  set database boot itself fails. To test the recovery, it is just a matter 
- *  of clearing up the debug flag and rebooting the database. 
- *  
- * In Non debug mode, this tests does not do anything.
- *
- * @version 1.0
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.derby.iapi.services.sanity.SanityManager;
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.JDBC;
+import org.apache.derbyTesting.junit.JDBCDataSource;
+import org.apache.derbyTesting.junit.TestConfiguration;
+
+/**
+ * This class tests crash/recovery scenarios during cryptographic operations on
+ * the database.
+ * <p>
+ * Debug flags are used to simulate crashes during the encryption of an
+ * un-encrypted database and re-encryption of an encrypted database with new
+ * password/key.
+ * <p>
+ * Unlike the other recovery tests which do a setup and recovery as different
+ * tests, crash/recovery for cryptographic operations can be simulated in one
+ * test itself because the cryptographic operation is performed at boot time.
+ * When debug flags are set the database boot itself fails. To test the
+ * recovery, it is just a matter of clearing up the debug flag and rebooting
+ * the database.
+ * <p>
+ * In non-debug mode (compiled as "insane") this test does nothing.
  */
+public class CryptoCrashRecoveryTest
+    extends BaseJDBCTestCase {
 
-public class ReEncryptCrashRecovery
-{
+    private static boolean USE_ENC_PWD = true;
+    private static boolean USE_ENC_KEY = false;
 
-    // database name used to test re-encryption of an encrypted database 
-    // using a new boot password.
-    private static final String TEST_REENCRYPT_PWD_DATABASE = "wombat_pwd_ren" ;
-    // database name used to test encryption and un-encrypted database.
-    // using a boot password.
-    private static final String TEST_ENCRYPT_PWD_DATABASE = "wombat_pwd_en";
-
-
-    // database name used to test re-encryption of an encrypted database 
-    // using the external encryption key.
-    private static final String TEST_REENCRYPT_KEY_DATABASE = "wombat_key_ren" ;
-    // database name used to test encryption of un-encrypted database.
-    // using external encryption key.
-    private static final String TEST_ENCRYPT_KEY_DATABASE = "wombat_key_en";
-
-    // flags to indicate type of mechanism used to test the (re)encryption
-    private static final  int USING_KEY = 1;
-    private static final  int USING_PASSWORD = 2;
-
-    // flags to indicate the password/key to be used during recovery
-    // on reboot after a crash.
-    private static final int NONE = 1;
-    private static final int OLD  = 2;
-    private static final int NEW  = 3;
+    private static final int OP_ENCRYPT = 0;
+    private static final int OP_DECRYPT = 1;
+    private static final int OP_REENCRYPT = 2;
 
-    // test table name.
+    /** Table name used by the test. */
     private static final String TEST_TABLE_NAME = "emp";
 
     private static final String OLD_PASSWORD = "xyz1234abc";
     private static final String NEW_PASSWORD = "new1234xyz";
-    
+
     private static final String OLD_KEY = "6162636465666768";
     private static final String NEW_KEY = "5666768616263646";
-    
-    // the current database being tested.
-    private String currentTestDatabase ;
-    // the current encryption type being tested. 
-    private int encryptionType; 
-
-    // set the following to true, for this test 
-    // spit out more status messages.
-    private boolean verbose = false;
-
 
-	ReEncryptCrashRecovery() {
-        
+	public CryptoCrashRecoveryTest(String name) {
+        super(name);
 	}
 
-
-    /*
-	 * Test (re)encrytpion crash/recovery scenarios. 
-	 */
-	private void runTest() throws Exception {
-		logMessage("Begin  ReEncryptCrashRecovery Test");
-
+    public static Test suite() {
+        Test suite;
         if (SanityManager.DEBUG) {
-            if (verbose) 
-                logMessage("Start testing re-encryption with Password");
-            // test  crash recovery during re-encryption 
-            // using the password mechanism.
-            currentTestDatabase = TEST_REENCRYPT_PWD_DATABASE;
-            encryptionType = USING_PASSWORD;
-            runCrashRecoveryTestCases(true);
-
-        
-            if (verbose) 
-            logMessage("Start Testing encryption with Password");
-
-            // test crash recovery during databse encryption 
-            // using the password mechanism.
-            currentTestDatabase = TEST_ENCRYPT_PWD_DATABASE;
-            encryptionType = USING_PASSWORD;
-            // run crash recovery test cases. 
-            runCrashRecoveryTestCases(false);
-
-
-            if (verbose) {
-                logMessage("Start Testing Encryption with external Key");
-            }
-            // test crash recovery during database encryption 
-            // using the encryption key.
-        
-            currentTestDatabase = TEST_ENCRYPT_KEY_DATABASE;
-            encryptionType = USING_KEY;
-            runCrashRecoveryTestCases(false);
-
-            if (verbose) 
-                logMessage("Start Testing re-encryption with external Key");
-
-            // test crash recovery dureing re-encryption 
-            // using the encryption key.
-        
-            currentTestDatabase = TEST_REENCRYPT_KEY_DATABASE;
-            encryptionType = USING_KEY;
-            runCrashRecoveryTestCases(true);
-        }
-        logMessage("End ReEncryptCrashRecovery Test");
+            suite = TestConfiguration.embeddedSuite(
+                    CryptoCrashRecoveryTest.class);
+        } else {
+            suite = new TestSuite("disabled due to non-debug build");
+            println("test disabled due to non-debug build");
+        }
+        return suite;
+    }
+
+	public void testEncryptionWithBootPassword()
+            throws Exception {
+        String db = "wombat_pwd_en";
+        // Crash recovery during encryption using the password mechanism.
+        DataSource ds = JDBCDataSource.getDataSource(db);
+        runCrashRecoveryTestCases(ds, OP_ENCRYPT, USE_ENC_PWD);
+        assertDirectoryDeleted(new File("system", db));
+    }
+
+	public void testEncryptionWitEncryptionKey()
+            throws Exception {
+        String db = "wombat_key_en";
+        // Crash recovery during database encryption using the encryption key.
+        DataSource ds = JDBCDataSource.getDataSource(db);
+        runCrashRecoveryTestCases(ds, OP_ENCRYPT, USE_ENC_KEY);
+        assertDirectoryDeleted(new File("system", db));
+    }
+
+	public void testReEncryptionWithBootPassword()
+            throws Exception {
+        String db = "wombat_pwd_ren";
+        // Crash recovery during re-encryption using the password mechanism.
+        DataSource ds = JDBCDataSource.getDataSource(db);
+        runCrashRecoveryTestCases(ds, OP_REENCRYPT, USE_ENC_PWD);
+        assertDirectoryDeleted(new File("system", db));
+    }
+
+	public void testReEncryptionWithEncryptionKey()
+            throws Exception {
+        String db = "wombat_key_ren";
+        // Crash recovery during re-encryption using an encryption key.
+        DataSource ds = JDBCDataSource.getDataSource(db);
+        runCrashRecoveryTestCases(ds, OP_REENCRYPT, USE_ENC_KEY);
+        assertDirectoryDeleted(new File("system", db));
     }
 
-
     /**
-     * run crash recovery test scenarios using the debug flags.
-     * @param reEncrypt  <code> true </code> if testing re-encryption 
-     *                   <colde> false </code> otherwise.
-     */
-    private void runCrashRecoveryTestCases(boolean reEncrypt) 
-        throws SQLException
-    {
-        Connection conn;
-        if (reEncrypt) 
-            conn = createEncryptedDatabase();
-        else 
-            conn = createDatabase();
-
-        createTable(conn, TEST_TABLE_NAME);
-        //load some rows 
-        insert(conn, TEST_TABLE_NAME, 100);
-        conn.commit();
-        conn.close();
-		shutdown();
-
-        // following cases of (re) encryption should be rolled back. 
-        int passwordKey = (reEncrypt ? OLD : NONE );
+     * Runs crash recovery test scenarios for the given cryptographic operation
+     * using the debug flags.
+     *
+     * @param ds data source
+     * @param operation the cryptographic operation to perform
+     * @param useEncPwd whether to use encryption key or boot password (see
+     *      {@linkplain #USE_ENC_KEY} and {@linkplain #USE_ENC_PWD})
+     */
+    private void runCrashRecoveryTestCases(DataSource ds, int operation,
+                                           boolean useEncPwd)
+            throws SQLException {
+        verifyOperation(operation);
+        Connection con;
+        if (operation == OP_REENCRYPT) {
+            con = createEncryptedDatabase(ds, useEncPwd);
+        } else {
+            con = createDatabase(ds);
+        }
+
+        createTable(con, TEST_TABLE_NAME);
+        // Load some rows, used for verification later.
+        insert(con, TEST_TABLE_NAME, 100);
+        con.commit();
+        con.close();
+        JDBCDataSource.shutdownDatabase(ds);
+
+        // Following cases of (re-)encryption should be rolled back.
+        Boolean useNewCredential =
+                (operation == OP_REENCRYPT ? Boolean.FALSE : null);
 
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_BEFORE_COMMT);
+        crash(ds, operation, useEncPwd, TEST_REENCRYPT_CRASH_BEFORE_COMMT);
 
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_AFTER_COMMT);
-        crashInRecovery(passwordKey, 
+        crash(ds, operation, useEncPwd, TEST_REENCRYPT_CRASH_AFTER_COMMT);
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_LOGFILE_DELETE);
-        crashInRecovery(passwordKey, 
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_REVERTING_KEY);
-        crashInRecovery(passwordKey, 
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_BEFORE_RECOVERY_FINAL_CLEANUP);
 
-        
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_AFTER_COMMT);
-        crashInRecovery(passwordKey, 
+
+        crash(ds, operation, useEncPwd, TEST_REENCRYPT_CRASH_AFTER_COMMT);
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_LOGFILE_DELETE);
         // retry (re)encryption and crash.
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_AFTER_COMMT);
-
+        crash(ds, operation, useEncPwd, TEST_REENCRYPT_CRASH_AFTER_COMMT);
 
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY);
-        crashInRecovery(passwordKey, 
+        crash(ds, operation, useEncPwd,
+                TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY);
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_LOGFILE_DELETE);
-        crashInRecovery(passwordKey, 
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_REVERTING_KEY);
-        crashInRecovery(passwordKey, 
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_BEFORE_RECOVERY_FINAL_CLEANUP);
 
-
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY);
-        crashInRecovery(passwordKey, 
+        crash(ds, operation, useEncPwd,
+                TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY);
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_REVERTING_KEY);
-        // retry (re)encryption and crash.
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY);
-        crashInRecovery(passwordKey, 
+        // Retry (re-)encryption and crash.
+        crash(ds, operation, useEncPwd,
+                TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY);
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_BEFORE_RECOVERY_FINAL_CLEANUP);
 
+        // Rollowing cases of (re-)encryption should be successful, only
+        // cleanup is pending.
 
-        // following cases  (re) encryption should be successful, only 
-        // cleanup is pending. 
-
-        // crash after database is re-encrypted, but before cleanup. 
-        // (re)encryption is complete, database should be bootable 
-        // with a new password. 
-        passwordKey = (reEncrypt ? NEW : OLD);
-        crash(reEncrypt, TEST_REENCRYPT_CRASH_AFTER_CHECKPOINT);
-        crashInRecovery(passwordKey, 
+        // Crash after database is (re-)encrypted, but before cleanup.
+        // If re-encryption is complete, database should be bootable with the
+        // new password.
+        useNewCredential =
+                (operation == OP_REENCRYPT ? Boolean.TRUE : Boolean.FALSE);
+        crash(ds, operation, useEncPwd, TEST_REENCRYPT_CRASH_AFTER_CHECKPOINT);
+        crashInRecovery(ds, useEncPwd, useNewCredential,
                      TEST_REENCRYPT_CRASH_BEFORE_RECOVERY_FINAL_CLEANUP);
 
-        recover(passwordKey);
-        shutdown();
+        recover(ds, useEncPwd, useNewCredential);
+        JDBCDataSource.shutdownDatabase(ds);
     }
 
-
-    /*
-     * Attempt to (re)encrypt the database and force it to crash 
-     * at the given debug flag. 
-     */
-    private void crash(boolean reEncrypt, String debugFlag) 
-    {
-        if (verbose)
-            logMessage("Testing : " + debugFlag);
-        // set the debug flag to crash. 
+    /**
+     * Crashes the engine at the point specified by the debug flag while
+     * performing the requested operation.
+     *
+     * @param ds database
+     * @param operation cryptographic operation to perform
+     * @param useEncPwd whether to use boot password or encryption key
+     * @param debugFlag debug flag to enable to make the engine crash
+     */
+    private void crash(DataSource ds, int operation, boolean useEncPwd,
+                       String debugFlag) {
+        println("Testing crash at " + debugFlag);
+        // Set the debug flag to crash.
         setDebugFlag(debugFlag);
 
-        SQLException sqle = null;
-        Connection conn;
         try {
-            if (reEncrypt) 
-                conn = reEncryptDatabase();
-            else 
-                conn = encryptDatabase();
-                
-        }catch (SQLException se) {
-            // (re)encryption of the database should have failed,
-            // at the specified debug flag.
-            sqle = se;
+            if (operation == OP_REENCRYPT) {
+                reEncryptDatabase(ds, useEncPwd);
+            } else {
+                encryptDatabase(ds, useEncPwd);
+            }
+            fail("crypto operation didn't crash as expected");
+        } catch (SQLException sqle) {
+            // check that database boot failed at the set debug flag.
+            verifyBootException(sqle, debugFlag);
+        } finally {
+            clearDebugFlag(debugFlag);
         }
-
-        // check that database boot failed at the set debug flag.
-        verifyException(sqle, debugFlag);
-        // clear the debug flag.
-        clearDebugFlag(debugFlag);
     }
 
+    /**
+     * Crashes the engine in recovery of the given database at the point
+     * specified by the debug flag.
+     *
+     * @param ds database
+     * @param useEncPwd whether to use boot password or encryption key
+     * @param useNewCredential tri-state telling whether to use the old, the
+     *      new, or no credential when booting the database
+     * @param debugFlag debug flag to enable to make the engine crash
+     */
+    private void crashInRecovery(DataSource ds, boolean useEncPwd,
+                                 Boolean useNewCredential, String debugFlag)
+            throws SQLException {
+        println("Recovery crash at " + debugFlag);
 
-    /*
-     * Crash in recovery of the database at the given 
-     * debug flag.
-     */
-    private void crashInRecovery(int passwordKey, String debugFlag) 
-        throws SQLException 
-    {
-        if (verbose) 
-            logMessage("Testing : " + debugFlag);
-        
-        // set the debug flag to crash. 
+        // set the debug flag to crash.
         setDebugFlag(debugFlag);
-        SQLException sqle = null;
         try {
-            Connection conn = bootDatabase(passwordKey);
-        } catch (SQLException se) {
-            // recovery of the database 
-            // shold have failed at the specified
-            // debug flag.
-            sqle = se;
-        }
-        // check that database boot failed at the set debug flag.
-        verifyException(sqle, debugFlag);
-        // clear the debug flag.
-        clearDebugFlag(debugFlag);
-    }   
-    
-
+            bootDatabase(ds, useEncPwd, useNewCredential);
+            fail("database booted unexpectedly");
+        } catch (SQLException sqle) {
+            // check that database boot failed at the set debug flag.
+            verifyBootException(sqle, debugFlag);
+        } finally {
+            clearDebugFlag(debugFlag);
+        }
+    }
 
     /*
-     * Recover the database that failied during re-encryption and 
-     * perform some simple sanity check on the database. 
+     * Recover the database that failed during re-encryption and
+     * perform some simple sanity checks on the database.
      */
-    private void recover(int passwordKey) 
-        throws SQLException 
-    {
-        // starting recovery of database with failed Re-encrytpion
+    private void recover(DataSource ds, boolean useEncKey,
+                         Boolean useNewCredential)
+            throws SQLException {
+        // starting recovery of database with failed Re-encryption
         // in debug mode;
 
-        Connection conn = bootDatabase(passwordKey);
+        Connection con = bootDatabase(ds, useEncKey, useNewCredential);
 
-        // verify the contents of the db are ok. 
-        runConsistencyChecker(conn, TEST_TABLE_NAME);
-        // insert some rows, this might fail if anyhing is 
+        // Verify that the contents of the db are ok.
+        runConsistencyChecker(con, TEST_TABLE_NAME);
+        // Insert some rows, this might fail if anything is
         // wrong in the logging system setup.
-        insert(conn, TEST_TABLE_NAME, 100);
-        conn.commit();
-        conn.close();
-    }   
-    
-
-
-    /** *************************************************
-     * Crash/recovery test scenarios during 
-     * encryption of an un-encrypted database.
-     ****************************************************/
-    
-
-
-    // Debug flags that are to be set to simulate a crash 
-    // at different points during (re)encryption of the database. 
-    // these flags should match the flags in the engine code;
-    // these are redifined here to avoid pulling the engine code
-    // into the tests. 
-
-    
-    /*
-      Set to true if we want the re-encryption to crash just 
-      before the commit.
-	*/
-
-	public static final String TEST_REENCRYPT_CRASH_BEFORE_COMMT  = 
-        SanityManager.DEBUG ? "TEST_REENCRYPT_CRASH_BEFORE_COMMT" : null ;
-    public static final String TEST_REENCRYPT_CRASH_AFTER_COMMT  = 
-        SanityManager.DEBUG ? "TEST_REENCRYPT_CRASH_AFTER_COMMT" : null ;
-    public static final String TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY  = 
-        SanityManager.DEBUG ? "TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY" : null ;
-    public static final String TEST_REENCRYPT_CRASH_AFTER_CHECKPOINT  = 
-        SanityManager.DEBUG ? "TEST_REENCRYPT_CRASH_AFTER_CHECKPOINT" : null ;
-                                            
-    public static final String 
+        insert(con, TEST_TABLE_NAME, 100);
+        con.commit();
+        con.close();
+    }
+
+    // Debug flags are set to simulate a crash at different
+    // points during a cryptographic operation on the database.
+    // These flags should match the flags in the engine code, and they
+    // are redefined here to avoid pulling the engine code into the tests.
+
+	private static final String TEST_REENCRYPT_CRASH_BEFORE_COMMT =
+            "TEST_REENCRYPT_CRASH_BEFORE_COMMT";
+    private static final String TEST_REENCRYPT_CRASH_AFTER_COMMT =
+            "TEST_REENCRYPT_CRASH_AFTER_COMMT";
+    private static final String TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY =
+        "TEST_REENCRYPT_CRASH_AFTER_SWITCH_TO_NEWKEY";
+    private static final String TEST_REENCRYPT_CRASH_AFTER_CHECKPOINT =
+        "TEST_REENCRYPT_CRASH_AFTER_CHECKPOINT";
+    private static final String
         TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_LOGFILE_DELETE =
-        SanityManager.DEBUG ?
-        "TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_LOGFILE_DELETE" : null;
-    public static final String 
+            "TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_LOGFILE_DELETE";
+    private static final String
         TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_REVERTING_KEY =
-        SanityManager.DEBUG ?
-        "TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_REVERTING_KEY" : null;
-    public static final String 
+            "TEST_REENCRYPT_CRASH_AFTER_RECOVERY_UNDO_REVERTING_KEY";
+    private static final String
         TEST_REENCRYPT_CRASH_BEFORE_RECOVERY_FINAL_CLEANUP =
-        SanityManager.DEBUG ?
-        "TEST_REENCRYPT_CRASH_BEFORE_RECOVERY_FINAL_CLEANUP" : null;
-    
-    
-    void setDebugFlag(String debugFlag) {
+            "TEST_REENCRYPT_CRASH_BEFORE_RECOVERY_FINAL_CLEANUP";
+
+    private void setDebugFlag(String debugFlag) {
         if (SanityManager.DEBUG) {
             SanityManager.DEBUG_SET(debugFlag);
         }
     }
 
-    void clearDebugFlag(String debugFlag) {
+    private void clearDebugFlag(String debugFlag) {
         if (SanityManager.DEBUG) {
             SanityManager.DEBUG_CLEAR(debugFlag);
         }
     }
 
-    /*
-     * verify that database boot failed when a debug flag is set. 
-     */
-    private void verifyException(SQLException sqle, String debugFlag) 
-    {
-        boolean expectedExcepion = false ;
-        if (sqle != null) 
-        {
-            
-            if (sqle.getSQLState() != null && 
-                sqle.getSQLState().equals("XJ040")) 
-            {
-                // boot failed as expected with the  debug flag
-                // now check if it failed with specifed debug flags.
-                SQLException ne = sqle.getNextException();
-                if (ne != null) {
-                    String message = ne.getMessage();
-                    // check if debug flag exists in the message
-                    if (message.indexOf(debugFlag) != -1)
-                    {
-                        expectedExcepion = true;
-                    }
-                }
-            }
-
-            if (!expectedExcepion)
-                dumpSQLException(sqle);
-        } 
-        else 
-        {
-            if (SanityManager.DEBUG) 
-            {
-                logMessage("Did not crash at " + debugFlag);
+    /**
+     * Verifies that database boot failed because of the right reasons.
+     *
+     * @param sqle the exception thrown when
+     * @param debugFlag the debug flag that was set before booting
+     * @throws junit.framework.AssertionFailedError if the boot failure is
+     *      deemed invalid
+     */
+    private void verifyBootException(SQLException sqle, String debugFlag) {
+        assertSQLState("XJ040", sqle);
+        // Boot failed as expected triggered by a debug flag.
+        // Now check if it failed because of the expected debug flag.
+        SQLException ne = sqle.getNextException();
+        while (ne != null) {
+            String message = ne.getMessage();
+            // Check if debug flag exists in the message.
+            if (message.indexOf(debugFlag) != -1) {
+                return;
             }
+            ne = ne.getNextException();
         }
+        fail("real error or wrong debug flag triggered crash", sqle);
     }
 
-
-    /* 
-     * create the tables that are used by this test.
-     * @param  conn  connection to the database.
-     * @param  tableName  Name of the table to create.
+    /**
+     * Creates the table that is used by this test.
+     *
+     * @param con connection to the database
+     * @param tableName  name of the table to create
      * @exception SQLException if any database exception occurs.
      */
-    void createTable(Connection conn, 
-                     String tableName) throws SQLException {
-
-			Statement s = conn.createStatement();
-			s.executeUpdate("CREATE TABLE " + tableName + 
-							"(id INT," +
-							"name CHAR(200))");
-			s.executeUpdate("create index " + tableName + "_id_idx on " + 
-							tableName + "(id)");
-			s.close();
+    private void createTable(Connection con, String tableName)
+            throws SQLException {
+        Statement s = con.createStatement();
+        s.executeUpdate("CREATE TABLE " + tableName +
+                        "(id INT," +
+                        "name VARCHAR(200))");
+        s.executeUpdate("create index " + tableName + "_id_idx on " +
+                        tableName + "(id)");
+        s.close();
     }
 
-
     /**
-	 * Run some consistency checks.
-     * @param  conn  connection to the database.
-	 * @param  tableName  consistency checks are performed on this table.
-     * @exception SQLException if any database exception occurs.
+	 * Runs some consistency checks on the specified table.
+     *
+     * @param con connection to the database
+	 * @param tableName target table
+     * @exception SQLException if any database exception occurs
 	 */
-	void runConsistencyChecker(Connection conn, 
-                               String tableName) throws SQLException {
-		Statement stmt = conn.createStatement();
+	private void runConsistencyChecker(Connection con, String tableName)
+            throws SQLException {
+		Statement stmt = con.createStatement();
 		stmt.execute("values SYSCS_UTIL.SYSCS_CHECK_TABLE('APP',  'EMP')");
-        // check the data in the EMP table.
-        select(conn, tableName);
+        // Check the data in the EMP table.
+        verifyContents(con, tableName);
 	}
 
-    		
     /**
-     * Insert some rows into the specified table.
-     * @param  conn  connection to the database.
-     * @param  tableName  name of the table that rows are inserted.
-     * @param  rowCount   Number of rows to Insert.
-     * @exception SQLException if any database exception occurs.
-     */
-    void insert(Connection conn, 
-                String tableName, 
-                int rowCount) throws SQLException 
-    {
-
-        PreparedStatement ps = conn.prepareStatement("INSERT INTO " + 
-                                                     tableName + 
-                                                     " VALUES(?,?)");
-        int startId = findMax(conn, tableName);
-        for (int i = startId; i < rowCount; i++) {
-			
+     * Inserts rows into the specified table.
+     *
+     * @param con connection to the database
+     * @param tableName target table
+     * @param rowCount number of rows to insert
+     * @exception SQLException if any database exception occurs
+     */
+    private void insert(Connection con, String tableName, int rowCount)
+            throws SQLException {
+        PreparedStatement ps = con.prepareStatement(
+                "INSERT INTO " + tableName + " VALUES(?,?)");
+        int startId = findMaxId(con, tableName);
+        int endId = rowCount + startId;
+        for (int i = startId; i < endId; i++) {
             ps.setInt(1, i); // ID
             ps.setString(2 , "skywalker" + i);
             ps.executeUpdate();
         }
         ps.close();
-        conn.commit();
+        con.commit();
     }
 
     /**
-    * find a max value on the give table. 
-    * @param  conn  connection to the database.
-    * @param  tableName  name of the table.
-    * @exception SQLException if any database exception occurs.
-    */
-    private int findMax(Connection conn, 
-                        String tableName) throws SQLException 
-    {
-        Statement s = conn.createStatement();
-        ResultSet rs = s.executeQuery("SELECT max(ID) from " +  
-										  tableName);
-        rs.next();
+     * Returns the highest id in the given table.
+     *
+     * @param con connection to the database.
+     * @param tableName name of the table
+     * @return The highest id.
+     * @exception SQLException if any database exception occurs.
+     */
+    private int findMaxId(Connection con, String tableName)
+            throws SQLException {
+        Statement s = con.createStatement();
+        ResultSet rs = s.executeQuery("SELECT max(ID) from " + tableName);
+        assertTrue(rs.next());
         int max = rs.getInt(1);
         rs.close();
         s.close();
         return max;
     }
 
-
-    /*
-     * read  the rows in the table. 
-     * @param  conn  connection to the database.
-     * @param  tableName  select operation is perfomed on this table.
-     * @exception SQLException if any database exception occurs.
-     */
-    void select(Connection conn , 
-                String tableName) throws SQLException 
-    {
-		
-        Statement s = conn.createStatement();
-        ResultSet rs = s.executeQuery("SELECT ID, name from " +  
-										  tableName + " order by id" );
+    /**
+     * Verifies the rows in the given table.
+     *
+     * @param con connection to the database
+     * @param tableName table to select from
+     * @exception SQLException if any database exception occurs
+     */
+    private void verifyContents(Connection con, String tableName)
+            throws SQLException {
+        Statement s = con.createStatement();
+        ResultSet rs = s.executeQuery(
+                "SELECT ID, name from " +  tableName + " order by id");
         int count = 0;
         int id = 0;
-        while(rs.next())
-        {
+        while (rs.next()) {
             int tid = rs.getInt(1);
             String name = rs.getString(2);
-            if(name.equals("skywalker" + id) && tid!= id)
-            {
-                logMessage("DATA IN THE TABLE IS NOT AS EXPECTED");
-                logMessage("Got :ID=" +  tid + " Name=:" + name);
-                logMessage("Expected: ID=" + id + "Name=" + "skywalker" + id );
-            }
-
+            assertEquals("skywalker" + id, name);
+            assertEquals(id, tid);
             id++;
             count++;
         }
-            
+
         rs.close();
         s.close();
-        conn.commit();
+        con.commit();
     }
 
-
-
-    /*
-     * create an encrypted database.
-     */
-    private Connection createEncryptedDatabase() throws SQLException
-    {
-        String connAttrs = "";
-        if (encryptionType == USING_PASSWORD) 
-        {
+    /**
+     * Creates an encrypted database.
+     *
+     * @param ds database
+     * @param useEncPwd whether to use boot password or encryption key
+     */
+    private Connection createEncryptedDatabase(DataSource ds, boolean useEncPwd)
+            throws SQLException {
+        String connAttrs = "dataEncryption=true;";
+        if (useEncPwd) {
             // create encrypted database.
-            connAttrs = "create=true;dataEncryption=true;bootPassword=" +
-                OLD_PASSWORD;
-        }
-
-        if (encryptionType == USING_KEY) 
-        {
+            connAttrs += "bootPassword=" + OLD_PASSWORD;
+        } else {
             // create an encrypted  database.
-            connAttrs = "create=true;dataEncryption=true;encryptionKey=" +
-                OLD_KEY;
+            connAttrs += "encryptionKey=" + OLD_KEY;
+        }
+        JDBCDataSource.setBeanProperty(ds, "createDatabase", "create");
+        JDBCDataSource.setBeanProperty(ds, "connectionAttributes", connAttrs);
+        try {
+            return ds.getConnection();
+        } finally {
+            JDBCDataSource.clearStringBeanProperty(ds, "createDatabase");
+            JDBCDataSource.clearStringBeanProperty(ds, "connectionAttributes");
         }
-        
-        return TestUtil.getConnection(currentTestDatabase, connAttrs); 
     }
 
-
-    /*
-     * create an un-encrypted database.
-     */
-    private Connection createDatabase() throws SQLException
-    {
-        return TestUtil.getConnection(currentTestDatabase,  
-                                      "create=true" );
+    /**
+     * Creates an un-encrypted database.
+     *
+     * @param ds database
+     */
+    private Connection createDatabase(DataSource ds)
+            throws SQLException {
+        JDBCDataSource.setBeanProperty(ds, "createDatabase", "create");
+        try {
+            Connection con = ds.getConnection();
+            JDBC.assertNoWarnings(con.getWarnings());
+            return con;
+        } finally {
+            JDBCDataSource.clearStringBeanProperty(ds, "createDatabase");
+        }
     }
 
-
     /**
-     * Re-encrypt the database. 
-     * @exception SQLException if any database exception occurs.
-     */
-    private Connection  reEncryptDatabase() throws SQLException
-    {
-        String connAttrs = "";
-        if (encryptionType == USING_PASSWORD) 
-        {
-            // re-encrypt the database.
-            connAttrs = "bootPassword=" + OLD_PASSWORD + 
+     * Re-encrypts the database.
+     *
+     * @param ds database
+     * @param useEncPwd whether to use boot password or encryption key
+     * @throws SQLException if any database exception occurs
+     */
+    private Connection reEncryptDatabase(DataSource ds, boolean useEncPwd)
+            throws SQLException {
+        String connAttrs;
+        if (useEncPwd) {
+            connAttrs = "bootPassword=" + OLD_PASSWORD +
                 ";newBootPassword=" + NEW_PASSWORD;
-        }
-
-        if (encryptionType == USING_KEY) 
-        {
-            // re-encrypt the database.
-            connAttrs = "encryptionKey=" + OLD_KEY + 
+        } else {
+            connAttrs = "encryptionKey=" + OLD_KEY +
                 ";newEncryptionKey=" + NEW_KEY;
         }
-        
-        if (verbose)
-            logMessage("re-encrypting " + currentTestDatabase + 
-                       " with " + connAttrs);
 
-        return TestUtil.getConnection(currentTestDatabase, connAttrs); 
+        JDBCDataSource.setBeanProperty(ds, "connectionAttributes", connAttrs);
+        println("re-encrypting " + db(ds) + " with " + connAttrs);
+        // Re-encrypt the database.
+        try {
+            return ds.getConnection();
+        } finally {
+            JDBCDataSource.clearStringBeanProperty(ds, "connectionAttributes");
+        }
     }
 
-    
     /**
-     * Encrypt an un-encrypted atabase. 
+     * Encrypts an un-encrypted database.
+     *
+     * @param ds database
+     * @param useEncPwd whether to use boot password or encryption key
      * @exception SQLException if any database exception occurs.
      */
-    private Connection encryptDatabase() 
-        throws SQLException
-    {
-        String connAttrs = "";
-        if (encryptionType == USING_PASSWORD) 
-        {
-            //encrypt an existing database.
-            connAttrs = "dataEncryption=true;bootPassword=" + OLD_PASSWORD;
-        }
-        if (encryptionType == USING_KEY) 
-        {
-            //encrypt an existing database.
-            connAttrs = "dataEncryption=true;encryptionKey=" + OLD_KEY;
+    private Connection encryptDatabase(DataSource ds, boolean useEncPwd)
+        throws SQLException {
+        String connAttrs = "dataEncryption=true;";
+        if (useEncPwd) {
+            connAttrs += "bootPassword=" + OLD_PASSWORD;
+        } else {
+            connAttrs += "encryptionKey=" + OLD_KEY;
         }
 
-        if (verbose)
-            logMessage("encrypting " + currentTestDatabase + 
-                       " with " + connAttrs);
-        return TestUtil.getConnection(currentTestDatabase, connAttrs); 
+        JDBCDataSource.setBeanProperty(ds, "connectionAttributes", connAttrs);
+        println("encrypting " + db(ds) + " with " + connAttrs);
+        //Encrypt the existing database.
+        try {
+            return ds.getConnection();
+        } finally {
+            JDBCDataSource.clearStringBeanProperty(ds, "connectionAttributes");
+        }
     }
-    
 
     /**
-     * Boot the database. 
-     * @param passwordKey the password/key to use.  
+     * Boots the database.
+     *
+     * @param ds database
+     * @param useEncPwd whether to use boot password or encryption key
+     * @param useNewCredential tri-state telling whether to use the old, the
+     *      new, or no credential when booting the database
      * @exception SQLException if any database exception occurs.
      */
-    Connection bootDatabase(int passwordKey)
-        throws SQLException 
-    {
-
+    private Connection bootDatabase(DataSource ds,
+                                    boolean useEncPwd, Boolean useNewCredential)
+            throws SQLException {
         String connAttrs = "";
-        if (encryptionType == USING_PASSWORD) 
-        {
-            if (passwordKey == NEW)
+        if (useEncPwd) {
+            if (Boolean.TRUE.equals(useNewCredential)) {
                 connAttrs = "bootPassword=" + NEW_PASSWORD;
-            else if (passwordKey == OLD)
+            } else if (Boolean.FALSE.equals(useNewCredential)) {
                 connAttrs = "bootPassword=" + OLD_PASSWORD;
-        }
-
-        
-        if (encryptionType == USING_KEY) 
-        {
-            if (passwordKey == NEW)
+            }
+        } else {
+            if (Boolean.TRUE.equals(useNewCredential)) {
                 connAttrs = "encryptionKey=" + NEW_KEY;
-            else if (passwordKey == OLD)
+            } else if (Boolean.FALSE.equals(useNewCredential)) {
                 connAttrs = "encryptionKey=" + OLD_KEY;
+            }
         }
 
-        if (verbose)
-            logMessage("booting " + currentTestDatabase + 
-                   " with " + connAttrs);
-        return TestUtil.getConnection(currentTestDatabase, connAttrs); 
+        JDBCDataSource.setBeanProperty(ds, "connectionAttributes", connAttrs);
+        println("booting " + db(ds) +
+                (connAttrs.length() > 0 ? " with " + connAttrs : ""));
+        try {
+            return ds.getConnection();
+        } finally {
+            JDBCDataSource.clearStringBeanProperty(ds, "connectionAttributes");
+        }
     }
 
-
-
-    /**
-	 * Shutdown the datbase
-	 */
-	void shutdown() {
-
-        if (verbose)
-            logMessage("Shutdown " + currentTestDatabase);
-		try{
-			//shutdown
-			TestUtil.getConnection(currentTestDatabase, "shutdown=true");
-		}catch(SQLException se){
-			if (se.getSQLState() == null || !(se.getSQLState().equals("08006")))
-            {
-                // database was not shutdown properly
-				dumpSQLException(se);
-            }
+    /** Verifies if the operation constant is a known operation. */
+    private static void verifyOperation(int operation) {
+        switch (operation) {
+            case OP_ENCRYPT:
+            //case OP_DECRYPT:
+            case OP_REENCRYPT:
+                return;
+            default:
+                fail("unknown operation constant: " + operation);
         }
-        
-
     }
 
-    /**
-     * dump the SQLException to the standard output.
-	 */
-	private void dumpSQLException(SQLException sqle) {
-		
-		org.apache.derby.tools.JDBCDisplayUtil.	ShowSQLException(System.out, sqle);
-		sqle.printStackTrace(System.out);
-	}
-
-
-    void logMessage(String str)
-    {
-        System.out.println(str);
-    }
-	
-	
-	public static void main(String[] argv) throws Throwable {
-		
-        ReEncryptCrashRecovery test = new ReEncryptCrashRecovery();
+    /** Extracts the database name from the data source. */
+    private static String db(DataSource ds) {
         try {
-            test.runTest();
+            return (String)JDBCDataSource.getBeanProperty(ds, "databaseName");
+        } catch (Exception e) {
+            return "<unknown/error>";
         }
-        catch (SQLException sqle) {
-			org.apache.derby.tools.JDBCDisplayUtil.ShowSQLException(
-                System.out, sqle);
-			sqle.printStackTrace(System.out);
-		}
     }
 }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/_Suite.java?rev=1392375&r1=1392374&r2=1392375&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/_Suite.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/_Suite.java Mon Oct  1 15:05:48 2012
@@ -98,6 +98,7 @@ public class _Suite extends BaseTestCase
             suite.addTest(EncryptionKeyDESTest.suite());
             suite.addTest(EncryptionAESTest.suite());
             suite.addTest(EncryptDatabaseTest.suite());
+            suite.addTest(CryptoCrashRecoveryTest.suite());
         }
 
         return suite;