/*
 * SPDX-License-Identifier: Apache-2.0
 *
 * The OpenSearch Contributors require contributions made to
 * this file be licensed under the Apache-2.0 license or a
 * compatible open source license.
 */

package org.opensearch.gradle;

import org.opensearch.gradle.test.GradleUnitTestCase;

public class ArchitectureTests extends GradleUnitTestCase {

    final String architecture = System.getProperty("os.arch", "");

    public void testCurrentArchitecture() {
        assertEquals(Architecture.X64, currentArchitecture("amd64"));
        assertEquals(Architecture.X64, currentArchitecture("x86_64"));
        assertEquals(Architecture.ARM64, currentArchitecture("aarch64"));
        assertEquals(Architecture.S390X, currentArchitecture("s390x"));
        assertEquals(Architecture.PPC64LE, currentArchitecture("ppc64le"));
    }

    public void testInvalidCurrentArchitecture() {
        assertThrows("can not determine architecture from [", IllegalArgumentException.class, () -> currentArchitecture("fooBar64"));
    }

    /**
     * Determines the return value of {@link Architecture#current()} based on a string representing a potential OS Architecture.
     *
     * @param osArchToTest  An expected value of the {@code os.arch} system property on another architecture.
     * @return the value of the {@link Architecture} enum which would have resulted with the given value.
     * @throws IllegalArgumentException if the string is not mapped to a value of the {@link Architecture} enum.
     */
    private Architecture currentArchitecture(String osArchToTest) throws IllegalArgumentException {
        // Test new architecture
        System.setProperty("os.arch", osArchToTest);
        try {
            return Architecture.current();
        } finally {
            // Restore actual architecture property value
            System.setProperty("os.arch", this.architecture);
        }
    }
}