< prev index next >

test/java/lang/module/MultiReleaseJarTest.java

Print this page


   1 /*
   2  * Copyright (c) 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  */


  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 


 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);


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


  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 String 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/" + RELEASE + "/p/Helper.class")
  92                 .resource("META-INF/versions/" + RELEASE + "/p/internal/HelperNew.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 


 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/" + RELEASE + "/" + MODULE_INFO, descriptor2)
 135                 .resource("META-INF/versions/" + RELEASE + "/p/Helper.class")
 136                 .resource("META-INF/versions/" + RELEASE + "/p/internal/HelperNew.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/" + RELEASE + "/p/Helper.class")
 165                 .resource("META-INF/versions/" + RELEASE + "/p/internal/HelperNew.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/" + RELEASE + "/" + 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);


< prev index next >