1/*
2 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * @test
26 * @library /lib/testlibrary /test/lib
27 * @modules jdk.compiler
28 * @build OverlappingPackagesTest jdk.testlibrary.*
29 *        jdk.test.lib.compiler.CompilerUtils
30 * @run testng OverlappingPackagesTest
31 * @summary Basic test to ensure that startup fails if two or more modules
32 *          in the boot Layer have the same package
33 */
34
35import java.nio.file.Path;
36import java.nio.file.Paths;
37import java.util.Arrays;
38import java.util.List;
39
40import jdk.test.lib.compiler.CompilerUtils;
41import static jdk.testlibrary.ProcessTools.*;
42
43import org.testng.annotations.BeforeTest;
44import org.testng.annotations.Test;
45import static org.testng.Assert.*;
46
47@Test
48public class OverlappingPackagesTest {
49
50    private static final String TEST_SRC = System.getProperty("test.src");
51
52    private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
53    private static final Path MODS_DIR = Paths.get("mods");
54
55    // the names of the modules in this test
56    private static List<String> modules = Arrays.asList("m1", "m2", "test");
57
58
59    /**
60     * Compiles all modules used by the test
61     */
62    @BeforeTest
63    public void compileAll() throws Exception {
64        for (String mn : modules) {
65            Path src = SRC_DIR.resolve(mn);
66            Path mods = MODS_DIR.resolve(mn);
67            assertTrue(CompilerUtils.compile(src, mods));
68        }
69        Path srcMisc = SRC_DIR.resolve("misc");
70        Path modsMisc = MODS_DIR.resolve("misc");
71        assertTrue(CompilerUtils.compile(srcMisc, modsMisc));
72    }
73
74    /**
75     * Sanity check that the test runs without error.
76     */
77    public void testNoOverlappingPackages() throws Exception {
78        int exitValue
79            = executeTestJava("--module-path", MODS_DIR.toString(),
80                              "-m", "test/test.Main")
81                .outputTo(System.out)
82                .errorTo(System.err)
83                .getExitValue();
84
85        assertTrue(exitValue == 0);
86    }
87
88
89    /**
90     * Run the test with "--add-modules misc", the misc module has package
91     * jdk.internal.misc and so should overlap with the base module.
92     */
93    public void testOverlapWithBaseModule() throws Exception {
94        int exitValue
95            = executeTestJava("--module-path", MODS_DIR.toString(),
96                              "-add-modules", "misc",
97                              "-m", "test/test.Main")
98                .outputTo(System.out)
99                .errorTo(System.err)
100                .getExitValue();
101
102        assertTrue(exitValue != 0);
103    }
104
105    /**
106     * Run the test with "--add-modules m1,m2". Both modules have package p.
107     */
108    public void testOverlap() throws Exception {
109        int exitValue
110            = executeTestJava("--module-path", MODS_DIR.toString(),
111                              "--add-modules", "m1,m2",
112                              "-m", "test/test.Main")
113                .outputTo(System.out)
114                .errorTo(System.err)
115                .getExitValue();
116
117        assertTrue(exitValue != 0);
118    }
119
120
121}
122