/*
 * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     David McCann - Dec.05, 2012 - 2.4.2 - Initial Implementation
package dbws.testing;

//JUnit4 imports
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.StringTokenizer;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

//testing imports
import dbws.testing.keymappings.KeyMappingsTestSuite;
import dbws.testing.relationships.RelationshipsTestSuite;
import dbws.testing.xrdynamicentity.XRDynamicEntityTestSuite;
import static dbws.testing.DBWSTestHelper.DATABASE_PASSWORD_KEY;
import static dbws.testing.DBWSTestHelper.DATABASE_URL_KEY;
import static dbws.testing.DBWSTestHelper.DATABASE_USERNAME_KEY;
import static dbws.testing.DBWSTestHelper.DEFAULT_DATABASE_DRIVER;
import static dbws.testing.DBWSTestHelper.DEFAULT_DATABASE_PASSWORD;
import static dbws.testing.DBWSTestHelper.DEFAULT_DATABASE_URL;
import static dbws.testing.DBWSTestHelper.DEFAULT_DATABASE_USERNAME;

@RunWith(Suite.class)
@SuiteClasses({
    KeyMappingsTestSuite.class,
    RelationshipsTestSuite.class,
    XRDynamicEntityTestSuite.class
  }
)

/**
 * Responsible for running the suite of non-oracle (MYSQL) DBWS runtime tests.
 *
 */
public class AllTests {
    public static final String DELIM = "|";

    /**
     * Build a MYSQL database connection to use when executing create and
     * drop DDL statements.
     */
    public static Connection buildConnection() throws ClassNotFoundException, SQLException {
        String username = System.getProperty(DATABASE_USERNAME_KEY, DEFAULT_DATABASE_USERNAME);
        String password = System.getProperty(DATABASE_PASSWORD_KEY, DEFAULT_DATABASE_PASSWORD);
        String url = System.getProperty(DATABASE_URL_KEY, DEFAULT_DATABASE_URL);
        Class.forName(DEFAULT_DATABASE_DRIVER);
        return DriverManager.getConnection(url, username, password);
    }

    /**
     * Execute the given DDL string.  If more than one statement is contained within the
     * given string, it is expected that the statements are separated by '|'.
     */
    public static void runDdl(String ddl, boolean printStackTrace) throws ClassNotFoundException, SQLException {
        try {
            Statement stmt = buildConnection().createStatement();
            StringTokenizer stok = new StringTokenizer(ddl, DELIM);
            while (stok.hasMoreTokens()) {
                stmt.addBatch(stok.nextToken());
            }
            stmt.executeBatch();
        } catch (SQLException e) {
            if (printStackTrace) {
                e.printStackTrace();
            }
        }
    }
}
