Return-Path: X-Original-To: apmail-db-derby-commits-archive@www.apache.org Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B2A6C113FB for ; Thu, 27 Mar 2014 08:40:34 +0000 (UTC) Received: (qmail 41213 invoked by uid 500); 27 Mar 2014 08:40:34 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 41149 invoked by uid 500); 27 Mar 2014 08:40:32 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 41142 invoked by uid 99); 27 Mar 2014 08:40:31 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Mar 2014 08:40:31 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Mar 2014 08:40:29 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5B46D23889E3; Thu, 27 Mar 2014 08:40:09 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1582220 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting: functionTests/tests/lang/ functionTests/util/ junit/ Date: Thu, 27 Mar 2014 08:40:09 -0000 To: derby-commits@db.apache.org From: kahatlen@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140327084009.5B46D23889E3@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: kahatlen Date: Thu Mar 27 08:40:08 2014 New Revision: 1582220 URL: http://svn.apache.org/r1582220 Log: DERBY-2162/DERBY-5618: Close the URLClassLoader when tests are done with it so that file handles are freed and the jar files can be deleted. Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/DatabaseClassLoadingTest.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/FullCollationTests.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/NativeAuthenticationServiceTest.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/ClasspathSetup.java Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/DatabaseClassLoadingTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/DatabaseClassLoadingTest.java?rev=1582220&r1=1582219&r2=1582220&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/DatabaseClassLoadingTest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/DatabaseClassLoadingTest.java Thu Mar 27 08:40:08 2014 @@ -29,7 +29,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.net.URLClassLoader; import java.security.AccessController; import java.sql.CallableStatement; import java.sql.Connection; @@ -46,6 +45,7 @@ import junit.framework.Test; import junit.framework.TestSuite; import org.apache.derbyTesting.junit.BaseJDBCTestCase; +import org.apache.derbyTesting.junit.ClasspathSetup; import org.apache.derbyTesting.junit.CleanDatabaseTestSetup; import org.apache.derbyTesting.junit.JDBC; import org.apache.derbyTesting.junit.JDBCDataSource; @@ -72,7 +72,7 @@ public class DatabaseClassLoadingTest ex * Ordering is important here so the fixtures are added * explicitly. */ - public static Test suite() + public static Test suite() throws Exception { final TestSuite suite = new TestSuite("DatabaseClassLoadingTest"); @@ -117,8 +117,15 @@ public class DatabaseClassLoadingTest ex suite.addTest(SecurityManagerSetup.noSecurityManager( new DatabaseClassLoadingTest("testDatabaseInJar"))); - suite.addTest(SecurityManagerSetup.noSecurityManager( - new DatabaseClassLoadingTest("testDatabaseInClasspath"))); + // DERBY-2162: Only run this test case on platforms that support + // the URLClassLoader.close() method. Otherwise, we won't be able + // to delete the jar file afterwards. + if (ClasspathSetup.supportsClose()) { + suite.addTest(SecurityManagerSetup.noSecurityManager( + new ClasspathSetup( + new DatabaseClassLoadingTest("testDatabaseInClasspath"), + SupportFilesSetup.getReadOnlyURL("dclt.jar")))); + } // No security manager because the test uses getClass().getClassLoader() // in an installed jar to ensure that the class loader for @@ -638,34 +645,11 @@ public class DatabaseClassLoadingTest ex readOnlyTest(ds); } - public void testDatabaseInClasspath() throws SQLException, MalformedURLException + public void testDatabaseInClasspath() throws SQLException { String dbName = "classpath:dbro"; DataSource ds = JDBCDataSource.getDataSource(dbName); - - try { - ds.getConnection(); - fail("opened database before it was on classpath"); - } catch (SQLException e) - { - assertSQLState("XJ004", e); - } - - URL jarURL = SupportFilesSetup.getReadOnlyURL("dclt.jar"); - - // DERBY-2179 - temp disable using the class loader - // (since due to DERBY-2162) it's not working anyway) - // need to re-write code not to assume there is no - // existing thread context loader. - //setContextClassLoader(jarURL); - try { - // Disabled due to DERBY-2162, running this opens - // the database thus accessing resources and means the - // jar file cannot be cleaned up. - // readOnlyTest(ds); - } finally { - //setContextClassLoader(null); - } + readOnlyTest(ds); } /** @@ -1331,17 +1315,4 @@ public class DatabaseClassLoadingTest ex in.close(); zos.closeEntry(); } - - private static void setContextClassLoader(final URL url) - { - AccessController.doPrivileged - (new java.security.PrivilegedAction() { - public Void run() { - URLClassLoader cl = - url == null ? null : new URLClassLoader(new URL[] {url}); - java.lang.Thread.currentThread().setContextClassLoader(cl); - return null; - } - }); - } } Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/FullCollationTests.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/FullCollationTests.java?rev=1582220&r1=1582219&r2=1582220&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/FullCollationTests.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/FullCollationTests.java Thu Mar 27 08:40:08 2014 @@ -27,19 +27,13 @@ import junit.framework.TestSuite; import org.apache.derbyTesting.junit.Decorator; -public class FullCollationTests extends CollationTest { - - public FullCollationTests(String name) { - super(name); - - } +public class FullCollationTests extends TestSuite { - /** * Return a suite that uses a single use database with * a primary fixture from this test plus all tests */ - public static Test suite() + public static Test suite() throws Exception { TestSuite suite = new TestSuite("FullCollationTests:territory=" +"no_NO"); suite.addTest(new CollationTest("testNorwayCollation")); Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/NativeAuthenticationServiceTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/NativeAuthenticationServiceTest.java?rev=1582220&r1=1582219&r2=1582220&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/NativeAuthenticationServiceTest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/NativeAuthenticationServiceTest.java Thu Mar 27 08:40:08 2014 @@ -22,6 +22,7 @@ package org.apache.derbyTesting.functionTests.tests.lang; import java.io.File; +import java.net.URL; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -351,17 +352,16 @@ public class NativeAuthenticationService /** * Construct top level suite in this JUnit test */ - public static Test suite() + public static Test suite() throws Exception { TestSuite suite = new TestSuite(); // // Special version of the test which uses an encrypted database for credentials. - // Not run on windows until DERBY-5618 is addressed. - // Also not run on small devices because encryption is not supported there - // by default. + // Only run on platforms where we can expect cleanup of support files + // to succeed (DERBY-5618). // - if ( !onWindows() && !JDBC.vmSupportsJSR169() ) + if (enableSubprotocolTests()) { suite.addTest ( @@ -380,9 +380,21 @@ public class NativeAuthenticationService // should be OK to run in the local time zone. return new TimeZoneTestSetup(suite, "GMT"); } - private static boolean onWindows() - { - return getSystemProperty("os.name").startsWith("Windows"); + + /** + * Check whether or not tests for subprotocols should be enabled + * on this platform. + */ + private static boolean enableSubprotocolTests() { + // DERBY-5618: On Windows, we are not able to delete the jar files + // used by the tests for the classpath subsubprotocol if we don't + // close the URLClassLoader when we're done. Closing the class loader + // can only be done on Java 7 and higher. + // + // Run the tests if the Java version supports URLClassLoader.close(), + // or if we're on a non-Windows platform (where the jar files can be + // deleted even if the class loader hasn't been closed). + return ClasspathSetup.supportsClose() || !isWindowsPlatform(); } /** @@ -390,7 +402,7 @@ public class NativeAuthenticationService * Create a suite of all test configurations. *

