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 rh...@apache.org on 2006/04/24 20:36:02 UTC

svn commit: r396638 - in /db/derby/code/trunk: ./ java/testing/org/apache/derbyTesting/functionTests/suites/ java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ java/testing/org/apache/derbyTesting/functionTests/util/

Author: rhillegas
Date: Mon Apr 24 11:36:00 2006
New Revision: 396638

URL: http://svn.apache.org/viewcvs?rev=396638&view=rev
Log:
DERBY-930: Enable autoloading of client drivers now that build 81 of jdk1.6 fixes a problem with autoloading under the SecurityManager.

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/AutoloadTest.java   (with props)
Modified:
    db/derby/code/trunk/build.xml
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbc40.runall
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/BaseJDBCTestCase.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/TestConfiguration.java

Modified: db/derby/code/trunk/build.xml
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/build.xml?rev=396638&r1=396637&r2=396638&view=diff
==============================================================================
--- db/derby/code/trunk/build.xml (original)
+++ db/derby/code/trunk/build.xml Mon Apr 24 11:36:00 2006
@@ -889,12 +889,13 @@
           append="true"
           message="org/apache/derby/info/DBMS.properties"/>
 
-    <!-- copy license file to lists dir for inclusion in derby.jar -->
+    <!-- copy boilerplate common to derby jar files -->
+    <antcall target="meta-inf-common"/>
 
-    <mkdir dir="${derby.jar.dir}/lists/META-INF"/>
-    <copy todir="${derby.jar.dir}/lists/META-INF">
-      <fileset dir="${basedir}" includes="LICENSE*,NOTICE*,COPYRIGHT*"/>
-    </copy>
+    <!-- declare the embedded driver for autoloading by the JDBC 4 DriverManager -->
+    <antcall target="declare-autoloadable-driver">
+      <param name="driver.name" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+    </antcall>
 
     <!-- the next two targets are orthogonal. Only one will be executed, -->
     <!-- depending on whether or not osgi.jar is available.              -->
@@ -1063,12 +1064,8 @@
       <param name="info.file" value="${out.dir}/org/apache/derby/info/tools.properties"/>
     </antcall>
 
-    <!-- copy license file to lists dir for inclusion in derbytools.jar -->
-
-    <mkdir dir="${derby.jar.dir}/lists/META-INF"/>
-    <copy todir="${derby.jar.dir}/lists/META-INF">
-      <fileset dir="${basedir}" includes="LICENSE*,NOTICE*,COPYRIGHT*"/>
-    </copy>
+    <!-- copy boilerplate common to derby jar files -->
+    <antcall target="meta-inf-common"/>
 
     <delete file="${derby.jar.dir}/derbytools.jar"/>
     <jar destfile="${derby.jar.dir}/derbytools.jar"
@@ -1115,13 +1112,9 @@
       <param name="info.file" value="${out.dir}/org/apache/derby/info/net.properties"/>
     </antcall>
 
-    <!-- copy license file to lists dir for inclusion in derbynet.jar -->
+    <!-- copy boilerplate common to derby jar files -->
+    <antcall target="meta-inf-common"/>
 
-    <mkdir dir="${derby.jar.dir}/lists/META-INF"/>
-    <copy todir="${derby.jar.dir}/lists/META-INF">
-      <fileset dir="${basedir}" includes="LICENSE*,NOTICE*,COPYRIGHT*"/>
-    </copy>
-  	
     <manifest file="${derby.jar.dir}/lists/smfnet.mf">
       <attribute name="Main-Class" value="org.apache.derby.drda.NetworkServerControl"/>
       <attribute name="Class-Path" value="derby.jar"/>
@@ -1174,13 +1167,14 @@
       <param name="info.file" value="${out.dir}/org/apache/derby/info/dnc.properties"/>
     </antcall>
 
-    <!-- copy license file to lists dir for inclusion in derbyclient.jar -->
+    <!-- copy boilerplate common to derby jar files -->
+    <antcall target="meta-inf-common"/>
+
+    <!-- declare the client driver for autoloading by the JDBC 4 DriverManager -->
+    <antcall target="declare-autoloadable-driver">
+      <param name="driver.name" value="org.apache.derby.jdbc.ClientDriver"/>
+    </antcall>
 
