/*
 * Copyright (c) 1998, 2022 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.framework;

import org.eclipse.persistence.testing.tests.TestRunModel;

import java.util.Vector;

/**
 * Run a batch task, e.g., LightRunAll, MediumRunAll and NotInLightRunAll utilizing PromptTestRunner.
 *
 * @author Edwin Tang
 */
public class BatchTestRunner {
    protected static final String PROPERTIES_FILE_FLAG = "pfile=";
    protected static final String BATCH_NAME_FLAG = "batchname=";
    protected static final String LIGHT_RUN_ALL = "lightrunall";
    protected static final String MEDIUM_RUN_ALL = "mediumrunall";
    protected static final String TEST_NOT_IN_LIGHT_RUN_ALL = "testnotinlightrunall";
    private String pFileName;
    private String batchName;
    private Vector<String> testList;

    /**
    * Util method to log output.
    */
    public static void log(String str) {
        System.out.println(str);
    }

    public static void main(String[] args) {
        new BatchTestRunner().run(args);
    }

    private void run(String[] args) {
        if (args.length < 2) {
            this.printUsageAndExit();
        }
        for (int i = 0; i < args.length; i++) {
            processArguments(args[i]);
        }

        long startTime = System.currentTimeMillis();
        log("*** Beginning of running " + batchName + ", model by model. ***");
        PromptTestRunner ptr = new PromptTestRunner();
        for (int index = 0; index < testList.size(); ++index) {
            String arg1 = "testmodel=" + testList.elementAt(index);
            String arg2 = "pfile=" + pFileName;
            String[] a = { arg1, arg2 };
            log("*** Running " + testList.elementAt(index));
            ptr.run(a);
        }
        long endTime = System.currentTimeMillis();
        log("*** End of running " + batchName + ", model by model. ***");
        log("*** " + testList.size() + " test models. ");
        log("*** Total running time is " + ((endTime - startTime) / (1000 * 60)) + "m " + (((endTime - startTime) / 1000) % 60) + "s.");
        System.exit(0);
    }

    public void printUsageAndExit() {
        log("Usage:\n\tBatchTestRunner " + PROPERTIES_FILE_FLAG + "<PropertiesFile> " + BATCH_NAME_FLAG + "<BatchName>");
        log("\n\t" + BATCH_NAME_FLAG + "<BatchName> The name could be " + LIGHT_RUN_ALL + MEDIUM_RUN_ALL + " or " + TEST_NOT_IN_LIGHT_RUN_ALL);
        log("\n\t" + PROPERTIES_FILE_FLAG + "<PropertiesFile> The specified properties file name");
        log("\n\t\t" + "Template of properties file:");
        log("\n\t\t\t" + "# properties for DatabseSession");
        log("\n\t\t\t" + "session.log=c:\\temp.txt");
        log("\n\t\t\t" + "session.logMessages=false");
        log("\n\n\t\t\t" + "# properties for TestExecutor");
        log("\n\t\t\t" + "executor.handleErrors=true");
        log("\n\n\t\t\t" + "# properties for DatabaseLogin");
        log("\n\t\t\t" + "login.databaseplatform=ORACLE");
        log("\n\t\t\t" + "login.driverClass=oracle.jdbc.OracleDriver");
        log("\n\t\t\t" + "login.databaseURL=jdbc:oracle:thin:@localhost:1521:ORCL");
        log("\n\t\t\t" + "login.username=scott");
        log("\n\t\t\t" + "login.password=tiger");
        log("\n\t" + "Example:  java org.eclipse.persistence.testing.Testframework.BatchTestRunner ");
        log("\n\t\t" + BATCH_NAME_FLAG + LIGHT_RUN_ALL);
        log("\n\t\t" + PROPERTIES_FILE_FLAG + "C:\\titlcore.properties");
        System.exit(1);
    }

    private void processArguments(String arg) {
        if (arg.startsWith(PROPERTIES_FILE_FLAG)) {
            pFileName = arg.substring(PROPERTIES_FILE_FLAG.length());
        } else if (arg.startsWith(BATCH_NAME_FLAG)) {
            batchName = arg.substring(BATCH_NAME_FLAG.length());
            if (batchName.equalsIgnoreCase(LIGHT_RUN_ALL)) {
                testList = TestRunModel.buildLRGTestList();
            } else if (batchName.equalsIgnoreCase(MEDIUM_RUN_ALL)) {
                testList = TestRunModel.buildAllTestModelsList() ;
            } else if (batchName.equalsIgnoreCase(TEST_NOT_IN_LIGHT_RUN_ALL)) {
                testList = TestRunModel.buildNonLRGTestList();
            } else {
                log("Invaild batch name.");
                log("Correct batch name should be " + LIGHT_RUN_ALL + ", " + MEDIUM_RUN_ALL + " or " + TEST_NOT_IN_LIGHT_RUN_ALL);
                System.exit(1);
            }
        }
    }
}
