| /* |
| * 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) {} |
| }; |
| } |
| } |