exportimporttest.java

来自「OpenJMS是一个开源的Java Message Service API 1.」· Java 代码 · 共 347 行

JAVA
347
字号
/** * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright *    statements and notices.  Redistributions must also contain a *    copy of this document. * * 2. Redistributions in binary form must reproduce the *    above copyright notice, this list of conditions and the *    following disclaimer in the documentation and/or other *    materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote *    products derived from this Software without prior written *    permission of Exoffice Technologies.  For written permission, *    please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" *    nor may "Exolab" appear in their names without prior written *    permission of Exoffice Technologies. Exolab is a registered *    trademark of Exoffice Technologies. * * 5. Due credit should be given to the Exolab Project *    (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 2005 (C) Exoffice Technologies Inc. All Rights Reserved. * * $Id: ExportImportTest.java,v 1.2 2005/11/12 12:52:06 tanderson Exp $ */package org.exolab.jms.tools.migration;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import org.apache.derby.jdbc.EmbeddedDataSource;import junit.framework.TestCase;import org.dbunit.Assertion;import org.dbunit.database.DatabaseConnection;import org.dbunit.database.IDatabaseConnection;import org.dbunit.database.QueryDataSet;import org.dbunit.dataset.IDataSet;import org.dbunit.dataset.ITable;import org.exolab.jms.config.Configuration;import org.exolab.jms.config.ConfigurationReader;import org.exolab.jms.config.DatabaseConfiguration;import org.exolab.jms.config.RdbmsDatabaseConfiguration;import org.exolab.jms.persistence.PersistenceException;import org.exolab.jms.tools.db.Database;import org.exolab.jms.tools.db.RDBMSTool;import org.exolab.jms.tools.db.SchemaHelper;/** * Tests the {@link Exporter} and {@link Importer}. * * @author <a href="mailto:tma@netspace.net.au">Tim Anderson</a> * @version $Revision: 1.2 $ $Date: 2005/11/12 12:52:06 $ */public class ExportImportTest extends TestCase {    /**     * Migration database name.     */    private static final String DB_NAME = "openjms_migdb";    /**     * Destinations table query. Ignores destination identifiers as these     * may be different between databases.     */    private static final String DESTINATIONS_QUERY            = "select name, isQueue from destinations order by name";    /**     * Message handles table query. Translates destination and consumer     * identifiers to their corresponding names, as these may be different     * between databases.     */    private static final String MESSAGE_HANDLES_QUERY            = "select messageId, d.name destination, c.name consumer, "              + "     priority, acceptedTime, sequenceNumber, expiryTime, "              + "     delivered "              + "from message_handles m, destinations d, consumers c "              + "where m.destinationId = d.destinationId and "              + "      m.consumerId = c.consumerId "              + "order by messageId, destination, consumer";    /**     * Consumers table query. Ignores the 'created' column which is no longer     * used.     */    private static final String CONSUMERS_QUERY            = "select c.name name, d.name destination "              + "from consumers c, destinations d "              + "where c.destinationId = d.destinationId "              + "order by name, destination";    /**     * Verifies that the exporter creates the tables in the target proxy,     * if they don't exist.     *     * @throws Exception for any error     */    public void testExporterCreateTables() throws Exception {        // load the configuration for the master database        Configuration config = read("/openjmstest.xml");        // ensure the tables don't exist        EmbeddedDataSource ds = MigrationHelper.getDataSource(DB_NAME);        RDBMSTool tool = new RDBMSTool(ds.getConnection());        Database schema = MigrationHelper.getSchema();        tool.drop(schema);        assertFalse(tool.hasTables(schema.getTable()));        // Create the exporter, and verify it has created the tables.        new Exporter(config, DB_NAME, false);        assertTrue(tool.hasTables(schema.getTable()));    }    /**     * Verifies that the exporter will only export data if the delete flag     * is true when the tables exists.     *     * @throws Exception for any error     */    public void testExporterDelete() throws Exception {        // load the configuration for the master database        Configuration config = read("/openjmstest.xml");        // create the target database.        EmbeddedDataSource ds = MigrationHelper.getDataSource(DB_NAME);        RDBMSTool tool = new RDBMSTool(ds.getConnection());        Database schema = MigrationHelper.getSchema();        tool.drop(schema);        tool.create(schema);        // Create the exporter        try {            new Exporter(config, DB_NAME, false);            fail("Expected Exporter construction to fail, as tables exist");        } catch (PersistenceException expected) {            // expected behaviour        }        try {            new Exporter(config, DB_NAME, true);        } catch (PersistenceException unexpected) {            fail("Expected Exporter construction to succeed");        }    }    /**     * Verifies that the importer creates the tables in the target master,     * if they don't exist.     *     * @throws Exception for any error     */    public void testImporterCreateTables() throws Exception {        // load the configuration for the target master database 'migrated'        Configuration config = read("/openjmstest_migrated.xml");        // ensure the tables don't exist        RDBMSTool tool = new RDBMSTool(config);        Database schema = SchemaHelper.getSchema();        tool.drop(schema);        assertFalse(tool.hasTables(schema.getTable()));        // Create the importer, and verify it has created the tables.        new Importer(config, DB_NAME, false);        assertTrue(tool.hasTables(schema.getTable()));    }    /**     * Verifies that the importer will only import data if the delete flag     * is true when the tables exists.     *     * @throws Exception for any error     */    public void testImporterDelete() throws Exception {        // load the configuration for the target master database 'migrated'        Configuration config = read("/openjmstest_migrated.xml");        // create the target database.        RDBMSTool tool = new RDBMSTool(config);        Database schema = SchemaHelper.getSchema();        tool.drop(schema);        tool.create(schema);        tool.close();        // Create the importer        try {            new Importer(config, DB_NAME, false);            fail("Expected Importer construction to fail, as tables exist");        } catch (PersistenceException expected) {            // expected behaviour        }        try {            new Importer(config, DB_NAME, true);        } catch (PersistenceException unexpected) {            fail("Expected Importer construction to succeed");        }    }    /**     * Exports data from a database and imports it to another, verifying the     * contents are the same between each.     *     * @throws Exception for any error     */    public void testRoundtrip() throws Exception {        // load the configuration for the master database        Configuration master = read("/openjmstest.xml");        // export the data to a proxy database        Exporter exporter = new Exporter(master, DB_NAME, true);        exporter.apply();        // load the configuration for the target master database 'migrated'        Configuration migrated = read("/openjmstest_migrated.xml");        // import the data from the proxy database into 'migrated'        Importer importer = new Importer(migrated, DB_NAME, true);        importer.apply();        // verify data between the two master databases        IDatabaseConnection masterConn = getConnection(master);        IDatabaseConnection migratedConn = getConnection(migrated);        IDataSet expectedDataSet = masterConn.createDataSet();        IDataSet actualDataSet = migratedConn.createDataSet();        // NOTE: don't care about the contents of the 'seeds' and 'system_data'        // tables as neither are explicitly migrated, and the contents of        // each may differ        checkQuery("destinations", DESTINATIONS_QUERY, masterConn,                   migratedConn);        checkTable("messages", expectedDataSet, actualDataSet);        checkQuery("message_handles", MESSAGE_HANDLES_QUERY, masterConn,                   migratedConn);        checkQuery("consumers", CONSUMERS_QUERY, masterConn, migratedConn);        checkTable("users", expectedDataSet, actualDataSet);    }    /**     * Reads a configuration from a resource.     *     * @param path the path to the resource     * @throws Exception for any error     */    private Configuration read(String path) throws Exception {        InputStream stream = ExportImportTest.class.getResourceAsStream(path);        return ConfigurationReader.read(stream);    }    /**     * Returns a dbunit connection for a database.     *     * @param config the configuration to use     * @return the connection     * @throws SQLException for any error     */    private IDatabaseConnection getConnection(Configuration config)            throws SQLException {        DatabaseConfiguration db = config.getDatabaseConfiguration();        Connection connection                = getConnection(db.getRdbmsDatabaseConfiguration());        return new DatabaseConnection(connection);    }    /**     * Returns a connection given the configuration.     *     * @param config the config to use     * @throws SQLException for any error     */    private Connection getConnection(RdbmsDatabaseConfiguration config)            throws SQLException {        return DriverManager.getConnection(config.getUrl(), config.getUser(),                                           config.getPassword());    }    /**     * Verifies that the contents of the named table is the same in 2 datasets.     *     * @param table           the table name     * @param expectedDataSet the data set containing the expected results     * @param actualDataSet   the data st containing the actual results     * @throws Exception for any error     */    private void checkTable(String table, IDataSet expectedDataSet,                            IDataSet actualDataSet) throws Exception {        ITable expected = expectedDataSet.getTable(table);        ITable actual = actualDataSet.getTable(table);        // make sure there is actually data to compare against        assertTrue(expected.getRowCount() != 0);        Assertion.assertEquals(expected, actual);    }    /**     * Verifies that the results returned by a query are the same from two     * different connections.     *     * @param table              the table name     * @param query              the query to execute     * @param expectedConnection the connection containing the expected results     * @param actualConnection   the connection containing the actual results     * @throws Exception for any error     */    private void checkQuery(String table, String query,                            IDatabaseConnection expectedConnection,                            IDatabaseConnection actualConnection)            throws Exception {        QueryDataSet expectedDataSet = new QueryDataSet(expectedConnection);        expectedDataSet.addTable(table, query);        QueryDataSet actualDataSet = new QueryDataSet(actualConnection);        actualDataSet.addTable(table, query);        // new FlatXmlWriter(System.out).write(expectedDataSet);        // new FlatXmlWriter(System.out).write(actualDataSet);        // make sure there is actually data to compare against        assertTrue(expectedDataSet.getTable(table).getRowCount() != 0);        Assertion.assertEquals(expectedDataSet, actualDataSet);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?