blob: 1a0d888b68d2a8be14d248499a9c8deb9c54b38b [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.solr.handler.dataimport;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import junit.framework.Assert;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
/**
* This sets up an in-memory Sql database with a little sample data.
*/
public abstract class AbstractDIHJdbcTestCase extends
AbstractDataImportHandlerTestCase {
protected Database dbToUse;
public enum Database {
RANDOM, DERBY, HSQLDB
}
protected boolean skipThisTest = false;
private static final Pattern totalRequestsPattern = Pattern
.compile(".str name..Total Requests made to DataSource..(\\d+)..str.");
@BeforeClass
public static void beforeClassDihJdbcTest() throws Exception {
try {
Class.forName("org.hsqldb.jdbcDriver").newInstance();
String oldProp = System.getProperty("derby.stream.error.field");
System
.setProperty("derby.stream.error.field",
"org.apache.solr.handler.dataimport.AbstractDIHJdbcTestCase$DerbyUtil.DEV_NULL");
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
if (oldProp != null) {
System.setProperty("derby.stream.error.field", oldProp);
}
} catch (Exception e) {
throw e;
}
initCore("dataimport-solrconfig.xml", "dataimport-schema.xml");
}
@AfterClass
public static void afterClassDihJdbcTest() throws Exception {
try {
DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (SQLException e) {
// ignore...we might not even be using derby this time...
}
}
protected Database setAllowedDatabases() {
return Database.RANDOM;
}
@Before
public void beforeDihJdbcTest() throws Exception {
skipThisTest = false;
dbToUse = setAllowedDatabases();
if (dbToUse == Database.RANDOM) {
if (random().nextBoolean()) {
dbToUse = Database.DERBY;
} else {
dbToUse = Database.HSQLDB;
}
}
clearIndex();
assertU(commit());
buildDatabase();
}
@After
public void afterDihJdbcTest() throws Exception {
Connection conn = null;
Statement s = null;
try {
if (dbToUse == Database.DERBY) {
try {
conn = DriverManager
.getConnection("jdbc:derby:memory:derbyDB;drop=true;territory=en_US");
} catch (SQLException e) {
if (!"08006".equals(e.getSQLState())) {
throw e;
}
}
} else if (dbToUse == Database.HSQLDB) {
conn = DriverManager.getConnection("jdbc:hsqldb:mem:.");
s = conn.createStatement();
s.executeUpdate("shutdown");
}
} catch (SQLException e) {
if(!skipThisTest) {
throw e;
}
} finally {
try {
s.close();
} catch (Exception ex) {}
try {
conn.close();
} catch (Exception ex) {}
}
}
protected Connection newConnection() throws Exception {
if (dbToUse == Database.DERBY) {
return DriverManager.getConnection("jdbc:derby:memory:derbyDB;territory=en_US");
} else if (dbToUse == Database.HSQLDB) {
return DriverManager.getConnection("jdbc:hsqldb:mem:.");
}
throw new AssertionError("Invalid database to use: " + dbToUse);
}
protected void buildDatabase() throws Exception {
Connection conn = null;
try {
if (dbToUse == Database.DERBY) {
conn = DriverManager
.getConnection("jdbc:derby:memory:derbyDB;create=true;territory=en_US");
} else if (dbToUse == Database.HSQLDB) {
conn = DriverManager.getConnection("jdbc:hsqldb:mem:.");
} else {
throw new AssertionError("Invalid database to use: " + dbToUse);
}
populateData(conn);
} catch (SQLException sqe) {
Throwable cause = sqe;
while(cause.getCause()!=null) {
cause = cause.getCause();
}
} finally {
try {
conn.close();
} catch (Exception e1) {}
}
}
protected void populateData(Connection conn) throws Exception {
// no-op
}
public int totalDatabaseRequests(String dihHandlerName) throws Exception {
LocalSolrQueryRequest request = lrf.makeRequest("indent", "true");
String response = h.query(dihHandlerName, request);
Matcher m = totalRequestsPattern.matcher(response);
Assert.assertTrue("The handler " + dihHandlerName
+ " is not reporting any database requests. ",
m.find() && m.groupCount() == 1);
return Integer.parseInt(m.group(1));
}
public int totalDatabaseRequests() throws Exception {
return totalDatabaseRequests("/dataimport");
}
protected LocalSolrQueryRequest generateRequest() {
return lrf.makeRequest("command", "full-import", "dataConfig",
generateConfig(), "clean", "true", "commit", "true", "synchronous",
"true", "indent", "true");
}
protected abstract String generateConfig();
public static class DerbyUtil {
public static final OutputStream DEV_NULL = new OutputStream() {
@Override
public void write(int b) {}
};
}
}