Path: blob/master/test/jdk/java/lang/module/ModuleDescriptorTest.java
41149 views
/*1* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @modules java.base/jdk.internal.access26* java.base/jdk.internal.module27* @run testng ModuleDescriptorTest28* @summary Basic test for java.lang.module.ModuleDescriptor and its builder29*/3031import java.io.ByteArrayOutputStream;32import java.io.IOException;33import java.io.InputStream;34import java.lang.module.InvalidModuleDescriptorException;35import java.lang.module.ModuleDescriptor;36import java.lang.module.ModuleDescriptor.Builder;37import java.lang.module.ModuleDescriptor.Exports;38import java.lang.module.ModuleDescriptor.Opens;39import java.lang.module.ModuleDescriptor.Requires;40import java.lang.module.ModuleDescriptor.Provides;41import java.lang.module.ModuleDescriptor.Requires.Modifier;42import java.lang.module.ModuleDescriptor.Version;43import java.nio.ByteBuffer;44import java.util.ArrayList;45import java.util.Collections;46import java.util.EnumSet;47import java.util.HashSet;48import java.util.Iterator;49import java.util.List;50import java.util.Objects;51import java.util.Set;52import java.util.stream.Collectors;5354import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;5556import jdk.internal.access.JavaLangModuleAccess;57import jdk.internal.access.SharedSecrets;58import jdk.internal.module.ModuleInfoWriter;59import org.testng.annotations.DataProvider;60import org.testng.annotations.Test;61import static org.testng.Assert.*;6263@Test64public class ModuleDescriptorTest {6566@DataProvider(name = "invalidNames")67public Object[][] invalidNames() {68return new Object[][]{6970{ null, null },71{ "1", null },72{ "1foo", null },73{ ".foo", null },74{ "foo.", null },75{ "[foo]", null },76{ "foo.1", null },77{ "1foo.bar", null },78{ "foo.1bar", null },79{ "foo.[bar]", null },80{ "foo..bar", null },81{ "foo.bar.1", null },82{ "foo.bar.1gus", null },83{ "foo.bar.[gus]", null },8485{ "class", null },86{ "interface", null },87{ "true", null },88{ "false", null },89{ "null", null },9091{ "x.class", null },92{ "x.interface", null },93{ "x.true", null },94{ "x.false", null },95{ "x.null", null },9697{ "class.x", null },98{ "interface.x", null },99{ "true.x", null },100{ "false.x", null },101{ "null.x", null },102103{ "x.class.x", null },104{ "x.interface.x", null },105{ "x.true.x", null },106{ "x.false.x", null },107{ "x.null.x", null },108109{ "_", null },110111};112}113114115// requires116117private Requires requires(Set<Modifier> mods, String mn) {118return requires(mods, mn, null);119}120121private Requires requires(Set<Modifier> mods, String mn, Version v) {122Builder builder = ModuleDescriptor.newModule("m");123if (v == null) {124builder.requires(mods, mn);125} else {126builder.requires(mods, mn, v);127}128Set<Requires> requires = builder.build().requires();129assertTrue(requires.size() == 2);130Iterator<Requires> iterator = requires.iterator();131Requires r = iterator.next();132if (r.name().equals("java.base")) {133r = iterator.next();134} else {135Requires other = iterator.next();136assertEquals(other.name(), "java.base");137}138return r;139}140141private Requires requires(String mn) {142return requires(Collections.emptySet(), mn);143}144145public void testRequiresWithRequires() {146Requires r1 = requires("foo");147ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").requires(r1).build();148assertEquals(descriptor.requires().size(), 2);149var iterator = descriptor.requires().iterator();150Requires r2 = iterator.next();151if (r2.name().equals("java.base")) {152r2 = iterator.next();153}154assertEquals(r1, r2);155}156157public void testRequiresWithNoModifiers() {158Requires r = requires(EnumSet.noneOf(Requires.Modifier.class), "foo");159assertEquals(r, r);160assertTrue(r.compareTo(r) == 0);161assertTrue(r.modifiers().isEmpty());162assertEquals(r.name(), "foo");163assertFalse(r.compiledVersion().isPresent());164}165166public void testRequiresWithOneModifier() {167Requires r = requires(EnumSet.of(TRANSITIVE), "foo");168assertEquals(r, r);169assertTrue(r.compareTo(r) == 0);170assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE));171assertEquals(r.name(), "foo");172assertFalse(r.compiledVersion().isPresent());173}174175public void testRequiresWithTwoModifiers() {176Requires r = requires(EnumSet.of(TRANSITIVE, SYNTHETIC), "foo");177assertEquals(r, r);178assertTrue(r.compareTo(r) == 0);179assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE, SYNTHETIC));180assertEquals(r.name(), "foo");181assertFalse(r.compiledVersion().isPresent());182}183184public void testRequiresWithAllModifiers() {185Requires r = requires(EnumSet.allOf(Modifier.class), "foo");186assertEquals(r, r);187assertTrue(r.compareTo(r) == 0);188assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE, STATIC, SYNTHETIC, MANDATED));189assertEquals(r.name(), "foo");190assertFalse(r.compiledVersion().isPresent());191}192193public void testRequiresWithCompiledVersion() {194Version v = Version.parse("1.0");195Requires r = requires(Set.of(), "foo", v);196assertEquals(r, r);197assertTrue(r.compareTo(r) == 0);198assertEquals(r.modifiers(), Set.of());199assertEquals(r.name(), "foo");200assertTrue(r.compiledVersion().isPresent());201assertEquals(r.compiledVersion().get().toString(), "1.0");202}203204@Test(expectedExceptions = IllegalStateException.class)205public void testRequiresWithDuplicatesRequires() {206Requires r = requires("foo");207ModuleDescriptor.newModule("m").requires(r).requires(r);208}209210@Test(expectedExceptions = IllegalArgumentException.class)211public void testRequiresSelfWithRequires() {212Requires r = requires("foo");213ModuleDescriptor.newModule("foo").requires(r);214}215216@Test(expectedExceptions = IllegalArgumentException.class)217public void testRequiresSelfWithNoModifier() {218ModuleDescriptor.newModule("m").requires("m");219}220221@Test(expectedExceptions = IllegalArgumentException.class)222public void testRequiresSelfWithOneModifier() {223ModuleDescriptor.newModule("m").requires(Set.of(TRANSITIVE), "m");224}225226@Test(expectedExceptions = IllegalArgumentException.class)227public void testRequiresSelfWithAllModifiers() {228ModuleDescriptor.newModule("m").requires(EnumSet.allOf(Modifier.class), "m");229}230231@Test(dataProvider = "invalidNames",232expectedExceptions = IllegalArgumentException.class )233public void testRequiresWithBadModuleName(String mn, String ignore) {234requires(EnumSet.noneOf(Modifier.class), mn);235}236237@Test(expectedExceptions = NullPointerException.class)238public void testRequiresWithNullRequires() {239ModuleDescriptor.newModule("m").requires((Requires) null);240}241242@Test(expectedExceptions = NullPointerException.class)243public void testRequiresWithNullModifiers() {244ModuleDescriptor.newModule("m").requires(null, "foo");245}246247@Test(expectedExceptions = NullPointerException.class)248public void testRequiresWithNullVersion() {249ModuleDescriptor.newModule("m").requires(Set.of(), "foo", null);250}251252public void testRequiresCompare() {253Requires r1 = requires(EnumSet.noneOf(Modifier.class), "foo");254Requires r2 = requires(EnumSet.noneOf(Modifier.class), "bar");255int n = "foo".compareTo("bar");256assertTrue(r1.compareTo(r2) == n);257assertTrue(r2.compareTo(r1) == -n);258}259260public void testRequiresCompareWithDifferentModifiers() {261Requires r1 = requires(EnumSet.of(TRANSITIVE), "foo");262Requires r2 = requires(EnumSet.of(SYNTHETIC), "foo");263int n = Integer.compare(1 << TRANSITIVE.ordinal(), 1 << SYNTHETIC.ordinal());264assertTrue(r1.compareTo(r2) == n);265assertTrue(r2.compareTo(r1) == -n);266}267268public void testRequiresCompareWithSameModifiers() {269Requires r1 = requires(EnumSet.of(SYNTHETIC), "foo");270Requires r2 = requires(EnumSet.of(SYNTHETIC), "foo");271assertTrue(r1.compareTo(r2) == 0);272assertTrue(r2.compareTo(r1) == 0);273}274275public void testRequiresCompareWithSameCompiledVersion() {276Requires r1 = requires(Set.of(), "foo", Version.parse("2.0"));277Requires r2 = requires(Set.of(), "foo", Version.parse("2.0"));278assertTrue(r1.compareTo(r2) == 0);279assertTrue(r2.compareTo(r1) == 0);280}281282public void testRequiresCompareWithDifferentCompiledVersion() {283Requires r1 = requires(Set.of(), "foo", Version.parse("1.0"));284Requires r2 = requires(Set.of(), "foo", Version.parse("2.0"));285assertTrue(r1.compareTo(r2) < 0);286assertTrue(r2.compareTo(r1) > 0);287}288289public void testRequiresEqualsAndHashCode() {290Requires r1 = requires("foo");291Requires r2 = requires("foo");292assertEquals(r1, r2);293assertTrue(r1.hashCode() == r2.hashCode());294295r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo");296r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo");297assertEquals(r1, r2);298assertTrue(r1.hashCode() == r2.hashCode());299300r1 = requires("foo");301r2 = requires("bar");302assertNotEquals(r1, r2);303304r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo");305r2 = requires(Set.of(), "foo");306assertNotEquals(r1, r2);307308Version v1 = Version.parse("1.0");309r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);310r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);311assertEquals(r1, r2);312assertTrue(r1.hashCode() == r2.hashCode());313314Version v2 = Version.parse("2.0");315r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);316r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v2);317assertNotEquals(r1, r2);318}319320public void testRequiresToString() {321Requires r = requires(EnumSet.noneOf(Modifier.class), "foo");322assertTrue(r.toString().contains("foo"));323}324325326// exports327328private Exports exports(Set<Exports.Modifier> mods, String pn) {329return ModuleDescriptor.newModule("foo")330.exports(mods, pn)331.build()332.exports()333.iterator()334.next();335}336337private Exports exports(String pn) {338return exports(Set.of(), pn);339}340341private Exports exports(Set<Exports.Modifier> mods, String pn, String target) {342return ModuleDescriptor.newModule("foo")343.exports(mods, pn, Set.of(target))344.build()345.exports()346.iterator()347.next();348}349350private Exports exports(String pn, String target) {351return exports(Set.of(), pn, target);352}353354355public void testExportsExports() {356Exports e1 = exports("p");357ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").exports(e1).build();358Exports e2 = descriptor.exports().iterator().next();359assertEquals(e1, e2);360}361362public void testExportsToAll() {363Exports e = exports("p");364assertEquals(e, e);365assertTrue(e.modifiers().isEmpty());366assertEquals(e.source(), "p");367assertFalse(e.isQualified());368assertTrue(e.targets().isEmpty());369}370371public void testExportsToTarget() {372Exports e = exports("p", "bar");373assertEquals(e, e);374assertTrue(e.modifiers().isEmpty());375assertEquals(e.source(), "p");376assertTrue(e.isQualified());377assertTrue(e.targets().size() == 1);378assertTrue(e.targets().contains("bar"));379}380381public void testExportsToTargets() {382Set<String> targets = new HashSet<>();383targets.add("bar");384targets.add("gus");385Exports e386= ModuleDescriptor.newModule("foo")387.exports("p", targets)388.build()389.exports()390.iterator()391.next();392assertEquals(e, e);393assertTrue(e.modifiers().isEmpty());394assertEquals(e.source(), "p");395assertTrue(e.isQualified());396assertTrue(e.targets().size() == 2);397assertTrue(e.targets().contains("bar"));398assertTrue(e.targets().contains("gus"));399}400401public void testExportsToAllWithModifier() {402Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");403assertEquals(e, e);404assertTrue(e.modifiers().size() == 1);405assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));406assertEquals(e.source(), "p");407assertFalse(e.isQualified());408assertTrue(e.targets().isEmpty());409}410411public void testExportsToTargetWithModifier() {412Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p", "bar");413assertEquals(e, e);414assertTrue(e.modifiers().size() == 1);415assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));416assertEquals(e.source(), "p");417assertTrue(e.isQualified());418assertTrue(e.targets().size() == 1);419assertTrue(e.targets().contains("bar"));420}421422@Test(expectedExceptions = IllegalStateException.class)423public void testExportsWithDuplicate1() {424Exports e = exports("p");425ModuleDescriptor.newModule("foo").exports(e).exports(e);426}427428@Test(expectedExceptions = IllegalStateException.class)429public void testExportsWithDuplicate2() {430ModuleDescriptor.newModule("foo").exports("p").exports("p");431}432433@Test(expectedExceptions = IllegalArgumentException.class )434public void testExportsWithEmptySet() {435ModuleDescriptor.newModule("foo").exports("p", Collections.emptySet());436}437438@Test(dataProvider = "invalidNames",439expectedExceptions = IllegalArgumentException.class )440public void testExportsWithBadName(String pn, String ignore) {441ModuleDescriptor.newModule("foo").exports(pn);442}443444@Test(expectedExceptions = NullPointerException.class )445public void testExportsWithNullExports() {446ModuleDescriptor.newModule("foo").exports((Exports) null);447}448449@Test(expectedExceptions = NullPointerException.class )450public void testExportsWithNullTargets() {451ModuleDescriptor.newModule("foo").exports("p", (Set<String>) null);452}453454public void testExportsCompare() {455Exports e1 = exports("p");456Exports e2 = exports("p");457assertEquals(e1, e2);458assertTrue(e1.hashCode() == e2.hashCode());459assertTrue(e1.compareTo(e2) == 0);460assertTrue(e2.compareTo(e1) == 0);461}462463public void testExportsCompareWithSameModifiers() {464Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");465Exports e2 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");466assertEquals(e1, e2);467assertTrue(e1.hashCode() == e2.hashCode());468assertTrue(e1.compareTo(e2) == 0);469assertTrue(e2.compareTo(e1) == 0);470}471472public void testExportsCompareWithDifferentModifiers() {473Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");474Exports e2 = exports("p");475assertNotEquals(e1, e2);476assertTrue(e1.compareTo(e2) == 1);477assertTrue(e2.compareTo(e1) == -1);478}479480public void testExportsCompareWithSameTargets() {481Exports e1 = exports("p", "x");482Exports e2 = exports("p", "x");483assertEquals(e1, e2);484assertTrue(e1.hashCode() == e2.hashCode());485assertTrue(e1.compareTo(e2) == 0);486assertTrue(e2.compareTo(e1) == 0);487}488489public void testExportsCompareWithDifferentTargets() {490Exports e1 = exports("p", "y");491Exports e2 = exports("p", "x");492assertNotEquals(e1, e2);493assertTrue(e1.compareTo(e2) == 1);494assertTrue(e2.compareTo(e1) == -1);495}496497public void testExportsToString() {498String s = ModuleDescriptor.newModule("foo")499.exports("p1", Set.of("bar"))500.build()501.exports()502.iterator()503.next()504.toString();505assertTrue(s.contains("p1"));506assertTrue(s.contains("bar"));507}508509510// opens511512private Opens opens(Set<Opens.Modifier> mods, String pn) {513return ModuleDescriptor.newModule("foo")514.opens(mods, pn)515.build()516.opens()517.iterator()518.next();519}520521private Opens opens(String pn) {522return opens(Set.of(), pn);523}524525private Opens opens(Set<Opens.Modifier> mods, String pn, String target) {526return ModuleDescriptor.newModule("foo")527.opens(mods, pn, Set.of(target))528.build()529.opens()530.iterator()531.next();532}533534private Opens opens(String pn, String target) {535return opens(Set.of(), pn, target);536}537538public void testOpensOpens() {539Opens o1 = opens("p");540ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").opens(o1).build();541Opens o2 = descriptor.opens().iterator().next();542assertEquals(o1, o2);543}544545public void testOpensToAll() {546Opens o = opens("p");547assertEquals(o, o);548assertTrue(o.modifiers().isEmpty());549assertEquals(o.source(), "p");550assertFalse(o.isQualified());551assertTrue(o.targets().isEmpty());552}553554555public void testOpensToTarget() {556Opens o = opens("p", "bar");557assertEquals(o, o);558assertTrue(o.modifiers().isEmpty());559assertEquals(o.source(), "p");560assertTrue(o.isQualified());561assertTrue(o.targets().size() == 1);562assertTrue(o.targets().contains("bar"));563}564565public void testOpensToTargets() {566Set<String> targets = new HashSet<>();567targets.add("bar");568targets.add("gus");569Opens o = ModuleDescriptor.newModule("foo")570.opens("p", targets)571.build()572.opens()573.iterator()574.next();575assertEquals(o, o);576assertTrue(o.modifiers().isEmpty());577assertEquals(o.source(), "p");578assertTrue(o.isQualified());579assertTrue(o.targets().size() == 2);580assertTrue(o.targets().contains("bar"));581assertTrue(o.targets().contains("gus"));582}583584@Test(expectedExceptions = IllegalStateException.class)585public void testOpensWithDuplicate1() {586Opens o = opens("p");587ModuleDescriptor.newModule("foo").opens(o).opens(o);588}589590@Test(expectedExceptions = IllegalStateException.class)591public void testOpensWithDuplicate2() {592ModuleDescriptor.newModule("foo").opens("p").opens("p");593}594595@Test(expectedExceptions = IllegalArgumentException.class )596public void testOpensWithEmptySet() {597ModuleDescriptor.newModule("foo").opens("p", Collections.emptySet());598}599600@Test(dataProvider = "invalidNames",601expectedExceptions = IllegalArgumentException.class )602public void testOpensWithBadName(String pn, String ignore) {603ModuleDescriptor.newModule("foo").opens(pn);604}605606@Test(expectedExceptions = NullPointerException.class )607public void testOpensWithNullExports() {608ModuleDescriptor.newModule("foo").opens((Opens) null);609}610611@Test(expectedExceptions = NullPointerException.class )612public void testOpensWithNullTargets() {613ModuleDescriptor.newModule("foo").opens("p", (Set<String>) null);614}615616public void testOpensCompare() {617Opens o1 = opens("p");618Opens o2 = opens("p");619assertEquals(o1, o2);620assertTrue(o1.hashCode() == o2.hashCode());621assertTrue(o1.compareTo(o2) == 0);622assertTrue(o2.compareTo(o1) == 0);623}624625public void testOpensCompareWithSameModifiers() {626Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");627Opens o2 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");628assertEquals(o1, o2);629assertTrue(o1.hashCode() == o2.hashCode());630assertTrue(o1.compareTo(o2) == 0);631assertTrue(o2.compareTo(o1) == 0);632}633634public void testOpensCompareWithDifferentModifiers() {635Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");636Opens o2 = opens("p");637assertNotEquals(o1, o2);638assertTrue(o1.compareTo(o2) == 1);639assertTrue(o2.compareTo(o1) == -1);640}641642public void testOpensCompareWithSameTargets() {643Opens o1 = opens("p", "x");644Opens o2 = opens("p", "x");645assertEquals(o1, o2);646assertTrue(o1.hashCode() == o2.hashCode());647assertTrue(o1.compareTo(o2) == 0);648assertTrue(o2.compareTo(o1) == 0);649}650651public void testOpensCompareWithDifferentTargets() {652Opens o1 = opens("p", "y");653Opens o2 = opens("p", "x");654assertNotEquals(o1, o2);655assertTrue(o1.compareTo(o2) == 1);656assertTrue(o2.compareTo(o1) == -1);657}658659public void testOpensToString() {660String s = ModuleDescriptor.newModule("foo")661.opens("p1", Set.of("bar"))662.build()663.opens()664.iterator()665.next()666.toString();667assertTrue(s.contains("p1"));668assertTrue(s.contains("bar"));669}670671672// uses673674public void testUses() {675Set<String> uses676= ModuleDescriptor.newModule("foo")677.uses("p.S")678.uses("q.S")679.build()680.uses();681assertTrue(uses.size() == 2);682assertTrue(uses.contains("p.S"));683assertTrue(uses.contains("q.S"));684}685686@Test(expectedExceptions = IllegalStateException.class)687public void testUsesWithDuplicate() {688ModuleDescriptor.newModule("foo").uses("p.S").uses("p.S");689}690691@Test(expectedExceptions = IllegalArgumentException.class)692public void testUsesWithSimpleIdentifier() {693ModuleDescriptor.newModule("foo").uses("S");694}695696@Test(dataProvider = "invalidNames",697expectedExceptions = IllegalArgumentException.class )698public void testUsesWithBadName(String service, String ignore) {699ModuleDescriptor.newModule("foo").uses(service);700}701702703// provides704705private Provides provides(String st, String pc) {706return ModuleDescriptor.newModule("foo")707.provides(st, List.of(pc))708.build()709.provides()710.iterator()711.next();712}713714private Provides provides(String st, List<String> pns) {715return ModuleDescriptor.newModule("foo")716.provides(st, pns)717.build()718.provides()719.iterator()720.next();721}722723public void testProvidesWithProvides() {724Provides p1 = provides("p.S", "q.S1");725ModuleDescriptor descriptor = ModuleDescriptor.newModule("m")726.provides(p1)727.build();728Provides p2 = descriptor.provides().iterator().next();729assertEquals(p1, p2);730}731732733public void testProvides() {734Set<Provides> set = ModuleDescriptor.newModule("foo")735.provides("p.S", List.of("q.P1", "q.P2"))736.build()737.provides();738assertTrue(set.size() == 1);739740Provides p = set.iterator().next();741assertEquals(p, p);742assertEquals(p.service(), "p.S");743assertTrue(p.providers().size() == 2);744assertEquals(p.providers().get(0), "q.P1");745assertEquals(p.providers().get(1), "q.P2");746}747748@Test(expectedExceptions = IllegalStateException.class )749public void testProvidesWithDuplicateProvides() {750Provides p = provides("p.S", "q.S2");751ModuleDescriptor.newModule("m").provides("p.S", List.of("q.S1")).provides(p);752}753754@Test(expectedExceptions = IllegalArgumentException.class )755public void testProvidesWithEmptySet() {756ModuleDescriptor.newModule("foo").provides("p.Service", Collections.emptyList());757}758759@Test(expectedExceptions = IllegalArgumentException.class )760public void testProvidesWithSimpleIdentifier1() {761ModuleDescriptor.newModule("foo").provides("S", List.of("q.P"));762}763764@Test(expectedExceptions = IllegalArgumentException.class )765public void testProvidesWithSimpleIdentifier2() {766ModuleDescriptor.newModule("foo").provides("p.S", List.of("P"));767}768769@Test(dataProvider = "invalidNames",770expectedExceptions = IllegalArgumentException.class )771public void testProvidesWithBadService(String service, String ignore) {772ModuleDescriptor.newModule("foo").provides(service, List.of("p.Provider"));773}774775@Test(dataProvider = "invalidNames",776expectedExceptions = IllegalArgumentException.class )777public void testProvidesWithBadProvider(String provider, String ignore) {778List<String> names = new ArrayList<>(); // allows nulls779names.add(provider);780ModuleDescriptor.newModule("foo").provides("p.Service", names);781}782783@Test(expectedExceptions = NullPointerException.class )784public void testProvidesWithNullProvides() {785ModuleDescriptor.newModule("foo").provides((Provides) null);786}787788@Test(expectedExceptions = NullPointerException.class )789public void testProvidesWithNullProviders() {790ModuleDescriptor.newModule("foo").provides("p.S", (List<String>) null);791}792793public void testProvidesCompare() {794Provides p1 = provides("p.S", "q.S1");795Provides p2 = provides("p.S", "q.S1");796assertEquals(p1, p2);797assertTrue(p1.hashCode() == p2.hashCode());798assertTrue(p1.compareTo(p2) == 0);799assertTrue(p2.compareTo(p1) == 0);800}801802public void testProvidesCompareWithDifferentService() {803Provides p1 = provides("p.S2", "q.S1");804Provides p2 = provides("p.S1", "q.S1");805assertNotEquals(p1, p2);806assertTrue(p1.compareTo(p2) == 1);807assertTrue(p2.compareTo(p1) == -1);808}809810public void testProvidesCompareWithDifferentProviders1() {811Provides p1 = provides("p.S", "q.S2");812Provides p2 = provides("p.S", "q.S1");813assertNotEquals(p1, p2);814assertTrue(p1.compareTo(p2) == 1);815assertTrue(p2.compareTo(p1) == -1);816}817818public void testProvidesCompareWithDifferentProviders2() {819Provides p1 = provides("p.S", List.of("q.S1", "q.S2"));820Provides p2 = provides("p.S", "q.S1");821assertNotEquals(p1, p2);822assertTrue(p1.compareTo(p2) == 1);823assertTrue(p2.compareTo(p1) == -1);824}825826// packages827828public void testPackages1() {829Set<String> packages = ModuleDescriptor.newModule("foo")830.packages(Set.of("p", "q"))831.build()832.packages();833assertTrue(packages.size() == 2);834assertTrue(packages.contains("p"));835assertTrue(packages.contains("q"));836}837838public void testPackages2() {839Set<String> packages = ModuleDescriptor.newModule("foo")840.packages(Set.of("p"))841.packages(Set.of("q"))842.build()843.packages();844assertTrue(packages.size() == 2);845assertTrue(packages.contains("p"));846assertTrue(packages.contains("q"));847}848849850public void testPackagesWithEmptySet() {851Set<String> packages = ModuleDescriptor.newModule("foo")852.packages(Collections.emptySet())853.build()854.packages();855assertTrue(packages.size() == 0);856}857858public void testPackagesDuplicate() {859Set<String> packages = ModuleDescriptor.newModule("foo")860.packages(Set.of("p"))861.packages(Set.of("p"))862.build()863.packages();864assertTrue(packages.size() == 1);865assertTrue(packages.contains("p"));866}867868public void testPackagesAndExportsPackage1() {869Set<String> packages = ModuleDescriptor.newModule("foo")870.packages(Set.of("p"))871.exports("p")872.build()873.packages();874assertTrue(packages.size() == 1);875assertTrue(packages.contains("p"));876}877878public void testPackagesAndExportsPackage2() {879Set<String> packages = ModuleDescriptor.newModule("foo")880.exports("p")881.packages(Set.of("p"))882.build()883.packages();884assertTrue(packages.size() == 1);885assertTrue(packages.contains("p"));886}887888public void testPackagesAndOpensPackage1() {889Set<String> packages = ModuleDescriptor.newModule("foo")890.packages(Set.of("p"))891.opens("p")892.build()893.packages();894assertTrue(packages.size() == 1);895assertTrue(packages.contains("p"));896}897898public void testPackagesAndOpensPackage2() {899Set<String> packages = ModuleDescriptor.newModule("foo")900.opens("p")901.packages(Set.of("p"))902.build()903.packages();904assertTrue(packages.size() == 1);905assertTrue(packages.contains("p"));906}907908public void testPackagesAndProvides1() {909Set<String> packages = ModuleDescriptor.newModule("foo")910.packages(Set.of("p"))911.provides("q.S", List.of("p.T"))912.build()913.packages();914assertTrue(packages.size() == 1);915assertTrue(packages.contains("p"));916}917918public void testPackagesAndProvides2() {919Set<String> packages = ModuleDescriptor.newModule("foo")920.provides("q.S", List.of("p.T"))921.packages(Set.of("p"))922.build()923.packages();924assertTrue(packages.size() == 1);925assertTrue(packages.contains("p"));926}927928public void testPackagesAndMainClass1() {929Set<String> packages = ModuleDescriptor.newModule("foo")930.packages(Set.of("p"))931.mainClass("p.Main")932.build()933.packages();934assertTrue(packages.size() == 1);935assertTrue(packages.contains("p"));936}937938public void testPackagesAndMainClass2() {939Set<String> packages = ModuleDescriptor.newModule("foo")940.mainClass("p.Main")941.packages(Set.of("p"))942.build()943.packages();944assertTrue(packages.size() == 1);945assertTrue(packages.contains("p"));946}947948public void testPackagesAndAll() {949Set<String> packages = ModuleDescriptor.newModule("foo")950.exports("p1")951.opens("p2")952.packages(Set.of("p3"))953.provides("q.S", List.of("p4.T"))954.mainClass("p5.Main")955.build()956.packages();957assertTrue(Objects.equals(packages, Set.of("p1", "p2", "p3", "p4", "p5")));958}959960@Test(dataProvider = "invalidNames",961expectedExceptions = IllegalArgumentException.class )962public void testPackagesWithBadName(String pn, String ignore) {963Set<String> pkgs = new HashSet<>(); // allows nulls964pkgs.add(pn);965ModuleDescriptor.newModule("foo").packages(pkgs);966}967968// name969970public void testModuleName() {971String mn = ModuleDescriptor.newModule("foo").build().name();972assertEquals(mn, "foo");973}974975@Test(dataProvider = "invalidNames",976expectedExceptions = IllegalArgumentException.class )977public void testBadModuleName(String mn, String ignore) {978ModuleDescriptor.newModule(mn);979}980981982// version983984public void testVersion1() {985Version v1 = Version.parse("1.0");986Version v2 = ModuleDescriptor.newModule("foo")987.version(v1)988.build()989.version()990.get();991assertEquals(v1, v2);992}993994public void testVersion2() {995String vs = "1.0";996Version v1 = ModuleDescriptor.newModule("foo")997.version(vs)998.build()999.version()1000.get();1001Version v2 = Version.parse(vs);1002assertEquals(v1, v2);1003}10041005@Test(expectedExceptions = NullPointerException.class )1006public void testNullVersion1() {1007ModuleDescriptor.newModule("foo").version((Version) null);1008}10091010@Test(expectedExceptions = IllegalArgumentException.class )1011public void testNullVersion2() {1012ModuleDescriptor.newModule("foo").version((String) null);1013}10141015@Test(expectedExceptions = IllegalArgumentException.class )1016public void testEmptyVersion() {1017ModuleDescriptor.newModule("foo").version("");1018}101910201021@DataProvider(name = "unparseableVersions")1022public Object[][] unparseableVersions() {1023return new Object[][]{10241025{ null, "A1" }, // no version < unparseable1026{ "A1", "A2" }, // unparseable < unparseable1027{ "A1", "1.0" }, // unparseable < parseable10281029};1030}10311032/**1033* Basic test for unparseable module versions1034*/1035@Test(dataProvider = "unparseableVersions")1036public void testUnparseableModuleVersion(String vs1, String vs2) {1037ModuleDescriptor descriptor1 = newModule("m", vs1);1038ModuleDescriptor descriptor2 = newModule("m", vs2);10391040if (vs1 != null && !isParsableVersion(vs1)) {1041assertFalse(descriptor1.version().isPresent());1042assertTrue(descriptor1.rawVersion().isPresent());1043assertEquals(descriptor1.rawVersion().get(), vs1);1044}10451046if (vs2 != null && !isParsableVersion(vs2)) {1047assertFalse(descriptor2.version().isPresent());1048assertTrue(descriptor2.rawVersion().isPresent());1049assertEquals(descriptor2.rawVersion().get(), vs2);1050}10511052assertFalse(descriptor1.equals(descriptor2));1053assertFalse(descriptor2.equals(descriptor1));1054assertTrue(descriptor1.compareTo(descriptor2) == -1);1055assertTrue(descriptor2.compareTo(descriptor1) == 1);1056}10571058/**1059* Basic test for requiring a module with an unparseable version recorded1060* at compile version.1061*/1062@Test(dataProvider = "unparseableVersions")1063public void testUnparseableCompiledVersion(String vs1, String vs2) {1064Requires r1 = newRequires("m", vs1);1065Requires r2 = newRequires("m", vs2);10661067if (vs1 != null && !isParsableVersion(vs1)) {1068assertFalse(r1.compiledVersion().isPresent());1069assertTrue(r1.rawCompiledVersion().isPresent());1070assertEquals(r1.rawCompiledVersion().get(), vs1);1071}10721073if (vs2 != null && !isParsableVersion(vs2)) {1074assertFalse(r2.compiledVersion().isPresent());1075assertTrue(r2.rawCompiledVersion().isPresent());1076assertEquals(r2.rawCompiledVersion().get(), vs2);1077}10781079assertFalse(r1.equals(r2));1080assertFalse(r2.equals(r1));1081assertTrue(r1.compareTo(r2) == -1);1082assertTrue(r2.compareTo(r1) == 1);1083}10841085private ModuleDescriptor newModule(String name, String vs) {1086JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();1087Builder builder = JLMA.newModuleBuilder(name, false, Set.of());1088if (vs != null)1089builder.version(vs);1090builder.requires("java.base");1091ByteBuffer bb = ModuleInfoWriter.toByteBuffer(builder.build());1092return ModuleDescriptor.read(bb);1093}10941095private Requires newRequires(String name, String vs) {1096JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();1097Builder builder = JLMA.newModuleBuilder("foo", false, Set.of());1098if (vs == null) {1099builder.requires(name);1100} else {1101JLMA.requires(builder, Set.of(), name, vs);1102}1103Set<ModuleDescriptor.Requires> requires = builder.build().requires();1104Iterator<ModuleDescriptor.Requires> iterator = requires.iterator();1105ModuleDescriptor.Requires r = iterator.next();1106if (r.name().equals("java.base")) {1107r = iterator.next();1108}1109return r;1110}11111112private boolean isParsableVersion(String vs) {1113try {1114Version.parse(vs);1115return true;1116} catch (IllegalArgumentException e) {1117return false;1118}1119}112011211122// toNameAndVersion11231124public void testToNameAndVersion() {1125ModuleDescriptor md1 = ModuleDescriptor.newModule("foo").build();1126assertEquals(md1.toNameAndVersion(), "foo");11271128ModuleDescriptor md2 = ModuleDescriptor.newModule("foo").version("1.0").build();1129assertEquals(md2.toNameAndVersion(), "[email protected]");1130}113111321133// open modules11341135public void testOpenModule() {1136ModuleDescriptor descriptor = ModuleDescriptor.newOpenModule("foo")1137.requires("bar")1138.exports("p")1139.provides("p.Service", List.of("q.ServiceImpl"))1140.build();11411142// modifiers1143assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.OPEN));1144assertTrue(descriptor.isOpen());11451146// requires1147assertTrue(descriptor.requires().size() == 2);1148Set<String> names = descriptor.requires()1149.stream()1150.map(Requires::name)1151.collect(Collectors.toSet());1152assertEquals(names, Set.of("bar", "java.base"));11531154// packages1155assertEquals(descriptor.packages(), Set.of("p", "q"));11561157// exports1158assertTrue(descriptor.exports().size() == 1);1159names = descriptor.exports()1160.stream()1161.map(Exports::source)1162.collect(Collectors.toSet());1163assertEquals(names, Set.of("p"));11641165// opens1166assertTrue(descriptor.opens().isEmpty());1167}11681169@Test(expectedExceptions = IllegalStateException.class)1170public void testOpensOnOpenModule1() {1171ModuleDescriptor.newOpenModule("foo").opens("p");1172}11731174@Test(expectedExceptions = IllegalStateException.class)1175public void testOpensOnOpenModule2() {1176ModuleDescriptor.newOpenModule("foo").opens("p", Set.of("bar"));1177}11781179public void testIsOpen() {1180assertFalse(ModuleDescriptor.newModule("m").build().isOpen());1181assertFalse(ModuleDescriptor.newAutomaticModule("m").build().isOpen());1182assertTrue(ModuleDescriptor.newOpenModule("m").build().isOpen());1183}118411851186// automatic modules11871188public void testAutomaticModule() {1189ModuleDescriptor descriptor = ModuleDescriptor.newAutomaticModule("foo")1190.packages(Set.of("p"))1191.provides("p.Service", List.of("q.ServiceImpl"))1192.build();11931194// modifiers1195assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.AUTOMATIC));1196assertTrue(descriptor.isAutomatic());11971198// requires1199assertTrue(descriptor.requires().size() == 1);1200Set<String> names = descriptor.requires()1201.stream()1202.map(Requires::name)1203.collect(Collectors.toSet());1204assertEquals(names, Set.of("java.base"));12051206// packages1207assertEquals(descriptor.packages(), Set.of("p", "q"));1208assertTrue(descriptor.exports().isEmpty());1209assertTrue(descriptor.opens().isEmpty());1210}12111212@Test(expectedExceptions = IllegalStateException.class)1213public void testRequiresOnAutomaticModule() {1214ModuleDescriptor.newAutomaticModule("foo").requires("java.base");1215}12161217@Test(expectedExceptions = IllegalStateException.class)1218public void testExportsOnAutomaticModule1() {1219ModuleDescriptor.newAutomaticModule("foo").exports("p");1220}12211222@Test(expectedExceptions = IllegalStateException.class)1223public void testExportsOnAutomaticModule2() {1224ModuleDescriptor.newAutomaticModule("foo").exports("p", Set.of("bar"));1225}12261227@Test(expectedExceptions = IllegalStateException.class)1228public void testOpensOnAutomaticModule1() {1229ModuleDescriptor.newAutomaticModule("foo").opens("p");1230}12311232@Test(expectedExceptions = IllegalStateException.class)1233public void testOpensOnAutomaticModule2() {1234ModuleDescriptor.newAutomaticModule("foo").opens("p", Set.of("bar"));1235}12361237@Test(expectedExceptions = IllegalStateException.class)1238public void testUsesOnAutomaticModule() {1239ModuleDescriptor.newAutomaticModule("foo").uses("p.Service");1240}12411242public void testIsAutomatic() {1243ModuleDescriptor descriptor1 = ModuleDescriptor.newModule("foo").build();1244assertFalse(descriptor1.isAutomatic());12451246ModuleDescriptor descriptor2 = ModuleDescriptor.newOpenModule("foo").build();1247assertFalse(descriptor2.isAutomatic());12481249ModuleDescriptor descriptor3 = ModuleDescriptor.newAutomaticModule("foo").build();1250assertTrue(descriptor3.isAutomatic());1251}125212531254// newModule with modifiers12551256public void testNewModuleToBuildAutomaticModule() {1257Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC);1258ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();1259assertTrue(descriptor.modifiers().equals(ms));1260assertTrue(descriptor.isAutomatic());1261}12621263public void testNewModuleToBuildOpenModule() {1264Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.OPEN);1265ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();1266assertTrue(descriptor.modifiers().equals(ms));1267assertTrue(descriptor.isOpen());12681269ms = Set.of(ModuleDescriptor.Modifier.OPEN, ModuleDescriptor.Modifier.SYNTHETIC);1270descriptor = ModuleDescriptor.newModule("foo", ms).build();1271assertTrue(descriptor.modifiers().equals(ms));1272assertTrue(descriptor.isOpen());1273}12741275@Test(expectedExceptions = IllegalArgumentException.class)1276public void testNewModuleToBuildAutomaticAndOpenModule() {1277Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC,1278ModuleDescriptor.Modifier.OPEN);1279ModuleDescriptor.newModule("foo", ms);1280}128112821283// mainClass12841285public void testMainClass() {1286String mainClass1287= ModuleDescriptor.newModule("foo").mainClass("p.Main").build().mainClass().get();1288assertEquals(mainClass, "p.Main");1289}12901291@Test(expectedExceptions = IllegalArgumentException.class)1292public void testMainClassWithSimpleIdentifier() {1293ModuleDescriptor.newModule("foo").mainClass("Main");1294}12951296@Test(dataProvider = "invalidNames",1297expectedExceptions = IllegalArgumentException.class )1298public void testMainClassWithBadName(String mainClass, String ignore) {1299Builder builder = ModuleDescriptor.newModule("foo");1300builder.mainClass(mainClass);1301}130213031304// reads13051306private static InputStream EMPTY_INPUT_STREAM = new InputStream() {1307@Override1308public int read() {1309return -1;1310}1311};13121313private static InputStream FAILING_INPUT_STREAM = new InputStream() {1314@Override1315public int read() throws IOException {1316throw new IOException();1317}1318};13191320/**1321* Basic test reading module-info.class1322*/1323public void testRead() throws Exception {1324Module base = Object.class.getModule();13251326try (InputStream in = base.getResourceAsStream("module-info.class")) {1327ModuleDescriptor descriptor = ModuleDescriptor.read(in);1328assertTrue(in.read() == -1); // all bytes read1329assertEquals(descriptor.name(), "java.base");1330}13311332try (InputStream in = base.getResourceAsStream("module-info.class")) {1333ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());1334ModuleDescriptor descriptor = ModuleDescriptor.read(bb);1335assertFalse(bb.hasRemaining()); // no more remaining bytes1336assertEquals(descriptor.name(), "java.base");1337}1338}13391340/**1341* Test ModuleDescriptor with a packager finder1342*/1343public void testReadsWithPackageFinder() throws Exception {1344ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")1345.requires("java.base")1346.build();13471348ByteArrayOutputStream baos = new ByteArrayOutputStream();1349ModuleInfoWriter.write(descriptor, baos);1350ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());13511352descriptor = ModuleDescriptor.read(bb, () -> Set.of("p", "q"));13531354assertTrue(descriptor.packages().size() == 2);1355assertTrue(descriptor.packages().contains("p"));1356assertTrue(descriptor.packages().contains("q"));1357}13581359/**1360* Test ModuleDescriptor with a packager finder that doesn't return the1361* complete set of packages.1362*/1363@Test(expectedExceptions = InvalidModuleDescriptorException.class)1364public void testReadsWithBadPackageFinder() throws Exception {1365ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")1366.requires("java.base")1367.exports("p")1368.build();13691370ByteArrayOutputStream baos = new ByteArrayOutputStream();1371ModuleInfoWriter.write(descriptor, baos);1372ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());13731374// package finder returns a set that doesn't include p1375ModuleDescriptor.read(bb, () -> Set.of("q"));1376}13771378@Test(expectedExceptions = InvalidModuleDescriptorException.class)1379public void testReadFromEmptyInputStream() throws Exception {1380ModuleDescriptor.read(EMPTY_INPUT_STREAM);1381}13821383@Test(expectedExceptions = IOException.class)1384public void testReadFromFailingInputStream() throws Exception {1385ModuleDescriptor.read(FAILING_INPUT_STREAM);1386}13871388@Test(expectedExceptions = InvalidModuleDescriptorException.class)1389public void testReadFromEmptyBuffer() {1390ByteBuffer bb = ByteBuffer.allocate(0);1391ModuleDescriptor.read(bb);1392}13931394// The requires table for java.base must be 0 length1395@Test(expectedExceptions = InvalidModuleDescriptorException.class)1396public void testReadOfJavaBaseWithRequires() {1397ModuleDescriptor descriptor1398= ModuleDescriptor.newModule("java.base")1399.requires("other")1400.build();1401ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);1402ModuleDescriptor.read(bb);1403}14041405// The requires table must have an entry for java.base1406@Test(expectedExceptions = InvalidModuleDescriptorException.class)1407public void testReadWithEmptyRequires() {1408ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()1409.newModuleBuilder("m1", false, Set.of()).build();1410ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);1411ModuleDescriptor.read(bb);1412}14131414// The requires table must have an entry for java.base1415@Test(expectedExceptions = InvalidModuleDescriptorException.class)1416public void testReadWithNoRequiresBase() {1417ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()1418.newModuleBuilder("m1", false, Set.of()).requires("m2").build();1419ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);1420ModuleDescriptor.read(bb);1421}14221423public void testReadWithNull() throws Exception {1424Module base = Object.class.getModule();14251426try {1427ModuleDescriptor.read((InputStream)null);1428assertTrue(false);1429} catch (NullPointerException expected) { }143014311432try (InputStream in = base.getResourceAsStream("module-info.class")) {1433try {1434ModuleDescriptor.read(in, null);1435assertTrue(false);1436} catch (NullPointerException expected) { }1437}14381439try {1440ModuleDescriptor.read((ByteBuffer)null);1441assertTrue(false);1442} catch (NullPointerException expected) { }144314441445try (InputStream in = base.getResourceAsStream("module-info.class")) {1446ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());1447try {1448ModuleDescriptor.read(bb, null);1449assertTrue(false);1450} catch (NullPointerException expected) { }1451}1452}145314541455// equals/hashCode/compareTo/toString14561457public void testEqualsAndHashCode() {1458ModuleDescriptor md1 = ModuleDescriptor.newModule("m").build();1459ModuleDescriptor md2 = ModuleDescriptor.newModule("m").build();1460assertEquals(md1, md1);1461assertEquals(md1.hashCode(), md2.hashCode());1462assertTrue(md1.compareTo(md2) == 0);1463assertTrue(md2.compareTo(md1) == 0);1464}14651466@DataProvider(name = "sortedModuleDescriptors")1467public Object[][] sortedModuleDescriptors() {1468return new Object[][]{14691470{ ModuleDescriptor.newModule("m2").build(),1471ModuleDescriptor.newModule("m1").build()1472},14731474{ ModuleDescriptor.newModule("m").version("2").build(),1475ModuleDescriptor.newModule("m").version("1").build()1476},14771478{ ModuleDescriptor.newModule("m").version("1").build(),1479ModuleDescriptor.newModule("m").build()1480},14811482{ ModuleDescriptor.newOpenModule("m").build(),1483ModuleDescriptor.newModule("m").build()1484},14851486};1487}14881489@Test(dataProvider = "sortedModuleDescriptors")1490public void testCompare(ModuleDescriptor md1, ModuleDescriptor md2) {1491assertNotEquals(md1, md2);1492assertTrue(md1.compareTo(md2) == 1);1493assertTrue(md2.compareTo(md1) == -1);1494}14951496public void testToString() {1497String s = ModuleDescriptor.newModule("m1")1498.requires("m2")1499.exports("p1")1500.build()1501.toString();1502assertTrue(s.contains("m1"));1503assertTrue(s.contains("m2"));1504assertTrue(s.contains("p1"));1505}15061507}150815091510