/*
 * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code 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
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @bug 6332666 6863624 7180362 8003846 8074350 8074351 8130246 8149735 7102969
 *      8157138 8190904 8210410
 * @summary Tests the capability of replacing the currency data with a user
 *          specified currency properties file in lib directory (old way) or
 *          via the system property in the cmdline (new way).
 * @library /test/lib
 * @build PropertiesTest
 * @run junit PropertiesTestRun
 */

import jdk.test.lib.Utils;
import jdk.test.lib.process.ProcessTools;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.Arrays;
import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.fail;

public class PropertiesTestRun {

    // String paths used for the cmdline processes
    private static final String TEST_JDK = Utils.TEST_JDK;
    private static final String TEST_PROPS =
            Utils.TEST_SRC+Utils.FILE_SEPARATOR+"currency.properties";
    private static final String WRITABLE_JDK =
            "."+Utils.FILE_SEPARATOR+"WRITABLE_JDK";
    private static final String WRITABLE_JDK_LIB =
            WRITABLE_JDK+Utils.FILE_SEPARATOR+"lib";
    private static final String WRITABLE_JDK_BIN =
            WRITABLE_JDK+Utils.FILE_SEPARATOR+"bin";
    private static final String WRITABLE_JDK_JAVA_PATH =
            WRITABLE_JDK_BIN + Utils.FILE_SEPARATOR + "java";

    // Create a writable JDK and set up dumps 1-3
    @BeforeAll
    static void setUp() throws Throwable {
        // Create separate JDK to supersede currencies via lib directory
        createWritableJDK();
        // Create dump without user defined prop file
        executeTestJDKMethod("PropertiesTest", "-d", "dump1");
        // Create dump with user defined prop file (via system property)
        executeTestJDKMethod("-Djava.util.currency.data="+TEST_PROPS,
                "PropertiesTest", "-d", "dump2");
        // Create dump with user defined prop file (via lib)
        executeWritableJDKMethod("PropertiesTest", "-d", "dump3");
    }

    // Need to create a separate JDK to insert the user defined properties file
    // into the lib folder. Create separate JDK to not disturb current TEST JDK.
    private static void createWritableJDK() throws Throwable {
        // Copy Test JDK into a separate JDK folder
        executeProcess(new String[]{"cp", "-H", "-R", TEST_JDK, WRITABLE_JDK});
        // Make the separate JDK writable
        executeProcess(new String[]{"chmod", "-R", "u+w", WRITABLE_JDK_LIB});
        // Copy the properties file into the writable JDK lib folder
        executeProcess(new String[]{"cp", TEST_PROPS, WRITABLE_JDK_LIB});
    }

    // Compares the dumped output is expected between the default currencies
    // and the user-defined custom currencies
    @Test
    void compareDumps() throws Throwable {
        // Compare dump (from sys prop)
        executeTestJDKMethod("PropertiesTest", "-c", "dump1", "dump2",
                TEST_PROPS);
        // Compare dump (from lib)
        executeTestJDKMethod("PropertiesTest", "-c", "dump1", "dump3",
                TEST_PROPS);
    }

    // Launch a test from PropertiesTest. See PropertiesTest.java for more
    // detail regarding a specific test that was launched.
    @ParameterizedTest
    @MethodSource("PropertiesTestMethods")
    void launchPropertiesTests(String methodName) throws Throwable {
        // Test via both the lib and system property
        executeWritableJDKMethod("PropertiesTest", methodName);
        executeTestJDKMethod("-Djava.util.currency.data="+TEST_PROPS,
                "PropertiesTest", methodName);
    }

    private static Stream<String> PropertiesTestMethods() {
        return Stream.of("bug7102969", "bug8157138", "bug8190904");
    }

    // Launch a PropertiesTest method using the TEST JDK
    private static void executeTestJDKMethod(String... params) throws Throwable {
        int exitStatus = ProcessTools.executeTestJava(params).getExitValue();
        if (exitStatus != 0) {
            fail("Process started with: " + Arrays.toString(params) + " failed");
        }
    }

    // Launch a PropertiesTest method using the WRITABLE JDK
    private static void executeWritableJDKMethod(String... params) throws Throwable {
        // Need to include WritableJDK javapath, TEST JDK classpath
        String[] allParams = new String[3+params.length+Utils.getTestJavaOpts().length];
        // We don't use executeTestJava() because we want to point to separate JDK java path
        allParams[0] = WRITABLE_JDK_JAVA_PATH;
        allParams[1] = "-cp";
        allParams[2] = System.getProperty("java.class.path");
        // Add test.vm.opts and test.java.opts
        System.arraycopy(Utils.getTestJavaOpts(), 0, allParams, 3,
                Utils.getTestJavaOpts().length);
        // Add the rest of the actual arguments
        System.arraycopy(params, 0, allParams, Utils.getTestJavaOpts().length+3,
                params.length);
        // Launch the actual test method with all parameters set
        executeProcess(allParams);
    }

    // Execute a process and fail if the command is not successful
    private static void executeProcess(String[] params) throws Throwable {
        System.out.println("Command line: " + Arrays.toString(params));
        int exitStatus = ProcessTools.executeProcess(params).getExitValue();
        if (exitStatus != 0) {
            fail("Process started with: " + Arrays.toString(params) + " failed");
        }
    }

    @AfterAll
    static void tearDown() throws Throwable {
        // Remove the copied writable JDK image from scratch folder
        executeProcess(new String[]{"rm", "-rf", WRITABLE_JDK});
    }
}
