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 da...@apache.org on 2009/06/16 11:58:33 UTC

svn commit: r785139 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting: functionTests/tests/replicationTests/ReplicationRun.java junit/BaseTestCase.java

Author: dag
Date: Tue Jun 16 09:58:33 2009
New Revision: 785139

URL: http://svn.apache.org/viewvc?rev=785139&view=rev
Log:
DERBY-4270 Make replication tests save derby.log and database when a failure occurs

Patch derby-4270-2 adds an overload of TestCase.runBare to
ReplicationRun which does this desired copying on the same pattern as
done for "normal" tests in BaseTestCase.runBare.


Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun.java?rev=785139&r1=785138&r2=785139&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun.java Tue Jun 16 09:58:33 2009
@@ -21,6 +21,8 @@
 package org.apache.derbyTesting.functionTests.tests.replicationTests;
 
 
+import org.apache.derbyTesting.functionTests.util.PrivilegedFileOpsForTests;
+import org.apache.derbyTesting.junit.TestConfiguration;
 import org.apache.derby.drda.NetworkServerControl;
 import java.net.InetAddress;
 import java.util.Properties;
@@ -186,6 +188,74 @@
         super.tearDown();
     }
     
+    /**
+     * Run the test. Extra logic in addition to BaseTestCase's similar logic,
+     * to save derby.log and database files for replication directories if a
+     * failure happens.
+     */
+    public void runBare() throws Throwable {
+
+        try {
+
+            super.runBare();
+
+        } catch (Throwable running) {
+
+            // Copy the master and slave's derby.log file and databases
+            //
+            PrintWriter stackOut = null;
+
+            try {
+                String failPath = PrivilegedFileOpsForTests.
+                    getAbsolutePath(getFailureFolder());
+
+                stackOut = new PrintWriter(
+                        PrivilegedFileOpsForTests.getFileOutputStream(
+                            new File(failPath, ERRORSTACKTRACEFILE), true));
+
+                String[] replPaths = new String[]{masterDbSubPath,
+                                                  slaveDbSubPath};
+
+                for (int i=0; i < 2; i++) {
+                    // Copy the derby.log file.
+                    //
+                    File origLog = new File(replPaths[i], DERBY_LOG);
+                    File newLog = new File(failPath,
+                                           replPaths[i] + "-" + DERBY_LOG);
+                    PrivilegedFileOpsForTests.copy(origLog, newLog);
+
+                    // Copy the database.
+                    //
+                    String dbName = TestConfiguration.getCurrent().
+                        getDefaultDatabaseName();
+                    File dbDir = new File(replPaths[i], dbName );
+                    File newDbDir = new File(failPath,
+                                             replPaths[i] + "-" + dbName);
+                    PrivilegedFileOpsForTests.copy(dbDir,newDbDir);
+                }
+            } catch (IOException ioe) {
+                // We need to throw the original exception so if there
+                // is an exception saving the db or derby.log we will print it
+                // and additionally try to log it to file.
+                BaseTestCase.printStackTrace(ioe);
+                if (stackOut != null) {
+                    stackOut.println("Copying db_slave/db_master's " +
+                                     DERBY_LOG + " or database failed:");
+                    ioe.printStackTrace(stackOut);
+                    stackOut.println();
+                }
+            } finally {
+                if (stackOut != null) {
+                    stackOut.close();
+                }
+
+                // Let JUnit take over
+                throw running;
+            }
+        }
+    }
+
+
     String useEncryption(boolean create)
     {
         String encryptionString = "";

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java?rev=785139&r1=785138&r2=785139&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java Tue Jun 16 09:58:33 2009
@@ -50,7 +50,10 @@
  */
 public abstract class BaseTestCase
     extends TestCase {
-    
+
+    protected final static String ERRORSTACKTRACEFILE = "error-stacktrace.out";
+    protected final static String DEFAULT_DB_DIR      = "system";
+    protected final static String DERBY_LOG           = "derby.log";
     /**
      * No argument constructor made private to enforce naming of test cases.
      * According to JUnit documentation, this constructor is provided for
@@ -114,18 +117,18 @@
                 // Write the stack trace of the error/failure to file.
                 stackOut = new PrintWriter(
                         PrivilegedFileOpsForTests.getFileOutputStream(
-                            new File(failPath, "error-stacktrace.out"), true));
+                            new File(failPath, ERRORSTACKTRACEFILE), true));
                 stackOut.println("[Error/failure logged at " +
                         new java.util.Date() + "]");
                 running.printStackTrace(stackOut);
                 stackOut.println(); // Add an extra blank line.
                 // Copy the derby.log file.
-                File origLog = new File("system", "derby.log");
-                File newLog = new File(failPath, "derby.log");
+                File origLog = new File(DEFAULT_DB_DIR, DERBY_LOG);
+                File newLog = new File(failPath, DERBY_LOG);
                 PrivilegedFileOpsForTests.copy(origLog, newLog);
                 // Copy the database.
                 String dbName = TestConfiguration.getCurrent().getDefaultDatabaseName();
-                File dbDir = new File("system", dbName );                        
+                File dbDir = new File(DEFAULT_DB_DIR, dbName );
                 File newDbDir = new File(failPath, dbName);
                 PrivilegedFileOpsForTests.copy(dbDir,newDbDir);
            }