< prev index next >

test/java/lang/module/ModuleDescriptorTest.java

Print this page


   1 /*
   2  * Copyright (c) 2013, 2016, 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.module

  27  * @run testng ModuleDescriptorTest
  28  * @summary Basic test for java.lang.module.ModuleDescriptor and its builder
  29  */
  30 
  31 import java.io.ByteArrayOutputStream;
  32 import java.io.IOException;
  33 import java.io.InputStream;
  34 import java.lang.module.InvalidModuleDescriptorException;
  35 import java.lang.module.ModuleDescriptor;
  36 import java.lang.module.ModuleDescriptor.Builder;
  37 import java.lang.module.ModuleDescriptor.Exports;
  38 import java.lang.module.ModuleDescriptor.Opens;
  39 import java.lang.module.ModuleDescriptor.Requires;
  40 import java.lang.module.ModuleDescriptor.Provides;
  41 import java.lang.module.ModuleDescriptor.Requires.Modifier;
  42 import java.lang.module.ModuleDescriptor.Version;
  43 import java.lang.reflect.Module;
  44 import java.nio.ByteBuffer;

  45 import java.util.Collections;
  46 import java.util.EnumSet;
  47 import java.util.HashSet;

  48 import java.util.List;

  49 import java.util.Set;

  50 
  51 import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
  52 

  53 import jdk.internal.module.ModuleInfoWriter;
  54 import org.testng.annotations.DataProvider;
  55 import org.testng.annotations.Test;
  56 import static org.testng.Assert.*;
  57 
  58 @Test
  59 public class ModuleDescriptorTest {
  60 
  61     @DataProvider(name = "invalidjavaidentifiers")
  62     public Object[][] invalidJavaIdentifiers() {
  63         return new Object[][]{
  64 
  65             { null,             null },
  66             { "1",              null },
  67             { "1foo",           null },
  68             { ".foo",           null },
  69             { "foo.",           null },
  70             { "[foo]",          null },
  71             { "foo.1",          null },
  72             { "1foo.bar",       null },
  73             { "foo.1bar",       null },
  74             { "foo.[bar]",      null },
  75             { "foo..bar",       null },
  76             { "foo.bar.1",      null },
  77             { "foo.bar.1gus",   null },
  78             { "foo.bar.[gus]",  null },
  79 
  80         };
  81     }
  82 
  83 
  84     // requires
  85 
  86     private Requires requires(Set<Modifier> mods, String mn) {
  87         return ModuleDescriptor.module("m")
  88             .requires(mods, mn)
  89             .build()
  90             .requires()
  91             .iterator()
  92             .next();
  93     }
  94 
  95     private Requires requires(Set<Modifier> mods, String mn, Version v) {
  96         return ModuleDescriptor.module("m")
  97             .requires(mods, mn, v)
  98             .build()
  99             .requires()
 100             .iterator()
 101             .next();











 102     }
 103 
 104     private Requires requires(String mn) {
 105         return requires(Collections.emptySet(), mn);
 106     }
 107 
 108     public void testRequiresWithRequires() {
 109         Requires r1 = requires("foo");
 110         ModuleDescriptor descriptor = ModuleDescriptor.module("m").requires(r1).build();
 111         Requires r2 = descriptor.requires().iterator().next();
 112         assertEquals(r1, r2);
 113     }
 114 
 115     public void testRequiresWithNoModifiers() {
 116         Requires r = requires(EnumSet.noneOf(Requires.Modifier.class), "foo");
 117         assertEquals(r, r);
 118         assertTrue(r.compareTo(r) == 0);
 119         assertTrue(r.modifiers().isEmpty());
 120         assertEquals(r.name(), "foo");
 121         assertFalse(r.compiledVersion().isPresent());
 122     }
 123 
 124     public void testRequiresWithOneModifier() {
 125         Requires r = requires(EnumSet.of(TRANSITIVE), "foo");
 126         assertEquals(r, r);
 127         assertTrue(r.compareTo(r) == 0);
 128         assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE));
 129         assertEquals(r.name(), "foo");
 130         assertFalse(r.compiledVersion().isPresent());


 145         assertTrue(r.compareTo(r) == 0);
 146         assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE, STATIC, SYNTHETIC, MANDATED));
 147         assertEquals(r.name(), "foo");
 148         assertFalse(r.compiledVersion().isPresent());
 149     }
 150 
 151     public void testRequiresWithCompiledVersion() {
 152         Version v = Version.parse("1.0");
 153         Requires r = requires(Set.of(), "foo", v);
 154         assertEquals(r, r);
 155         assertTrue(r.compareTo(r) == 0);
 156         assertEquals(r.modifiers(), Set.of());
 157         assertEquals(r.name(), "foo");
 158         assertTrue(r.compiledVersion().isPresent());
 159         assertEquals(r.compiledVersion().get().toString(), "1.0");
 160     }
 161 
 162     @Test(expectedExceptions = IllegalStateException.class)
 163     public void testRequiresWithDuplicatesRequires() {
 164         Requires r = requires("foo");
 165         ModuleDescriptor.module("m").requires(r).requires(r);
 166     }
 167 
 168     @Test(expectedExceptions = IllegalArgumentException.class)
 169     public void testRequiresSelfWithRequires() {
 170         Requires r = requires("foo");
 171         ModuleDescriptor.module("foo").requires(r);
 172     }
 173 
 174     @Test(expectedExceptions = IllegalArgumentException.class)
 175     public void testRequiresSelfWithNoModifier() {
 176         ModuleDescriptor.module("m").requires("m");
 177     }
 178 
 179     @Test(expectedExceptions = IllegalArgumentException.class)
 180     public void testRequiresSelfWithOneModifier() {
 181         ModuleDescriptor.module("m").requires(Set.of(TRANSITIVE), "m");
 182     }
 183 
 184     @Test(expectedExceptions = IllegalArgumentException.class)
 185     public void testRequiresSelfWithAllModifiers() {
 186         ModuleDescriptor.module("m").requires(EnumSet.allOf(Modifier.class), "m");
 187     }
 188 
 189     @Test(dataProvider = "invalidjavaidentifiers",
 190           expectedExceptions = IllegalArgumentException.class )
 191     public void testRequiresWithBadModuleName(String mn, String ignore) {
 192         requires(EnumSet.noneOf(Modifier.class), mn);
 193     }
 194 
 195     @Test(expectedExceptions = NullPointerException.class)
 196     public void testRequiresWithNullRequires() {
 197         ModuleDescriptor.module("m").requires((Requires) null);
 198     }
 199 
 200     @Test(expectedExceptions = NullPointerException.class)
 201     public void testRequiresWithNullModifiers() {
 202         ModuleDescriptor.module("m").requires(null, "foo");
 203     }
 204 
 205     @Test(expectedExceptions = NullPointerException.class)
 206     public void testRequiresWithNullVersion() {
 207         ModuleDescriptor.module("m").requires(Set.of(), "foo", null);
 208     }
 209 
 210     public void testRequiresCompare() {
 211         Requires r1 = requires(EnumSet.noneOf(Modifier.class), "foo");
 212         Requires r2 = requires(EnumSet.noneOf(Modifier.class), "bar");
 213         int n = "foo".compareTo("bar");
 214         assertTrue(r1.compareTo(r2) == n);
 215         assertTrue(r2.compareTo(r1) == -n);
 216     }
 217 
 218     public void testRequiresCompareWithDifferentModifiers() {
 219         Requires r1 = requires(EnumSet.of(TRANSITIVE), "foo");
 220         Requires r2 = requires(EnumSet.of(SYNTHETIC), "foo");
 221         int n = Integer.compare(1 << TRANSITIVE.ordinal(), 1 << SYNTHETIC.ordinal());
 222         assertTrue(r1.compareTo(r2) == n);
 223         assertTrue(r2.compareTo(r1) == -n);
 224     }
 225 
 226     public void testRequiresCompareWithSameModifiers() {
 227         Requires r1 = requires(EnumSet.of(SYNTHETIC), "foo");


 267         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 268         r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 269         assertEquals(r1, r2);
 270         assertTrue(r1.hashCode() == r2.hashCode());
 271 
 272         Version v2 = Version.parse("2.0");
 273         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 274         r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v2);
 275         assertNotEquals(r1, r2);
 276     }
 277 
 278     public void testRequiresToString() {
 279         Requires r = requires(EnumSet.noneOf(Modifier.class), "foo");
 280         assertTrue(r.toString().contains("foo"));
 281     }
 282 
 283 
 284     // exports
 285 
 286     private Exports exports(Set<Exports.Modifier> mods, String pn) {
 287         return ModuleDescriptor.module("foo")
 288             .exports(mods, pn)
 289             .build()
 290             .exports()
 291             .iterator()
 292             .next();
 293     }
 294 
 295     private Exports exports(String pn) {
 296         return exports(Set.of(), pn);
 297     }
 298 
 299     private Exports exports(Set<Exports.Modifier> mods, String pn, String target) {
 300         return ModuleDescriptor.module("foo")
 301             .exports(mods, pn, Set.of(target))
 302             .build()
 303             .exports()
 304             .iterator()
 305             .next();
 306     }
 307 
 308     private Exports exports(String pn, String target) {
 309         return exports(Set.of(), pn, target);
 310     }
 311 
 312 
 313     public void testExportsExports() {
 314         Exports e1 = exports("p");
 315         ModuleDescriptor descriptor = ModuleDescriptor.module("m").exports(e1).build();
 316         Exports e2 = descriptor.exports().iterator().next();
 317         assertEquals(e1, e2);
 318     }
 319 
 320     public void testExportsToAll() {
 321         Exports e = exports("p");
 322         assertEquals(e, e);
 323         assertTrue(e.modifiers().isEmpty());
 324         assertEquals(e.source(), "p");
 325         assertFalse(e.isQualified());
 326         assertTrue(e.targets().isEmpty());
 327     }
 328 
 329     public void testExportsToTarget() {
 330         Exports e = exports("p", "bar");
 331         assertEquals(e, e);
 332         assertTrue(e.modifiers().isEmpty());
 333         assertEquals(e.source(), "p");
 334         assertTrue(e.isQualified());
 335         assertTrue(e.targets().size() == 1);
 336         assertTrue(e.targets().contains("bar"));
 337     }
 338 
 339     public void testExportsToTargets() {
 340         Set<String> targets = new HashSet<>();
 341         targets.add("bar");
 342         targets.add("gus");
 343         Exports e
 344             = ModuleDescriptor.module("foo")
 345                 .exports("p", targets)
 346                 .build()
 347                 .exports()
 348                 .iterator()
 349                 .next();
 350         assertEquals(e, e);
 351         assertTrue(e.modifiers().isEmpty());
 352         assertEquals(e.source(), "p");
 353         assertTrue(e.isQualified());
 354         assertTrue(e.targets().size() == 2);
 355         assertTrue(e.targets().contains("bar"));
 356         assertTrue(e.targets().contains("gus"));
 357     }
 358 
 359     public void testExportsToAllWithModifier() {
 360         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 361         assertEquals(e, e);
 362         assertTrue(e.modifiers().size() == 1);
 363         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 364         assertEquals(e.source(), "p");
 365         assertFalse(e.isQualified());
 366         assertTrue(e.targets().isEmpty());
 367     }
 368 
 369     public void testExportsToTargetWithModifier() {
 370         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p", "bar");
 371         assertEquals(e, e);
 372         assertTrue(e.modifiers().size() == 1);
 373         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 374         assertEquals(e.source(), "p");
 375         assertTrue(e.isQualified());
 376         assertTrue(e.targets().size() == 1);
 377         assertTrue(e.targets().contains("bar"));
 378     }
 379 
 380     @Test(expectedExceptions = IllegalStateException.class)
 381     public void testExportsWithDuplicate1() {
 382         Exports e = exports("p");
 383         ModuleDescriptor.module("foo").exports(e).exports(e);
 384     }
 385 
 386     @Test(expectedExceptions = IllegalStateException.class)
 387     public void testExportsWithDuplicate2() {
 388         ModuleDescriptor.module("foo").exports("p").exports("p");
 389     }
 390 
 391     @Test(expectedExceptions = IllegalStateException.class)
 392     public void testExportsOnContainedPackage() {
 393         ModuleDescriptor.module("foo").contains("p").exports("p");
 394     }
 395 
 396     @Test(expectedExceptions = IllegalStateException.class)
 397     public void testExportsToTargetOnContainedPackage() {
 398         ModuleDescriptor.module("foo").contains("p").exports("p", Set.of("bar"));
 399     }
 400 
 401     @Test(expectedExceptions = IllegalArgumentException.class )
 402     public void testExportsWithEmptySet() {
 403         ModuleDescriptor.module("foo").exports("p", Collections.emptySet());
 404     }
 405 
 406     @Test(dataProvider = "invalidjavaidentifiers",
 407           expectedExceptions = IllegalArgumentException.class )
 408     public void testExportsWithBadName(String pn, String ignore) {
 409         ModuleDescriptor.module("foo").exports(pn);
 410     }
 411 
 412     @Test(expectedExceptions = NullPointerException.class )
 413     public void testExportsWithNullExports() {
 414         ModuleDescriptor.module("foo").exports((Exports) null);
 415     }
 416 
 417     @Test(expectedExceptions = NullPointerException.class )
 418     public void testExportsWithNullTargets() {
 419         ModuleDescriptor.module("foo").exports("p", (Set<String>) null);
 420     }
 421 
 422     public void testExportsEqualsAndHashCode() {
 423         Exports e1, e2;
 424 
 425         e1 = exports("p");
 426         e2 = exports("p");
 427         assertEquals(e1, e2);
 428         assertTrue(e1.hashCode() == e2.hashCode());



 429 
 430         e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 431         e2 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");

 432         assertEquals(e1, e2);
 433         assertTrue(e1.hashCode() == e2.hashCode());



 434 
 435         e1 = exports("p");
 436         e2 = exports("q");

 437         assertNotEquals(e1, e2);



 438 
 439         e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 440         e2 = exports(Set.of(), "p");










 441         assertNotEquals(e1, e2);


 442     }
 443 
 444     public void testExportsToString() {
 445         String s = ModuleDescriptor.module("foo")
 446             .exports("p1", Set.of("bar"))
 447             .build()
 448             .exports()
 449             .iterator()
 450             .next()
 451             .toString();
 452         assertTrue(s.contains("p1"));
 453         assertTrue(s.contains("bar"));
 454     }
 455 
 456 
 457     // opens
 458 
 459     private Opens opens(Set<Opens.Modifier> mods, String pn) {
 460         return ModuleDescriptor.module("foo")
 461                 .opens(mods, pn)
 462                 .build()
 463                 .opens()
 464                 .iterator()
 465                 .next();
 466     }
 467 
 468     private Opens opens(String pn) {
 469         return opens(Set.of(), pn);
 470     }
 471 
 472     private Opens opens(Set<Opens.Modifier> mods, String pn, String target) {
 473         return ModuleDescriptor.module("foo")
 474                 .opens(mods, pn, Set.of(target))
 475                 .build()
 476                 .opens()
 477                 .iterator()
 478                 .next();
 479     }
 480 
 481     private Opens opens(String pn, String target) {
 482         return opens(Set.of(), pn, target);
 483     }
 484 
 485     public void testOpensOpens() {
 486         Opens o1 = opens("p");
 487         ModuleDescriptor descriptor = ModuleDescriptor.module("m").opens(o1).build();
 488         Opens o2 = descriptor.opens().iterator().next();
 489         assertEquals(o1, o2);
 490     }
 491 
 492     public void testOpensToAll() {
 493         Opens o = opens("p");
 494         assertEquals(o, o);
 495         assertTrue(o.modifiers().isEmpty());
 496         assertEquals(o.source(), "p");
 497         assertFalse(o.isQualified());
 498         assertTrue(o.targets().isEmpty());
 499     }
 500 
 501 
 502     public void testOpensToTarget() {
 503         Opens o = opens("p", "bar");
 504         assertEquals(o, o);
 505         assertTrue(o.modifiers().isEmpty());
 506         assertEquals(o.source(), "p");
 507         assertTrue(o.isQualified());
 508         assertTrue(o.targets().size() == 1);
 509         assertTrue(o.targets().contains("bar"));
 510     }
 511 
 512     public void testOpensToTargets() {
 513         Set<String> targets = new HashSet<>();
 514         targets.add("bar");
 515         targets.add("gus");
 516         Opens o = ModuleDescriptor.module("foo")
 517                 .opens("p", targets)
 518                 .build()
 519                 .opens()
 520                 .iterator()
 521                 .next();
 522         assertEquals(o, o);
 523         assertTrue(o.modifiers().isEmpty());
 524         assertEquals(o.source(), "p");
 525         assertTrue(o.isQualified());
 526         assertTrue(o.targets().size() == 2);
 527         assertTrue(o.targets().contains("bar"));
 528         assertTrue(o.targets().contains("gus"));
 529     }
 530 
 531     /*
 532 
 533     public void testOpensToAllWithModifier() {
 534         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 535         assertEquals(e, e);
 536         assertTrue(e.modifiers().size() == 1);
 537         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 538         assertEquals(e.source(), "p");
 539         assertFalse(e.isQualified());
 540         assertTrue(e.targets().isEmpty());
 541     }
 542 
 543     public void testOpensToTargetWithModifier() {
 544         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p", Set.of("bar"));
 545         assertEquals(e, e);
 546         assertTrue(e.modifiers().size() == 1);
 547         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 548         assertEquals(e.source(), "p");
 549         assertTrue(e.isQualified());
 550         assertTrue(e.targets().size() == 1);
 551         assertTrue(e.targets().contains("bar"));
 552     }
 553 
 554 
 555     */
 556 
 557     @Test(expectedExceptions = IllegalStateException.class)
 558     public void testOpensWithDuplicate1() {
 559         Opens o = opens("p");
 560         ModuleDescriptor.module("foo").opens(o).opens(o);
 561     }
 562 
 563     @Test(expectedExceptions = IllegalStateException.class)
 564     public void testOpensWithDuplicate2() {
 565         ModuleDescriptor.module("foo").opens("p").opens("p");
 566     }
 567 
 568     @Test(expectedExceptions = IllegalStateException.class)
 569     public void testOpensOnContainedPackage() {
 570         ModuleDescriptor.module("foo").contains("p").opens("p");
 571     }
 572 
 573     @Test(expectedExceptions = IllegalStateException.class)
 574     public void testOpensToTargetOnContainedPackage() {
 575         ModuleDescriptor.module("foo").contains("p").opens("p", Set.of("bar"));
 576     }
 577 
 578     @Test(expectedExceptions = IllegalArgumentException.class )
 579     public void testOpensWithEmptySet() {
 580         ModuleDescriptor.module("foo").opens("p", Collections.emptySet());
 581     }
 582 
 583     @Test(dataProvider = "invalidjavaidentifiers",
 584             expectedExceptions = IllegalArgumentException.class )
 585     public void testOpensWithBadName(String pn, String ignore) {
 586         ModuleDescriptor.module("foo").opens(pn);
 587     }
 588 
 589     @Test(expectedExceptions = NullPointerException.class )
 590     public void testOpensWithNullExports() {
 591         ModuleDescriptor.module("foo").opens((Opens) null);
 592     }
 593 
 594     @Test(expectedExceptions = NullPointerException.class )
 595     public void testOpensWithNullTargets() {
 596         ModuleDescriptor.module("foo").opens("p", (Set<String>) null);
 597     }
 598 
 599     public void testOpensEqualsAndHashCode() {
 600         Opens o1, o2;
 601 
 602         o1 = opens("p");
 603         o2 = opens("p");
 604         assertEquals(o1, o2);
 605         assertTrue(o1.hashCode() == o1.hashCode());



 606 
 607         o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 608         o2 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");

 609         assertEquals(o1, o2);
 610         assertTrue(o1.hashCode() == o2.hashCode());



 611 
 612         o1 = opens("p");
 613         o2 = opens("q");

 614         assertNotEquals(o1, o2);



 615 
 616         o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 617         o2 = opens(Set.of(), "p");










 618         assertNotEquals(o1, o2);


 619     }
 620 
 621     public void testOpensToString() {
 622         String s = ModuleDescriptor.module("foo")
 623                 .opens("p1", Set.of("bar"))
 624                 .build()
 625                 .opens()
 626                 .iterator()
 627                 .next()
 628                 .toString();
 629         assertTrue(s.contains("p1"));
 630         assertTrue(s.contains("bar"));
 631     }
 632 
 633 
 634     // uses
 635 
 636     public void testUses() {
 637         Set<String> uses
 638             = ModuleDescriptor.module("foo")
 639                 .uses("p.S")
 640                 .uses("q.S")
 641                 .build()
 642                 .uses();
 643         assertTrue(uses.size() == 2);
 644         assertTrue(uses.contains("p.S"));
 645         assertTrue(uses.contains("q.S"));
 646     }
 647 
 648     @Test(expectedExceptions = IllegalStateException.class)
 649     public void testUsesWithDuplicate() {
 650         ModuleDescriptor.module("foo").uses("p.S").uses("p.S");





 651     }
 652 
 653     @Test(dataProvider = "invalidjavaidentifiers",
 654           expectedExceptions = IllegalArgumentException.class )
 655     public void testUsesWithBadName(String service, String ignore) {
 656         ModuleDescriptor.module("foo").uses(service);
 657     }
 658 
 659 
 660     // provides
 661 
 662     private Provides provides(String st, String pc) {
 663         return ModuleDescriptor.module("foo")
 664             .provides(st, pc)









 665             .build()
 666             .provides()
 667             .iterator()
 668             .next();
 669     }
 670 
 671     public void testProvidesWithProvides() {
 672         Provides p1 = provides("p.S", "q.S1");
 673         ModuleDescriptor descriptor = ModuleDescriptor.module("m")
 674                 .provides(p1)
 675                 .build();
 676         Provides p2 = descriptor.provides().iterator().next();
 677         assertEquals(p1, p2);
 678     }
 679 
 680 
 681     public void testProvides() {
 682         Set<Provides> set = ModuleDescriptor.module("foo")
 683                 .provides("p.S", List.of("q.P1", "q.P2"))
 684                 .build()
 685                 .provides();
 686         assertTrue(set.size() == 1);
 687 
 688         Provides p = set.iterator().next();
 689         assertEquals(p, p);
 690         assertEquals(p.service(), "p.S");
 691         assertTrue(p.providers().size() == 2);
 692         assertEquals(p.providers().get(0), "q.P1");
 693         assertEquals(p.providers().get(1), "q.P2");
 694     }
 695 
 696     @Test(expectedExceptions = IllegalStateException.class )
 697     public void testProvidesWithDuplicateProvides() {
 698         Provides p = provides("p.S", "q.S2");
 699         ModuleDescriptor.module("m").provides("p.S", "q.S1").provides(p);
 700     }
 701 
 702     @Test(expectedExceptions = IllegalArgumentException.class )
 703     public void testProvidesWithEmptySet() {
 704         ModuleDescriptor.module("foo").provides("p.Service", Collections.emptyList());










 705     }
 706 
 707     @Test(dataProvider = "invalidjavaidentifiers",
 708           expectedExceptions = IllegalArgumentException.class )
 709     public void testProvidesWithBadService(String service, String ignore) {
 710         ModuleDescriptor.module("foo").provides(service, "p.Provider");
 711     }
 712 
 713     @Test(dataProvider = "invalidjavaidentifiers",
 714           expectedExceptions = IllegalArgumentException.class )
 715     public void testProvidesWithBadProvider(String provider, String ignore) {
 716         ModuleDescriptor.module("foo").provides("p.Service", provider);


 717     }
 718 
 719     @Test(expectedExceptions = NullPointerException.class )
 720     public void testProvidesWithNullProvides() {
 721         ModuleDescriptor.module("foo").provides((Provides) null);
 722     }
 723 
 724     @Test(expectedExceptions = NullPointerException.class )
 725     public void testProvidesWithNullProviders() {
 726         ModuleDescriptor.module("foo").provides("p.S", (List<String>) null);
 727     }
 728 
 729     public void testProvidesEqualsAndHashCode() {
 730         Provides p1, p2;
 731 
 732         p1 = provides("p.S", "q.S1");
 733         p2 = provides("p.S", "q.S1");
 734         assertEquals(p1, p2);
 735         assertTrue(p1.hashCode() == p2.hashCode());



 736 
 737         p1 = provides("p.S", "q.S1");
 738         p2 = provides("p.S", "q.S2");

 739         assertNotEquals(p1, p2);



 740 
 741         p1 = provides("p.S", "q.S1");
 742         p2 = provides("p.S2", "q.S1");

 743         assertNotEquals(p1, p2);


 744     }
 745 
 746     // contains








 747 
 748     public void testContains() {
 749         Set<String> packages = ModuleDescriptor.module("foo")
 750                 .contains("p")
 751                 .contains("q")
 752                 .build()
 753                 .packages();
 754         assertTrue(packages.size() == 2);
 755         assertTrue(packages.contains("p"));
 756         assertTrue(packages.contains("q"));
 757     }
 758 
 759     public void testContainsWithEmptySet() {
 760         Set<String> packages = ModuleDescriptor.module("foo")
 761                 .contains(Collections.emptySet())












 762                 .build()
 763                 .packages();
 764         assertTrue(packages.size() == 0);
 765     }
 766 
 767     @Test(expectedExceptions = IllegalStateException.class)
 768     public void testContainsWithDuplicate() {
 769         ModuleDescriptor.module("foo").contains("p").contains("p");





 770     }
 771 
 772     @Test(expectedExceptions = IllegalStateException.class)
 773     public void testContainsWithExportedPackage() {
 774         ModuleDescriptor.module("foo").exports("p").contains("p");





 775     }
 776 
 777     @Test(dataProvider = "invalidjavaidentifiers",
 778           expectedExceptions = IllegalArgumentException.class )
 779     public void testContainsWithBadName(String pn, String ignore) {
 780         ModuleDescriptor.module("foo").contains(pn);




 781     }
 782 









 783 
 784     // packages








 785 
 786     public void testPackages() {
 787         Set<String> packages = ModuleDescriptor.module("foo")
 788                 .exports("p")
 789                 .contains("q")
 790                 .build()
 791                 .packages();
 792         assertTrue(packages.size() == 2);




















 793         assertTrue(packages.contains("p"));
 794         assertTrue(packages.contains("q"));
 795     }
 796 





























 797 
 798     // name
 799 
 800     public void testModuleName() {
 801         String mn = ModuleDescriptor.module("foo").build().name();
 802         assertEquals(mn, "foo");
 803     }
 804 
 805     @Test(dataProvider = "invalidjavaidentifiers",
 806           expectedExceptions = IllegalArgumentException.class )
 807     public void testBadModuleName(String mn, String ignore) {
 808         ModuleDescriptor.module(mn);
 809     }
 810 
 811 
 812     // version
 813 
 814     public void testVersion1() {
 815         Version v1 = Version.parse("1.0");
 816         Version v2 = ModuleDescriptor.module("foo")
 817                 .version(v1)
 818                 .build()
 819                 .version()
 820                 .get();
 821         assertEquals(v1, v2);
 822     }
 823 
 824     public void testVersion2() {
 825         String vs = "1.0";
 826         Version v1 = ModuleDescriptor.module("foo")
 827                 .version(vs)
 828                 .build()
 829                 .version()
 830                 .get();
 831         Version v2 = Version.parse(vs);
 832         assertEquals(v1, v2);
 833     }
 834 
 835     @Test(expectedExceptions = NullPointerException.class )
 836     public void testNullVersion1() {
 837         ModuleDescriptor.module("foo").version((Version) null);
 838     }
 839 
 840     @Test(expectedExceptions = IllegalArgumentException.class )
 841     public void testNullVersion2() {
 842         ModuleDescriptor.module("foo").version((String) null);
 843     }
 844 
 845     @Test(expectedExceptions = IllegalArgumentException.class )
 846     public void testEmptyVersion() {
 847         ModuleDescriptor.module("foo").version("");
 848     }
 849 
 850 
 851     // toNameAndVersion
 852 
 853     public void testToNameAndVersion() {
 854         ModuleDescriptor md1 = ModuleDescriptor.module("foo").build();
 855         assertEquals(md1.toNameAndVersion(), "foo");
 856 
 857         ModuleDescriptor md2 = ModuleDescriptor.module("foo").version("1.0").build();
 858         assertEquals(md2.toNameAndVersion(), "foo@1.0");
 859     }
 860 
 861 
 862     // open modules
 863 
 864     public void testOpenModules() {
 865         ModuleDescriptor descriptor = ModuleDescriptor.openModule("m")
 866                 .requires("java.base")
 867                 .contains("p")

 868                 .build();



 869         assertTrue(descriptor.isOpen());
 870         assertTrue(descriptor.packages().size() == 1);
 871         assertTrue(descriptor.packages().contains("p"));
 872         assertTrue(descriptor.exports().isEmpty());



















 873     }
 874 
 875     @Test(expectedExceptions = IllegalStateException.class)
 876     public void testOpensOnWeakModule1() {
 877         ModuleDescriptor.openModule("foo").opens("p");
 878     }
 879 
 880     @Test(expectedExceptions = IllegalStateException.class)
 881     public void testOpensOnWeakModule2() {
 882         ModuleDescriptor.openModule("foo").opens("p", Set.of("bar"));
 883     }
 884 
 885     public void testIsOpen() {
 886         assertFalse(ModuleDescriptor.module("m").build().isOpen());
 887         assertFalse(ModuleDescriptor.automaticModule("m").build().isOpen());
 888         assertTrue(ModuleDescriptor.openModule("m").build().isOpen());
 889     }
 890 
 891 
 892     // automatic modules
 893 






















































 894     public void testIsAutomatic() {
 895         ModuleDescriptor descriptor1 = ModuleDescriptor.module("foo").build();
 896         assertFalse(descriptor1.isAutomatic());
 897 
 898         ModuleDescriptor descriptor2 = ModuleDescriptor.openModule("foo").build();
 899         assertFalse(descriptor2.isAutomatic());
 900 
 901         ModuleDescriptor descriptor3 = ModuleDescriptor.automaticModule("foo").build();
 902         assertTrue(descriptor3.isAutomatic());
 903     }
 904 
 905     // isSynthetic
 906     public void testIsSynthetic() {
 907         assertFalse(Object.class.getModule().getDescriptor().isSynthetic());
 908 
 909         ModuleDescriptor descriptor1 = ModuleDescriptor.module("foo").build();
 910         assertFalse(descriptor1.isSynthetic());
 911 
 912         ModuleDescriptor descriptor2 = ModuleDescriptor.openModule("foo").build();
 913         assertFalse(descriptor2.isSynthetic());















 914 
 915         ModuleDescriptor descriptor3 = ModuleDescriptor.automaticModule("foo").build();
 916         assertFalse(descriptor3.isSynthetic());









 917     }
 918 
 919 
 920     // mainClass
 921 
 922     public void testMainClass() {
 923         String mainClass
 924             = ModuleDescriptor.module("foo").mainClass("p.Main").build().mainClass().get();
 925         assertEquals(mainClass, "p.Main");
 926     }
 927 





 928     @Test(dataProvider = "invalidjavaidentifiers",
 929           expectedExceptions = IllegalArgumentException.class )
 930     public void testMainClassWithBadName(String mainClass, String ignore) {
 931         Builder builder = ModuleDescriptor.module("foo");
 932         builder.mainClass(mainClass);
 933     }
 934 
 935 
 936     // osName
 937 
 938     public void testOsName() {
 939         String osName = ModuleDescriptor.module("foo").osName("Linux").build().osName().get();
 940         assertEquals(osName, "Linux");
 941     }
 942 
 943     @Test(expectedExceptions = IllegalArgumentException.class)
 944     public void testNullOsName() {
 945         ModuleDescriptor.module("foo").osName(null);
 946     }
 947 
 948     @Test(expectedExceptions = IllegalArgumentException.class)
 949     public void testEmptyOsName() {
 950         ModuleDescriptor.module("foo").osName("");
 951     }
 952 
 953 
 954     // osArch
 955 
 956     public void testOsArch() {
 957         String osArch = ModuleDescriptor.module("foo").osName("arm").build().osName().get();
 958         assertEquals(osArch, "arm");
 959     }
 960 
 961     @Test(expectedExceptions = IllegalArgumentException.class)
 962     public void testNullOsArch() {
 963         ModuleDescriptor.module("foo").osArch(null);
 964     }
 965 
 966     @Test(expectedExceptions = IllegalArgumentException.class)
 967     public void testEmptyOsArch() {
 968         ModuleDescriptor.module("foo").osArch("");
 969     }
 970 
 971 
 972     // osVersion
 973 
 974     public void testOsVersion() {
 975         String osVersion = ModuleDescriptor.module("foo").osName("11.2").build().osName().get();
 976         assertEquals(osVersion, "11.2");
 977     }
 978 
 979     @Test(expectedExceptions = IllegalArgumentException.class)
 980     public void testNullOsVersion() {
 981         ModuleDescriptor.module("foo").osVersion(null);
 982     }
 983 
 984     @Test(expectedExceptions = IllegalArgumentException.class)
 985     public void testEmptyOsVersion() {
 986         ModuleDescriptor.module("foo").osVersion("");
 987     }
 988 
 989     // reads
 990 
 991     private static InputStream EMPTY_INPUT_STREAM = new InputStream() {
 992         @Override
 993         public int read() {
 994             return -1;
 995         }
 996     };
 997 
 998     private static InputStream FAILING_INPUT_STREAM = new InputStream() {
 999         @Override
1000         public int read() throws IOException {
1001             throw new IOException();
1002         }
1003     };
1004 
1005     // basic test reading module-info.class
1006     public void testRead() throws Exception {
1007         Module base = Object.class.getModule();
1008 
1009         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1010             ModuleDescriptor descriptor = ModuleDescriptor.read(in);
1011             assertTrue(in.read() == -1); // all bytes read
1012             assertEquals(descriptor.name(), "java.base");
1013         }
1014 
1015         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1016             ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());
1017             ModuleDescriptor descriptor = ModuleDescriptor.read(bb);
1018             assertFalse(bb.hasRemaining()); // no more remaining bytes
1019             assertEquals(descriptor.name(), "java.base");
1020         }
1021     }
1022     /**
1023      * Test ModuleDescriptor with a packager finder
1024      */
1025     public void testReadsWithPackageFinder() throws Exception {
1026         ModuleDescriptor descriptor = ModuleDescriptor.module("foo")
1027                 .requires("java.base")
1028                 .build();
1029 
1030         ByteArrayOutputStream baos = new ByteArrayOutputStream();
1031         ModuleInfoWriter.write(descriptor, baos);
1032         ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
1033 
1034         descriptor = ModuleDescriptor.read(bb, () -> Set.of("p", "q"));
1035 
1036         assertTrue(descriptor.packages().size() == 2);
1037         assertTrue(descriptor.packages().contains("p"));
1038         assertTrue(descriptor.packages().contains("q"));
1039     }
1040 
1041     /**
1042      * Test ModuleDescriptor with a packager finder that doesn't return the
1043      * complete set of packages.
1044      */
1045     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1046     public void testReadsWithBadPackageFinder() throws Exception {
1047         ModuleDescriptor descriptor = ModuleDescriptor.module("foo")
1048                 .requires("java.base")
1049                 .exports("p")
1050                 .build();
1051 
1052         ByteArrayOutputStream baos = new ByteArrayOutputStream();
1053         ModuleInfoWriter.write(descriptor, baos);
1054         ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
1055 
1056         // package finder returns a set that doesn't include p
1057         ModuleDescriptor.read(bb, () -> Set.of("q"));
1058     }
1059 
1060     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1061     public void testReadFromEmptyInputStream() throws Exception {
1062         ModuleDescriptor.read(EMPTY_INPUT_STREAM);
1063     }
1064 
1065     @Test(expectedExceptions = IOException.class)
1066     public void testReadFromFailingInputStream() throws Exception {
1067         ModuleDescriptor.read(FAILING_INPUT_STREAM);
1068     }
1069 
1070     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1071     public void testReadFromEmptyBuffer() {
1072         ByteBuffer bb = ByteBuffer.allocate(0);
1073         ModuleDescriptor.read(bb);
1074     }
1075 
1076     // The requires table for java.base must be 0 length
1077     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1078     public void testReadOfJavaBaseWithRequires() {
1079         ModuleDescriptor descriptor
1080             = ModuleDescriptor.module("java.base")
1081                 .requires("other")
1082                 .build();
1083         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1084         ModuleDescriptor.read(bb);
1085     }
1086 
1087     // The requires table must have an entry for java.base
1088     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1089     public void testReadWithEmptyRequires() {
1090         ModuleDescriptor descriptor = ModuleDescriptor.module("m1").build();

1091         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1092         ModuleDescriptor.read(bb);
1093     }
1094 
1095     // The requires table must have an entry for java.base
1096     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1097     public void testReadWithNoRequiresBase() {
1098         ModuleDescriptor descriptor
1099             = ModuleDescriptor.module("m1")
1100                 .requires("m2")
1101                 .build();
1102         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1103         ModuleDescriptor.read(bb);
1104     }
1105 
1106     public void testReadWithNull() throws Exception {
1107         Module base = Object.class.getModule();
1108 
1109         try {
1110             ModuleDescriptor.read((InputStream)null);
1111             assertTrue(false);
1112         } catch (NullPointerException expected) { }
1113 
1114 
1115         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1116             try {
1117                 ModuleDescriptor.read(in, null);
1118                 assertTrue(false);
1119             } catch (NullPointerException expected) { }
1120         }
1121 
1122         try {
1123             ModuleDescriptor.read((ByteBuffer)null);
1124             assertTrue(false);
1125         } catch (NullPointerException expected) { }
1126 
1127 
1128         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1129             ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());
1130             try {
1131                 ModuleDescriptor.read(bb, null);
1132                 assertTrue(false);
1133             } catch (NullPointerException expected) { }
1134         }
1135     }
1136 
1137 
1138     // equals/hashCode/compareTo/toString
1139 
1140     public void testEqualsAndHashCode() {
1141         ModuleDescriptor md1 = ModuleDescriptor.module("foo").build();
1142         ModuleDescriptor md2 = ModuleDescriptor.module("foo").build();
1143         assertEquals(md1, md1);
1144         assertEquals(md1.hashCode(), md2.hashCode());


1145     }
1146 
1147     public void testCompare() {
1148         ModuleDescriptor md1 = ModuleDescriptor.module("foo").build();
1149         ModuleDescriptor md2 = ModuleDescriptor.module("bar").build();
1150         int n = "foo".compareTo("bar");
1151         assertTrue(md1.compareTo(md2) == n);
1152         assertTrue(md2.compareTo(md1) == -n);






















1153     }
1154 
1155     public void testToString() {
1156         String s = ModuleDescriptor.module("m1").requires("m2").exports("p1").build().toString();




1157         assertTrue(s.contains("m1"));
1158         assertTrue(s.contains("m2"));
1159         assertTrue(s.contains("p1"));
1160     }
1161 
1162 }
   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.module
  27  *          java.base/jdk.internal.misc
  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.lang.reflect.Module;
  45 import java.nio.ByteBuffer;
  46 import java.util.ArrayList;
  47 import java.util.Collections;
  48 import java.util.EnumSet;
  49 import java.util.HashSet;
  50 import java.util.Iterator;
  51 import java.util.List;
  52 import java.util.Objects;
  53 import java.util.Set;
  54 import java.util.stream.Collectors;
  55 
  56 import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
  57 
  58 import jdk.internal.misc.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 = "invalidjavaidentifiers")
  68     public Object[][] invalidJavaIdentifiers() {
  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         };
  87     }
  88 
  89 
  90     // requires
  91 
  92     private Requires requires(Set<Modifier> mods, String mn) {
  93         return requires(mods, mn, null);





  94     }
  95 
  96     private Requires requires(Set<Modifier> mods, String mn, Version v) {
  97         Builder builder = ModuleDescriptor.newModule("m");
  98         if (v == null) {
  99             builder.requires(mods, mn);
 100         } else {
 101             builder.requires(mods, mn, v);
 102         }
 103         Set<Requires> requires = builder.build().requires();
 104         assertTrue(requires.size() == 2);
 105         Iterator<Requires> iterator = requires.iterator();
 106         Requires r = iterator.next();
 107         if (r.name().equals("java.base")) {
 108             r = iterator.next();
 109         } else {
 110             Requires other = iterator.next();
 111             assertEquals(other.name(), "java.base");
 112         }
 113         return r;
 114     }
 115 
 116     private Requires requires(String mn) {
 117         return requires(Collections.emptySet(), mn);
 118     }
 119 
 120     public void testRequiresWithRequires() {
 121         Requires r1 = requires("foo");
 122         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").requires(r1).build();
 123         Requires r2 = descriptor.requires().iterator().next();
 124         assertEquals(r1, r2);
 125     }
 126 
 127     public void testRequiresWithNoModifiers() {
 128         Requires r = requires(EnumSet.noneOf(Requires.Modifier.class), "foo");
 129         assertEquals(r, r);
 130         assertTrue(r.compareTo(r) == 0);
 131         assertTrue(r.modifiers().isEmpty());
 132         assertEquals(r.name(), "foo");
 133         assertFalse(r.compiledVersion().isPresent());
 134     }
 135 
 136     public void testRequiresWithOneModifier() {
 137         Requires r = requires(EnumSet.of(TRANSITIVE), "foo");
 138         assertEquals(r, r);
 139         assertTrue(r.compareTo(r) == 0);
 140         assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE));
 141         assertEquals(r.name(), "foo");
 142         assertFalse(r.compiledVersion().isPresent());


 157         assertTrue(r.compareTo(r) == 0);
 158         assertEquals(r.modifiers(), EnumSet.of(TRANSITIVE, STATIC, SYNTHETIC, MANDATED));
 159         assertEquals(r.name(), "foo");
 160         assertFalse(r.compiledVersion().isPresent());
 161     }
 162 
 163     public void testRequiresWithCompiledVersion() {
 164         Version v = Version.parse("1.0");
 165         Requires r = requires(Set.of(), "foo", v);
 166         assertEquals(r, r);
 167         assertTrue(r.compareTo(r) == 0);
 168         assertEquals(r.modifiers(), Set.of());
 169         assertEquals(r.name(), "foo");
 170         assertTrue(r.compiledVersion().isPresent());
 171         assertEquals(r.compiledVersion().get().toString(), "1.0");
 172     }
 173 
 174     @Test(expectedExceptions = IllegalStateException.class)
 175     public void testRequiresWithDuplicatesRequires() {
 176         Requires r = requires("foo");
 177         ModuleDescriptor.newModule("m").requires(r).requires(r);
 178     }
 179 
 180     @Test(expectedExceptions = IllegalArgumentException.class)
 181     public void testRequiresSelfWithRequires() {
 182         Requires r = requires("foo");
 183         ModuleDescriptor.newModule("foo").requires(r);
 184     }
 185 
 186     @Test(expectedExceptions = IllegalArgumentException.class)
 187     public void testRequiresSelfWithNoModifier() {
 188         ModuleDescriptor.newModule("m").requires("m");
 189     }
 190 
 191     @Test(expectedExceptions = IllegalArgumentException.class)
 192     public void testRequiresSelfWithOneModifier() {
 193         ModuleDescriptor.newModule("m").requires(Set.of(TRANSITIVE), "m");
 194     }
 195 
 196     @Test(expectedExceptions = IllegalArgumentException.class)
 197     public void testRequiresSelfWithAllModifiers() {
 198         ModuleDescriptor.newModule("m").requires(EnumSet.allOf(Modifier.class), "m");
 199     }
 200 
 201     @Test(dataProvider = "invalidjavaidentifiers",
 202           expectedExceptions = IllegalArgumentException.class )
 203     public void testRequiresWithBadModuleName(String mn, String ignore) {
 204         requires(EnumSet.noneOf(Modifier.class), mn);
 205     }
 206 
 207     @Test(expectedExceptions = NullPointerException.class)
 208     public void testRequiresWithNullRequires() {
 209         ModuleDescriptor.newModule("m").requires((Requires) null);
 210     }
 211 
 212     @Test(expectedExceptions = NullPointerException.class)
 213     public void testRequiresWithNullModifiers() {
 214         ModuleDescriptor.newModule("m").requires(null, "foo");
 215     }
 216 
 217     @Test(expectedExceptions = NullPointerException.class)
 218     public void testRequiresWithNullVersion() {
 219         ModuleDescriptor.newModule("m").requires(Set.of(), "foo", null);
 220     }
 221 
 222     public void testRequiresCompare() {
 223         Requires r1 = requires(EnumSet.noneOf(Modifier.class), "foo");
 224         Requires r2 = requires(EnumSet.noneOf(Modifier.class), "bar");
 225         int n = "foo".compareTo("bar");
 226         assertTrue(r1.compareTo(r2) == n);
 227         assertTrue(r2.compareTo(r1) == -n);
 228     }
 229 
 230     public void testRequiresCompareWithDifferentModifiers() {
 231         Requires r1 = requires(EnumSet.of(TRANSITIVE), "foo");
 232         Requires r2 = requires(EnumSet.of(SYNTHETIC), "foo");
 233         int n = Integer.compare(1 << TRANSITIVE.ordinal(), 1 << SYNTHETIC.ordinal());
 234         assertTrue(r1.compareTo(r2) == n);
 235         assertTrue(r2.compareTo(r1) == -n);
 236     }
 237 
 238     public void testRequiresCompareWithSameModifiers() {
 239         Requires r1 = requires(EnumSet.of(SYNTHETIC), "foo");


 279         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 280         r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 281         assertEquals(r1, r2);
 282         assertTrue(r1.hashCode() == r2.hashCode());
 283 
 284         Version v2 = Version.parse("2.0");
 285         r1 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v1);
 286         r2 = requires(EnumSet.allOf(Requires.Modifier.class), "foo", v2);
 287         assertNotEquals(r1, r2);
 288     }
 289 
 290     public void testRequiresToString() {
 291         Requires r = requires(EnumSet.noneOf(Modifier.class), "foo");
 292         assertTrue(r.toString().contains("foo"));
 293     }
 294 
 295 
 296     // exports
 297 
 298     private Exports exports(Set<Exports.Modifier> mods, String pn) {
 299         return ModuleDescriptor.newModule("foo")
 300             .exports(mods, pn)
 301             .build()
 302             .exports()
 303             .iterator()
 304             .next();
 305     }
 306 
 307     private Exports exports(String pn) {
 308         return exports(Set.of(), pn);
 309     }
 310 
 311     private Exports exports(Set<Exports.Modifier> mods, String pn, String target) {
 312         return ModuleDescriptor.newModule("foo")
 313             .exports(mods, pn, Set.of(target))
 314             .build()
 315             .exports()
 316             .iterator()
 317             .next();
 318     }
 319 
 320     private Exports exports(String pn, String target) {
 321         return exports(Set.of(), pn, target);
 322     }
 323 
 324 
 325     public void testExportsExports() {
 326         Exports e1 = exports("p");
 327         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").exports(e1).build();
 328         Exports e2 = descriptor.exports().iterator().next();
 329         assertEquals(e1, e2);
 330     }
 331 
 332     public void testExportsToAll() {
 333         Exports e = exports("p");
 334         assertEquals(e, e);
 335         assertTrue(e.modifiers().isEmpty());
 336         assertEquals(e.source(), "p");
 337         assertFalse(e.isQualified());
 338         assertTrue(e.targets().isEmpty());
 339     }
 340 
 341     public void testExportsToTarget() {
 342         Exports e = exports("p", "bar");
 343         assertEquals(e, e);
 344         assertTrue(e.modifiers().isEmpty());
 345         assertEquals(e.source(), "p");
 346         assertTrue(e.isQualified());
 347         assertTrue(e.targets().size() == 1);
 348         assertTrue(e.targets().contains("bar"));
 349     }
 350 
 351     public void testExportsToTargets() {
 352         Set<String> targets = new HashSet<>();
 353         targets.add("bar");
 354         targets.add("gus");
 355         Exports e
 356             = ModuleDescriptor.newModule("foo")
 357                 .exports("p", targets)
 358                 .build()
 359                 .exports()
 360                 .iterator()
 361                 .next();
 362         assertEquals(e, e);
 363         assertTrue(e.modifiers().isEmpty());
 364         assertEquals(e.source(), "p");
 365         assertTrue(e.isQualified());
 366         assertTrue(e.targets().size() == 2);
 367         assertTrue(e.targets().contains("bar"));
 368         assertTrue(e.targets().contains("gus"));
 369     }
 370 
 371     public void testExportsToAllWithModifier() {
 372         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 373         assertEquals(e, e);
 374         assertTrue(e.modifiers().size() == 1);
 375         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 376         assertEquals(e.source(), "p");
 377         assertFalse(e.isQualified());
 378         assertTrue(e.targets().isEmpty());
 379     }
 380 
 381     public void testExportsToTargetWithModifier() {
 382         Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p", "bar");
 383         assertEquals(e, e);
 384         assertTrue(e.modifiers().size() == 1);
 385         assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
 386         assertEquals(e.source(), "p");
 387         assertTrue(e.isQualified());
 388         assertTrue(e.targets().size() == 1);
 389         assertTrue(e.targets().contains("bar"));
 390     }
 391 
 392     @Test(expectedExceptions = IllegalStateException.class)
 393     public void testExportsWithDuplicate1() {
 394         Exports e = exports("p");
 395         ModuleDescriptor.newModule("foo").exports(e).exports(e);
 396     }
 397 
 398     @Test(expectedExceptions = IllegalStateException.class)
 399     public void testExportsWithDuplicate2() {
 400         ModuleDescriptor.newModule("foo").exports("p").exports("p");










 401     }
 402 
 403     @Test(expectedExceptions = IllegalArgumentException.class )
 404     public void testExportsWithEmptySet() {
 405         ModuleDescriptor.newModule("foo").exports("p", Collections.emptySet());
 406     }
 407 
 408     @Test(dataProvider = "invalidjavaidentifiers",
 409           expectedExceptions = IllegalArgumentException.class )
 410     public void testExportsWithBadName(String pn, String ignore) {
 411         ModuleDescriptor.newModule("foo").exports(pn);
 412     }
 413 
 414     @Test(expectedExceptions = NullPointerException.class )
 415     public void testExportsWithNullExports() {
 416         ModuleDescriptor.newModule("foo").exports((Exports) null);
 417     }
 418 
 419     @Test(expectedExceptions = NullPointerException.class )
 420     public void testExportsWithNullTargets() {
 421         ModuleDescriptor.newModule("foo").exports("p", (Set<String>) null);
 422     }
 423 
 424     public void testExportsCompare() {
 425         Exports e1 = exports("p");
 426         Exports e2 = exports("p");


 427         assertEquals(e1, e2);
 428         assertTrue(e1.hashCode() == e2.hashCode());
 429         assertTrue(e1.compareTo(e2) == 0);
 430         assertTrue(e2.compareTo(e1) == 0);
 431     }
 432 
 433     public void testExportsCompareWithSameModifiers() {
 434         Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 435         Exports e2 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 436         assertEquals(e1, e2);
 437         assertTrue(e1.hashCode() == e2.hashCode());
 438         assertTrue(e1.compareTo(e2) == 0);
 439         assertTrue(e2.compareTo(e1) == 0);
 440     }
 441 
 442     public void testExportsCompareWithDifferentModifiers() {
 443         Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
 444         Exports e2 = exports("p");
 445         assertNotEquals(e1, e2);
 446         assertTrue(e1.compareTo(e2) == 1);
 447         assertTrue(e2.compareTo(e1) == -1);
 448     }
 449 
 450     public void testExportsCompareWithSameTargets() {
 451         Exports e1 = exports("p", "x");
 452         Exports e2 = exports("p", "x");
 453         assertEquals(e1, e2);
 454         assertTrue(e1.hashCode() == e2.hashCode());
 455         assertTrue(e1.compareTo(e2) == 0);
 456         assertTrue(e2.compareTo(e1) == 0);
 457     }
 458 
 459     public void testExportsCompareWithDifferentTargets() {
 460         Exports e1 = exports("p", "y");
 461         Exports e2 = exports("p", "x");
 462         assertNotEquals(e1, e2);
 463         assertTrue(e1.compareTo(e2) == 1);
 464         assertTrue(e2.compareTo(e1) == -1);
 465     }
 466 
 467     public void testExportsToString() {
 468         String s = ModuleDescriptor.newModule("foo")
 469             .exports("p1", Set.of("bar"))
 470             .build()
 471             .exports()
 472             .iterator()
 473             .next()
 474             .toString();
 475         assertTrue(s.contains("p1"));
 476         assertTrue(s.contains("bar"));
 477     }
 478 
 479 
 480     // opens
 481 
 482     private Opens opens(Set<Opens.Modifier> mods, String pn) {
 483         return ModuleDescriptor.newModule("foo")
 484                 .opens(mods, pn)
 485                 .build()
 486                 .opens()
 487                 .iterator()
 488                 .next();
 489     }
 490 
 491     private Opens opens(String pn) {
 492         return opens(Set.of(), pn);
 493     }
 494 
 495     private Opens opens(Set<Opens.Modifier> mods, String pn, String target) {
 496         return ModuleDescriptor.newModule("foo")
 497                 .opens(mods, pn, Set.of(target))
 498                 .build()
 499                 .opens()
 500                 .iterator()
 501                 .next();
 502     }
 503 
 504     private Opens opens(String pn, String target) {
 505         return opens(Set.of(), pn, target);
 506     }
 507 
 508     public void testOpensOpens() {
 509         Opens o1 = opens("p");
 510         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").opens(o1).build();
 511         Opens o2 = descriptor.opens().iterator().next();
 512         assertEquals(o1, o2);
 513     }
 514 
 515     public void testOpensToAll() {
 516         Opens o = opens("p");
 517         assertEquals(o, o);
 518         assertTrue(o.modifiers().isEmpty());
 519         assertEquals(o.source(), "p");
 520         assertFalse(o.isQualified());
 521         assertTrue(o.targets().isEmpty());
 522     }
 523 
 524 
 525     public void testOpensToTarget() {
 526         Opens o = opens("p", "bar");
 527         assertEquals(o, o);
 528         assertTrue(o.modifiers().isEmpty());
 529         assertEquals(o.source(), "p");
 530         assertTrue(o.isQualified());
 531         assertTrue(o.targets().size() == 1);
 532         assertTrue(o.targets().contains("bar"));
 533     }
 534 
 535     public void testOpensToTargets() {
 536         Set<String> targets = new HashSet<>();
 537         targets.add("bar");
 538         targets.add("gus");
 539         Opens o = ModuleDescriptor.newModule("foo")
 540                 .opens("p", targets)
 541                 .build()
 542                 .opens()
 543                 .iterator()
 544                 .next();
 545         assertEquals(o, o);
 546         assertTrue(o.modifiers().isEmpty());
 547         assertEquals(o.source(), "p");
 548         assertTrue(o.isQualified());
 549         assertTrue(o.targets().size() == 2);
 550         assertTrue(o.targets().contains("bar"));
 551         assertTrue(o.targets().contains("gus"));
 552     }
 553 


























 554     @Test(expectedExceptions = IllegalStateException.class)
 555     public void testOpensWithDuplicate1() {
 556         Opens o = opens("p");
 557         ModuleDescriptor.newModule("foo").opens(o).opens(o);
 558     }
 559 
 560     @Test(expectedExceptions = IllegalStateException.class)
 561     public void testOpensWithDuplicate2() {
 562         ModuleDescriptor.newModule("foo").opens("p").opens("p");










 563     }
 564 
 565     @Test(expectedExceptions = IllegalArgumentException.class )
 566     public void testOpensWithEmptySet() {
 567         ModuleDescriptor.newModule("foo").opens("p", Collections.emptySet());
 568     }
 569 
 570     @Test(dataProvider = "invalidjavaidentifiers",
 571             expectedExceptions = IllegalArgumentException.class )
 572     public void testOpensWithBadName(String pn, String ignore) {
 573         ModuleDescriptor.newModule("foo").opens(pn);
 574     }
 575 
 576     @Test(expectedExceptions = NullPointerException.class )
 577     public void testOpensWithNullExports() {
 578         ModuleDescriptor.newModule("foo").opens((Opens) null);
 579     }
 580 
 581     @Test(expectedExceptions = NullPointerException.class )
 582     public void testOpensWithNullTargets() {
 583         ModuleDescriptor.newModule("foo").opens("p", (Set<String>) null);
 584     }
 585 
 586     public void testOpensCompare() {
 587         Opens o1 = opens("p");
 588         Opens o2 = opens("p");


 589         assertEquals(o1, o2);
 590         assertTrue(o1.hashCode() == o2.hashCode());
 591         assertTrue(o1.compareTo(o2) == 0);
 592         assertTrue(o2.compareTo(o1) == 0);
 593     }
 594 
 595     public void testOpensCompareWithSameModifiers() {
 596         Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 597         Opens o2 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 598         assertEquals(o1, o2);
 599         assertTrue(o1.hashCode() == o2.hashCode());
 600         assertTrue(o1.compareTo(o2) == 0);
 601         assertTrue(o2.compareTo(o1) == 0);
 602     }
 603 
 604     public void testOpensCompareWithDifferentModifiers() {
 605         Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
 606         Opens o2 = opens("p");
 607         assertNotEquals(o1, o2);
 608         assertTrue(o1.compareTo(o2) == 1);
 609         assertTrue(o2.compareTo(o1) == -1);
 610     }
 611 
 612     public void testOpensCompareWithSameTargets() {
 613         Opens o1 = opens("p", "x");
 614         Opens o2 = opens("p", "x");
 615         assertEquals(o1, o2);
 616         assertTrue(o1.hashCode() == o2.hashCode());
 617         assertTrue(o1.compareTo(o2) == 0);
 618         assertTrue(o2.compareTo(o1) == 0);
 619     }
 620 
 621     public void testOpensCompareWithDifferentTargets() {
 622         Opens o1 = opens("p", "y");
 623         Opens o2 = opens("p", "x");
 624         assertNotEquals(o1, o2);
 625         assertTrue(o1.compareTo(o2) == 1);
 626         assertTrue(o2.compareTo(o1) == -1);
 627     }
 628 
 629     public void testOpensToString() {
 630         String s = ModuleDescriptor.newModule("foo")
 631                 .opens("p1", Set.of("bar"))
 632                 .build()
 633                 .opens()
 634                 .iterator()
 635                 .next()
 636                 .toString();
 637         assertTrue(s.contains("p1"));
 638         assertTrue(s.contains("bar"));
 639     }
 640 
 641 
 642     // uses
 643 
 644     public void testUses() {
 645         Set<String> uses
 646             = ModuleDescriptor.newModule("foo")
 647                 .uses("p.S")
 648                 .uses("q.S")
 649                 .build()
 650                 .uses();
 651         assertTrue(uses.size() == 2);
 652         assertTrue(uses.contains("p.S"));
 653         assertTrue(uses.contains("q.S"));
 654     }
 655 
 656     @Test(expectedExceptions = IllegalStateException.class)
 657     public void testUsesWithDuplicate() {
 658         ModuleDescriptor.newModule("foo").uses("p.S").uses("p.S");
 659     }
 660 
 661     @Test(expectedExceptions = IllegalArgumentException.class)
 662     public void testUsesWithSimpleIdentifier() {
 663         ModuleDescriptor.newModule("foo").uses("S");
 664     }
 665 
 666     @Test(dataProvider = "invalidjavaidentifiers",
 667           expectedExceptions = IllegalArgumentException.class )
 668     public void testUsesWithBadName(String service, String ignore) {
 669         ModuleDescriptor.newModule("foo").uses(service);
 670     }
 671 
 672 
 673     // provides
 674 
 675     private Provides provides(String st, String pc) {
 676         return ModuleDescriptor.newModule("foo")
 677             .provides(st, List.of(pc))
 678             .build()
 679             .provides()
 680             .iterator()
 681             .next();
 682     }
 683 
 684     private Provides provides(String st, List<String> pns) {
 685         return ModuleDescriptor.newModule("foo")
 686                 .provides(st, pns)
 687                 .build()
 688                 .provides()
 689                 .iterator()
 690                 .next();
 691     }
 692 
 693     public void testProvidesWithProvides() {
 694         Provides p1 = provides("p.S", "q.S1");
 695         ModuleDescriptor descriptor = ModuleDescriptor.newModule("m")
 696                 .provides(p1)
 697                 .build();
 698         Provides p2 = descriptor.provides().iterator().next();
 699         assertEquals(p1, p2);
 700     }
 701 
 702 
 703     public void testProvides() {
 704         Set<Provides> set = ModuleDescriptor.newModule("foo")
 705                 .provides("p.S", List.of("q.P1", "q.P2"))
 706                 .build()
 707                 .provides();
 708         assertTrue(set.size() == 1);
 709 
 710         Provides p = set.iterator().next();
 711         assertEquals(p, p);
 712         assertEquals(p.service(), "p.S");
 713         assertTrue(p.providers().size() == 2);
 714         assertEquals(p.providers().get(0), "q.P1");
 715         assertEquals(p.providers().get(1), "q.P2");
 716     }
 717 
 718     @Test(expectedExceptions = IllegalStateException.class )
 719     public void testProvidesWithDuplicateProvides() {
 720         Provides p = provides("p.S", "q.S2");
 721         ModuleDescriptor.newModule("m").provides("p.S", List.of("q.S1")).provides(p);
 722     }
 723 
 724     @Test(expectedExceptions = IllegalArgumentException.class )
 725     public void testProvidesWithEmptySet() {
 726         ModuleDescriptor.newModule("foo").provides("p.Service", Collections.emptyList());
 727     }
 728 
 729     @Test(expectedExceptions = IllegalArgumentException.class )
 730     public void testProvidesWithSimpleIdentifier1() {
 731         ModuleDescriptor.newModule("foo").provides("S", List.of("q.P"));
 732     }
 733 
 734     @Test(expectedExceptions = IllegalArgumentException.class )
 735     public void testProvidesWithSimpleIdentifier2() {
 736         ModuleDescriptor.newModule("foo").provides("p.S", List.of("P"));
 737     }
 738 
 739     @Test(dataProvider = "invalidjavaidentifiers",
 740           expectedExceptions = IllegalArgumentException.class )
 741     public void testProvidesWithBadService(String service, String ignore) {
 742         ModuleDescriptor.newModule("foo").provides(service, List.of("p.Provider"));
 743     }
 744 
 745     @Test(dataProvider = "invalidjavaidentifiers",
 746           expectedExceptions = IllegalArgumentException.class )
 747     public void testProvidesWithBadProvider(String provider, String ignore) {
 748         List<String> names = new ArrayList<>(); // allows nulls
 749         names.add(provider);
 750         ModuleDescriptor.newModule("foo").provides("p.Service", names);
 751     }
 752 
 753     @Test(expectedExceptions = NullPointerException.class )
 754     public void testProvidesWithNullProvides() {
 755         ModuleDescriptor.newModule("foo").provides((Provides) null);
 756     }
 757 
 758     @Test(expectedExceptions = NullPointerException.class )
 759     public void testProvidesWithNullProviders() {
 760         ModuleDescriptor.newModule("foo").provides("p.S", (List<String>) null);
 761     }
 762 
 763     public void testProvidesCompare() {
 764         Provides p1 = provides("p.S", "q.S1");
 765         Provides p2 = provides("p.S", "q.S1");


 766         assertEquals(p1, p2);
 767         assertTrue(p1.hashCode() == p2.hashCode());
 768         assertTrue(p1.compareTo(p2) == 0);
 769         assertTrue(p2.compareTo(p1) == 0);
 770     }
 771 
 772     public void testProvidesCompareWithDifferentService() {
 773         Provides p1 = provides("p.S2", "q.S1");
 774         Provides p2 = provides("p.S1", "q.S1");
 775         assertNotEquals(p1, p2);
 776         assertTrue(p1.compareTo(p2) == 1);
 777         assertTrue(p2.compareTo(p1) == -1);
 778     }
 779 
 780     public void testProvidesCompareWithDifferentProviders1() {
 781         Provides p1 = provides("p.S", "q.S2");
 782         Provides p2 = provides("p.S", "q.S1");
 783         assertNotEquals(p1, p2);
 784         assertTrue(p1.compareTo(p2) == 1);
 785         assertTrue(p2.compareTo(p1) == -1);
 786     }
 787 
 788     public void testProvidesCompareWithDifferentProviders2() {
 789         Provides p1 = provides("p.S", List.of("q.S1", "q.S2"));
 790         Provides p2 = provides("p.S", "q.S1");
 791         assertNotEquals(p1, p2);
 792         assertTrue(p1.compareTo(p2) == 1);
 793         assertTrue(p2.compareTo(p1) == -1);
 794     }
 795 
 796     // packages
 797 
 798     public void testPackages1() {
 799         Set<String> packages = ModuleDescriptor.newModule("foo")
 800                 .packages(Set.of("p", "q"))

 801                 .build()
 802                 .packages();
 803         assertTrue(packages.size() == 2);
 804         assertTrue(packages.contains("p"));
 805         assertTrue(packages.contains("q"));
 806     }
 807 
 808     public void testPackages2() {
 809         Set<String> packages = ModuleDescriptor.newModule("foo")
 810                 .packages(Set.of("p"))
 811                 .packages(Set.of("q"))
 812                 .build()
 813                 .packages();
 814         assertTrue(packages.size() == 2);
 815         assertTrue(packages.contains("p"));
 816         assertTrue(packages.contains("q"));
 817     }
 818 
 819 
 820     public void testPackagesWithEmptySet() {
 821         Set<String> packages = ModuleDescriptor.newModule("foo")
 822                 .packages(Collections.emptySet())
 823                 .build()
 824                 .packages();
 825         assertTrue(packages.size() == 0);
 826     }
 827 
 828     public void testPackagesDuplicate() {
 829         Set<String> packages = ModuleDescriptor.newModule("foo")
 830                 .packages(Set.of("p"))
 831                 .packages(Set.of("p"))
 832                 .build()
 833                 .packages();
 834         assertTrue(packages.size() == 1);
 835         assertTrue(packages.contains("p"));
 836     }
 837 
 838     public void testPackagesAndExportsPackage1() {
 839         Set<String> packages = ModuleDescriptor.newModule("foo")
 840                 .packages(Set.of("p"))
 841                 .exports("p")
 842                 .build()
 843                 .packages();
 844         assertTrue(packages.size() == 1);
 845         assertTrue(packages.contains("p"));
 846     }
 847 
 848     public void testPackagesAndExportsPackage2() {
 849         Set<String> packages = ModuleDescriptor.newModule("foo")
 850                 .exports("p")
 851                 .packages(Set.of("p"))
 852                 .build()
 853                 .packages();
 854         assertTrue(packages.size() == 1);
 855         assertTrue(packages.contains("p"));
 856     }
 857 
 858     public void testPackagesAndOpensPackage1() {
 859         Set<String> packages = ModuleDescriptor.newModule("foo")
 860                 .packages(Set.of("p"))
 861                 .opens("p")
 862                 .build()
 863                 .packages();
 864         assertTrue(packages.size() == 1);
 865         assertTrue(packages.contains("p"));
 866     }
 867 
 868     public void testPackagesAndOpensPackage2() {
 869         Set<String> packages = ModuleDescriptor.newModule("foo")
 870                 .opens("p")
 871                 .packages(Set.of("p"))
 872                 .build()
 873                 .packages();
 874         assertTrue(packages.size() == 1);
 875         assertTrue(packages.contains("p"));
 876     }
 877 
 878     public void testPackagesAndProvides1() {
 879         Set<String> packages = ModuleDescriptor.newModule("foo")
 880                 .packages(Set.of("p"))
 881                 .provides("q.S", List.of("p.T"))
 882                 .build()
 883                 .packages();
 884         assertTrue(packages.size() == 1);
 885         assertTrue(packages.contains("p"));
 886     }
 887 
 888     public void testPackagesAndProvides2() {
 889         Set<String> packages = ModuleDescriptor.newModule("foo")
 890                 .provides("q.S", List.of("p.T"))
 891                 .packages(Set.of("p"))
 892                 .build()
 893                 .packages();
 894         assertTrue(packages.size() == 1);
 895         assertTrue(packages.contains("p"));
 896     }
 897 
 898     public void testPackagesAndMainClass1() {
 899         Set<String> packages = ModuleDescriptor.newModule("foo")
 900                 .packages(Set.of("p"))
 901                 .mainClass("p.Main")
 902                 .build()
 903                 .packages();
 904         assertTrue(packages.size() == 1);
 905         assertTrue(packages.contains("p"));

 906     }
 907 
 908     public void testPackagesAndMainClass2() {
 909         Set<String> packages = ModuleDescriptor.newModule("foo")
 910                 .mainClass("p.Main")
 911                 .packages(Set.of("p"))
 912                 .build()
 913                 .packages();
 914         assertTrue(packages.size() == 1);
 915         assertTrue(packages.contains("p"));
 916     }
 917 
 918     public void testPackagesAndAll() {
 919         Set<String> packages = ModuleDescriptor.newModule("foo")
 920                 .exports("p1")
 921                 .opens("p2")
 922                 .packages(Set.of("p3"))
 923                 .provides("q.S", List.of("p4.T"))
 924                 .mainClass("p5.Main")
 925                 .build()
 926                 .packages();
 927         assertTrue(Objects.equals(packages, Set.of("p1", "p2", "p3", "p4", "p5")));
 928     }
 929 
 930     @Test(dataProvider = "invalidjavaidentifiers",
 931           expectedExceptions = IllegalArgumentException.class )
 932     public void testPackagesWithBadName(String pn, String ignore) {
 933         Set<String> pkgs = new HashSet<>();  // allows nulls
 934         pkgs.add(pn);
 935         ModuleDescriptor.newModule("foo").packages(pkgs);
 936     }
 937 
 938     // name
 939 
 940     public void testModuleName() {
 941         String mn = ModuleDescriptor.newModule("foo").build().name();
 942         assertEquals(mn, "foo");
 943     }
 944 
 945     @Test(dataProvider = "invalidjavaidentifiers",
 946           expectedExceptions = IllegalArgumentException.class )
 947     public void testBadModuleName(String mn, String ignore) {
 948         ModuleDescriptor.newModule(mn);
 949     }
 950 
 951 
 952     // version
 953 
 954     public void testVersion1() {
 955         Version v1 = Version.parse("1.0");
 956         Version v2 = ModuleDescriptor.newModule("foo")
 957                 .version(v1)
 958                 .build()
 959                 .version()
 960                 .get();
 961         assertEquals(v1, v2);
 962     }
 963 
 964     public void testVersion2() {
 965         String vs = "1.0";
 966         Version v1 = ModuleDescriptor.newModule("foo")
 967                 .version(vs)
 968                 .build()
 969                 .version()
 970                 .get();
 971         Version v2 = Version.parse(vs);
 972         assertEquals(v1, v2);
 973     }
 974 
 975     @Test(expectedExceptions = NullPointerException.class )
 976     public void testNullVersion1() {
 977         ModuleDescriptor.newModule("foo").version((Version) null);
 978     }
 979 
 980     @Test(expectedExceptions = IllegalArgumentException.class )
 981     public void testNullVersion2() {
 982         ModuleDescriptor.newModule("foo").version((String) null);
 983     }
 984 
 985     @Test(expectedExceptions = IllegalArgumentException.class )
 986     public void testEmptyVersion() {
 987         ModuleDescriptor.newModule("foo").version("");
 988     }
 989 
 990 
 991     // toNameAndVersion
 992 
 993     public void testToNameAndVersion() {
 994         ModuleDescriptor md1 = ModuleDescriptor.newModule("foo").build();
 995         assertEquals(md1.toNameAndVersion(), "foo");
 996 
 997         ModuleDescriptor md2 = ModuleDescriptor.newModule("foo").version("1.0").build();
 998         assertEquals(md2.toNameAndVersion(), "foo@1.0");
 999     }