-    <mkdir dir="${derby.jar.dir}/lists/META-INF"/>
-    <copy todir="${derby.jar.dir}/lists/META-INF">
-      <fileset dir="${basedir}" includes="LICENSE*,NOTICE*,COPYRIGHT*"/>
-    </copy>
- 	
     <manifest file="${derby.jar.dir}/lists/smfclient.mf">
       	<attribute name="Sealed" value="true"/>
     	<section name="org/apache/derby/jdbc/">
@@ -1254,12 +1248,8 @@
 
   <target name="derbylocalejars" depends="initjars">
  
-    <!-- copy license file to lists dir for inclusion in derbynet.jar -->
-
-    <mkdir dir="${derby.jar.dir}/lists/META-INF"/>
-    <copy todir="${derby.jar.dir}/lists/META-INF">
-      <fileset dir="${basedir}" includes="LICENSE*,NOTICE*,COPYRIGHT*"/>
-    </copy>
+    <!-- copy boilerplate common to derby jar files -->
+    <antcall target="meta-inf-common"/>
 
     <!-- call localejar for each locale -->
 
@@ -1376,6 +1366,36 @@
   <target name="cleanjars" depends="setsanityname">
     <delete dir="${basedir}/jars/${sanity.name}"/>
   </target>
+
+<!-- - - - - - - - - - - - - - targets for populating META-INF  - - - - - - - - - - - -->
+
+  <!-- copy boilerplate common to derby jar files -->
+
+  <target name="meta-inf-common">
+ 
+    <mkdir dir="${derby.jar.dir}/lists/META-INF"/>
+    <copy todir="${derby.jar.dir}/lists/META-INF">
+      <fileset dir="${basedir}" includes="LICENSE*,NOTICE*,COPYRIGHT*"/>
+    </copy>
+
+  </target>
+
+  <!--
+    Declare the jdbc driver for autoloading under JDBC 4.
+
+    Parameters:
+
+      driver.name   Class name of driver to be autoloaded by JDBC 4 DriverManager
+  -->
+
+  <target name="declare-autoloadable-driver">
+ 
+    <mkdir dir="${derby.jar.dir}/lists/META-INF/services"/>
+    <echo file="${derby.jar.dir}/lists/META-INF/services/java.sql.Driver">${driver.name}
+</echo>
+
+  </target>
+
 
 <!-- =================================================================== -->
 <!--                         Nightly build targets                       -->

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbc40.runall
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbc40.runall?rev=396638&r1=396637&r2=396638&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbc40.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbc40.runall Mon Apr 24 11:36:00 2006
@@ -11,4 +11,5 @@
 jdbc4/DataSourceTest.junit
 jdbc4/ResultSetMetaDataTest.junit
 jdbc4/EmbeddedBrokeredConnectionWrapperTest.junit
