/*
 * Copyright (c) 2017, 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
 * @library /lib/testlibrary
 * @build Driver Main JarUtils jdk.testlibrary.ProcessTools
 * @run main Driver
 * @summary Test ClassLoader.getResourceXXX to locate resources in an automatic
 *          module
 */

import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReference;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import jdk.testlibrary.ProcessTools;

/**
 * The driver creates a JAR file containing p/Foo.class, p/foo.properties,
 * and p/resources/bar.properties. This ensures there are is a resource in
 * a module package and a resource that is not in the module package. The
 * test is then launched to locate every resource in the JAR file.
 */

public class Driver {

    private static final String TEST_CLASSES = System.getProperty("test.classes");

    public static void main(String[] args) throws Exception {
        // create content for JAR file
        Path dir = Files.createTempDirectory("classes");
        Path p = Files.createDirectory(dir.resolve("p"));
        Files.createFile(p.resolve("Foo.class"));
        Files.createFile(p.resolve("foo.properties"));
        Path resources = Files.createDirectory(p.resolve("resources"));
        Files.createFile(resources.resolve("bar.properties"));

        // create the JAR file, including a manifest
        Path jarFile = Paths.get("library-1.0.jar");
        Manifest man = new Manifest();
        Attributes attrs = man.getMainAttributes();
        attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0");
        JarUtils.createJarFile(jarFile, man, dir, p);

        // get the module name
        ModuleFinder finder = ModuleFinder.of(jarFile);
        ModuleReference mref = finder.findAll().stream().findAny().orElse(null);
        if (mref == null)
            throw new RuntimeException("Module not found!!!");
        String name = mref.descriptor().name();

        // launch the test with the JAR file on the module path
        if (ProcessTools.executeTestJava("-p", jarFile.toString(),
                                         "--add-modules", name,
                                         "-cp", TEST_CLASSES,
                                         "Main", name)
                .outputTo(System.out)
                .errorTo(System.out)
                .getExitValue() != 0)
            throw new RuntimeException("Test failed - see output");
    }

}
