/* * Copyright 2014 LinkedIn Corp. * * Licensed 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 azkaban.database; import com.google.common.io.Resources; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URISyntaxException; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.junit.Rule; import org.junit.rules.TemporaryFolder; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import azkaban.utils.Props; public class AzkabanDatabaseSetupTest { @Rule public TemporaryFolder temp = new TemporaryFolder(); private static String sqlScriptsDir; @BeforeClass public static void setupDB() throws IOException, URISyntaxException { URL resourceUrl = Resources.getResource("sql"); assertNotNull(resourceUrl); sqlScriptsDir = new File(resourceUrl.toURI()).getCanonicalPath(); } @AfterClass public static void teardownDB() { } @Ignore @Test public void testH2Query() throws Exception { File dbDir = temp.newFolder("h2dbtest"); Props h2Props = getH2Props(dbDir.getCanonicalPath(), sqlScriptsDir); AzkabanDatabaseSetup setup = new AzkabanDatabaseSetup(h2Props); // First time will create the tables setup.loadTableInfo(); setup.printUpgradePlan(); setup.updateDatabase(true, true); assertTrue(setup.needsUpdating()); // Second time will update some tables. This is only for testing purpose and // obviously we wouldn't set things up this way. setup.loadTableInfo(); setup.printUpgradePlan(); setup.updateDatabase(true, true); assertTrue(setup.needsUpdating()); // Nothing to be done setup.loadTableInfo(); setup.printUpgradePlan(); assertFalse(setup.needsUpdating()); } @Ignore @Test public void testMySQLQuery() throws Exception { clearMySQLTestDB(); Props mysqlProps = getMySQLProps(sqlScriptsDir); AzkabanDatabaseSetup setup = new AzkabanDatabaseSetup(mysqlProps); // First time will create the tables setup.loadTableInfo(); setup.printUpgradePlan(); setup.updateDatabase(true, true); assertTrue(setup.needsUpdating()); // Second time will update some tables. This is only for testing purpose // and obviously we wouldn't set things up this way. setup.loadTableInfo(); setup.printUpgradePlan(); setup.updateDatabase(true, true); assertTrue(setup.needsUpdating()); // Nothing to be done setup.loadTableInfo(); setup.printUpgradePlan(); assertFalse(setup.needsUpdating()); } private static Props getH2Props(String dbDir, String sqlScriptsDir) { Props props = new Props(); props.put("database.type", "h2"); props.put("h2.path", dbDir); props.put("database.sql.scripts.dir", sqlScriptsDir); return props; } private static Props getMySQLProps(String sqlScriptsDir) { Props props = new Props(); props.put("database.type", "mysql"); props.put("mysql.port", "3306"); props.put("mysql.host", "localhost"); props.put("mysql.database", "azkabanunittest"); props.put("mysql.user", "root"); props.put("database.sql.scripts.dir", sqlScriptsDir); props.put("mysql.password", ""); props.put("mysql.numconnections", 10); return props; } private static void clearMySQLTestDB() throws SQLException { Props props = new Props(); props.put("database.type", "mysql"); props.put("mysql.host", "localhost"); props.put("mysql.port", "3306"); props.put("mysql.database", ""); props.put("mysql.user", "root"); props.put("mysql.password", ""); props.put("mysql.numconnections", 10); DataSource datasource = DataSourceUtils.getDataSource(props); QueryRunner runner = new QueryRunner(datasource); try { runner.update("drop database azkabanunittest"); } catch (SQLException e) { } runner.update("create database azkabanunittest"); } }