package com.linkedin.thirdeye;
import com.linkedin.thirdeye.client.DAORegistry;
import com.linkedin.thirdeye.datalayer.ScriptRunner;
import com.linkedin.thirdeye.datalayer.bao.AbstractManagerTestBase;
import com.linkedin.thirdeye.datalayer.util.DaoProviderUtil;
import com.linkedin.thirdeye.datalayer.util.PersistenceConfig;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.sql.Connection;
import org.apache.tomcat.jdbc.pool.DataSource;
public class TestDBResources {
private DataSource ds;
private DAORegistry daoRegistry;
public static TestDBResources setupDAO() throws Exception {
URL url = TestDBResources.class.getResource("/persistence-local.yml");
File configFile = new File(url.toURI());
DaoProviderUtil.init(configFile);
// TestDBResources instance = new TestDBResources();
// instance.setTestDaoRegistry(DAORegistry.getInstance());
// try {
//
// instance.init();
// System.out.println("DAOs initialized");
// return instance;
// } catch(Exception e) {
// throw new RuntimeException(e);
// }
return null;
}
public static void teardownDAO(TestDBResources instance) {
try {
System.out.println("DAOs cleaned up");
instance.cleanUp();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
public void setTestDaoRegistry(DAORegistry daoRegistry) {
this.daoRegistry = daoRegistry;
}
public DAORegistry getTestDaoRegistry() {
return daoRegistry;
}
private void init() throws Exception {
URL url = AbstractManagerTestBase.class.getResource("/persistence-local.yml");
File configFile = new File(url.toURI());
PersistenceConfig configuration = DaoProviderUtil.createConfiguration(configFile);
initializeDs(configuration);
initJDBC();
}
private void cleanUp() throws Exception {
cleanUpJDBC();
}
private void initializeDs(PersistenceConfig configuration) {
String dbId = System.currentTimeMillis() + "" + Math.random();
ds = new DataSource();
ds.setUrl(configuration.getDatabaseConfiguration().getUrl() + dbId);
System.out.println("Creating db with connection url : " + ds.getUrl());
ds.setPassword(configuration.getDatabaseConfiguration().getPassword());
ds.setUsername(configuration.getDatabaseConfiguration().getUser());
ds.setDriverClassName(configuration.getDatabaseConfiguration().getProperties()
.get("hibernate.connection.driver_class"));
// pool size configurations
ds.setMaxActive(200);
ds.setMinIdle(10);
ds.setInitialSize(10);
// when returning connection to pool
ds.setTestOnReturn(true);
ds.setRollbackOnReturn(true);
// Timeout before an abandoned(in use) connection can be removed.
ds.setRemoveAbandonedTimeout(600_000);
ds.setRemoveAbandoned(true);
}
//JDBC related init/cleanup
private void initJDBC() throws Exception {
initDB();
}
private void initDB() throws Exception {
try (Connection conn = ds.getConnection()) {
// create schema
URL createSchemaUrl = getClass().getResource("/schema/create-schema.sql");
ScriptRunner scriptRunner = new ScriptRunner(conn, false, false);
scriptRunner.setDelimiter(";", true);
scriptRunner.runScript(new FileReader(createSchemaUrl.getFile()));
}
}
private void cleanUpJDBC() throws Exception {
System.out.println("Cleaning database: start");
try (Connection conn = ds.getConnection()) {
URL deleteSchemaUrl = getClass().getResource("/schema/drop-tables.sql");
ScriptRunner scriptRunner = new ScriptRunner(conn, false, false);
scriptRunner.runScript(new FileReader(deleteSchemaUrl.getFile()));
}
System.out.println("Cleaning database: done!");
}
}