/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2009-2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.core.schema; import static org.junit.Assert.assertTrue; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.sql.DataSource; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.opennms.core.test.OpenNMSJUnit4ClassRunner; import org.opennms.netmgt.dao.db.JUnitTemporaryDatabase; import org.opennms.netmgt.dao.db.TemporaryDatabase; import org.opennms.core.test.MockLogAppender; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.test.context.ContextConfiguration; @RunWith(OpenNMSJUnit4ClassRunner.class) @ContextConfiguration(locations={ "classpath:/migratorTest.xml" }) @JUnitTemporaryDatabase(createSchema=false) public class MigratorTest { @Autowired DataSource m_dataSource; @Autowired ResourceLoader m_resourceLoader; @Autowired ApplicationContext m_context; private Migration m_migration; @Before public void setUp() throws Exception { MockLogAppender.setupLogging(); m_migration = new Migration(); m_migration.setAdminUser(System.getProperty(TemporaryDatabase.ADMIN_USER_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_USER)); m_migration.setAdminPassword(System.getProperty(TemporaryDatabase.ADMIN_PASSWORD_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_PASSWORD)); m_migration.setDatabaseUser(System.getProperty(TemporaryDatabase.ADMIN_USER_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_USER)); m_migration.setDatabasePassword(System.getProperty(TemporaryDatabase.ADMIN_PASSWORD_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_PASSWORD)); m_migration.setChangeLog("changelog.xml"); } @Test public void testUpdate() throws Exception { Migrator m = new Migrator(); m.setDataSource(m_dataSource); m.setAdminDataSource(m_dataSource); m.setValidateDatabaseVersion(false); m.setCreateUser(false); m.setCreateDatabase(false); m.prepareDatabase(m_migration); m.migrate(m_migration); Connection conn = null; try { conn = m_dataSource.getConnection(); Set<String> tables = new HashSet<String>(); ResultSet rs = conn.getMetaData().getTables(null, null, "%", null); while (rs.next()) { tables.add(rs.getString("TABLE_NAME").toLowerCase()); } assertTrue("must contain table 'alarms'", tables.contains("alarms")); Set<String> procs = new HashSet<String>(); rs = conn.getMetaData().getProcedures(null, null, "%"); while (rs.next()) { procs.add(rs.getString("PROCEDURE_NAME").toLowerCase()); } System.err.println("procs = " + procs); assertTrue("must have stored procedure 'setSnmpInterfaceKeysOnUpdate'", procs.contains("setsnmpinterfacekeysonupdate")); } finally { if (conn != null) { conn.close(); } } } @Test public void testMultipleChangelogs() throws Exception { final Migrator m = new Migrator(); m.setDataSource(m_dataSource); m.setAdminDataSource(m_dataSource); m.setValidateDatabaseVersion(false); m.setCreateUser(false); m.setCreateDatabase(false); Migration migration = new Migration(); migration.setAdminUser(System.getProperty(TemporaryDatabase.ADMIN_USER_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_USER)); migration.setAdminPassword(System.getProperty(TemporaryDatabase.ADMIN_PASSWORD_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_PASSWORD)); migration.setDatabaseUser(System.getProperty(TemporaryDatabase.ADMIN_USER_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_USER)); migration.setDatabasePassword(System.getProperty(TemporaryDatabase.ADMIN_PASSWORD_PROPERTY, TemporaryDatabase.DEFAULT_ADMIN_PASSWORD)); migration.setChangeLog("changelog.xml"); for (final Resource resource : m_context.getResources("classpath*:/changelog.xml")) { System.err.println("=== found resource: " + resource + " ==="); migration.setAccessor(new ExistingResourceAccessor(resource)); m.migrate(migration); } final Connection connection = m_dataSource.getConnection(); final PreparedStatement statement = connection.prepareStatement("SELECT id FROM databasechangelog"); assertTrue(statement.execute()); final ResultSet rs = statement.getResultSet(); final List<String> ids = new ArrayList<String>(); while (rs.next()) { ids.add(rs.getString(1)); } assertTrue(ids.size() > 0); assertTrue(ids.contains("test-api.schema.a")); assertTrue(ids.contains("test-api.schema.b")); } @Test @Ignore("takes a long time, just did this to make sure 'upgrades' would not bomb") public void testUpdateTwice() throws Exception { final Migrator m = new Migrator(); m.setDataSource(m_dataSource); m.migrate(m_migration); m.migrate(m_migration); } }