1000 
1001 
1002     // open modules
1003 
1004     public void testOpenModule() {
1005         ModuleDescriptor descriptor = ModuleDescriptor.newOpenModule("foo")
1006                 .requires("bar")
1007                 .exports("p")
1008                 .provides("p.Service", List.of("q.ServiceImpl"))
1009                 .build();
1010 
1011         // modifiers
1012         assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.OPEN));
1013         assertTrue(descriptor.isOpen());
1014 
1015         // requires
1016         assertTrue(descriptor.requires().size() == 2);
1017         Set<String> names = descriptor.requires()
1018                 .stream()
1019                 .map(Requires::name)
1020                 .collect(Collectors.toSet());
1021         assertEquals(names, Set.of("bar", "java.base"));
1022 
1023         // packages
1024         assertEquals(descriptor.packages(), Set.of("p", "q"));
1025 
1026         // exports
1027         assertTrue(descriptor.exports().size() == 1);
1028         names = descriptor.exports()
1029                 .stream()
1030                 .map(Exports::source)
1031                 .collect(Collectors.toSet());
1032         assertEquals(names, Set.of("p"));
1033 
1034         // opens
1035         assertTrue(descriptor.opens().isEmpty());
1036     }
1037 
1038     @Test(expectedExceptions = IllegalStateException.class)
1039     public void testOpensOnOpenModule1() {
1040         ModuleDescriptor.newOpenModule("foo").opens("p");
1041     }
1042 
1043     @Test(expectedExceptions = IllegalStateException.class)
1044     public void testOpensOnOpenModule2() {
1045         ModuleDescriptor.newOpenModule("foo").opens("p", Set.of("bar"));
1046     }
1047 
1048     public void testIsOpen() {
1049         assertFalse(ModuleDescriptor.newModule("m").build().isOpen());
1050         assertFalse(ModuleDescriptor.newAutomaticModule("m").build().isOpen());
1051         assertTrue(ModuleDescriptor.newOpenModule("m").build().isOpen());
1052     }
1053 
1054 
1055     // automatic modules
1056 
1057     public void testAutomaticModule() {
1058         ModuleDescriptor descriptor = ModuleDescriptor.newAutomaticModule("foo")
1059                 .packages(Set.of("p"))
1060                 .provides("p.Service", List.of("q.ServiceImpl"))
1061                 .build();
1062 
1063         // modifiers
1064         assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.AUTOMATIC));
1065         assertTrue(descriptor.isAutomatic());
1066 
1067         // requires
1068         assertTrue(descriptor.requires().size() == 1);
1069         Set<String> names = descriptor.requires()
1070                 .stream()
1071                 .map(Requires::name)
1072                 .collect(Collectors.toSet());
1073         assertEquals(names, Set.of("java.base"));
1074 
1075         // packages
1076         assertEquals(descriptor.packages(), Set.of("p", "q"));
1077         assertTrue(descriptor.exports().isEmpty());
1078         assertTrue(descriptor.opens().isEmpty());
1079     }
1080 
1081     @Test(expectedExceptions = IllegalStateException.class)
1082     public void testRequiresOnAutomaticModule() {
1083         ModuleDescriptor.newAutomaticModule("foo").requires("java.base");
1084     }
1085 
1086     @Test(expectedExceptions = IllegalStateException.class)
1087     public void testExportsOnAutomaticModule1() {
1088         ModuleDescriptor.newAutomaticModule("foo").exports("p");
1089     }
1090 
1091     @Test(expectedExceptions = IllegalStateException.class)
1092     public void testExportsOnAutomaticModule2() {
1093         ModuleDescriptor.newAutomaticModule("foo").exports("p", Set.of("bar"));
1094     }
1095 
1096     @Test(expectedExceptions = IllegalStateException.class)
1097     public void testOpensOnAutomaticModule1() {
1098         ModuleDescriptor.newAutomaticModule("foo").opens("p");
1099     }
1100 
1101     @Test(expectedExceptions = IllegalStateException.class)
1102     public void testOpensOnAutomaticModule2() {
1103         ModuleDescriptor.newAutomaticModule("foo").opens("p", Set.of("bar"));
1104     }
1105 
1106     @Test(expectedExceptions = IllegalStateException.class)
1107     public void testUsesOnAutomaticModule() {
1108         ModuleDescriptor.newAutomaticModule("foo").uses("p.Service");
1109     }
1110 
1111     public void testIsAutomatic() {
1112         ModuleDescriptor descriptor1 = ModuleDescriptor.newModule("foo").build();
1113         assertFalse(descriptor1.isAutomatic());
1114 
1115         ModuleDescriptor descriptor2 = ModuleDescriptor.newOpenModule("foo").build();
1116         assertFalse(descriptor2.isAutomatic());
1117 
1118         ModuleDescriptor descriptor3 = ModuleDescriptor.newAutomaticModule("foo").build();
1119         assertTrue(descriptor3.isAutomatic());
1120     }
1121 



