--- old/test/java/lang/module/ModuleDescriptorTest.java 2017-03-21 13:44:27.189079630 +0000 +++ new/test/java/lang/module/ModuleDescriptorTest.java 2017-03-21 13:44:26.990065975 +0000 @@ -50,11 +50,13 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import static java.lang.module.ModuleDescriptor.Requires.Modifier.*; +import jdk.internal.misc.JavaLangModuleAccess; import jdk.internal.misc.SharedSecrets; import jdk.internal.module.ModuleInfoWriter; import org.testng.annotations.DataProvider; @@ -988,6 +990,107 @@ } + @DataProvider(name = "unparseableVersions") + public Object[][] unparseableVersions() { + return new Object[][]{ + + { null, "A1" }, // no version < unparseable + { "A1", "A2" }, // unparseable < unparseable + { "A1", "1.0" }, // unparseable < parseable + + }; + } + + /** + * Basic test for unparseable module versions + */ + @Test(dataProvider = "unparseableVersions") + public void testUnparseableModuleVersion(String vs1, String vs2) { + ModuleDescriptor descriptor1 = newModule("m", vs1); + ModuleDescriptor descriptor2 = newModule("m", vs2); + + if (vs1 != null && !isParsableVersion(vs1)) { + assertFalse(descriptor1.version().isPresent()); + assertTrue(descriptor1.rawVersion().isPresent()); + assertEquals(descriptor1.rawVersion().get(), vs1); + } + + if (vs2 != null && !isParsableVersion(vs2)) { + assertFalse(descriptor2.version().isPresent()); + assertTrue(descriptor2.rawVersion().isPresent()); + assertEquals(descriptor2.rawVersion().get(), vs2); + } + + assertFalse(descriptor1.equals(descriptor2)); + assertFalse(descriptor2.equals(descriptor1)); + assertTrue(descriptor1.compareTo(descriptor2) == -1); + assertTrue(descriptor2.compareTo(descriptor1) == 1); + } + + /** + * Basic test for requiring a module with an unparseable version recorded + * at compile version. + */ + @Test(dataProvider = "unparseableVersions") + public void testUnparseableCompiledVersion(String vs1, String vs2) { + Requires r1 = newRequires("m", vs1); + Requires r2 = newRequires("m", vs2); + + if (vs1 != null && !isParsableVersion(vs1)) { + assertFalse(r1.compiledVersion().isPresent()); + assertTrue(r1.rawCompiledVersion().isPresent()); + assertEquals(r1.rawCompiledVersion().get(), vs1); + } + + if (vs2 != null && !isParsableVersion(vs2)) { + assertFalse(r2.compiledVersion().isPresent()); + assertTrue(r2.rawCompiledVersion().isPresent()); + assertEquals(r2.rawCompiledVersion().get(), vs2); + } + + assertFalse(r1.equals(r2)); + assertFalse(r2.equals(r1)); + assertTrue(r1.compareTo(r2) == -1); + assertTrue(r2.compareTo(r1) == 1); + } + + private ModuleDescriptor newModule(String name, String vs) { + JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess(); + Builder builder = JLMA.newModuleBuilder(name, false, Set.of()); + if (vs != null) + builder.version(vs); + builder.requires("java.base"); + ByteBuffer bb = ModuleInfoWriter.toByteBuffer(builder.build()); + return ModuleDescriptor.read(bb); + } + + private Requires newRequires(String name, String vs) { + JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess(); + Builder builder = JLMA.newModuleBuilder("foo", false, Set.of()); + if (vs == null) { + builder.requires(name); + } else { + JLMA.requires(builder, Set.of(), name, vs); + } + Set requires = builder.build().requires(); + Iterator iterator = requires.iterator(); + ModuleDescriptor.Requires r = iterator.next(); + if (r.name().equals("java.base")) { + r = iterator.next(); + } + return r; + } + + private boolean isParsableVersion(String vs) { + try { + Version.parse(vs); + return true; + } catch (IllegalArgumentException e) { + return false; + } + } + + // toNameAndVersion public void testToNameAndVersion() { @@ -1170,59 +1273,6 @@ } - // osName - - public void testOsName() { - String osName = ModuleDescriptor.newModule("foo").osName("Linux").build().osName().get(); - assertEquals(osName, "Linux"); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testNullOsName() { - ModuleDescriptor.newModule("foo").osName(null); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testEmptyOsName() { - ModuleDescriptor.newModule("foo").osName(""); - } - - - // osArch - - public void testOsArch() { - String osArch = ModuleDescriptor.newModule("foo").osName("arm").build().osName().get(); - assertEquals(osArch, "arm"); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testNullOsArch() { - ModuleDescriptor.newModule("foo").osArch(null); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testEmptyOsArch() { - ModuleDescriptor.newModule("foo").osArch(""); - } - - - // osVersion - - public void testOsVersion() { - String osVersion = ModuleDescriptor.newModule("foo").osName("11.2").build().osName().get(); - assertEquals(osVersion, "11.2"); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testNullOsVersion() { - ModuleDescriptor.newModule("foo").osVersion(null); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testEmptyOsVersion() { - ModuleDescriptor.newModule("foo").osVersion(""); - } - // reads private static InputStream EMPTY_INPUT_STREAM = new InputStream() { @@ -1239,7 +1289,9 @@ } }; - // basic test reading module-info.class + /** + * Basic test reading module-info.class + */ public void testRead() throws Exception { Module base = Object.class.getModule(); @@ -1256,6 +1308,7 @@ assertEquals(descriptor.name(), "java.base"); } } + /** * Test ModuleDescriptor with a packager finder */