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 km...@apache.org on 2008/10/15 19:24:39 UTC

svn commit: r704964 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting: functionTests/util/PrivilegedFileOpsForTests.java junit/BaseTestCase.java

Author: kmarsden
Date: Wed Oct 15 10:24:39 2008
New Revision: 704964

URL: http://svn.apache.org/viewvc?rev=704964&view=rev
Log:
DERBY-3905 Failed tests should save the database off to the fail directory


Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/PrivilegedFileOpsForTests.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/PrivilegedFileOpsForTests.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/PrivilegedFileOpsForTests.java?rev=704964&r1=704963&r2=704964&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/PrivilegedFileOpsForTests.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/PrivilegedFileOpsForTests.java Wed Oct 15 10:24:39 2008
@@ -25,10 +25,14 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
+import java.sql.SQLException;
 
 /**
  * A set of operations on {@link java.io.File} that wraps the
@@ -64,6 +68,30 @@
     }
 
     /**
+     * Get the absolute path
+     *
+     * @param file File for absolute path
+     * @return Absolute path of the file.
+     * @throws SecurityException if the required permissions to access the file,
+     *      
+     * @see File#getAbsolutePath
+     */
+    public static String getAbsolutePath(final File file)
+            throws SecurityException {
+        if (file == null) {
+            throw new IllegalArgumentException("file cannot be <null>");
+        }
+        return (String)AccessController.doPrivileged(
+                new PrivilegedAction() {
+                    public Object run() throws SecurityException {
+                        return file.getAbsolutePath();
+                    }});
+    }
+      
+    
+    
+
+    /**
      * Returns a input stream for the specified file.
      *
      * @param file the file to open a stream for
@@ -137,6 +165,98 @@
         }
     }
 
+    
+    /**
+     * In a priv block, do a recursive copy from source to target.  
+     * If target exists it will be overwritten. Parent directory for 
+     * target will be created if it does not exist. 
+     * If source does not exist this will be a noop.
+     * 
+     * @param source  Source file or directory to copy
+     * @param target  Target file or directory to copy
+     * @throws IOException
+     * @throws SecurityException
+     */    
+    public static void copy(final File source, final File target) throws IOException {
+        try {
+            AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                public Object run() throws IOException {
+                    recursiveCopy(source,target);
+                    return null;
+                }
+                });
+        } catch (PrivilegedActionException pae) {
+            throw (IOException) pae.getException();
+        
+        }
+        
+    }
+    /**
+     * Do a recursive copy from source to target.  If target exists it will 
+     * be overwritten. Parent directory for target will be created if it does
+     * not exist. If source does not exist this will be a noop.
+     * 
+     * @param source  Source file or directory to copy
+     * @param target  Target file or directory to copy
+     * @throws IOException
+     * @throws FileNotFoundException
+     */
+    private static void  recursiveCopy(File source, File target) throws IOException, FileNotFoundException{
+    
+        if (source.isFile()) {
+            copySingleFile(source,target);
+            return;
+        }
+            
+        String[] list = source.list();
+
+        // Some JVMs return null for File.list() when the
+        // directory is empty.
+        if (list != null) {
+            for (int i = 0; i < list.length; i++) {
+                File entry = new File(source, list[i]);
+                File targetEntry = new File(target, list[i]);
+                if (entry.isDirectory()) {
+                    copy(entry,targetEntry);
+                } else {
+                    copySingleFile(entry, targetEntry);
+                }
+            }
+
+        }
+    }
+
+    /**
+     * Copy a single file from source to target.  If target exists it will be 
+     * overwritten.  If source does not exist, this will be a noop.
+     * 
+     * @param source  Source file to copy
+     * @param target  Destination file for copy
+     * @throws IOException
+     * @throws FileNotFoundException
+     */
+    private static void copySingleFile (File source, File target) throws IOException, FileNotFoundException {
+
+        File targetParent = target.getParentFile();
+        if (targetParent != null && ! targetParent.exists())
+            target.getParentFile().mkdirs();
+        
+                
+        InputStream in = new FileInputStream(source);
+        OutputStream out = new FileOutputStream(target);
+        byte[] buf = new byte[32 * 1024];
+        
+        for (;;) {
+            int read = in.read(buf);
+            if (read == -1)
+                break;
+            out.write(buf, 0, read);
+        }
+        in.close();
+        out.close();
+    }
+    
+
     /**
      * Returns a file output stream for the specified file.
      *

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=704964&r1=704963&r2=704964&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 Wed Oct 15 10:24:39 2008
@@ -19,6 +19,7 @@
  */
 package org.apache.derbyTesting.junit;
 
+import org.apache.derbyTesting.functionTests.util.PrivilegedFileOpsForTests;
 import junit.framework.Assert;
 import junit.framework.TestCase;
 import junit.framework.AssertionFailedError;
@@ -103,36 +104,25 @@
         try {
             super.runBare();   
         }
-        //To save the derby.log of failed tests. 
+        //To save the derby.log  and database of failed tests.
         catch (Throwable running) {
             try{
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws SQLException, FileNotFoundException,
-                    IOException {
-
-                        File origLogDir = new File("system", "derby.log");
-                        if (origLogDir.exists()) {
-                            File failDir = getFailureFolder();
-                            InputStream in = new FileInputStream(origLogDir);
-                            OutputStream out = new FileOutputStream(new File(failDir,
-                            "derby.log"));
-                            byte[] buf = new byte[32 * 1024];
-
-                            for (;;) {
-                                int read = in.read(buf);
-                                if (read == -1)
-                                    break;
-                                out.write(buf, 0, read);
-                            }
-                            in.close();
-                            out.close();
-                        }
-
-                        return null;
-                    }
-                });
+                String failPath = PrivilegedFileOpsForTests.getAbsolutePath(getFailureFolder());
+                File origLog = new File("system", "derby.log");
+                File newLog = new File(failPath, "derby.log");
+                PrivilegedFileOpsForTests.copy(origLog, newLog);
+                String dbName = TestConfiguration.getCurrent().getDefaultDatabaseName();
+                File dbDir = new File("system", dbName );                        
+                File newDbDir = new File(failPath, 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 just
+                // print it.
+                BaseTestCase.printStackTrace(ioe);
             }
-            finally{        		
+            finally {
                 throw running;
             }
         }