1122 
1123     // newModule with modifiers

1124 
1125     public void testNewModuleToBuildAutomaticModule() {
1126         Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC);
1127         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();
1128         assertTrue(descriptor.modifiers().equals(ms));
1129         assertTrue(descriptor.isAutomatic());
1130 
1131         ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC, ModuleDescriptor.Modifier.SYNTHETIC);
1132         descriptor = ModuleDescriptor.newModule("foo", ms).build();
1133         assertTrue(descriptor.modifiers().equals(ms));
1134         assertTrue(descriptor.isAutomatic());
1135     }
1136 
1137     public void testNewModuleToBuildOpenModule() {
1138         Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.OPEN);
1139         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();
1140         assertTrue(descriptor.modifiers().equals(ms));
1141         assertTrue(descriptor.isOpen());
1142 
1143         ms = Set.of(ModuleDescriptor.Modifier.OPEN, ModuleDescriptor.Modifier.SYNTHETIC);
1144         descriptor = ModuleDescriptor.newModule("foo", ms).build();
1145         assertTrue(descriptor.modifiers().equals(ms));
1146         assertTrue(descriptor.isOpen());
1147     }
1148 
1149     @Test(expectedExceptions = IllegalArgumentException.class)
1150     public void testNewModuleToBuildAutomaticAndOpenModule() {
1151         Set<ModuleDescriptor.Modifier> ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC,
1152                                                    ModuleDescriptor.Modifier.OPEN);
1153         ModuleDescriptor.newModule("foo", ms);
1154     }
1155 
1156 
1157     // mainClass
1158 
1159     public void testMainClass() {
1160         String mainClass
1161             = ModuleDescriptor.newModule("foo").mainClass("p.Main").build().mainClass().get();
1162         assertEquals(mainClass, "p.Main");
1163     }
1164 
1165     @Test(expectedExceptions = IllegalArgumentException.class)
1166     public void testMainClassWithSimpleIdentifier() {
1167         ModuleDescriptor.newModule("foo").mainClass("Main");
1168     }
1169 
1170     @Test(dataProvider = "invalidjavaidentifiers",
1171           expectedExceptions = IllegalArgumentException.class )
1172     public void testMainClassWithBadName(String mainClass, String ignore) {
1173         Builder builder = ModuleDescriptor.newModule("foo");
1174         builder.mainClass(mainClass);
1175     }
1176 
1177 
1178     // osName
1179 
1180     public void testOsName() {
1181         String osName = ModuleDescriptor.newModule("foo").osName("Linux").build().osName().get();
1182         assertEquals(osName, "Linux");
1183     }
1184 
1185     @Test(expectedExceptions = IllegalArgumentException.class)
1186     public void testNullOsName() {
1187         ModuleDescriptor.newModule("foo").osName(null);
1188     }
1189 
1190     @Test(expectedExceptions = IllegalArgumentException.class)
1191     public void testEmptyOsName() {
1192         ModuleDescriptor.newModule("foo").osName("");
1193     }
1194 
1195 
1196     // osArch
1197 
1198     public void testOsArch() {
1199         String osArch = ModuleDescriptor.newModule("foo").osName("arm").build().osName().get();
1200         assertEquals(osArch, "arm");
1201     }
1202 
1203     @Test(expectedExceptions = IllegalArgumentException.class)
1204     public void testNullOsArch() {
1205         ModuleDescriptor.newModule("foo").osArch(null);
1206     }
1207 
1208     @Test(expectedExceptions = IllegalArgumentException.class)
1209     public void testEmptyOsArch() {
1210         ModuleDescriptor.newModule("foo").osArch("");
1211     }
1212 
1213 
1214     // osVersion
1215 
1216     public void testOsVersion() {
1217         String osVersion = ModuleDescriptor.newModule("foo").osName("11.2").build().osName().get();
1218         assertEquals(osVersion, "11.2");
1219     }
1220 
1221     @Test(expectedExceptions = IllegalArgumentException.class)
1222     public void testNullOsVersion() {
1223         ModuleDescriptor.newModule("foo").osVersion(null);
1224     }
1225 
1226     @Test(expectedExceptions = IllegalArgumentException.class)
1227     public void testEmptyOsVersion() {
1228         ModuleDescriptor.newModule("foo").osVersion("");
1229     }
1230 
1231     // reads
1232 
1233     private static InputStream EMPTY_INPUT_STREAM = new InputStream() {
1234         @Override
1235         public int read() {
1236             return -1;
1237         }
1238     };
1239 
1240     private static InputStream FAILING_INPUT_STREAM = new InputStream() {
1241         @Override
1242         public int read() throws IOException {
1243             throw new IOException();
1244         }
1245     };
1246 
1247     // basic test reading module-info.class
1248     public void testRead() throws Exception {
1249         Module base = Object.class.getModule();
1250 
1251         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1252             ModuleDescriptor descriptor = ModuleDescriptor.read(in);
1253             assertTrue(in.read() == -1); // all bytes read
1254             assertEquals(descriptor.name(), "java.base");
1255         }
1256 
1257         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1258             ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());
1259             ModuleDescriptor descriptor = ModuleDescriptor.read(bb);
1260             assertFalse(bb.hasRemaining()); // no more remaining bytes
1261             assertEquals(descriptor.name(), "java.base");
1262         }
1263     }
1264     /**
1265      * Test ModuleDescriptor with a packager finder
1266      */
1267     public void testReadsWithPackageFinder() throws Exception {
1268         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
1269                 .requires("java.base")
1270                 .build();
1271 
1272         ByteArrayOutputStream baos = new ByteArrayOutputStream();
1273         ModuleInfoWriter.write(descriptor, baos);
1274         ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
1275 
1276         descriptor = ModuleDescriptor.read(bb, () -> Set.of("p", "q"));
1277 
1278         assertTrue(descriptor.packages().size() == 2);
1279         assertTrue(descriptor.packages().contains("p"));
1280         assertTrue(descriptor.packages().contains("q"));
1281     }
1282 
1283     /**
1284      * Test ModuleDescriptor with a packager finder that doesn't return the
1285      * complete set of packages.
1286      */
1287     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1288     public void testReadsWithBadPackageFinder() throws Exception {
1289         ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
1290                 .requires("java.base")
1291                 .exports("p")
1292                 .build();
1293 
1294         ByteArrayOutputStream baos = new ByteArrayOutputStream();
1295         ModuleInfoWriter.write(descriptor, baos);
1296         ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
1297 
1298         // package finder returns a set that doesn't include p
1299         ModuleDescriptor.read(bb, () -> Set.of("q"));
1300     }
1301 
1302     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1303     public void testReadFromEmptyInputStream() throws Exception {
1304         ModuleDescriptor.read(EMPTY_INPUT_STREAM);
1305     }
1306 
1307     @Test(expectedExceptions = IOException.class)
1308     public void testReadFromFailingInputStream() throws Exception {
1309         ModuleDescriptor.read(FAILING_INPUT_STREAM);
1310     }
1311 
1312     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1313     public void testReadFromEmptyBuffer() {
1314         ByteBuffer bb = ByteBuffer.allocate(0);
1315         ModuleDescriptor.read(bb);
1316     }
1317 
1318     // The requires table for java.base must be 0 length
1319     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1320     public void testReadOfJavaBaseWithRequires() {
1321         ModuleDescriptor descriptor
1322             = ModuleDescriptor.newModule("java.base")
1323                 .requires("other")
1324                 .build();
1325         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1326         ModuleDescriptor.read(bb);
1327     }
1328 
1329     // The requires table must have an entry for java.base
1330     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1331     public void testReadWithEmptyRequires() {
1332         ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
1333                 .newModuleBuilder("m1", false, Set.of()).build();
1334         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1335         ModuleDescriptor.read(bb);
1336     }
1337 
1338     // The requires table must have an entry for java.base
1339     @Test(expectedExceptions = InvalidModuleDescriptorException.class)
1340     public void testReadWithNoRequiresBase() {
1341         ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
1342                 .newModuleBuilder("m1", false, Set.of()).requires("m2").build();


1343         ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
1344         ModuleDescriptor.read(bb);
1345     }
1346 
1347     public void testReadWithNull() throws Exception {
1348         Module base = Object.class.getModule();
1349 
1350         try {
1351             ModuleDescriptor.read((InputStream)null);
1352             assertTrue(false);
1353         } catch (NullPointerException expected) { }
1354 
1355 
1356         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1357             try {
1358                 ModuleDescriptor.read(in, null);
1359                 assertTrue(false);
1360             } catch (NullPointerException expected) { }
1361         }
1362 
1363         try {
1364             ModuleDescriptor.read((ByteBuffer)null);
1365             assertTrue(false);
1366         } catch (NullPointerException expected) { }
1367 
1368 
1369         try (InputStream in = base.getResourceAsStream("module-info.class")) {
1370             ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());
1371             try {
1372                 ModuleDescriptor.read(bb, null);
1373                 assertTrue(false);
1374             } catch (NullPointerException expected) { }
1375         }
1376     }
1377 
1378 
1379     // equals/hashCode/compareTo/toString
1380 
1381     public void testEqualsAndHashCode() {
1382         ModuleDescriptor md1 = ModuleDescriptor.newModule("m").build();
1383         ModuleDescriptor md2 = ModuleDescriptor.newModule("m").build();
1384         assertEquals(md1, md1);
1385         assertEquals(md1.hashCode(), md2.hashCode());
1386         assertTrue(md1.compareTo(md2) == 0);
1387         assertTrue(md2.compareTo(md1) == 0);
1388     }
1389 
1390     @DataProvider(name = "sortedModuleDescriptors")
1391     public Object[][] sortedModuleDescriptors() {
1392         return new Object[][]{
1393 
1394             { ModuleDescriptor.newModule("m2").build(),
1395               ModuleDescriptor.newModule("m1").build()
1396             },
1397 
1398             { ModuleDescriptor.newModule("m").version("2").build(),
1399               ModuleDescriptor.newModule("m").version("1").build()
1400             },
1401 
1402             { ModuleDescriptor.newModule("m").version("1").build(),
1403               ModuleDescriptor.newModule("m").build()
1404             },
1405 
1406             { ModuleDescriptor.newOpenModule("m").build(),
1407               ModuleDescriptor.newModule("m").build()
1408             },
1409 
1410         };
1411     }
1412 
1413     @Test(dataProvider = "sortedModuleDescriptors")
1414     public void testCompare(ModuleDescriptor md1, ModuleDescriptor md2) {
1415         assertNotEquals(md1, md2);
1416         assertTrue(md1.compareTo(md2) == 1);
1417         assertTrue(md2.compareTo(md1) == -1);
1418     }
1419 
1420     public void testToString() {
1421         String s = ModuleDescriptor.newModule("m1")
1422                 .requires("m2")
1423                 .exports("p1")
1424                 .build()
1425                 .toString();
1426         assertTrue(s.contains("m1"));
1427         assertTrue(s.contains("m2"));
1428         assertTrue(s.contains("p1"));
1429     }
1430 
1431 }
< prev index next >