-jdbc4/ParameterMetaDataWrapperTest.junit
\ No newline at end of file
+jdbc4/ParameterMetaDataWrapperTest.junit
+jdbc4/AutoloadTest.junit

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/AutoloadTest.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/AutoloadTest.java?rev=396638&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/AutoloadTest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/AutoloadTest.java Mon Apr 24 11:36:00 2006
@@ -0,0 +1,214 @@
+/*
+
+   Derby - Class org.apache.derbyTesting.functionTests.tests.jdbc4.AutoloadTest
+
+   Copyright 2006 The Apache Software Foundation or its licensors, as applicable.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+/**
+ * <p>
+ * This JUnit test verifies the autoloading of the jdbc driver under JDBC4.
+ * This test must be run in its own VM because we want to verify that the
+ * driver was not accidentally loaded by some other test.
+ * </p>
+ *
+ * @author Rick
+ */
+
+package org.apache.derbyTesting.functionTests.tests.jdbc4;
+
+import java.sql.*;
+import java.util.*;
+import junit.framework.*;
+
+import org.apache.derbyTesting.functionTests.util.BaseJDBCTestCase;
+import org.apache.derbyTesting.functionTests.util.SQLStateConstants;
+
+public	class	AutoloadTest	extends	BaseJDBCTestCase
+{
+	/////////////////////////////////////////////////////////////
+	//
+	//	CONSTANTS
+	//
+	/////////////////////////////////////////////////////////////
+
+	/////////////////////////////////////////////////////////////
+	//
+	//	STATE
+	//
+	/////////////////////////////////////////////////////////////
+
+	private	static	final	String	NONEXISTENT_DATABASE = "nonexistentDatabase";
+	private	static	final	String	DRIVER_LIST = "jdbc.drivers";
+	
+	/////////////////////////////////////////////////////////////
+	//
+	//	CONSTRUCTOR
+	//
+	/////////////////////////////////////////////////////////////
+	
+	public	AutoloadTest( String name ) { super( name ); }
+
+	/////////////////////////////////////////////////////////////
+	//
+	//	ENTRY POINT
+	//
+	/////////////////////////////////////////////////////////////
+
+	/////////////////////////////////////////////////////////////
+	//
+	//	JUnit BEHAVIOR
+	//
+	/////////////////////////////////////////////////////////////
+
+	/////////////////////////////////////////////////////////////
+	//
+	//	TEST ENTRY POINTS
+	//
+	/////////////////////////////////////////////////////////////
+
+	/**
+	 * <p>
+	 * Tests the autoloading of the client driver by JDBC 4. This behavior
+	 * is described in section 10.2.1 of the JDBC 4 spec. The driver is
+	 * autoloaded if we are running under jdk1.6 or later and one of the
+	 * following is true:
+	 * </p>
+	 *
+	 * <ul>
+	 * <li>Classes are being loaded out of the Derby jar files.</li>
+	 * <li>OR the system property jdbc.drivers names the drivers.</li>
+	 * </ul>
+	 */
+	public	void	testAutoloading()
+		throws Exception
+	{
+		//CONFIG.setVerbosity( true );
+		
+		//
+		// We expect that the connection to the database will fail for
+		// one reason or another.
+		//
+		if ( autoloading() )
+		{
+			println( "We ARE autoloading..." );
+
+			//
+			// The DriverManager should have autoloaded the client driver.
+			// This means that the connection request is passed on to the
+			// server. The server then determines that the database does
+			// not exist. This raises a different error depending on whether
+			// we're running embedded or with the Derby client.
+			//
+			if ( usingEmbedded() ) { failToConnect( "XJ004" ); }
+			else { failToConnect( "08004" ); }
+		}
+		else
+		{
+			println( "We are NOT autoloading..." );
+
+			//
+			// We aren't autoloading the driver. The
+			// DriverManager returns the following SQLState.
+			//
+			failToConnect( "08001" );
+		}
+	}
+
+	/**
+	 * <p>
+	 * Verify that we fail to connect to the database for the expected
+	 * reason.
+	 * </p>
+	 */
+	private	void	failToConnect( String expectedSQLState )
+		throws Exception
+	{
+		String			connectionURL = CONFIG.getJDBCUrl( NONEXISTENT_DATABASE );
+		Properties		properties = new Properties();
+		SQLException 	se = null;
+
+		properties.put( "user", CONFIG.getUserName() );
+		properties.put( "password", CONFIG.getUserPassword() );
+
+		try {
+			println( "Attempting to connect with this URL: '" + connectionURL + "'" );
+			
+			DriverManager.getConnection( connectionURL, properties );
+		}
+		catch ( SQLException e ) { se = e; }
+
+		println( "Caught expected SQLException: " + se );
+		
+		assertSQLState( expectedSQLState, expectedSQLState, se );
+	}
+
+	/**
+	 * <p>
+	 * Return true if we expect that the DriverManager will autoload the client driver.
+	 * </p>
+	 */
+	private	boolean	autoloading()
+		throws Exception
+	{
+		//
+		// DriverManager autoloads the client only as of JDBC4.
+		//
+		if ( !CONFIG.supportsJDBC4() )
+		{
+			println( "NOT JDBC4..." );
+			return false;
+		}
+
+		//
+		// The DriverManager will autoload drivers specified by the jdbc.drivers
+		// property. 
+		//
+		if ( CONFIG.getSystemStartupProperty( DRIVER_LIST ) != null )
+		{
+			println( "Drivers list encoded in startup properties..." );
+			return true;
+		}
+
+		//
+		// The DriverManager will also look inside our jar files for
+		// the generated file META-INF/services/java.sql.Driver. This file
+		// will contain the name of the driver to load. So if we are running
+		// this test against Derby jar files, we expect that the driver will
+		// be autoloaded.
+		//
+		// Note that if we run with a security manager, we get permissions
+		// exception at startup when the driver is autoloaded. This exception
+		// is silently swallowed and the result is that the driver is not
+		// loaded even though we expect it to be.
+		//
+		if ( CONFIG.loadingFromJars() )
+		{
+			println( "Loading from jars..." );
+			return true;
+		}
+
+		//
+		// OK, we've run out of options. We do not expect that the driver
+		// will be autoloaded.
+		//
+
+		println( "None of the above. Not autoloading..." );
+		
+		return false;
+	}
+
+}
+

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/AutoloadTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/BaseJDBCTestCase.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/BaseJDBCTestCase.java?rev=396638&r1=396637&r2=396638&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/BaseJDBCTestCase.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/BaseJDBCTestCase.java Mon Apr 24 11:36:00 2006
@@ -20,8 +20,8 @@
 package org.apache.derbyTesting.functionTests.util;
 
 import java.sql.*;
