/* * 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.hadoop.hive.druid; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import io.druid.metadata.MetadataStorageConnectorConfig; import io.druid.metadata.MetadataStorageTablesConfig; import io.druid.metadata.storage.derby.DerbyConnector; import org.junit.Assert; import org.junit.rules.ExternalResource; import org.skife.jdbi.v2.DBI; import org.skife.jdbi.v2.exceptions.UnableToObtainConnectionException; import java.sql.SQLException; import java.util.UUID; public class DerbyConnectorTestUtility extends DerbyConnector { private final String jdbcUri; public DerbyConnectorTestUtility( Supplier<MetadataStorageConnectorConfig> config, Supplier<MetadataStorageTablesConfig> dbTables ) { this(config, dbTables, "jdbc:derby:memory:druidTest" + dbSafeUUID()); } protected DerbyConnectorTestUtility( Supplier<MetadataStorageConnectorConfig> config, Supplier<MetadataStorageTablesConfig> dbTables, String jdbcUri ) { super(config, dbTables, new DBI(jdbcUri + ";create=true")); this.jdbcUri = jdbcUri; } public void tearDown() { try { new DBI(jdbcUri + ";drop=true").open().close(); } catch (UnableToObtainConnectionException e) { SQLException cause = (SQLException) e.getCause(); // error code "08006" indicates proper shutdown Assert.assertEquals(String.format("Derby not shutdown: [%s]", cause.toString()), "08006", cause.getSQLState() ); } } public static String dbSafeUUID() { return UUID.randomUUID().toString().replace("-", ""); } public String getJdbcUri() { return jdbcUri; } public static class DerbyConnectorRule extends ExternalResource { private DerbyConnectorTestUtility connector; private final Supplier<MetadataStorageTablesConfig> dbTables; private final MetadataStorageConnectorConfig connectorConfig; public DerbyConnectorRule() { this("druidTest" + dbSafeUUID()); } private DerbyConnectorRule( final String defaultBase ) { this(Suppliers.ofInstance(MetadataStorageTablesConfig.fromBase(defaultBase))); } public DerbyConnectorRule( Supplier<MetadataStorageTablesConfig> dbTables ) { this.dbTables = dbTables; this.connectorConfig = new MetadataStorageConnectorConfig() { @Override public String getConnectURI() { return connector.getJdbcUri(); } }; } @Override protected void before() throws Throwable { connector = new DerbyConnectorTestUtility(Suppliers.ofInstance(connectorConfig), dbTables); connector.getDBI().open().close(); // create db } @Override protected void after() { connector.tearDown(); } public DerbyConnectorTestUtility getConnector() { return connector; } public MetadataStorageConnectorConfig getMetadataConnectorConfig() { return connectorConfig; } public Supplier<MetadataStorageTablesConfig> metadataTablesConfigSupplier() { return dbTables; } } }