blob: ebb055c4f9bf6924267d883f33b69cb114ffcb52 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.harmony.sql.tests.java.sql;
import dalvik.annotation.KnownFailure;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetNew;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.security.Permission;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.sql.SQLPermission;
import java.util.Enumeration;
import java.util.Properties;
import junit.framework.TestCase;
import static tests.support.Support_Exec.javaProcessBuilder;
import static tests.support.Support_Exec.execAndGetOutput;
@TestTargetClass(DriverManager.class)
/**
* JUnit Testcase for the java.sql.DriverManager class
*
*/
public class DriverManagerTest extends TestCase {
// Set of driver names to use
static final String DRIVER1 = "org.apache.harmony.sql.tests.java.sql.TestHelper_Driver1";
static final String DRIVER2 = "org.apache.harmony.sql.tests.java.sql.TestHelper_Driver2";
static final String DRIVER3 = "org.apache.harmony.sql.tests.java.sql.TestHelper_Driver3";
static final String DRIVER4 = "org.apache.harmony.sql.tests.java.sql.TestHelper_Driver4";
static final String DRIVER5 = "org.apache.harmony.sql.tests.java.sql.TestHelper_Driver5";
static final String INVALIDDRIVER1 = "abc.klm.Foo";
static String[] driverNames = { DRIVER1, DRIVER2 };
static int numberLoaded;
static String baseURL1 = "jdbc:mikes1";
static String baseURL4 = "jdbc:mikes4";
static final String JDBC_PROPERTY = "jdbc.drivers";
static TestHelper_ClassLoader testClassLoader = new TestHelper_ClassLoader();
// Static initializer to load the drivers so that they are available to all
// the
// test methods as needed.
@Override
public void setUp() {
numberLoaded = loadDrivers();
} // end setUp()
/**
* Test for the method DriverManager.deregisterDriver
* @throws SQLException
*/
@TestTargetNew(
level = TestLevel.SUFFICIENT,
notes = "SQLException checking missed: not feasible.",
method = "deregisterDriver",
args = {java.sql.Driver.class}
)
@KnownFailure("Not all Drivers are loaded in testsetup. Classloader issue in DriverManager.")
public void testDeregisterDriver() throws Exception {
// First get one of the drivers loaded by the test
Driver aDriver;
aDriver = DriverManager.getDriver(baseURL4);
// Deregister this driver
DriverManager.deregisterDriver(aDriver);
assertFalse("testDeregisterDriver: Driver was not deregistered.",
isDriverLoaded(aDriver));
// Re-register this driver (so subsequent tests have it available)
DriverManager.registerDriver(aDriver);
assertTrue("testDeregisterDriver: Driver did not reload.",
isDriverLoaded(aDriver));
// Test deregistering a null driver
DriverManager.deregisterDriver(null);
// Test deregistering a driver which was not loaded by this test's
// classloader
// TODO - need to load a driver with a different classloader!!
aDriver = DriverManager.getDriver(baseURL1);
try {
Class<?> driverClass = Class
.forName(
"org.apache.harmony.sql.tests.java.sql.TestHelper_DriverManager",
true, testClassLoader);
// Give the Helper class one of our drivers....
Class<?>[] methodClasses = {Class.forName("java.sql.Driver")};
Method theMethod = driverClass.getDeclaredMethod("setDriver",
methodClasses);
Object[] args = {aDriver};
assertNotNull(args);
theMethod.invoke(null, args);
} catch (Exception e) {
fail("testDeregisterDriver: Got exception allocating TestHelper: "
+ e.getMessage());
e.printStackTrace();
return;
} // end try
// Check that the driver was not deregistered
assertTrue(
"testDeregisterDriver: Driver was incorrectly deregistered.",
DriverManagerTest.isDriverLoaded(aDriver));
} // end method testDeregisterDriver()
static void printClassLoader(Object theObject) {
Class<? extends Object> theClass = theObject.getClass();
ClassLoader theClassLoader = theClass.getClassLoader();
System.out.println("ClassLoader is: " + theClassLoader.toString()
+ " for object: " + theObject.toString());
} // end method printClassLoader( Object )
static boolean isDriverLoaded(Driver theDriver) {
Enumeration<?> driverList = DriverManager.getDrivers();
while (driverList.hasMoreElements()) {
if ((Driver) driverList.nextElement() == theDriver) {
return true;
}
} // end while
return false;
} // end method isDriverLoaded( Driver )
/*
* Class under test for Connection getConnection(String)
*/
// valid connection - data1 does not require a user and password...
static String validConnectionURL = "jdbc:mikes1:data1";
// invalid connection - data2 requires a user & password
static String invalidConnectionURL1 = "jdbc:mikes1:data2";
// invalid connection - URL is gibberish
static String invalidConnectionURL2 = "xyz1:abc3:456q";
// invalid connection - URL is null
static String invalidConnectionURL3 = null;
static String[] invalidConnectionURLs = { invalidConnectionURL2,
invalidConnectionURL3 };
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getConnection",
args = {java.lang.String.class}
)
public void testGetConnectionString() throws SQLException {
Connection theConnection = null;
// validConnection - no user & password required
theConnection = DriverManager.getConnection(validConnectionURL);
assertNotNull(theConnection);
assertNotNull(DriverManager.getConnection(invalidConnectionURL1));
for (String element : invalidConnectionURLs) {
try {
theConnection = DriverManager
.getConnection(element);
fail("Should throw SQLException");
} catch (SQLException e) {
//expected
} // end try
} // end for
} // end method testGetConnectionString()
/**
* @tests java.sql.DriverManager#getConnection(String, Properties)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getConnection",
args = {java.lang.String.class, java.util.Properties.class}
)
public void test_getConnection_LStringLProperties() {
try {
DriverManager.getConnection("fff", //$NON-NLS-1$
new Properties());
fail("Should throw SQLException.");
} catch (SQLException e) {
assertEquals("08001", e.getSQLState()); //$NON-NLS-1$
}
try {
DriverManager.getConnection(null,
new Properties());
fail("Should throw SQLException.");
} catch (SQLException e) {
assertEquals("08001", e.getSQLState()); //$NON-NLS-1$
}
}
/*
* Class under test for Connection getConnection(String, Properties)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getConnection",
args = {java.lang.String.class, java.util.Properties.class}
)
public void testGetConnectionStringProperties() throws SQLException {
String validURL1 = "jdbc:mikes1:data2";
String validuser1 = "theuser";
String validpassword1 = "thepassword";
String invalidURL1 = "xyz:abc1:foo";
String invalidURL2 = "jdbc:mikes1:crazyone";
String invalidURL3 = "";
String invaliduser1 = "jonny nouser";
String invalidpassword1 = "whizz";
Properties nullProps = null;
Properties validProps = new Properties();
validProps.setProperty("user", validuser1);
validProps.setProperty("password", validpassword1);
Properties invalidProps1 = new Properties();
invalidProps1.setProperty("user", invaliduser1);
invalidProps1.setProperty("password", invalidpassword1);
String[] invalidURLs = { null, invalidURL1,
invalidURL2, invalidURL3 };
Properties[] invalidProps = { nullProps, invalidProps1};
Connection theConnection = null;
// validConnection - user & password required
theConnection = DriverManager.getConnection(validURL1, validProps);
assertNotNull(theConnection);
// invalid Connections
for (int i = 0; i < invalidURLs.length; i++) {
theConnection = null;
try {
theConnection = DriverManager.getConnection(invalidURLs[i],
validProps);
fail("Should throw SQLException");
} catch (SQLException e) {
//expected
} // end try
} // end for
for (Properties invalidProp : invalidProps) {
assertNotNull(DriverManager.getConnection(validURL1, invalidProp));
}
} // end method testGetConnectionStringProperties()
/*
* Class under test for Connection getConnection(String, String, String)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getConnection",
args = {java.lang.String.class, java.lang.String.class, java.lang.String.class}
)
public void testGetConnectionStringStringString() throws SQLException {
String validURL1 = "jdbc:mikes1:data2";
String validuser1 = "theuser";
String validpassword1 = "thepassword";
String invalidURL1 = "xyz:abc1:foo";
String invaliduser1 = "jonny nouser";
String invalidpassword1 = "whizz";
String[] invalid1 = { null, validuser1, validpassword1 };
String[] invalid2 = { validURL1, null, validpassword1 };
String[] invalid3 = { validURL1, validuser1, null };
String[] invalid4 = { invalidURL1, validuser1, validpassword1 };
String[] invalid5 = { validURL1, invaliduser1, invalidpassword1 };
String[] invalid6 = { validURL1, validuser1, invalidpassword1 };
String[][] invalids1 = { invalid1, invalid4};
String[][] invalids2 = {invalid2, invalid3, invalid5, invalid6 };
Connection theConnection = null;
// validConnection - user & password required
theConnection = DriverManager.getConnection(validURL1, validuser1,
validpassword1);
assertNotNull(theConnection);
for (String[] theData : invalids1) {
theConnection = null;
try {
theConnection = DriverManager.getConnection(theData[0],
theData[1], theData[2]);
fail("Should throw SQLException.");
} catch (SQLException e) {
//expected
} // end try
} // end for
for (String[] theData : invalids2) {
assertNotNull(DriverManager.getConnection(theData[0], theData[1],
theData[2]));
}
} // end method testGetConnectionStringStringString()
static String validURL1 = "jdbc:mikes1";
static String validURL2 = "jdbc:mikes2";
static String invalidURL1 = "xyz:acb";
static String invalidURL2 = null;
static String[] validURLs = { validURL1, validURL2 };
static String[] invalidURLs = { invalidURL1, invalidURL2 };
static String exceptionMsg1 = "No suitable driver";
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getDriver",
args = {java.lang.String.class}
)
public void testGetDriver() throws SQLException {
for (String element : validURLs) {
Driver validDriver = DriverManager.getDriver(element);
assertNotNull("Driver " + element + " not loaded", validDriver);
} // end for
for (String element : invalidURLs) {
try {
DriverManager.getDriver(element);
fail("Should throw SQLException");
} catch (SQLException e) {
assertEquals("08001", e.getSQLState());
assertEquals(exceptionMsg1, e.getMessage());
} // end try
} // end for
} // end method testGetDriver()
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "test only passes in CTS host environment.",
method = "getDrivers",
args = {}
)
public void testGetDrivers() {
// Load a driver manager
Enumeration<Driver> driverList = DriverManager.getDrivers();
int i = 0;
while (driverList.hasMoreElements()) {
Driver theDriver = driverList.nextElement();
assertNotNull(theDriver);
i++;
} // end while
// Check that all the drivers are in the list...
// BEGIN android-changed
// We have a ClassLoader issue in the DriverManager: The
// Drivermanager loads the System drivers in a static initialisation
// method loadInitialDrivers. This initialisation happens in the cts
// environment before the test sets the drivers via the system property
// "jdbc.drivers".
// Therefore the system drivers are not returned via getDrivers()
final int noOfSystemDriversLoaded = 2; //DRIVER4 + DRIVER5
assertEquals("testGetDrivers: Don't see all the loaded drivers - ", numberLoaded - noOfSystemDriversLoaded, i);
// END android-changed
} // end method testGetDrivers()
static int timeout1 = 25;
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getLoginTimeout",
args = {}
)
public void testGetLoginTimeout() {
DriverManager.setLoginTimeout(timeout1);
assertEquals(timeout1, DriverManager.getLoginTimeout());
} // end method testGetLoginTimeout()
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getLogStream",
args = {}
)
@SuppressWarnings("deprecation")
public void testGetLogStream() {
assertNull(DriverManager.getLogStream());
DriverManager.setLogStream(testPrintStream);
assertTrue(DriverManager.getLogStream() == testPrintStream);
DriverManager.setLogStream(null);
} // end method testGetLogStream()
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getLogWriter",
args = {}
)
public void testGetLogWriter() {
assertNull(DriverManager.getLogWriter());
DriverManager.setLogWriter(testPrintWriter);
assertTrue(DriverManager.getLogWriter() == testPrintWriter);
DriverManager.setLogWriter(null);
} // end method testGetLogWriter()
static String testMessage = "DriverManagerTest: test message for print stream";
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "println",
args = {java.lang.String.class}
)
@SuppressWarnings("deprecation")
public void testPrintln() {
// System.out.println("testPrintln");
DriverManager.println(testMessage);
DriverManager.setLogWriter(testPrintWriter);
DriverManager.println(testMessage);
String theOutput = outputStream.toString();
// System.out.println("testPrintln: output= " + theOutput );
assertTrue(theOutput.startsWith(testMessage));
DriverManager.setLogWriter(null);
DriverManager.setLogStream(testPrintStream);
DriverManager.println(testMessage);
theOutput = outputStream2.toString();
// System.out.println("testPrintln: output= " + theOutput );
assertTrue(theOutput.startsWith(testMessage));
DriverManager.setLogStream(null);
} // end method testPrintln()
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "SQLException checking missed: not feasible",
method = "registerDriver",
args = {java.sql.Driver.class}
)
public void testRegisterDriver() throws ClassNotFoundException,
SQLException, IllegalAccessException, InstantiationException {
// This is DRIVER3
// String EXTRA_DRIVER_NAME =
// "org.apache.harmony.sql.tests.java.sql.TestHelper_Driver3";
try {
DriverManager.registerDriver(null);
fail("Should throw NullPointerException.");
} catch (NullPointerException e) {
// expected
} // end try
Driver theDriver = null;
// Load another Driver that isn't in the basic set
Class<?> driverClass = Class.forName(DRIVER3);
theDriver = (Driver) driverClass.newInstance();
DriverManager.registerDriver(theDriver);
assertTrue("testRegisterDriver: driver not in loaded set",
isDriverLoaded(theDriver));
} // end testRegisterDriver()
static int validTimeout1 = 15;
static int validTimeout2 = 0;
static int[] validTimeouts = { validTimeout1, validTimeout2 };
static int invalidTimeout1 = -10;
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "setLoginTimeout",
args = {int.class}
)
public void testSetLoginTimeout() {
for (int element : validTimeouts) {
DriverManager.setLoginTimeout(element);
assertEquals(element, DriverManager.getLoginTimeout());
} // end for
// Invalid timeouts
DriverManager.setLoginTimeout(invalidTimeout1);
assertEquals(invalidTimeout1, DriverManager.getLoginTimeout());
} // end testSetLoginTimeout()
static ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream();
static PrintStream testPrintStream = new PrintStream(outputStream2);
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "setLogStream",
args = {java.io.PrintStream.class}
)
@SuppressWarnings("deprecation")
public void testSetLogStream() {
// System.out.println("testSetLogStream");
DriverManager.setLogStream(testPrintStream);
assertSame(testPrintStream, DriverManager.getLogStream());
DriverManager.setLogStream(null);
assertNull(DriverManager.getLogStream());
// Now let's deal with the case where there is a SecurityManager in
// place
TestSecurityManager theSecManager = new TestSecurityManager();
System.setSecurityManager(theSecManager);
theSecManager.setLogAccess(false);
try {
DriverManager.setLogStream(testPrintStream);
fail("Should throw SecurityException.");
} catch (SecurityException s) {
//expected
}
theSecManager.setLogAccess(true);
DriverManager.setLogStream(testPrintStream);
System.setSecurityManager(null);
} // end method testSetLogStream()
static ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
static PrintWriter testPrintWriter = new PrintWriter(outputStream);
/**
* Test for the setLogWriter method
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "setLogWriter",
args = {java.io.PrintWriter.class}
)
public void testSetLogWriter() {
// System.out.println("testSetLogWriter");
DriverManager.setLogWriter(testPrintWriter);
assertSame(testPrintWriter, DriverManager.getLogWriter());
DriverManager.setLogWriter(null);
assertNull("testDriverManager: Log writer not null:", DriverManager
.getLogWriter());
// Now let's deal with the case where there is a SecurityManager in
// place
TestSecurityManager theSecManager = new TestSecurityManager();
System.setSecurityManager(theSecManager);
theSecManager.setLogAccess(false);
try {
DriverManager.setLogWriter(testPrintWriter);
fail("Should throw SecurityException.");
} catch (SecurityException s) {
//expected
}
theSecManager.setLogAccess(true);
DriverManager.setLogWriter(testPrintWriter);
System.setSecurityManager(null);
} // end method testSetLogWriter()
/*
* Method which loads a set of JDBC drivers ready for use by the various
* tests @return the number of drivers loaded
*/
static boolean driversLoaded = false;
private static int loadDrivers() {
if (driversLoaded) {
return numberLoaded;
}
/*
* First define a value for the System property "jdbc.drivers" - before
* the DriverManager class is loaded - this property defines a set of
* drivers which the DriverManager will load during its initialization
* and which will be loaded on the System ClassLoader - unlike the ones
* loaded later by this method which are loaded on the Application
* ClassLoader.
*/
int numberLoaded = 0;
String theSystemDrivers = DRIVER4 + ":" + DRIVER5 + ":"
+ INVALIDDRIVER1;
System.setProperty(JDBC_PROPERTY, theSystemDrivers);
numberLoaded += 2;
for (String element : driverNames) {
try {
Class<?> driverClass = Class.forName(element);
assertNotNull(driverClass);
System.out.println("Loaded driver - classloader = " +
driverClass.getClassLoader());
numberLoaded++;
} catch (ClassNotFoundException e) {
System.out.println("DriverManagerTest: failed to load Driver: "
+ element);
} // end try
} // end for
driversLoaded = true;
return numberLoaded;
} // end method loadDrivers()
class TestSecurityManager extends SecurityManager {
boolean logAccess = true;
SQLPermission sqlPermission = new SQLPermission("setLog");
RuntimePermission setManagerPermission = new RuntimePermission(
"setSecurityManager");
TestSecurityManager() {
super();
} // end method TestSecurityManager()
void setLogAccess(boolean allow) {
logAccess = allow;
} // end method setLogAccess( boolean )
@Override
public void checkPermission(Permission thePermission) {
if (thePermission.equals(sqlPermission)) {
if (!logAccess) {
throw new SecurityException("Cannot set the sql Log Writer");
} // end if
return;
} // end if
if (thePermission.equals(setManagerPermission)) {
return;
} // end if
// super.checkPermission( thePermission );
} // end method checkPermission( Permission )
} // end class TestSecurityManager
/**
* @tests {@link java.sql.DriverManager#registerDriver(Driver)}
*
* Registers a driver for multiple times and deregisters it only once.
*
* Regression for HARMONY-4205
*/
public void test_registerDriver_MultiTimes() throws SQLException {
int register_count = 10;
int deregister_count = 1;
Driver dummy = new DummyDriver();
DriverManager.registerDriver(new BadDummyDriver());
for (int i = 0; i < register_count; i++) {
DriverManager.registerDriver(dummy);
}
DriverManager.registerDriver(new BadDummyDriver());
for (int i = 0; i < deregister_count; i++) {
DriverManager.deregisterDriver(dummy);
}
Driver d = DriverManager.getDriver("jdbc:dummy_protocol:dummy_subname");
assertNotNull(d);
}
/**
* Regression for HARMONY-4303
*/
public void test_initClass() throws Exception {
ProcessBuilder builder = javaProcessBuilder();
builder.command().add("org/apache/harmony/sql/tests/java/sql/TestMainForDriver");
assertEquals("", execAndGetOutput(builder));
}
private static class BadDummyDriver extends DummyDriver {
public boolean acceptsURL(String url) {
return false;
}
}
private static class DummyDriver implements Driver {
String goodurl = "jdbc:dummy_protocol:dummy_subname";
public boolean acceptsURL(String url) {
return url.equals(goodurl);
}
public Connection connect(String url, Properties info) {
return null;
}
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) {
return null;
}
public int getMajorVersion() {
return 0;
}
public int getMinorVersion() {
return 0;
}
public boolean jdbcCompliant() {
return true;
}
}
} // end class DriverManagerTest