*/ - private static Test allConfigurations( boolean clientServer ) + private static Test allConfigurations(boolean clientServer) throws Exception { TestSuite suite = new TestSuite(); @@ -442,9 +454,10 @@ public class NativeAuthenticationService ); // - // For testing subprotocols. Cleanup of support files is blocked by DERBY-5618. + // For testing subprotocols. Only run on platforms where we can + // expect cleanup of support files to succeed (DERBY-5618). // - if ( !onWindows() ) + if (enableSubprotocolTests()) { // // NATIVE authentication with credentials in read-only databases accessed via jar subprotocol @@ -481,7 +494,7 @@ public class NativeAuthenticationService ( CLASSPATH, NATIVE, LOCAL, DONT_DISABLE_AUTH, DISABLE_JAVA_SECURITY ) ).decorate( clientServer ) ); - } // end if !onWindows() + } return suite; } @@ -493,7 +506,7 @@ public class NativeAuthenticationService * stored properties that can't be removed at tearDown time. *

*/ - private Test decorate( boolean clientServer ) + private Test decorate(boolean clientServer) throws Exception { String credentialsDBPhysicalName = TestConfiguration.generateUniqueDatabaseName(); @@ -534,24 +547,17 @@ public class NativeAuthenticationService // }; // - // For testing subprotocols. Cleanup of support files is blocked by DERBY-5618. + // For testing subprotocols. Only run on platforms where we can + // expect cleanup of support files to succeed (DERBY-5618). // - if ( !onWindows() ) + if (enableSubprotocolTests()) { - // Add the jar files needed for testing jar and classpath subprotocols. - result = new SupportFilesSetup( result, SUPPORT_FILES_SOURCE, null, SUPPORT_FILES_TARGET, null ); - - // // Add a jar file to the classpath so that we can test the classpath subprotocol. - // - File currentDirectory = currentDirectory(); - File readOnlyDirectory = new File( currentDirectory, SupportFilesSetup.EXTIN ); - File nast2Jar = new File( readOnlyDirectory, NAST2_JAR_FILE ); + URL nast2Jar = SupportFilesSetup.getReadOnlyURL(NAST2_JAR_FILE); + result = new ClasspathSetup(result, nast2Jar); - try { - result = new ClasspathSetup( result, nast2Jar.toURI().toURL() ); - } - catch (Exception e) { printStackTrace( e ); } + // Add the jar files needed for testing jar and classpath subprotocols. + result = new SupportFilesSetup( result, SUPPORT_FILES_SOURCE, null, SUPPORT_FILES_TARGET, null ); } // @@ -866,12 +872,11 @@ public class NativeAuthenticationService /////////////////////////////////////////////////////////////////////////////////// // - // Vet databases accessed via subprotocols. Not run on Windows machines - // because of DERBY-5618. + // Vet databases accessed via subprotocols. // /////////////////////////////////////////////////////////////////////////////////// - if ( !onWindows() ) + if (enableSubprotocolTests()) { // database accessed via jar subprotocol vetProtocol( jarDBName( _credentialsDBLocation ) ); Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java?rev=1582220&r1=1582219&r2=1582220&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java Thu Mar 27 08:40:08 2014 @@ -49,7 +49,7 @@ public class _Suite extends BaseTestCase super(name); } - public static Test suite() { + public static Test suite() throws Exception { TestSuite suite = new TestSuite("lang"); Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy?rev=1582220&r1=1582219&r2=1582220&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy Thu Mar 27 08:40:08 2014 @@ -294,6 +294,9 @@ grant codeBase "${derbyTesting.testjar}d // Needed by NetworkServerTestSetup when probing ports. permission java.net.SocketPermission "localhost", "listen"; + + // Needed by ClasspathSetup for freeing resources. + permission java.lang.RuntimePermission "closeClassLoader"; }; // @@ -378,6 +381,9 @@ grant codeBase "${derbyTesting.codeclass // This permission is needed to call DriverManager.deregisterDriver() // on Java SE 8 and later. permission java.sql.SQLPermission "deregisterDriver"; + + // Needed by ClasspathSetup for freeing resources. + permission java.lang.RuntimePermission "closeClassLoader"; }; // JUnit jar file tries to read junit.properties in the user's Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/ClasspathSetup.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/ClasspathSetup.java?rev=1582220&r1=1582219&r2=1582220&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/ClasspathSetup.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/ClasspathSetup.java Thu Mar 27 08:40:08 2014 @@ -19,10 +19,13 @@ */ package org.apache.derbyTesting.junit; +import java.io.Closeable; +import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; import junit.extensions.TestSetup; import junit.framework.Test; @@ -49,6 +52,7 @@ public class ClasspathSetup extends Test private URL _resource; private ClassLoader _originalClassLoader; + private URLClassLoader _newClassLoader; /////////////////////////////////////////////////////////////////////////////////// // @@ -61,7 +65,7 @@ public class ClasspathSetup extends Test * Add the indicated URL to the classpath. *

*/ - public ClasspathSetup( Test test, URL resource ) throws Exception + public ClasspathSetup(Test test, URL resource) { super( test ); @@ -84,9 +88,9 @@ public class ClasspathSetup extends Test { _originalClassLoader = Thread.currentThread().getContextClassLoader(); - URLClassLoader newClassLoader = new URLClassLoader( new URL[] { _resource }, _originalClassLoader ); + _newClassLoader = new URLClassLoader( new URL[] { _resource }, _originalClassLoader ); - Thread.currentThread().setContextClassLoader( newClassLoader ); + Thread.currentThread().setContextClassLoader( _newClassLoader ); return null; } @@ -94,22 +98,42 @@ public class ClasspathSetup extends Test ); } - protected void tearDown() + protected void tearDown() throws Exception { AccessController.doPrivileged ( - new PrivilegedAction() + new PrivilegedExceptionAction() { - public Void run() + public Void run() throws IOException { Thread.currentThread().setContextClassLoader( _originalClassLoader ); - + + // On Java 7 and higher, URLClassLoader implements the + // Closable interface and has a close() method. Use that + // method, if it's available, to free all resources + // associated with the class loader. DERBY-2162. + if (_newClassLoader instanceof Closeable) { + ((Closeable) _newClassLoader).close(); + } + return null; } } ); - } -} + _originalClassLoader = null; + _newClassLoader = null; + _resource = null; + } + /** + * Check whether this platform supports closing a {@code URLClassLoader}. + * + * @return {@code true} if {@code URLClassLoader} has a {@code close()} + * method (Java 7 and higher), or {@code false} otherwise + */ + public static boolean supportsClose() { + return Closeable.class.isAssignableFrom(URLClassLoader.class); + } +}