< 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 >