/*
* 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.jackrabbit.core.util.db;
import java.sql.Connection;
import java.util.Properties;
import javax.jcr.RepositoryException;
import javax.sql.DataSource;
import junit.framework.TestCase;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.derby.iapi.jdbc.EngineConnection;
import org.apache.jackrabbit.core.config.ConfigurationException;
import org.apache.jackrabbit.core.config.DataSourceConfig;
/**
*
*/
public class ConnectionFactoryTest extends TestCase {
private ConnectionFactory connectionFactory;
private static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
private static final String DERBY_URL = "jdbc:derby:target/connection-factory-test/db;create=true";
private static final String MYSQL_URL = "jdbc:mysql://localhost:3306/dbName?autoReconnect=true";
private static final String MSSQL_URL_1 = "jdbc:jtds:sqlserver://localhost:2433/dbName";
private static final String MSSQL_URL_2 = "jdbc:sqlserver://localhost:1433;databaseName=dbName";
private static final String ORACLE_URL = "jdbc:oracle:thin:@localhost:1521:xe";
private static final String H2_URL = "jdbc:h2:tcp://localhost/dbName";
@Override
public void setUp() {
System.setProperty("derby.stream.error.file", "target/derby-connectionfactorytest.log");
connectionFactory = new ConnectionFactory();
}
public void testGetDataSource_defaults_Derby() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password");
assertTrue(ds1 instanceof BasicDataSource);
BasicDataSource ds = (BasicDataSource) ds1;
assertPoolDefaults(ds, "values(1)", -1);
}
public void testGuessValidationQuery_MYSQL() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, MYSQL_URL, "user", "password");
assertEquals("select 1", ((BasicDataSource) ds1).getValidationQuery());
}
public void testGuessValidationQuery_MSSQL() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, MSSQL_URL_1, "user", "password");
assertEquals("select 1", ((BasicDataSource) ds1).getValidationQuery());
DataSource ds2 = connectionFactory.getDataSource(DRIVER, MSSQL_URL_2, "user", "password");
assertEquals("select 1", ((BasicDataSource) ds2).getValidationQuery());
}
public void testGuessValidationQuery_ORACLE() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, ORACLE_URL, "user", "password");
assertEquals("select 'validationQuery' from dual", ((BasicDataSource) ds1).getValidationQuery());
}
public void testGuessValidationQuery_H2() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, H2_URL, "user", "password");
assertEquals("select 1", ((BasicDataSource) ds1).getValidationQuery());
}
public void testRegisterDataSources_defaultValues() throws Exception {
BasicDataSource ds = registerAndGet(DERBY_URL, "overwrite", -1);
assertPoolDefaults(ds, "overwrite", -1);
}
public void testRegisterDataSources_noValidationQuery() throws Exception {
BasicDataSource ds = registerAndGet(MYSQL_URL, "", -1);
assertEquals("select 1", ds.getValidationQuery());
}
public void testGetDatabaseType() throws Exception {
String name = register(MYSQL_URL, "", -1);
assertEquals("dbType", connectionFactory.getDataBaseType(name));
}
public void testGetDataSource_identity() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password");
DataSource ds2 = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password");
assertSame(ds1, ds2);
}
public void testGetDataSource_identity_differentPasswords() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password");
DataSource ds2 = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password2");
assertSame(ds1, ds2);
}
public void testGetDataSource_noIdentity() throws Exception {
DataSource ds1 = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password");
DataSource ds2 = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user2", "password");
assertNotSame(ds1, ds2);
}
public void testUnwrap() throws Exception {
DataSource ds = connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password");
Connection wrappedCon = ds.getConnection();
assertNotNull(wrappedCon);
Connection con = ConnectionFactory.unwrap(wrappedCon);
assertTrue(con instanceof EngineConnection);
}
public void testClose() throws Exception {
connectionFactory.close();
try {
connectionFactory.getDataBaseType("logicalName");
fail("could retrieve after close");
} catch (IllegalStateException expected) {
}
try {
connectionFactory.getDataSource("logicalName");
fail("could retrieve after close");
} catch (IllegalStateException expected) {
}
try {
connectionFactory.getDataSource(DRIVER, DERBY_URL, "user", "password");
fail("could retrieve after close");
} catch (IllegalStateException expected) {
}
}
private void assertPoolDefaults(BasicDataSource ds, String validationQuery, int maxCons) {
assertEquals(maxCons, ds.getMaxActive());
assertEquals(validationQuery, ds.getValidationQuery());
assertTrue(ds.getDefaultAutoCommit());
assertFalse(ds.getTestOnBorrow());
assertTrue(ds.getTestWhileIdle());
assertEquals(600000, ds.getTimeBetweenEvictionRunsMillis());
assertTrue(ds.isPoolPreparedStatements());
assertEquals(-1, ds.getMaxOpenPreparedStatements());
}
private BasicDataSource registerAndGet(String url, String validationQuery, int maxCons) throws Exception {
final String name = register(url, validationQuery, maxCons);
DataSource ds = connectionFactory.getDataSource(name);
assertTrue(ds instanceof BasicDataSource);
return (BasicDataSource) ds;
}
private String register(String url, String validationQuery, int maxCons) throws ConfigurationException,
RepositoryException {
final String name = "some random name to not interfere with integration tests...";
DataSourceConfig dsc = new DataSourceConfig();
Properties props = new Properties();
props.put(DataSourceConfig.DRIVER, DRIVER);
props.put(DataSourceConfig.URL, url);
props.put(DataSourceConfig.DB_TYPE, "dbType");
props.put(DataSourceConfig.MAX_POOL_SIZE, Integer.toString(maxCons));
props.put(DataSourceConfig.VALIDATION_QUERY, validationQuery);
dsc.addDataSourceDefinition(name, props);
connectionFactory.registerDataSources(dsc);
return name;
}
}