< prev index next >

test/java/lang/module/MultiReleaseJarTest.java

Print this page




  48 import java.util.HashMap;
  49 import java.util.HashSet;
  50 import java.util.List;
  51 import java.util.Map;
  52 import java.util.Optional;
  53 import java.util.Set;
  54 import java.util.jar.Attributes;
  55 import java.util.jar.Manifest;
  56 
  57 import jdk.internal.module.ModuleInfoWriter;
  58 
  59 import org.testng.annotations.Test;
  60 import static org.testng.Assert.*;
  61 
  62 
  63 @Test
  64 public class MultiReleaseJarTest {
  65 
  66     private static final String MODULE_INFO = "module-info.class";
  67 
  68     private static final int RELEASE = Runtime.version().major();
  69 
  70     // are multi-release JARs enabled?
  71     private static final boolean MULTI_RELEASE;
  72     static {
  73         String s = System.getProperty("jdk.util.jar.enableMultiRelease");
  74         MULTI_RELEASE = (s == null || Boolean.parseBoolean(s));
  75     }
  76 
  77     /**
  78      * Basic test of a multi-release JAR.
  79      */
  80     public void testBasic() throws Exception {
  81         String name = "m1";
  82 
  83         ModuleDescriptor descriptor = ModuleDescriptor.module(name)
  84                 .requires("java.base")
  85                 .build();
  86 
  87         Path jar = new JarBuilder(name)
  88                 .moduleInfo("module-info.class", descriptor)
  89                 .resource("p/Main.class")
  90                 .resource("p/Helper.class")
  91                 .resource("META-INF/versions/9/p/Helper.class")
  92                 .resource("META-INF/versions/9/p/internal/Helper9.class")
  93                 .build();
  94 
  95         // find the module
  96         ModuleFinder finder = ModuleFinder.of(jar);
  97         Optional<ModuleReference> omref = finder.find(name);
  98         assertTrue((omref.isPresent()));
  99         ModuleReference mref = omref.get();
 100 
 101         // check module packages
 102         descriptor = mref.descriptor();
 103         Set<String> packages = descriptor.packages();
 104         assertTrue(packages.contains("p"));
 105         if (MULTI_RELEASE) {
 106             assertTrue(packages.size() == 2);
 107             assertTrue(packages.contains("p.internal"));
 108         } else {
 109             assertTrue(packages.size() == 1);
 110         }
 111     }
 112 
 113     /**
 114      * Test a multi-release JAR with a module-info.class in the versioned
 115      * section of the JAR.
 116      */
 117     public void testModuleInfoInVersionedSection() throws Exception {
 118         String name = "m1";
 119 
 120         ModuleDescriptor descriptor1 = ModuleDescriptor.module(name)
 121                 .requires("java.base")
 122                 .build();
 123 
 124         // module descriptor for versioned section
 125         ModuleDescriptor descriptor2 = ModuleDescriptor.module(name)
 126                 .requires("java.base")
 127                 .requires("jdk.unsupported")
 128                 .build();
 129 
 130         Path jar = new JarBuilder(name)
 131                 .moduleInfo(MODULE_INFO, descriptor1)
 132                 .resource("p/Main.class")
 133                 .resource("p/Helper.class")
 134                 .moduleInfo("META-INF/versions/9/" + MODULE_INFO, descriptor2)
 135                 .resource("META-INF/versions/9/p/Helper.class")
 136                 .resource("META-INF/versions/9/p/internal/Helper9.class")
 137                 .build();
 138 
 139         // find the module
 140         ModuleFinder finder = ModuleFinder.of(jar);
 141         Optional<ModuleReference> omref = finder.find(name);
 142         assertTrue((omref.isPresent()));
 143         ModuleReference mref = omref.get();
 144 
 145         // ensure that the right module-info.class is loaded
 146         ModuleDescriptor descriptor = mref.descriptor();
 147         assertEquals(descriptor.name(), name);
 148         if (MULTI_RELEASE) {
 149             assertEquals(descriptor.requires(), descriptor2.requires());
 150         } else {
 151             assertEquals(descriptor.requires(), descriptor1.requires());
 152         }
 153     }
 154 
 155     /**
 156      * Test multi-release JAR as an automatic module.
 157      */
 158     public void testAutomaticModule() throws Exception {
 159         String name = "m";
 160 
 161         Path jar = new JarBuilder(name)
 162                 .resource("p/Main.class")
 163                 .resource("p/Helper.class")
 164                 .resource("META-INF/versions/9/p/Helper.class")
 165                 .resource("META-INF/versions/9/p/internal/Helper9.class")
 166                 .build();
 167 
 168         // find the module
 169         ModuleFinder finder = ModuleFinder.of(jar);
 170         Optional<ModuleReference> omref = finder.find(name);
 171         assertTrue((omref.isPresent()));
 172         ModuleReference mref = omref.get();
 173 
 174         // check module packages
 175         ModuleDescriptor descriptor = mref.descriptor();
 176         Set<String> packages = descriptor.packages();
 177         if (MULTI_RELEASE) {
 178             assertTrue(packages.size() == 2);
 179             assertTrue(packages.contains("p.internal"));
 180         } else {
 181             assertTrue(packages.size() == 1);
 182         }
 183     }
 184 
 185     /**
 186      * Exercise ModuleReader on a multi-release JAR
 187      */
 188     public void testModuleReader() throws Exception {
 189         String name = "m1";
 190 
 191         ModuleDescriptor descriptor1 = ModuleDescriptor.module(name)
 192                 .requires("java.base")
 193                 .build();
 194 
 195         // module descriptor for versioned section
 196         ModuleDescriptor descriptor2 = ModuleDescriptor.module(name)
 197                 .requires("java.base")
 198                 .requires("jdk.unsupported")
 199                 .build();
 200 
 201         Path jar = new JarBuilder(name)
 202                 .moduleInfo(MODULE_INFO, descriptor1)
 203                 .moduleInfo("META-INF/versions/9/" + MODULE_INFO, descriptor2)
 204                 .build();
 205 
 206         // find the module
 207         ModuleFinder finder = ModuleFinder.of(jar);
 208         Optional<ModuleReference> omref = finder.find(name);
 209         assertTrue((omref.isPresent()));
 210         ModuleReference mref = omref.get();
 211 
 212         ModuleDescriptor expected;
 213         if (MULTI_RELEASE) {
 214             expected = descriptor2;
 215         } else {
 216             expected = descriptor1;
 217         }
 218 
 219         // test ModuleReader by reading module-info.class resource
 220         try (ModuleReader reader = mref.open()) {
 221 
 222             // open resource
 223             Optional<InputStream> oin = reader.open(MODULE_INFO);


 226                 checkRequires(ModuleDescriptor.read(in), expected);
 227             }
 228 
 229             // read resource
 230             Optional<ByteBuffer> obb = reader.read(MODULE_INFO);
 231             assertTrue(obb.isPresent());
 232             ByteBuffer bb = obb.get();
 233             try {
 234                 checkRequires(ModuleDescriptor.read(bb), expected);
 235             } finally {
 236                 reader.release(bb);
 237             }
 238 
 239             // find resource
 240             Optional<URI> ouri = reader.find(MODULE_INFO);
 241             assertTrue(ouri.isPresent());
 242             URI uri = ouri.get();
 243 
 244             String expectedTail = "!/";
 245             if (MULTI_RELEASE)
 246                 expectedTail += "META-INF/versions/" + RELEASE + "/";
 247             expectedTail += MODULE_INFO;
 248             assertTrue(uri.toString().endsWith(expectedTail));
 249 
 250             URLConnection uc = uri.toURL().openConnection();
 251             uc.setUseCaches(false);
 252             try (InputStream in = uc.getInputStream()) {
 253                 checkRequires(ModuleDescriptor.read(in), expected);
 254             }
 255 
 256         }
 257     }
 258 
 259     /**
 260      * Check that two ModuleDescriptor have the same requires
 261      */
 262     static void checkRequires(ModuleDescriptor md1, ModuleDescriptor md2) {
 263         assertEquals(md1.requires(), md2.requires());
 264     }
 265 
 266     /**




  48 import java.util.HashMap;
  49 import java.util.HashSet;
  50 import java.util.List;
  51 import java.util.Map;
  52 import java.util.Optional;
  53 import java.util.Set;
  54 import java.util.jar.Attributes;
  55 import java.util.jar.Manifest;
  56 
  57 import jdk.internal.module.ModuleInfoWriter;
  58 
  59 import org.testng.annotations.Test;
  60 import static org.testng.Assert.*;
  61 
  62 
  63 @Test
  64 public class MultiReleaseJarTest {
  65 
  66     private static final String MODULE_INFO = "module-info.class";
  67 
  68     private static final int VERSION = Runtime.version().major();
  69 
  70     // are multi-release JARs enabled?
  71     private static final boolean MULTI_RELEASE;
  72     static {
  73         String s = System.getProperty("jdk.util.jar.enableMultiRelease");
  74         MULTI_RELEASE = (s == null || Boolean.parseBoolean(s));
  75     }
  76 
  77     /**
  78      * Basic test of a multi-release JAR.
  79      */
  80     public void testBasic() throws Exception {
  81         String name = "m1";
  82 
  83         ModuleDescriptor descriptor = ModuleDescriptor.newModule(name)
  84                 .requires("java.base")
  85                 .build();
  86 
  87         Path jar = new JarBuilder(name)
  88                 .moduleInfo("module-info.class", descriptor)
  89                 .resource("p/Main.class")
  90                 .resource("p/Helper.class")
  91                 .resource("META-INF/versions/" + VERSION + "/p/Helper.class")
  92                 .resource("META-INF/versions/" + VERSION + "/p/internal/Helper.class")
  93                 .build();
  94 
  95         // find the module
  96         ModuleFinder finder = ModuleFinder.of(jar);
  97         Optional<ModuleReference> omref = finder.find(name);
  98         assertTrue((omref.isPresent()));
  99         ModuleReference mref = omref.get();
 100 
 101         // check module packages
 102         descriptor = mref.descriptor();
 103         Set<String> packages = descriptor.packages();
 104         assertTrue(packages.contains("p"));
 105         if (MULTI_RELEASE) {
 106             assertTrue(packages.size() == 2);
 107             assertTrue(packages.contains("p.internal"));
 108         } else {
 109             assertTrue(packages.size() == 1);
 110         }
 111     }
 112 
 113     /**
 114      * Test a multi-release JAR with a module-info.class in the versioned
 115      * section of the JAR.
 116      */
 117     public void testModuleInfoInVersionedSection() throws Exception {
 118         String name = "m1";
 119 
 120         ModuleDescriptor descriptor1 = ModuleDescriptor.newModule(name)
 121                 .requires("java.base")
 122                 .build();
 123 
 124         // module descriptor for versioned section
 125         ModuleDescriptor descriptor2 = ModuleDescriptor.newModule(name)
 126                 .requires("java.base")
 127                 .requires("jdk.unsupported")
 128                 .build();
 129 
 130         Path jar = new JarBuilder(name)
 131                 .moduleInfo(MODULE_INFO, descriptor1)
 132                 .resource("p/Main.class")
 133                 .resource("p/Helper.class")
 134                 .moduleInfo("META-INF/versions/" + VERSION + "/" + MODULE_INFO, descriptor2)
 135                 .resource("META-INF/versions/" + VERSION + "/p/Helper.class")
 136                 .resource("META-INF/versions/" + VERSION + "/p/internal/Helper.class")
 137                 .build();
 138 
 139         // find the module
 140         ModuleFinder finder = ModuleFinder.of(jar);
 141         Optional<ModuleReference> omref = finder.find(name);
 142         assertTrue((omref.isPresent()));
 143         ModuleReference mref = omref.get();
 144 
 145         // ensure that the right module-info.class is loaded
 146         ModuleDescriptor descriptor = mref.descriptor();
 147         assertEquals(descriptor.name(), name);
 148         if (MULTI_RELEASE) {
 149             assertEquals(descriptor.requires(), descriptor2.requires());
 150         } else {
 151             assertEquals(descriptor.requires(), descriptor1.requires());
 152         }
 153     }
 154 
 155     /**
 156      * Test multi-release JAR as an automatic module.
 157      */
 158     public void testAutomaticModule() throws Exception {
 159         String name = "m";
 160 
 161         Path jar = new JarBuilder(name)
 162                 .resource("p/Main.class")
 163                 .resource("p/Helper.class")
 164                 .resource("META-INF/versions/" + VERSION + "/p/Helper.class")
 165                 .resource("META-INF/versions/" + VERSION + "/p/internal/Helper.class")
 166                 .build();
 167 
 168         // find the module
 169         ModuleFinder finder = ModuleFinder.of(jar);
 170         Optional<ModuleReference> omref = finder.find(name);
 171         assertTrue((omref.isPresent()));
 172         ModuleReference mref = omref.get();
 173 
 174         // check module packages
 175         ModuleDescriptor descriptor = mref.descriptor();
 176         Set<String> packages = descriptor.packages();
 177         if (MULTI_RELEASE) {
 178             assertTrue(packages.size() == 2);
 179             assertTrue(packages.contains("p.internal"));
 180         } else {
 181             assertTrue(packages.size() == 1);
 182         }
 183     }
 184 
 185     /**
 186      * Exercise ModuleReader on a multi-release JAR
 187      */
 188     public void testModuleReader() throws Exception {
 189         String name = "m1";
 190 
 191         ModuleDescriptor descriptor1 = ModuleDescriptor.newModule(name)
 192                 .requires("java.base")
 193                 .build();
 194 
 195         // module descriptor for versioned section
 196         ModuleDescriptor descriptor2 = ModuleDescriptor.newModule(name)
 197                 .requires("java.base")
 198                 .requires("jdk.unsupported")
 199                 .build();
 200 
 201         Path jar = new JarBuilder(name)
 202                 .moduleInfo(MODULE_INFO, descriptor1)
 203                 .moduleInfo("META-INF/versions/" + VERSION + "/" + MODULE_INFO, descriptor2)
 204                 .build();
 205 
 206         // find the module
 207         ModuleFinder finder = ModuleFinder.of(jar);
 208         Optional<ModuleReference> omref = finder.find(name);
 209         assertTrue((omref.isPresent()));
 210         ModuleReference mref = omref.get();
 211 
 212         ModuleDescriptor expected;
 213         if (MULTI_RELEASE) {
 214             expected = descriptor2;
 215         } else {
 216             expected = descriptor1;
 217         }
 218 
 219         // test ModuleReader by reading module-info.class resource
 220         try (ModuleReader reader = mref.open()) {
 221 
 222             // open resource
 223             Optional<InputStream> oin = reader.open(MODULE_INFO);


 226                 checkRequires(ModuleDescriptor.read(in), expected);
 227             }
 228 
 229             // read resource
 230             Optional<ByteBuffer> obb = reader.read(MODULE_INFO);
 231             assertTrue(obb.isPresent());
 232             ByteBuffer bb = obb.get();
 233             try {
 234                 checkRequires(ModuleDescriptor.read(bb), expected);
 235             } finally {
 236                 reader.release(bb);
 237             }
 238 
 239             // find resource
 240             Optional<URI> ouri = reader.find(MODULE_INFO);
 241             assertTrue(ouri.isPresent());
 242             URI uri = ouri.get();
 243 
 244             String expectedTail = "!/";
 245             if (MULTI_RELEASE)
 246                 expectedTail += "META-INF/versions/" + VERSION + "/";
 247             expectedTail += MODULE_INFO;
 248             assertTrue(uri.toString().endsWith(expectedTail));
 249 
 250             URLConnection uc = uri.toURL().openConnection();
 251             uc.setUseCaches(false);
 252             try (InputStream in = uc.getInputStream()) {
 253                 checkRequires(ModuleDescriptor.read(in), expected);
 254             }
 255 
 256         }
 257     }
 258 
 259     /**
 260      * Check that two ModuleDescriptor have the same requires
 261      */
 262     static void checkRequires(ModuleDescriptor md1, ModuleDescriptor md2) {
 263         assertEquals(md1.requires(), md2.requires());
 264     }
 265 
 266     /**


< prev index next >