1 /*
   2  * Copyright (c) 2013, 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  * @modules java.base/jdk.internal.access
  27  *          java.base/jdk.internal.module
  28  * @run testng ModuleDescriptorTest
  29  * @summary Basic test for java.lang.module.ModuleDescriptor and its builder
  30  */
  31 
  32 import java.io.ByteArrayOutputStream;
  33 import java.io.IOException;
  34 import java.io.InputStream;
  35 import java.lang.module.InvalidModuleDescriptorException;
  36 import java.lang.module.ModuleDescriptor;
  37 import java.lang.module.ModuleDescriptor.Builder;
  38 import java.lang.module.ModuleDescriptor.Exports;
  39 import java.lang.module.ModuleDescriptor.Opens;
  40 import java.lang.module.ModuleDescriptor.Requires;
  41 import java.lang.module.ModuleDescriptor.Provides;
  42 import java.lang.module.ModuleDescriptor.Requires.Modifier;
  43 import java.lang.module.ModuleDescriptor.Version;
  44 import java.nio.ByteBuffer;
  45 import java.util.ArrayList;
  46 import java.util.Collections;
  47 import java.util.EnumSet;
  48 import java.util.HashSet;
  49 import java.util.Iterator;
  50 import java.util.List;
  51 import java.util.Objects;
  52 import java.util.Set;
  53 import java.util.stream.Collectors;
  54 
  55 import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
  56 
  57 import jdk.internal.access.JavaLangModuleAccess;
  58 import jdk.internal.access.SharedSecrets;
  59 import jdk.internal.module.ModuleInfoWriter;
  60 import org.testng.annotations.DataProvider;
  61 import org.testng.annotations.Test;
  62 import static org.testng.Assert.*;
  63 
  64 @Test
  65 public class ModuleDescriptorTest {
  66 
  67     @DataProvider(name = "invalidNames")
  68     public Object[][] invalidNames() {
  69         return new Object[][]{
  70 
  71             { null,             null },
  72             { "1",              null },
  73             { "1foo",           null },
  74             { ".foo",           null },
  75             { "foo.",           null },
  76             { "[foo]",          null },
  77             { "foo.1",          null },
  78             { "1foo.bar",       null },
  79             { "foo.1bar",       null },
  80             { "foo.[bar]",      null },
  81             { "foo..bar",       null },
  82             { "foo.bar.1",      null },
  83             { "foo.bar.1gus",   null },
  84             { "foo.bar.[gus]",  null },
  85 
  86             { "class",          null },
  87             { "interface",      null },
  88             { "true",           null },
  89             { "false",          null },
  90             { "null",           null },
  91 
  92             { "x.class",        null },
  93             { "x.interface",    null },
  94             { "x.true",         null },
  95             { "x.false",        null },
  96             { "x.null",         null },
  97 
  98             { "class.x",        null },
  99             { "interface.x",    null },
 100             { "true.x",         null },
 101             { "false.x",        null },
 102             { "null.x",         null },
 103 
 104             { "x.class.x",      null },
 105             { "x.interface.x",  null },
 106             { "x.true.x",       null },
 107             { "x.false.x",      null },
 108             { "x.null.x",       null },
 109 
 110             { "_",              null },
 111 
 112         };
 113     }
 114 
 115 
 116     // requires
 117 
 118     private Requires requires(Set<Modifier> mods, String mn) {
 119         return requires(mods, mn, null);
 120     }
 121 
 122     private Requires requires(Set<Modifier> mods, String mn, Version v) {
 123         Builder builder = ModuleDescriptor.newModule("m");
 124         if (v == null) {
 125             builder.requires(mods, mn);
 126         } else {
 127             builder.requires(mods, mn, v);
 128         }
 129         Set<Requires> requires = builder.build().requires();
 130         assertTrue(requires.size() == 2);
 131         Iterator<Requires> iterator = requires.iterator();
 132         Requires r = iterator.next();
 133         if (r.name().equals("java.base")) {
 134             r = iterator.next();
 135         } else {
 136             Requires other = iterator.next();
 137             assertEquals(other.name(), "java.base");
 138         }
 139         return r;
 140     }
 141 
 142     private Requires requires(String mn) {
 143         return requires(Collections.emptySet(), mn);
 144     }
 145 
 146     public void testRequiresWithRequires() {
 147         Requires r1 = requires("foo");
 148         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").requires(r1).build();
 149         assertEquals(descriptor.requires().size(), 2);
 150         var iterator = descriptor.requires().iterator();
 151         Requires r2 = iterator.next();
 152         if (r2.name().equals("java.base")) {
 153             r2 = iterator.next();
 154         }
 155         assertEquals(r1, r2);
 156     }
 157 
 158     public void testRequiresWithNoModifiers() {
 159         Requires r = requires(EnumSet.noneOf(Requires.Modifier.class), "foo");
 160         assertEquals(r, r);
 161         assertTrue(r.compareTo(r) == 0);
 162         assertTrue(r.modifiers().isEmpty());
 163         assertEquals(r.name(), "foo");
 164         assertFalse(r.compiledVersion().isPresent());
 165     }
 166 
 167     public void testRequiresWithOneModifier() {
 168         Requires r = requires(EnumSet.of(TRANSITIVE), "foo");
 169         assertEquals(r, r);
 170         assertTrue(r.compareTo(r) == 0);
 171         assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE));
 172         assertEquals(r.name(), "foo");
 173         assertFalse(r.compiledVersion().isPresent());
 174     }
 175 
 176     public void testRequiresWithTwoModifiers() {
 177         Requires r = requires(EnumSet.of(TRANSITIVE, SYNTHETIC), "foo");
 178         assertEquals(r, r);
 179         assertTrue(r.compareTo(r) == 0);
 180         assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE, SYNTHETIC));
 181         assertEquals(r.name(), "foo");
 182         assertFalse(r.compiledVersion().isPresent());
 183     }
 184 
 185     public void testRequiresWithAllModifiers() {
 186         Requires r = requires(EnumSet.allOf(Modifier.class), "foo");
 187         assertEquals(r, r);
 188         assertTrue(r.compareTo(r) == 0);
 189         assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE, STATIC, SYNTHETIC, MANDATED));
 190         assertEquals(r.name(), "foo");
 191         assertFalse(r.compiledVersion().isPresent());
 192     }
 193 
 194     public void testRequiresWithCompiledVersion() {
 195         Version v = Version.parse("1.0");
 196         Requires r = requires(Set.of(), "foo", v);
 197         assertEquals(r, r);
 198         assertTrue(r.compareTo(r) == 0);
 199         assertEquals(r.modifiers(), Set.of());
 200         assertEquals(r.name(), "foo");
 201         assertTrue(r.compiledVersion().isPresent());
 202         assertEquals(r.compiledVersion().get().toString(), "1.0");
 203     }
 204 
 205     @Test(expectedExceptions = IllegalStateException.class)
 206     public void testRequiresWithDuplicatesRequires() {
 207         Requires r = requires("foo");
 208         ModuleDescriptor.newModule("m").requires(r).requires(r);
 209     }
 210 
 211     @Test(expectedExceptions = IllegalArgumentException.class)
 212     public void testRequiresSelfWithRequires() {
 213         Requires r = requires("foo");
 214         ModuleDescriptor.newModule("foo").requires(r);
 215     }
 216 
 217     @Test(expectedExceptions = IllegalArgumentException.class)
 218     public void testRequiresSelfWithNoModifier() {
 219         ModuleDescriptor.newModule("m").requires("m");
 220     }
 221 
 222     @Test(expectedExceptions = IllegalArgumentException.class)
 223     public void testRequiresSelfWithOneModifier() {
 224         ModuleDescriptor.newModule("m").requires(Set.of(TRANSITIVE), "m");
 225     }
 226 
 227     @Test(expectedExceptions = IllegalArgumentException.class)
 228     public void testRequiresSelfWithAllModifiers() {
 229         ModuleDescriptor.newModule("m").requires(EnumSet.allOf(Modifier.class), "m");
 230     }
 231 
 232     @Test(dataProvider = "invalidNames",
 233           expectedExceptions = IllegalArgumentException.class )
 234     public void testRequiresWithBadModuleName(String mn, String ignore) {
 235         requires(EnumSet.noneOf(Modifier.class), mn);
 236     }
 237 
 238     @Test(expectedExceptions = NullPointerException.class)
 239     public void testRequiresWithNullRequires() {
 240         ModuleDescriptor.newModule("m").requires((Requires) null);
 241     }
 242 
 243     @Test(expectedExceptions = NullPointerException.class)
 244     public void testRequiresWithNullModifiers() {
 245         ModuleDescriptor.newModule("m").requires(null, "foo");
 246     }
 247 
 248     @Test(expectedExceptions = NullPointerException.class)
 249     public void testRequiresWithNullVersion() {
 250         ModuleDescriptor.newModule("m").requires(Set.of(), "foo", null);
 251     }
 252 
 253     public void testRequiresCompare() {
 254         Requires r1 = requires(EnumSet.noneOf(Modifier.class), "foo");
 255         Requires r2 = requires(EnumSet.noneOf(Modifier.class), "bar");
 256         int n = "foo".compareTo("bar");
 257         assertTrue(r1.compareTo(r2) == n);
 258         assertTrue(r2.compareTo(r1) == -n);
 259     }
 260 
 261     public void testRequiresCompareWithDifferentModifiers() {
 262         Requires r1 = requires(EnumSet.of(TRANSITIVE), "foo");
 263         Requires r2 = requires(EnumSet.of(SYNTHETIC), "foo");
 264         int n = Integer.compare(1 << TRANSITIVE.ordinal(), 1 << SYNTHETIC.ordinal());
 265         assertTrue(r1.compareTo(r2) == n);
 266         assertTrue(r2.compareTo(r1) == -n);
 267     }
 268 
 269     public void testRequiresCompareWithSameModifiers() {
 270         Requires r1 = requires(EnumSet.of(SYNTHETIC), "foo");
 271         Requires r2 = requires(EnumSet.of(SYNTHETIC), "foo");
 272         assertTrue(r1.compareTo(r2) == 0);
 273         assertTrue(r2.compareTo(r1) == 0);
 274     }
 275 
 276     public void testRequiresCompareWithSameCompiledVersion() {
 277         Requires r1 = requires(Set.of(), "foo", Version.parse("2.0"));
 278         Requires r2 = requires(Set.of(), "foo", Version.parse("2.0"));
 279         assertTrue(r1.compareTo(r2) == 0);
 280         assertTrue(r2.compareTo(r1) == 0);
 281     }
 282 
 283     public void testRequiresCompareWithDifferentCompiledVersion() {
 284         Requires r1 = requires(Set.of(), "foo", Version.parse("1.0"));
 285         Requires r2 = requires(Set.of(), "foo", Version.parse("2.0"));
 286         assertTrue(r1.compareTo(r2) < 0);
 287         assertTrue(r2.compareTo(r1) > 0);
 288     }
 289 
 290     public void testRequiresEqualsAndHashCode() {
 291         Requires r1 = requires("foo");
 292         Requires r2 = requires("foo");
 293         assertEquals(r1, r2);
 294         assertTrue(r1.hashCode() == r2.hashCode());
 295 
 296         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo");
 297         r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo");
 298         assertEquals(r1, r2);
 299         assertTrue(r1.hashCode() == r2.hashCode());
 300 
 301         r1 = requires("foo");
 302         r2 = requires("bar");
 303         assertNotEquals(r1, r2);
 304 
 305         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo");
 306         r2 = requires(Set.of(), "foo");
 307         assertNotEquals(r1, r2);
 308 
 309         Version v1 = Version.parse("1.0");
 310         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 311         r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 312         assertEquals(r1, r2);
 313         assertTrue(r1.hashCode() == r2.hashCode());
 314 
 315         Version v2 = Version.parse("2.0");
 316         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 317         r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v2);
 318         assertNotEquals(r1, r2);
 319     }
 320 
 321     public void testRequiresToString() {
 322         Requires r = requires(EnumSet.noneOf(Modifier.class), "foo");
 323         assertTrue(r.toString().contains("foo"));
 324     }
 325 
 326 
 327     // exports
 328 
 329     private Exports exports(Set<Exports.Modifier> mods, String pn) {
 330         return ModuleDescriptor.newModule("foo")
 331             .exports(mods, pn)
 332             .build()
 333             .exports()
 334             .iterator()
 335             .next();
 336     }
 337 
 338     private Exports exports(String pn) {
 339         return exports(Set.of(), pn);
 340     }
 341 
 342     private Exports exports(Set<Exports.Modifier> mods, String pn, String target) {
 343         return ModuleDescriptor.newModule("foo")
 344             .exports(mods, pn, Set.of(target))
 345             .build()
 346             .exports()
 347             .iterator()
 348             .next();
 349     }
 350 
 351     private Exports exports(String pn, String target) {
 352         return exports(Set.of(), pn, target);
 353     }
 354 
 355 
 356     public void testExportsExports() {
 357         Exports e1 = exports("p");
 358         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").exports(e1).build();
 359         Exports e2 = descriptor.exports().iterator().next();
 360         assertEquals(e1, e2);
 361     }
 362 
 363     public void testExportsToAll() {
 364         Exports e = exports("p");
 365         assertEquals(e, e);
 366         assertTrue(e.modifiers().isEmpty());
 367         assertEquals(e.source(), "p");
 368         assertFalse(e.isQualified());
 369         assertTrue(e.targets().isEmpty());
 370     }
 371 
 372     public void testExportsToTarget() {
 373         Exports e = exports("p", "bar");
 374         assertEquals(e, e);
 375         assertTrue(e.modifiers().isEmpty());
 376         assertEquals(e.source(), "p");
 377         assertTrue(e.isQualified());
 378         assertTrue(e.targets().size() == 1);
 379         assertTrue(e.targets().contains("bar"));
 380     }
 381 
 382     public void testExportsToTargets() {
 383         Set<String> targets = new HashSet<>();
 384         targets.add("bar");
 385         targets.add("gus");
 386         Exports e
 387             = ModuleDescriptor.newModule("foo")
 388                 .exports("p", targets)
 389                 .build()
 390                 .exports()
 391                 .iterator()
 392                 .next();
 393         assertEquals(e, e);
 394         assertTrue(e.modifiers().isEmpty());
 395         assertEquals(e.source(), "p");
 396         assertTrue(e.isQualified());
 397         assertTrue(e.targets().size() == 2);
 398         assertTrue(e.targets().contains("bar"));
 399         assertTrue(e.targets().contains("gus"));
 400     }
 401 
 402     public void testExportsToAllWithModifier() {
 403         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 404         assertEquals(e, e);
 405         assertTrue(e.modifiers().size() == 1);
 406         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 407         assertEquals(e.source(), "p");
 408         assertFalse(e.isQualified());
 409         assertTrue(e.targets().isEmpty());
 410     }
 411 
 412     public void testExportsToTargetWithModifier() {
 413         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p", "bar");
 414         assertEquals(e, e);
 415         assertTrue(e.modifiers().size() == 1);
 416         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 417         assertEquals(e.source(), "p");
 418         assertTrue(e.isQualified());
 419         assertTrue(e.targets().size() == 1);
 420         assertTrue(e.targets().contains("bar"));
 421     }
 422 
 423     @Test(expectedExceptions = IllegalStateException.class)
 424     public void testExportsWithDuplicate1() {
 425         Exports e = exports("p");
 426         ModuleDescriptor.newModule("foo").exports(e).exports(e);
 427     }
 428 
 429     @Test(expectedExceptions = IllegalStateException.class)
 430     public void testExportsWithDuplicate2() {
 431         ModuleDescriptor.newModule("foo").exports("p").exports("p");
 432     }
 433 
 434     @Test(expectedExceptions = IllegalArgumentException.class )
 435     public void testExportsWithEmptySet() {
 436         ModuleDescriptor.newModule("foo").exports("p", Collections.emptySet());
 437     }
 438 
 439     @Test(dataProvider = "invalidNames",
 440           expectedExceptions = IllegalArgumentException.class )
 441     public void testExportsWithBadName(String pn, String ignore) {
 442         ModuleDescriptor.newModule("foo").exports(pn);
 443     }
 444 
 445     @Test(expectedExceptions = NullPointerException.class )
 446     public void testExportsWithNullExports() {
 447         ModuleDescriptor.newModule("foo").exports((Exports) null);
 448     }
 449 
 450     @Test(expectedExceptions = NullPointerException.class )
 451     public void testExportsWithNullTargets() {
 452         ModuleDescriptor.newModule("foo").exports("p", (Set<String>) null);
 453     }
 454 
 455     public void testExportsCompare() {
 456         Exports e1 = exports("p");
 457         Exports e2 = exports("p");
 458         assertEquals(e1, e2);
 459         assertTrue(e1.hashCode() == e2.hashCode());
 460         assertTrue(e1.compareTo(e2) == 0);
 461         assertTrue(e2.compareTo(e1) == 0);
 462     }
 463 
 464     public void testExportsCompareWithSameModifiers() {
 465         Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 466         Exports e2 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 467         assertEquals(e1, e2);
 468         assertTrue(e1.hashCode() == e2.hashCode());
 469         assertTrue(e1.compareTo(e2) == 0);
 470         assertTrue(e2.compareTo(e1) == 0);
 471     }
 472 
 473     public void testExportsCompareWithDifferentModifiers() {
 474         Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 475         Exports e2 = exports("p");
 476         assertNotEquals(e1, e2);
 477         assertTrue(e1.compareTo(e2) == 1);
 478         assertTrue(e2.compareTo(e1) == -1);
 479     }
 480 
 481     public void testExportsCompareWithSameTargets() {
 482         Exports e1 = exports("p", "x");
 483         Exports e2 = exports("p", "x");
 484         assertEquals(e1, e2);
 485         assertTrue(e1.hashCode() == e2.hashCode());
 486         assertTrue(e1.compareTo(e2) == 0);
 487         assertTrue(e2.compareTo(e1) == 0);
 488     }
 489 
 490     public void testExportsCompareWithDifferentTargets() {
 491         Exports e1 = exports("p", "y");
 492         Exports e2 = exports("p", "x");
 493         assertNotEquals(e1, e2);
 494         assertTrue(e1.compareTo(e2) == 1);
 495         assertTrue(e2.compareTo(e1) == -1);
 496     }
 497 
 498     public void testExportsToString() {
 499         String s = ModuleDescriptor.newModule("foo")
 500             .exports("p1", Set.of("bar"))
 501             .build()
 502             .exports()
 503             .iterator()
 504             .next()
 505             .toString();
 506         assertTrue(s.contains("p1"));
 507         assertTrue(s.contains("bar"));
 508     }
 509 
 510 
 511     // opens
 512 
 513     private Opens opens(Set<Opens.Modifier> mods, String pn) {
 514         return ModuleDescriptor.newModule("foo")
 515                 .opens(mods, pn)
 516                 .build()
 517                 .opens()
 518                 .iterator()
 519                 .next();
 520     }
 521 
 522     private Opens opens(String pn) {
 523         return opens(Set.of(), pn);
 524     }
 525 
 526     private Opens opens(Set<Opens.Modifier> mods, String pn, String target) {
 527         return ModuleDescriptor.newModule("foo")
 528                 .opens(mods, pn, Set.of(target))
 529                 .build()
 530                 .opens()
 531                 .iterator()
 532                 .next();
 533     }
 534 
 535     private Opens opens(String pn, String target) {
 536         return opens(Set.of(), pn, target);
 537     }
 538 
 539     public void testOpensOpens() {
 540         Opens o1 = opens("p");
 541         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").opens(o1).build();
 542         Opens o2 = descriptor.opens().iterator().next();
 543         assertEquals(o1, o2);
 544     }
 545 
 546     public void testOpensToAll() {
 547         Opens o = opens("p");
 548         assertEquals(o, o);
 549         assertTrue(o.modifiers().isEmpty());
 550         assertEquals(o.source(), "p");
 551         assertFalse(o.isQualified());
 552         assertTrue(o.targets().isEmpty());
 553     }
 554 
 555 
 556     public void testOpensToTarget() {
 557         Opens o = opens("p", "bar");
 558         assertEquals(o, o);
 559         assertTrue(o.modifiers().isEmpty());
 560         assertEquals(o.source(), "p");
 561         assertTrue(o.isQualified());
 562         assertTrue(o.targets().size() == 1);
 563         assertTrue(o.targets().contains("bar"));
 564     }
 565 
 566     public void testOpensToTargets() {
 567         Set<String> targets = new HashSet<>();
 568         targets.add("bar");
 569         targets.add("gus");
 570         Opens o = ModuleDescriptor.newModule("foo")
 571                 .opens("p", targets)
 572                 .build()
 573                 .opens()
 574                 .iterator()
 575                 .next();
 576         assertEquals(o, o);
 577         assertTrue(o.modifiers().isEmpty());
 578         assertEquals(o.source(), "p");
 579         assertTrue(o.isQualified());
 580         assertTrue(o.targets().size() == 2);
 581         assertTrue(o.targets().contains("bar"));
 582         assertTrue(o.targets().contains("gus"));
 583     }
 584 
 585     @Test(expectedExceptions = IllegalStateException.class)
 586     public void testOpensWithDuplicate1() {
 587         Opens o = opens("p");
 588         ModuleDescriptor.newModule("foo").opens(o).opens(o);
 589     }
 590 
 591     @Test(expectedExceptions = IllegalStateException.class)
 592     public void testOpensWithDuplicate2() {
 593         ModuleDescriptor.newModule("foo").opens("p").opens("p");
 594     }
 595 
 596     @Test(expectedExceptions = IllegalArgumentException.class )
 597     public void testOpensWithEmptySet() {
 598         ModuleDescriptor.newModule("foo").opens("p", Collections.emptySet());
 599     }
 600 
 601     @Test(dataProvider = "invalidNames",
 602             expectedExceptions = IllegalArgumentException.class )
 603     public void testOpensWithBadName(String pn, String ignore) {
 604         ModuleDescriptor.newModule("foo").opens(pn);
 605     }
 606 
 607     @Test(expectedExceptions = NullPointerException.class )
 608     public void testOpensWithNullExports() {
 609         ModuleDescriptor.newModule("foo").opens((Opens) null);
 610     }
 611 
 612     @Test(expectedExceptions = NullPointerException.class )
 613     public void testOpensWithNullTargets() {
 614         ModuleDescriptor.newModule("foo").opens("p", (Set<String>) null);
 615     }
 616 
 617     public void testOpensCompare() {
 618         Opens o1 = opens("p");
 619         Opens o2 = opens("p");
 620         assertEquals(o1, o2);
 621         assertTrue(o1.hashCode() == o2.hashCode());
 622         assertTrue(o1.compareTo(o2) == 0);
 623         assertTrue(o2.compareTo(o1) == 0);
 624     }
 625 
 626     public void testOpensCompareWithSameModifiers() {
 627         Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 628         Opens o2 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 629         assertEquals(o1, o2);
 630         assertTrue(o1.hashCode() == o2.hashCode());
 631         assertTrue(o1.compareTo(o2) == 0);
 632         assertTrue(o2.compareTo(o1) == 0);
 633     }
 634 
 635     public void testOpensCompareWithDifferentModifiers() {
 636         Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 637         Opens o2 = opens("p");
 638         assertNotEquals(o1, o2);
 639         assertTrue(o1.compareTo(o2) == 1);
 640         assertTrue(o2.compareTo(o1) == -1);
 641     }
 642 
 643     public void testOpensCompareWithSameTargets() {
 644         Opens o1 = opens("p", "x");
 645         Opens o2 = opens("p", "x");
 646         assertEquals(o1, o2);
 647         assertTrue(o1.hashCode() == o2.hashCode());
 648         assertTrue(o1.compareTo(o2) == 0);
 649         assertTrue(o2.compareTo(o1) == 0);
 650     }
 651 
 652     public void testOpensCompareWithDifferentTargets() {
 653         Opens o1 = opens("p", "y");
 654         Opens o2 = opens("p", "x");
 655         assertNotEquals(o1, o2);
 656         assertTrue(o1.compareTo(o2) == 1);
 657         assertTrue(o2.compareTo(o1) == -1);
 658     }
 659 
 660     public void testOpensToString() {
 661         String s = ModuleDescriptor.newModule("foo")
 662                 .opens("p1", Set.of("bar"))
 663                 .build()
 664                 .opens()
 665                 .iterator()
 666                 .next()
 667                 .toString();
 668         assertTrue(s.contains("p1"));
 669         assertTrue(s.contains("bar"));
 670     }
 671 
 672 
 673     // uses
 674 
 675     public void testUses() {
 676         Set<String> uses
 677             = ModuleDescriptor.newModule("foo")
 678                 .uses("p.S")
 679                 .uses("q.S")
 680                 .build()
 681                 .uses();
 682         assertTrue(uses.size() == 2);
 683         assertTrue(uses.contains("p.S"));
 684         assertTrue(uses.contains("q.S"));
 685     }
 686 
 687     @Test(expectedExceptions = IllegalStateException.class)
 688     public void testUsesWithDuplicate() {
 689         ModuleDescriptor.newModule("foo").uses("p.S").uses("p.S");
 690     }
 691 
 692     @Test(expectedExceptions = IllegalArgumentException.class)
 693     public void testUsesWithSimpleIdentifier() {
 694         ModuleDescriptor.newModule("foo").uses("S");
 695     }
 696 
 697     @Test(dataProvider = "invalidNames",
 698           expectedExceptions = IllegalArgumentException.class )
 699     public void testUsesWithBadName(String service, String ignore) {
 700         ModuleDescriptor.newModule("foo").uses(service);
 701     }
 702 
 703 
 704     // provides
 705 
 706     private Provides provides(String st, String pc) {
 707         return ModuleDescriptor.newModule("foo")
 708             .provides(st, List.of(pc))
 709             .build()
 710             .provides()
 711             .iterator()
 712             .next();
 713     }
 714 
 715     private Provides provides(String st, List<String> pns) {
 716         return ModuleDescriptor.newModule("foo")
 717                 .provides(st, pns)
 718                 .build()
 719                 .provides()
 720                 .iterator()
 721                 .next();
 722     }
 723 
 724     public void testProvidesWithProvides() {
 725         Provides p1 = provides("p.S", "q.S1");
 726         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m")
 727                 .provides(p1)
 728                 .build();
 729         Provides p2 = descriptor.provides().iterator().next();
 730         assertEquals(p1, p2);
 731     }
 732 
 733 
 734     public void testProvides() {
 735         Set<Provides> set = ModuleDescriptor.newModule("foo")
 736                 .provides("p.S", List.of("q.P1", "q.P2"))
 737                 .build()
 738                 .provides();
 739         assertTrue(set.size() == 1);
 740 
 741         Provides p = set.iterator().next();
 742         assertEquals(p, p);
 743         assertEquals(p.service(), "p.S");
 744         assertTrue(p.providers().size() == 2);
 745         assertEquals(p.providers().get(0), "q.P1");
 746         assertEquals(p.providers().get(1), "q.P2");
 747     }
 748 
 749     @Test(expectedExceptions = IllegalStateException.class )
 750     public void testProvidesWithDuplicateProvides() {
 751         Provides p = provides("p.S", "q.S2");
 752         ModuleDescriptor.newModule("m").provides("p.S", List.of("q.S1")).provides(p);
 753     }
 754 
 755     @Test(expectedExceptions = IllegalArgumentException.class )
 756     public void testProvidesWithEmptySet() {
 757         ModuleDescriptor.newModule("foo").provides("p.Service", Collections.emptyList());
 758     }
 759 
 760     @Test(expectedExceptions = IllegalArgumentException.class )
 761     public void testProvidesWithSimpleIdentifier1() {
 762         ModuleDescriptor.newModule("foo").provides("S", List.of("q.P"));
 763     }
 764 
 765     @Test(expectedExceptions = IllegalArgumentException.class )
 766     public void testProvidesWithSimpleIdentifier2() {
 767         ModuleDescriptor.newModule("foo").provides("p.S", List.of("P"));
 768     }
 769 
 770     @Test(dataProvider = "invalidNames",
 771           expectedExceptions = IllegalArgumentException.class )
 772     public void testProvidesWithBadService(String service, String ignore) {
 773         ModuleDescriptor.newModule("foo").provides(service, List.of("p.Provider"));
 774     }
 775 
 776     @Test(dataProvider = "invalidNames",
 777           expectedExceptions = IllegalArgumentException.class )
 778     public void testProvidesWithBadProvider(String provider, String ignore) {
 779         List<String> names = new ArrayList<>(); // allows nulls
 780         names.add(provider);
 781         ModuleDescriptor.newModule("foo").provides("p.Service", names);
 782     }
 783 
 784     @Test(expectedExceptions = NullPointerException.class )
 785     public void testProvidesWithNullProvides() {
 786         ModuleDescriptor.newModule("foo").provides((Provides) null);
 787     }
 788 
 789     @Test(expectedExceptions = NullPointerException.class )
 790     public void testProvidesWithNullProviders() {
 791         ModuleDescriptor.newModule("foo").provides("p.S", (List<String>) null);
 792     }
 793 
 794     public void testProvidesCompare() {
 795         Provides p1 = provides("p.S", "q.S1");
 796         Provides p2 = provides("p.S", "q.S1");
 797         assertEquals(p1, p2);
 798         assertTrue(p1.hashCode() == p2.hashCode());
 799         assertTrue(p1.compareTo(p2) == 0);
 800         assertTrue(p2.compareTo(p1) == 0);
 801     }
 802 
 803     public void testProvidesCompareWithDifferentService() {
 804         Provides p1 = provides("p.S2", "q.S1");
 805         Provides p2 = provides("p.S1", "q.S1");
 806         assertNotEquals(p1, p2);
 807         assertTrue(p1.compareTo(p2) == 1);
 808         assertTrue(p2.compareTo(p1) == -1);
 809     }
 810 
 811     public void testProvidesCompareWithDifferentProviders1() {
 812         Provides p1 = provides("p.S", "q.S2");
 813         Provides p2 = provides("p.S", "q.S1");
 814         assertNotEquals(p1, p2);
 815         assertTrue(p1.compareTo(p2) == 1);
 816         assertTrue(p2.compareTo(p1) == -1);
 817     }
 818 
 819     public void testProvidesCompareWithDifferentProviders2() {
 820         Provides p1 = provides("p.S", List.of("q.S1", "q.S2"));
 821         Provides p2 = provides("p.S", "q.S1");
 822         assertNotEquals(p1, p2);
 823         assertTrue(p1.compareTo(p2) == 1);
 824         assertTrue(p2.compareTo(p1) == -1);
 825     }
 826 
 827     // packages
 828 
 829     public void testPackages1() {
 830         Set<String> packages = ModuleDescriptor.newModule("foo")
 831                 .packages(Set.of("p", "q"))
 832                 .build()
 833                 .packages();
 834         assertTrue(packages.size() == 2);
 835         assertTrue(packages.contains("p"));
 836         assertTrue(packages.contains("q"));
 837     }
 838 
 839     public void testPackages2() {
 840         Set<String> packages = ModuleDescriptor.newModule("foo")
 841                 .packages(Set.of("p"))
 842                 .packages(Set.of("q"))
 843                 .build()
 844                 .packages();
 845         assertTrue(packages.size() == 2);
 846         assertTrue(packages.contains("p"));
 847         assertTrue(packages.contains("q"));
 848     }
 849 
 850 
 851     public void testPackagesWithEmptySet() {
 852         Set<String> packages = ModuleDescriptor.newModule("foo")
 853                 .packages(Collections.emptySet())
 854                 .build()
 855                 .packages();
 856         assertTrue(packages.size() == 0);
 857     }
 858 
 859     public void testPackagesDuplicate() {
 860         Set<String> packages = ModuleDescriptor.newModule("foo")
 861                 .packages(Set.of("p"))
 862                 .packages(Set.of("p"))
 863                 .build()
 864                 .packages();
 865         assertTrue(packages.size() == 1);
 866         assertTrue(packages.contains("p"));
 867     }
 868 
 869     public void testPackagesAndExportsPackage1() {
 870         Set<String> packages = ModuleDescriptor.newModule("foo")
 871                 .packages(Set.of("p"))
 872                 .exports("p")
 873                 .build()
 874                 .packages();
 875         assertTrue(packages.size() == 1);
 876         assertTrue(packages.contains("p"));
 877     }
 878 
 879     public void testPackagesAndExportsPackage2() {
 880         Set<String> packages = ModuleDescriptor.newModule("foo")
 881                 .exports("p")
 882                 .packages(Set.of("p"))
 883                 .build()
 884                 .packages();
 885         assertTrue(packages.size() == 1);
 886         assertTrue(packages.contains("p"));
 887     }
 888 
 889     public void testPackagesAndOpensPackage1() {
 890         Set<String> packages = ModuleDescriptor.newModule("foo")
 891                 .packages(Set.of("p"))
 892                 .opens("p")
 893                 .build()
 894                 .packages();
 895         assertTrue(packages.size() == 1);
 896         assertTrue(packages.contains("p"));
 897     }
 898 
 899     public void testPackagesAndOpensPackage2() {
 900         Set<String> packages = ModuleDescriptor.newModule("foo")
 901                 .opens("p")
 902                 .packages(Set.of("p"))
 903                 .build()
 904                 .packages();
 905         assertTrue(packages.size() == 1);
 906         assertTrue(packages.contains("p"));
 907     }
 908 
 909     public void testPackagesAndProvides1() {
 910         Set<String> packages = ModuleDescriptor.newModule("foo")
 911                 .packages(Set.of("p"))
 912                 .provides("q.S", List.of("p.T"))
 913                 .build()
 914                 .packages();
 915         assertTrue(packages.size() == 1);
 916         assertTrue(packages.contains("p"));
 917     }
 918 
 919     public void testPackagesAndProvides2() {
 920         Set<String> packages = ModuleDescriptor.newModule("foo")
 921                 .provides("q.S", List.of("p.T"))
 922                 .packages(Set.of("p"))
 923                 .build()
 924                 .packages();
 925         assertTrue(packages.size() == 1);
 926         assertTrue(packages.contains("p"));
 927     }
 928 
 929     public void testPackagesAndMainClass1() {
 930         Set<String> packages = ModuleDescriptor.newModule("foo")
 931                 .packages(Set.of("p"))
 932                 .mainClass("p.Main")
 933                 .build()
 934                 .packages();
 935         assertTrue(packages.size() == 1);
 936         assertTrue(packages.contains("p"));
 937     }
 938 
 939     public void testPackagesAndMainClass2() {
 940         Set<String> packages = ModuleDescriptor.newModule("foo")
 941                 .mainClass("p.Main")
 942                 .packages(Set.of("p"))
 943                 .build()
 944                 .packages();
 945         assertTrue(packages.size() == 1);
 946         assertTrue(packages.contains("p"));
 947     }
 948 
 949     public void testPackagesAndAll() {
 950         Set<String> packages = ModuleDescriptor.newModule("foo")
 951                 .exports("p1")
 952                 .opens("p2")
 953                 .packages(Set.of("p3"))
 954                 .provides("q.S", List.of("p4.T"))
 955                 .mainClass("p5.Main")
 956                 .build()
 957                 .packages();
 958         assertTrue(Objects.equals(packages, Set.of("p1", "p2", "p3", "p4", "p5")));
 959     }
 960 
 961     @Test(dataProvider = "invalidNames",
 962           expectedExceptions = IllegalArgumentException.class )
 963     public void testPackagesWithBadName(String pn, String ignore) {
 964         Set<String> pkgs = new HashSet<>();  // allows nulls
 965         pkgs.add(pn);
 966         ModuleDescriptor.newModule("foo").packages(pkgs);
 967     }
 968 
 969     // name
 970 
 971     public void testModuleName() {
 972         String mn = ModuleDescriptor.newModule("foo").build().name();
 973         assertEquals(mn, "foo");
 974     }
 975 
 976     @Test(dataProvider = "invalidNames",
 977           expectedExceptions = IllegalArgumentException.class )
 978     public void testBadModuleName(String mn, String ignore) {
 979         ModuleDescriptor.newModule(mn);
 980     }
 981 
 982 
 983     // version
 984 
 985     public void testVersion1() {
 986         Version v1 = Version.parse("1.0");
 987         Version v2 = ModuleDescriptor.newModule("foo")
 988                 .version(v1)
 989                 .build()
 990                 .version()
 991                 .get();
 992         assertEquals(v1, v2);
 993     }
 994 
 995     public void testVersion2() {
 996         String vs = "1.0";
 997         Version v1 = ModuleDescriptor.newModule("foo")
 998                 .version(vs)
 999                 .build()
1000                 .version()
1001                 .get();
1002         Version v2 = Version.parse(vs);
1003         assertEquals(v1, v2);
1004     }
1005 
1006     @Test(expectedExceptions = NullPointerException.class )
1007     public void testNullVersion1() {
1008         ModuleDescriptor.newModule("foo").version((Version) null);
1009     }
1010 
1011     @Test(expectedExceptions = IllegalArgumentException.class )
1012     public void testNullVersion2() {
1013         ModuleDescriptor.newModule("foo").version((String) null);
1014     }
1015 
1016     @Test(expectedExceptions = IllegalArgumentException.class )
1017     public void testEmptyVersion() {
1018         ModuleDescriptor.newModule("foo").version("");
1019     }
1020 
1021 
1022     @DataProvider(name = "unparseableVersions")
1023     public Object[][] unparseableVersions() {
1024         return new Object[][]{
1025 
1026                 { null,  "A1" },    // no version < unparseable
1027                 { "A1",  "A2" },    // unparseable < unparseable
1028                 { "A1",  "1.0" },   // unparseable < parseable
1029 
1030         };
1031     }
1032 
1033     /**
1034      * Basic test for unparseable module versions
1035      */
1036     @Test(dataProvider = "unparseableVersions")
1037     public void testUnparseableModuleVersion(String vs1, String vs2) {
1038         ModuleDescriptor descriptor1 = newModule("m", vs1);
1039         ModuleDescriptor descriptor2 = newModule("m", vs2);
1040 
1041         if (vs1 != null && !isParsableVersion(vs1)) {
1042             assertFalse(descriptor1.version().isPresent());
1043             assertTrue(descriptor1.rawVersion().isPresent());
1044             assertEquals(descriptor1.rawVersion().get(), vs1);
1045         }
1046 
1047         if (vs2 != null && !isParsableVersion(vs2)) {
1048             assertFalse(descriptor2.version().isPresent());
1049             assertTrue(descriptor2.rawVersion().isPresent());
1050             assertEquals(descriptor2.rawVersion().get(), vs2);
1051         }
1052 
1053         assertFalse(descriptor1.equals(descriptor2));
1054         assertFalse(descriptor2.equals(descriptor1));
1055         assertTrue(descriptor1.compareTo(descriptor2) == -1);
1056         assertTrue(descriptor2.compareTo(descriptor1) == 1);
1057     }
1058 
1059     /**
1060      * Basic test for requiring a module with an unparseable version recorded
1061      * at compile version.
1062      */
1063     @Test(dataProvider = "unparseableVersions")
1064     public void testUnparseableCompiledVersion(String vs1, String vs2) {
1065         Requires r1 = newRequires("m", vs1);
1066         Requires r2 = newRequires("m", vs2);
1067 
1068         if (vs1 != null && !isParsableVersion(vs1)) {
1069             assertFalse(r1.compiledVersion().isPresent());
1070             assertTrue(r1.rawCompiledVersion().isPresent());
1071             assertEquals(r1.rawCompiledVersion().get(), vs1);
1072         }
1073 
1074         if (vs2 != null && !isParsableVersion(vs2)) {
1075             assertFalse(r2.compiledVersion().isPresent());
1076             assertTrue(r2.rawCompiledVersion().isPresent());
1077             assertEquals(r2.rawCompiledVersion().get(), vs2);
1078         }
1079 
1080         assertFalse(r1.equals(r2));
1081         assertFalse(r2.equals(r1));
1082         assertTrue(r1.compareTo(r2) == -1);
1083         assertTrue(r2.compareTo(r1) == 1);
1084     }
1085 
1086     private ModuleDescriptor newModule(String name, String vs) {
1087         JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
1088         Builder builder = JLMA.newModuleBuilder(name, false, Set.of());
1089         if (vs != null)
1090             builder.version(vs);
1091         builder.requires("java.base");
1092         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(builder.build());
1093         return ModuleDescriptor.read(bb);
1094     }
1095 
1096     private Requires newRequires(String name, String vs) {
1097         JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
1098         Builder builder = JLMA.newModuleBuilder("foo", false, Set.of());
1099         if (vs == null) {
1100             builder.requires(name);
1101         } else {
1102             JLMA.requires(builder, Set.of(), name, vs);
1103         }
1104         Set<ModuleDescriptor.Requires> requires = builder.build().requires();
1105         Iterator<ModuleDescriptor.Requires> iterator = requires.iterator();
1106         ModuleDescriptor.Requires r = iterator.next();
1107         if (r.name().equals("java.base")) {
1108             r = iterator.next();
1109         }
1110         return r;
1111     }
1112 
1113     private boolean isParsableVersion(String vs) {
1114         try {
1115             Version.parse(vs);
1116             return true;
1117         } catch (IllegalArgumentException e) {
1118             return false;
1119         }
1120     }
1121 
1122 
1123     // toNameAndVersion
1124 
1125     public void testToNameAndVersion() {
1126         ModuleDescriptor md1 = ModuleDescriptor.newModule("foo").build();
1127         assertEquals(md1.toNameAndVersion(), "foo");
1128 
1129         ModuleDescriptor md2 = ModuleDescriptor.newModule("foo").version("1.0").build();
1130         assertEquals(md2.toNameAndVersion(), "foo@1.0");
1131     }
1132 
1133 
1134     // open modules
1135 
1136     public void testOpenModule() {
1137         ModuleDescriptor descriptor = ModuleDescriptor.newOpenModule("foo")
1138                 .requires("bar")
1139                 .exports("p")
1140                 .provides("p.Service", List.of("q.ServiceImpl"))
1141                 .build();
1142 
1143         // modifiers
1144         assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.OPEN));
1145         assertTrue(descriptor.isOpen());
1146 
1147         // requires
1148         assertTrue(descriptor.requires().size() == 2);
1149         Set<String> names = descriptor.requires()
1150                 .stream()
1151                 .map(Requires::name)
1152                 .collect(Collectors.toSet());
1153         assertEquals(names, Set.of("bar", "java.base"));
1154 
1155         // packages
1156         assertEquals(descriptor.packages(), Set.of("p", "q"));
1157 
1158         // exports
1159         assertTrue(descriptor.exports().size() == 1);
1160         names = descriptor.exports()
1161                 .stream()
1162                 .map(Exports::source)
1163                 .collect(Collectors.toSet());
1164         assertEquals(names, Set.of("p"));
1165 
1166         // opens
1167         assertTrue(descriptor.opens().isEmpty());
1168     }
1169 
1170     @Test(expectedExceptions = IllegalStateException.class)
1171     public void testOpensOnOpenModule1() {
1172         ModuleDescriptor.newOpenModule("foo").opens("p");
1173     }
1174 
1175     @Test(expectedExceptions = IllegalStateException.class)
1176     public void testOpensOnOpenModule2() {
1177         ModuleDescriptor.newOpenModule("foo").opens("p", Set.of("bar"));
1178     }
1179 
1180     public void testIsOpen() {
1181         assertFalse(ModuleDescriptor.newModule("m").build().isOpen());
1182         assertFalse(ModuleDescriptor.newAutomaticModule("m").build().isOpen());
1183         assertTrue(ModuleDescriptor.newOpenModule("m").build().isOpen());
1184     }
1185 
1186 
1187     // automatic modules
1188 
1189     public void testAutomaticModule() {
1190         ModuleDescriptor descriptor = ModuleDescriptor.newAutomaticModule("foo")
1191                 .packages(Set.of("p"))
1192                 .provides("p.Service", List.of("q.ServiceImpl"))
1193                 .build();
1194 
1195         // modifiers
1196         assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.AUTOMATIC));
1197         assertTrue(descriptor.isAutomatic());
1198 
1199         // requires
1200         assertTrue(descriptor.requires().size() == 1);
1201         Set<String> names = descriptor.requires()
1202                 .stream()
1203                 .map(Requires::name)
1204                 .collect(Collectors.toSet());
1205         assertEquals(names, Set.of("java.base"));
1206 
1207         // packages
1208         assertEquals(descriptor.packages(), Set.of("p", "q"));
1209         assertTrue(descriptor.exports().isEmpty());
1210         assertTrue(descriptor.opens().isEmpty());
1211     }
1212 
1213     @Test(expectedExceptions = IllegalStateException.class)
1214     public void testRequiresOnAutomaticModule() {
1215         ModuleDescriptor.newAutomaticModule("foo").requires("java.base");
1216     }
1217 
1218     @Test(expectedExceptions = IllegalStateException.class)
1219     public void testExportsOnAutomaticModule1() {
1220         ModuleDescriptor.newAutomaticModule("foo").exports("p");
1221     }
1222 
1223     @Test(expectedExceptions = IllegalStateException.class)
1224     public void testExportsOnAutomaticModule2() {
1225         ModuleDescriptor.newAutomaticModule("foo").exports("p", Set.of("bar"));
1226     }
1227 
1228     @Test(expectedExceptions = IllegalStateException.class)
1229     public void testOpensOnAutomaticModule1() {
1230         ModuleDescriptor.newAutomaticModule("foo").opens("p");
1231     }
1232 
1233     @Test(expectedExceptions = IllegalStateException.class)
1234     public void testOpensOnAutomaticModule2() {
1235         ModuleDescriptor.newAutomaticModule("foo").opens("p", Set.of("bar"));
1236     }
1237 
1238     @Test(expectedExceptions = IllegalStateException.class)
1239     public void testUsesOnAutomaticModule() {
1240         ModuleDescriptor.newAutomaticModule("foo").uses("p.Service");
1241     }
1242 
1243     public void testIsAutomatic() {
1244         ModuleDescriptor descriptor1 = ModuleDescriptor.newModule("foo").build();
1245         assertFalse(descriptor1.isAutomatic());
1246 
1247         ModuleDescriptor descriptor2 = ModuleDescriptor.newOpenModule("foo").build();
1248         assertFalse(descriptor2.isAutomatic());
1249 
1250         ModuleDescriptor descriptor3 = ModuleDescriptor.newAutomaticModule("foo").build();
1251         assertTrue(descriptor3.isAutomatic());
1252     }
1253 
1254 
1255     // newModule with modifiers
1256 
1257     public void testNewModuleToBuildAutomaticModule() {
1258         Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC);
1259         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();
1260         assertTrue(descriptor.modifiers().equals(ms));
1261         assertTrue(descriptor.isAutomatic());
1262     }
1263 
1264     public void testNewModuleToBuildOpenModule() {
1265         Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.OPEN);
1266         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();
1267         assertTrue(descriptor.modifiers().equals(ms));
1268         assertTrue(descriptor.isOpen());
1269 
1270         ms = Set.of(ModuleDescriptor.Modifier.OPEN, ModuleDescriptor.Modifier.SYNTHETIC);
1271         descriptor = ModuleDescriptor.newModule("foo", ms).build();
1272         assertTrue(descriptor.modifiers().equals(ms));
1273         assertTrue(descriptor.isOpen());
1274     }
1275 
1276     @Test(expectedExceptions = IllegalArgumentException.class)
1277     public void testNewModuleToBuildAutomaticAndOpenModule() {
1278         Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC,
1279                                                    ModuleDescriptor.Modifier.OPEN);
1280         ModuleDescriptor.newModule("foo", ms);
1281     }
1282 
1283 
1284     // mainClass
1285 
1286     public void testMainClass() {
1287         String mainClass
1288             = ModuleDescriptor.newModule("foo").mainClass("p.Main").build().mainClass().get();
1289         assertEquals(mainClass, "p.Main");
1290     }
1291 
1292     @Test(expectedExceptions = IllegalArgumentException.class)
1293     public void testMainClassWithSimpleIdentifier() {
1294         ModuleDescriptor.newModule("foo").mainClass("Main");
1295     }
1296 
1297     @Test(dataProvider = "invalidNames",
1298           expectedExceptions = IllegalArgumentException.class )
1299     public void testMainClassWithBadName(String mainClass, String ignore) {
1300         Builder builder = ModuleDescriptor.newModule("foo");
1301         builder.mainClass(mainClass);
1302     }
1303 
1304 
1305     // reads
1306 
1307     private static InputStream EMPTY_INPUT_STREAM = new InputStream() {
1308         @Override
1309         public int read() {
1310             return -1;
1311         }
1312     };
1313 
1314     private static InputStream FAILING_INPUT_STREAM = new InputStream() {
1315         @Override
1316         public int read() throws IOException {
1317             throw new IOException();
1318         }
1319     };
1320 
1321     /**
1322      * Basic test reading module-info.class
1323      */
1324     public void testRead() throws Exception {
1325         Module base = Object.class.getModule();
1326 
1327         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1328             ModuleDescriptor descriptor = ModuleDescriptor.read(in);
1329             assertTrue(in.read() == -1); // all bytes read
1330             assertEquals(descriptor.name(), "java.base");
1331         }
1332 
1333         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1334             ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());
1335             ModuleDescriptor descriptor = ModuleDescriptor.read(bb);
1336             assertFalse(bb.hasRemaining()); // no more remaining bytes
1337             assertEquals(descriptor.name(), "java.base");
1338         }
1339     }
1340 
1341     /**
1342      * Test ModuleDescriptor with a packager finder
1343      */
1344     public void testReadsWithPackageFinder() throws Exception {
1345         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
1346                 .requires("java.base")
1347                 .build();
1348 
1349         ByteArrayOutputStream baos = new ByteArrayOutputStream();
1350         ModuleInfoWriter.write(descriptor, baos);
1351         ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
1352 
1353         descriptor = ModuleDescriptor.read(bb, () -> Set.of("p", "q"));
1354 
1355         assertTrue(descriptor.packages().size() == 2);
1356         assertTrue(descriptor.packages().contains("p"));
1357         assertTrue(descriptor.packages().contains("q"));
1358     }
1359 
1360     /**
1361      * Test ModuleDescriptor with a packager finder that doesn't return the
1362      * complete set of packages.
1363      */
1364     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1365     public void testReadsWithBadPackageFinder() throws Exception {
1366         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
1367                 .requires("java.base")
1368                 .exports("p")
1369                 .build();
1370 
1371         ByteArrayOutputStream baos = new ByteArrayOutputStream();
1372         ModuleInfoWriter.write(descriptor, baos);
1373         ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
1374 
1375         // package finder returns a set that doesn't include p
1376         ModuleDescriptor.read(bb, () -> Set.of("q"));
1377     }
1378 
1379     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1380     public void testReadFromEmptyInputStream() throws Exception {
1381         ModuleDescriptor.read(EMPTY_INPUT_STREAM);
1382     }
1383 
1384     @Test(expectedExceptions = IOException.class)
1385     public void testReadFromFailingInputStream() throws Exception {
1386         ModuleDescriptor.read(FAILING_INPUT_STREAM);
1387     }
1388 
1389     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1390     public void testReadFromEmptyBuffer() {
1391         ByteBuffer bb = ByteBuffer.allocate(0);
1392         ModuleDescriptor.read(bb);
1393     }
1394 
1395     // The requires table for java.base must be 0 length
1396     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1397     public void testReadOfJavaBaseWithRequires() {
1398         ModuleDescriptor descriptor
1399             = ModuleDescriptor.newModule("java.base")
1400                 .requires("other")
1401                 .build();
1402         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1403         ModuleDescriptor.read(bb);
1404     }
1405 
1406     // The requires table must have an entry for java.base
1407     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1408     public void testReadWithEmptyRequires() {
1409         ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
1410                 .newModuleBuilder("m1", false, Set.of()).build();
1411         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1412         ModuleDescriptor.read(bb);
1413     }
1414 
1415     // The requires table must have an entry for java.base
1416     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1417     public void testReadWithNoRequiresBase() {
1418         ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
1419                 .newModuleBuilder("m1", false, Set.of()).requires("m2").build();
1420         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1421         ModuleDescriptor.read(bb);
1422     }
1423 
1424     public void testReadWithNull() throws Exception {
1425         Module base = Object.class.getModule();
1426 
1427         try {
1428             ModuleDescriptor.read((InputStream)null);
1429             assertTrue(false);
1430         } catch (NullPointerException expected) { }
1431 
1432 
1433         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1434             try {
1435                 ModuleDescriptor.read(in, null);
1436                 assertTrue(false);
1437             } catch (NullPointerException expected) { }
1438         }
1439 
1440         try {
1441             ModuleDescriptor.read((ByteBuffer)null);
1442             assertTrue(false);
1443         } catch (NullPointerException expected) { }
1444 
1445 
1446         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1447             ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());
1448             try {
1449                 ModuleDescriptor.read(bb, null);
1450                 assertTrue(false);
1451             } catch (NullPointerException expected) { }
1452         }
1453     }
1454 
1455 
1456     // equals/hashCode/compareTo/toString
1457 
1458     public void testEqualsAndHashCode() {
1459         ModuleDescriptor md1 = ModuleDescriptor.newModule("m").build();
1460         ModuleDescriptor md2 = ModuleDescriptor.newModule("m").build();
1461         assertEquals(md1, md1);
1462         assertEquals(md1.hashCode(), md2.hashCode());
1463         assertTrue(md1.compareTo(md2) == 0);
1464         assertTrue(md2.compareTo(md1) == 0);
1465     }
1466 
1467     @DataProvider(name = "sortedModuleDescriptors")
1468     public Object[][] sortedModuleDescriptors() {
1469         return new Object[][]{
1470 
1471             { ModuleDescriptor.newModule("m2").build(),
1472               ModuleDescriptor.newModule("m1").build()
1473             },
1474 
1475             { ModuleDescriptor.newModule("m").version("2").build(),
1476               ModuleDescriptor.newModule("m").version("1").build()
1477             },
1478 
1479             { ModuleDescriptor.newModule("m").version("1").build(),
1480               ModuleDescriptor.newModule("m").build()
1481             },
1482 
1483             { ModuleDescriptor.newOpenModule("m").build(),
1484               ModuleDescriptor.newModule("m").build()
1485             },
1486 
1487         };
1488     }
1489 
1490     @Test(dataProvider = "sortedModuleDescriptors")
1491     public void testCompare(ModuleDescriptor md1, ModuleDescriptor md2) {
1492         assertNotEquals(md1, md2);
1493         assertTrue(md1.compareTo(md2) == 1);
1494         assertTrue(md2.compareTo(md1) == -1);
1495     }
1496 
1497     public void testToString() {
1498         String s = ModuleDescriptor.newModule("m1")
1499                 .requires("m2")
1500                 .exports("p1")
1501                 .build()
1502                 .toString();
1503         assertTrue(s.contains("m1"));
1504         assertTrue(s.contains("m2"));
1505         assertTrue(s.contains("p1"));
1506     }
1507 
1508 }