< prev index next >

test/java/lang/module/AutomaticModulesTest.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2015, 2016, 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. --- 1,7 ---- /* ! * Copyright (c) 2015, 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.
*** 31,44 **** import java.io.IOException; import java.lang.module.Configuration; import java.lang.module.FindException; import java.lang.module.ModuleDescriptor; - import java.lang.module.ModuleDescriptor.Exports; import java.lang.module.ModuleDescriptor.Requires.Modifier; import java.lang.module.ModuleFinder; import java.lang.module.ModuleReference; import java.lang.module.ResolvedModule; import java.lang.reflect.Layer; import java.lang.reflect.Module; import java.nio.file.Files; import java.nio.file.Path; --- 31,44 ---- import java.io.IOException; import java.lang.module.Configuration; import java.lang.module.FindException; import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleDescriptor.Requires.Modifier; import java.lang.module.ModuleFinder; import java.lang.module.ModuleReference; + import java.lang.module.ResolutionException; import java.lang.module.ResolvedModule; import java.lang.reflect.Layer; import java.lang.reflect.Module; import java.nio.file.Files; import java.nio.file.Path;
*** 135,144 **** --- 135,145 ---- // a module with the expected name should be found Optional<ModuleReference> mref = finder.find(mn); assertTrue(mref.isPresent(), mn + " not found"); ModuleDescriptor descriptor = mref.get().descriptor(); + assertTrue(descriptor.isAutomatic()); assertEquals(descriptor.name(), mn); if (vs == null) { assertFalse(descriptor.version().isPresent()); } else { assertEquals(descriptor.version().get().toString(), vs);
*** 173,193 **** ModuleFinder finder = ModuleFinder.of(dir); Optional<ModuleReference> mref = finder.find("m"); assertTrue(mref.isPresent(), "m not found"); ModuleDescriptor descriptor = mref.get().descriptor(); assertTrue(descriptor.packages().size() == 2); assertTrue(descriptor.packages().contains("p")); assertTrue(descriptor.packages().contains("q")); ! Set<String> exports = descriptor.exports().stream() ! .map(Exports::source) ! .collect(Collectors.toSet()); ! assertTrue(exports.size() == 2); ! assertTrue(exports.contains("p")); ! assertTrue(exports.contains("q")); } /** * Test class files in JAR file where the entry does not correspond to a * legal package name. --- 174,191 ---- ModuleFinder finder = ModuleFinder.of(dir); Optional<ModuleReference> mref = finder.find("m"); assertTrue(mref.isPresent(), "m not found"); ModuleDescriptor descriptor = mref.get().descriptor(); + assertTrue(descriptor.isAutomatic()); assertTrue(descriptor.packages().size() == 2); assertTrue(descriptor.packages().contains("p")); assertTrue(descriptor.packages().contains("q")); ! assertTrue(descriptor.exports().isEmpty()); ! assertTrue(descriptor.opens().isEmpty()); } /** * Test class files in JAR file where the entry does not correspond to a * legal package name.
*** 199,217 **** ModuleFinder finder = ModuleFinder.of(dir); Optional<ModuleReference> mref = finder.find("m"); assertTrue(mref.isPresent(), "m not found"); ModuleDescriptor descriptor = mref.get().descriptor(); assertTrue(descriptor.packages().size() == 1); assertTrue(descriptor.packages().contains("p")); ! Set<String> exports = descriptor.exports().stream() ! .map(Exports::source) ! .collect(Collectors.toSet()); ! assertTrue(exports.size() == 1); ! assertTrue(exports.contains("p")); } /** * Test non-class resources in a JAR file. */ --- 197,213 ---- ModuleFinder finder = ModuleFinder.of(dir); Optional<ModuleReference> mref = finder.find("m"); assertTrue(mref.isPresent(), "m not found"); ModuleDescriptor descriptor = mref.get().descriptor(); + assertTrue(descriptor.isAutomatic()); assertTrue(descriptor.packages().size() == 1); assertTrue(descriptor.packages().contains("p")); ! assertTrue(descriptor.exports().isEmpty()); ! assertTrue(descriptor.opens().isEmpty()); } /** * Test non-class resources in a JAR file. */
*** 227,240 **** ModuleFinder finder = ModuleFinder.of(dir); Optional<ModuleReference> mref = finder.find("m"); assertTrue(mref.isPresent(), "m not found"); ModuleDescriptor descriptor = mref.get().descriptor(); ! assertTrue(descriptor.packages().size() == 2); assertTrue(descriptor.packages().contains("p")); - assertTrue(descriptor.packages().contains("p.resources")); } /** * Test .class file in unnamed package (top-level directory) */ --- 223,236 ---- ModuleFinder finder = ModuleFinder.of(dir); Optional<ModuleReference> mref = finder.find("m"); assertTrue(mref.isPresent(), "m not found"); ModuleDescriptor descriptor = mref.get().descriptor(); + assertTrue(descriptor.isAutomatic()); ! assertTrue(descriptor.packages().size() == 1); assertTrue(descriptor.packages().contains("p")); } /** * Test .class file in unnamed package (top-level directory) */
*** 252,264 **** --- 248,268 ---- public void testServicesConfiguration() throws IOException { String service = "p.S"; String provider = "p.S1"; Path tmpdir = Files.createTempDirectory(USER_DIR, "tmp"); + + // provider class + Path providerClass = tmpdir.resolve(provider.replace('.', '/') + ".class"); + Files.createDirectories(providerClass.getParent()); + Files.createFile(providerClass); + + // services configuration file Path services = tmpdir.resolve("META-INF").resolve("services"); Files.createDirectories(services); Files.write(services.resolve(service), Set.of(provider)); + Path dir = Files.createTempDirectory(USER_DIR, "mods"); JarUtils.createJarFile(dir.resolve("m.jar"), tmpdir); ModuleFinder finder = ModuleFinder.of(dir);
*** 312,338 **** public Object[][] createBadProviders() { return new Object[][] { // service type provider type { "p.S", "-" }, ! { "p.S", ".S1" }, { "p.S", "S1." }, }; } /** * Test JAR file with META-INF/services configuration file with bad * values or names. */ @Test(dataProvider = "badproviders", expectedExceptions = FindException.class) ! public void testBadProvideNames(String service, String provider) throws IOException { Path tmpdir = Files.createTempDirectory(USER_DIR, "tmp"); Path services = tmpdir.resolve("META-INF").resolve("services"); Files.createDirectories(services); Files.write(services.resolve(service), Set.of(provider)); Path dir = Files.createTempDirectory(USER_DIR, "mods"); JarUtils.createJarFile(dir.resolve("m.jar"), tmpdir); // should throw FindException ModuleFinder.of(dir).findAll(); --- 316,370 ---- public Object[][] createBadProviders() { return new Object[][] { // service type provider type { "p.S", "-" }, ! { "p.S", "p..S1" }, { "p.S", "S1." }, }; } /** * Test JAR file with META-INF/services configuration file with bad * values or names. */ @Test(dataProvider = "badproviders", expectedExceptions = FindException.class) ! public void testBadProviderNames(String service, String provider) throws IOException { Path tmpdir = Files.createTempDirectory(USER_DIR, "tmp"); + + // provider class + Path providerClass = tmpdir.resolve(provider.replace('.', '/') + ".class"); + Files.createDirectories(providerClass.getParent()); + Files.createFile(providerClass); + + // services configuration file Path services = tmpdir.resolve("META-INF").resolve("services"); Files.createDirectories(services); Files.write(services.resolve(service), Set.of(provider)); + + Path dir = Files.createTempDirectory(USER_DIR, "mods"); + JarUtils.createJarFile(dir.resolve("m.jar"), tmpdir); + + // should throw FindException + ModuleFinder.of(dir).findAll(); + } + + /** + * Test JAR file with META-INF/services configuration file listing a + * provider that is not in the module. + */ + @Test(expectedExceptions = FindException.class) + public void testMissingProviderPackage() throws IOException { + Path tmpdir = Files.createTempDirectory(USER_DIR, "tmp"); + + // services configuration file + Path services = tmpdir.resolve("META-INF").resolve("services"); + Files.createDirectories(services); + Files.write(services.resolve("p.S"), Set.of("q.P")); + Path dir = Files.createTempDirectory(USER_DIR, "mods"); JarUtils.createJarFile(dir.resolve("m.jar"), tmpdir); // should throw FindException ModuleFinder.of(dir).findAll();
*** 350,360 **** Attributes attrs = man.getMainAttributes(); attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0"); attrs.put(Attributes.Name.MAIN_CLASS, mainClass); Path dir = Files.createTempDirectory(USER_DIR, "mods"); ! createDummyJarFile(dir.resolve("m.jar"), man); ModuleFinder finder = ModuleFinder.of(dir); Configuration parent = Layer.boot().configuration(); Configuration cf = resolve(parent, finder, "m"); --- 382,393 ---- Attributes attrs = man.getMainAttributes(); attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0"); attrs.put(Attributes.Name.MAIN_CLASS, mainClass); Path dir = Files.createTempDirectory(USER_DIR, "mods"); ! String entry = mainClass.replace('.', '/') + ".class"; ! createDummyJarFile(dir.resolve("m.jar"), man, entry); ModuleFinder finder = ModuleFinder.of(dir); Configuration parent = Layer.boot().configuration(); Configuration cf = resolve(parent, finder, "m");
*** 364,396 **** assertTrue(descriptor.mainClass().isPresent()); assertEquals(descriptor.mainClass().get(), mainClass); } ! // Main-Class files that do not map to a legal Java identifier @DataProvider(name = "badmainclass") public Object[][] createBadMainClass() { return new Object[][]{ { "p-.Main", null }, - { ".Main", null } }; } /** ! * Test that a JAR file with a Main-Class attribute that is not a valid ! * Java identifier */ @Test(dataProvider = "badmainclass", expectedExceptions = FindException.class) public void testBadMainClass(String mainClass, String ignore) throws IOException { Manifest man = new Manifest(); Attributes attrs = man.getMainAttributes(); attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0"); attrs.put(Attributes.Name.MAIN_CLASS, mainClass); Path dir = Files.createTempDirectory(USER_DIR, "mods"); createDummyJarFile(dir.resolve("m.jar"), man); // should throw FindException ModuleFinder.of(dir).findAll(); } --- 397,448 ---- assertTrue(descriptor.mainClass().isPresent()); assertEquals(descriptor.mainClass().get(), mainClass); } ! // Main-Class files that do not map to a legal qualified type name @DataProvider(name = "badmainclass") public Object[][] createBadMainClass() { return new Object[][]{ + { "Main", null }, + { "p..Main", null }, { "p-.Main", null }, }; } /** ! * Test that a JAR file with a Main-Class attribute that is not a qualified ! * type name. */ @Test(dataProvider = "badmainclass", expectedExceptions = FindException.class) public void testBadMainClass(String mainClass, String ignore) throws IOException { Manifest man = new Manifest(); Attributes attrs = man.getMainAttributes(); attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0"); attrs.put(Attributes.Name.MAIN_CLASS, mainClass); Path dir = Files.createTempDirectory(USER_DIR, "mods"); + String entry = mainClass.replace('.', '/') + ".class"; + createDummyJarFile(dir.resolve("m.jar"), man, entry); + + // should throw FindException + ModuleFinder.of(dir).findAll(); + } + + /** + * Test that a JAR file with a Main-Class attribute that is not in the module + */ + @Test(expectedExceptions = FindException.class) + public void testMissingMainClassPackage() throws IOException { + Manifest man = new Manifest(); + Attributes attrs = man.getMainAttributes(); + attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0"); + attrs.put(Attributes.Name.MAIN_CLASS, "p.Main"); + + Path dir = Files.createTempDirectory(USER_DIR, "mods"); createDummyJarFile(dir.resolve("m.jar"), man); // should throw FindException ModuleFinder.of(dir).findAll(); }
*** 403,413 **** * b* * c* */ public void testConfiguration1() throws Exception { ModuleDescriptor descriptor1 ! = ModuleDescriptor.module("a") .requires("b") .requires("c") .requires("java.base") .build(); --- 455,465 ---- * b* * c* */ public void testConfiguration1() throws Exception { ModuleDescriptor descriptor1 ! = ModuleDescriptor.newModule("a") .requires("b") .requires("c") .requires("java.base") .build();
*** 463,479 **** * c* * d* */ public void testInConfiguration2() throws IOException { ModuleDescriptor descriptor1 ! = ModuleDescriptor.module("a") .requires("b") .requires("java.base") .build(); ModuleDescriptor descriptor2 ! = ModuleDescriptor.module("b") .requires("c") .requires("java.base") .build(); // c and d are automatic modules --- 515,531 ---- * c* * d* */ public void testInConfiguration2() throws IOException { ModuleDescriptor descriptor1 ! = ModuleDescriptor.newModule("a") .requires("b") .requires("java.base") .build(); ModuleDescriptor descriptor2 ! = ModuleDescriptor.newModule("b") .requires("c") .requires("java.base") .build(); // c and d are automatic modules
*** 536,552 **** * c* * d* */ public void testInConfiguration3() throws IOException { ModuleDescriptor descriptor1 ! = ModuleDescriptor.module("a") .requires("b") .requires("java.base") .build(); ModuleDescriptor descriptor2 ! = ModuleDescriptor.module("b") .requires(Set.of(Modifier.TRANSITIVE), "c") .requires("java.base") .build(); // c and d are automatic modules --- 588,604 ---- * c* * d* */ public void testInConfiguration3() throws IOException { ModuleDescriptor descriptor1 ! = ModuleDescriptor.newModule("a") .requires("b") .requires("java.base") .build(); ModuleDescriptor descriptor2 ! = ModuleDescriptor.newModule("b") .requires(Set.of(Modifier.TRANSITIVE), "c") .requires("java.base") .build(); // c and d are automatic modules
*** 607,621 **** testReadAllBootModules(cf, "d"); // d reads all modules in boot layer } /** * Basic test of Layer containing automatic modules */ public void testInLayer() throws IOException { ModuleDescriptor descriptor ! = ModuleDescriptor.module("a") .requires("b") .requires("c") .build(); // b and c are simple JAR files --- 659,729 ---- testReadAllBootModules(cf, "d"); // d reads all modules in boot layer } /** + * Basic test of a configuration created with automatic modules + * a requires b* and c* + * b* contains p + * c* contains p + */ + @Test(expectedExceptions = { ResolutionException.class }) + public void testDuplicateSuppliers1() throws IOException { + ModuleDescriptor descriptor + = ModuleDescriptor.newModule("a") + .requires("b") + .requires("c") + .build(); + + // c and d are automatic modules with the same package + Path dir = Files.createTempDirectory(USER_DIR, "mods"); + createDummyJarFile(dir.resolve("b.jar"), "p/T.class"); + createDummyJarFile(dir.resolve("c.jar"), "p/T.class"); + + // module finder locates 'a' and the modules in the directory + ModuleFinder finder + = ModuleFinder.compose(ModuleUtils.finderOf(descriptor), + ModuleFinder.of(dir)); + + Configuration parent = Layer.boot().configuration(); + resolve(parent, finder, "a"); + } + + + /** + * Basic test of a configuration created with automatic modules + * a contains p, requires b* + * b* contains p + */ + @Test(expectedExceptions = { ResolutionException.class }) + public void testDuplicateSuppliers2() throws IOException { + ModuleDescriptor descriptor + = ModuleDescriptor.newModule("a") + .packages(Set.of("p")) + .requires("b") + .build(); + + // c and d are automatic modules with the same package + Path dir = Files.createTempDirectory(USER_DIR, "mods"); + createDummyJarFile(dir.resolve("b.jar"), "p/T.class"); + + // module finder locates 'a' and the modules in the directory + ModuleFinder finder + = ModuleFinder.compose(ModuleUtils.finderOf(descriptor), + ModuleFinder.of(dir)); + + Configuration parent = Layer.boot().configuration(); + resolve(parent, finder, "a"); + } + + + /** * Basic test of Layer containing automatic modules */ public void testInLayer() throws IOException { ModuleDescriptor descriptor ! = ModuleDescriptor.newModule("a") .requires("b") .requires("c") .build(); // b and c are simple JAR files
*** 662,685 **** assertTrue(finder.find("m").isPresent()); ModuleDescriptor m = finder.find("m").get().descriptor(); // test miscellaneous methods assertTrue(m.isAutomatic()); ! assertFalse(m.isSynthetic()); assertFalse(m.osName().isPresent()); assertFalse(m.osArch().isPresent()); assertFalse(m.osVersion().isPresent()); } /** ! * Invokes parent.resolveRequires to resolve the given root modules. */ static Configuration resolve(Configuration parent, ModuleFinder finder, String... roots) { ! return parent.resolveRequires(finder, ModuleFinder.of(), Set.of(roots)); } /** * Finds a module in the given configuration or its parents, returning * the module descriptor (or null if not found) --- 770,793 ---- assertTrue(finder.find("m").isPresent()); ModuleDescriptor m = finder.find("m").get().descriptor(); // test miscellaneous methods assertTrue(m.isAutomatic()); ! assertFalse(m.modifiers().contains(ModuleDescriptor.Modifier.SYNTHETIC)); assertFalse(m.osName().isPresent()); assertFalse(m.osArch().isPresent()); assertFalse(m.osVersion().isPresent()); } /** ! * Invokes parent.resolve to resolve the given root modules. */ static Configuration resolve(Configuration parent, ModuleFinder finder, String... roots) { ! return parent.resolve(finder, ModuleFinder.of(), Set.of(roots)); } /** * Finds a module in the given configuration or its parents, returning * the module descriptor (or null if not found)
< prev index next >