-import javax.sql.DataSource;
 import java.util.Properties;
+import javax.sql.DataSource;
 import javax.sql.ConnectionPoolDataSource;
 import javax.sql.XADataSource;
 

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/TestConfiguration.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/TestConfiguration.java?rev=396638&r1=396637&r2=396638&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/TestConfiguration.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/TestConfiguration.java Mon Apr 24 11:36:00 2006
@@ -19,10 +19,11 @@
  */
 package org.apache.derbyTesting.functionTests.util;
 
-import java.security.AccessController;
-import java.security.PrivilegedAction;
+import java.security.*;
 import java.util.Properties;
 
+import org.apache.derby.iapi.services.info.JVMInfo;
+
 /**
  * Class which holds information about the configuration of a Test.
  */
@@ -41,6 +42,7 @@
      */
     private TestConfiguration(Properties props) 
         throws NumberFormatException {
+		systemStartupProperties = props;
         dbName = props.getProperty(KEY_DBNAME, DEFAULT_DBNAME);
         userName = props.getProperty(KEY_USER_NAME, DEFAULT_USER_NAME);
         userPassword = props.getProperty(KEY_USER_PASSWORD, 
@@ -73,6 +75,14 @@
     }
 
     /**
+     * Get the given system property as specified at startup.
+     */
+	public	String	getSystemStartupProperty( String key )
+	{
+		return systemStartupProperties.getProperty( key );
+	}
+
+    /**
      * Get the system properties in a privileged block.
      *
      * @return the system properties.
@@ -176,6 +186,11 @@
     }
     
     /**
+     * Set the verbosity, i.e., whether debug statements print.
+     */
+    public void	setVerbosity( boolean isChatty )	{ isVerbose = isChatty; }
+    
+    /**
      * Return verbose flag.
      *
      * @return verbose flag.
@@ -184,9 +199,39 @@
         return isVerbose;
     }
     
+ 	/**
+ 	 * <p>
+	 * Return true if the client supports JDBC4, i.e., if the VM level is at
+	 * least 1.6.
+	 * </p>
+	 */
+	public	boolean	supportsJDBC4()
+	{
+		if ( JVMInfo.JDK_ID >= JVMInfo.J2SE_16 ) { return true; }
+		else { return false; }
+	}
+
+	/**
+	 * <p>
+	 * Return true if we classes are being loaded from jar files. For the time
+	 * being, this simply tests that the JVMInfo class (common to the client and
+	 * the server) comes out of a jar file.
+	 * </p>
+	 */
+	public	boolean	loadingFromJars()
+	{
+		//
+		// jvm.java sets this property to the build jar directory
+		// if we are using derbyTesting.jar.
+		//
+		
+		return ( !UNUSED.equals( getSystemStartupProperty( "derbyTesting.codejar" ) ) );
+	}
+
     /**
      * Immutable data members in test configuration
      */
+	private	final Properties systemStartupProperties;
     private final String dbName;
     private final String url;
     private final String userName; 
@@ -194,7 +239,7 @@
     private final int port;
     private final String hostName;
     private final JDBCClient jdbcClient;
-    private final boolean isVerbose;
+    private boolean isVerbose;
     
     /**
      * Default values for configurations
@@ -216,5 +261,10 @@
     private final static String KEY_HOSTNAME = "hostName";
     private final static String KEY_PORT = "port";
     private final static String KEY_VERBOSE = "derby.tests.debug";
+
+    /**
+     * Possible values of system properties.
+     */
+    private final static String UNUSED = "file://unused/";
 
 }