jdk/test/tools/jlink/IntegrationTest.java
changeset 36511 9d0388c6b336
child 37779 7c84df693837
equal deleted inserted replaced
36510:043f1af70518 36511:9d0388c6b336
       
     1 /*
       
     2  * Copyright (c) 2015, 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 import java.io.File;
       
    25 import java.io.IOException;
       
    26 import java.io.UncheckedIOException;
       
    27 import java.nio.file.Files;
       
    28 import java.nio.file.Path;
       
    29 import java.nio.file.Paths;
       
    30 import java.util.ArrayList;
       
    31 import java.util.Collections;
       
    32 import java.util.HashMap;
       
    33 import java.util.HashSet;
       
    34 import java.util.List;
       
    35 import java.util.Map;
       
    36 import java.util.Set;
       
    37 import jdk.tools.jlink.Jlink;
       
    38 import jdk.tools.jlink.Jlink.JlinkConfiguration;
       
    39 import jdk.tools.jlink.Jlink.PluginsConfiguration;
       
    40 import jdk.tools.jlink.builder.DefaultImageBuilder;
       
    41 import jdk.tools.jlink.plugin.ExecutableImage;
       
    42 import jdk.tools.jlink.plugin.Pool;
       
    43 import jdk.tools.jlink.plugin.PostProcessorPlugin;
       
    44 import jdk.tools.jlink.plugin.TransformerPlugin;
       
    45 import jdk.tools.jlink.internal.plugins.DefaultCompressPlugin;
       
    46 import jdk.tools.jlink.internal.plugins.StripDebugPlugin;
       
    47 import jdk.tools.jlink.plugin.Plugin;
       
    48 
       
    49 import tests.Helper;
       
    50 import tests.JImageGenerator;
       
    51 
       
    52 /*
       
    53  * @test
       
    54  * @summary Test integration API
       
    55  * @author Jean-Francois Denise
       
    56  * @library ../lib
       
    57  * @modules java.base/jdk.internal.jimage
       
    58  *          jdk.jdeps/com.sun.tools.classfile
       
    59  *          jdk.jlink/jdk.tools.jlink.internal
       
    60  *          jdk.jlink/jdk.tools.jlink.internal.plugins
       
    61  *          jdk.jlink/jdk.tools.jmod
       
    62  *          jdk.jlink/jdk.tools.jimage
       
    63  *          jdk.compiler
       
    64  * @build tests.*
       
    65  * @run main IntegrationTest
       
    66  */
       
    67 public class IntegrationTest {
       
    68 
       
    69     private static final List<Integer> ordered = new ArrayList<>();
       
    70 
       
    71     public static class MyPostProcessor implements PostProcessorPlugin {
       
    72 
       
    73         public static final String NAME = "mypostprocessor";
       
    74 
       
    75         @Override
       
    76         public List<String> process(ExecutableImage image) {
       
    77             try {
       
    78                 Files.createFile(image.getHome().resolve("toto.txt"));
       
    79                 return null;
       
    80             } catch (IOException ex) {
       
    81                 throw new UncheckedIOException(ex);
       
    82             }
       
    83         }
       
    84 
       
    85         @Override
       
    86         public String getName() {
       
    87             return NAME;
       
    88         }
       
    89 
       
    90         @Override
       
    91         public Set<PluginType> getType() {
       
    92             Set<PluginType> set = new HashSet<>();
       
    93             set.add(CATEGORY.PROCESSOR);
       
    94             return Collections.unmodifiableSet(set);
       
    95         }
       
    96 
       
    97         @Override
       
    98         public void configure(Map<String, String> config) {
       
    99             throw new UnsupportedOperationException("Shouldn't be called");
       
   100         }
       
   101     }
       
   102 
       
   103     public static class MyPlugin1 implements TransformerPlugin {
       
   104 
       
   105         Integer index;
       
   106         Set<String> after;
       
   107         Set<String> before;
       
   108 
       
   109         private MyPlugin1(Integer index, Set<String> after, Set<String> before) {
       
   110             this.index = index;
       
   111             this.after = after;
       
   112             this.before = before;
       
   113         }
       
   114 
       
   115         @Override
       
   116         public Set<String> isAfter() {
       
   117             return after;
       
   118         }
       
   119 
       
   120         @Override
       
   121         public Set<String> isBefore() {
       
   122             return before;
       
   123         }
       
   124 
       
   125         @Override
       
   126         public String getName() {
       
   127             return NAME + index;
       
   128         }
       
   129 
       
   130         @Override
       
   131         public void visit(Pool in, Pool out) {
       
   132             System.err.println(NAME + index);
       
   133             ordered.add(index);
       
   134             in.visit((file) -> {
       
   135                 return file;
       
   136             }, out);
       
   137         }
       
   138 
       
   139         @Override
       
   140         public Set<PluginType> getType() {
       
   141             Set<PluginType> set = new HashSet<>();
       
   142             set.add(CATEGORY.TRANSFORMER);
       
   143             return Collections.unmodifiableSet(set);
       
   144         }
       
   145 
       
   146         @Override
       
   147         public String getDescription() {
       
   148             return null;
       
   149         }
       
   150 
       
   151         @Override
       
   152         public String getOption() {
       
   153             return null;
       
   154         }
       
   155         static final String NAME = "myprovider";
       
   156         static final String INDEX = "INDEX";
       
   157 
       
   158         @Override
       
   159         public void configure(Map<String, String> config) {
       
   160             throw new UnsupportedOperationException("Shouldn't be called");
       
   161         }
       
   162     }
       
   163 
       
   164     public static void main(String[] args) throws Exception {
       
   165 
       
   166         Helper helper = Helper.newHelper();
       
   167         if (helper == null) {
       
   168             System.err.println("Test not run");
       
   169             return;
       
   170         }
       
   171         apitest();
       
   172         test();
       
   173         testOrder();
       
   174         testCycleOrder();
       
   175     }
       
   176 
       
   177     private static void apitest() throws Exception {
       
   178         boolean failed = false;
       
   179         Jlink jl = new Jlink();
       
   180 
       
   181         try {
       
   182             jl.build(null);
       
   183             failed = true;
       
   184         } catch (Exception ex) {
       
   185             // XXX OK
       
   186         }
       
   187         if (failed) {
       
   188             throw new Exception("Should have failed");
       
   189         }
       
   190         System.out.println(jl);
       
   191 
       
   192         JlinkConfiguration config
       
   193                 = new JlinkConfiguration(null, null, null, null);
       
   194 
       
   195         System.out.println(config);
       
   196 
       
   197         Plugin p = Jlink.newPlugin("toto", Collections.emptyMap(), null);
       
   198         if (p != null) {
       
   199             throw new Exception("Plugin should be null");
       
   200         }
       
   201 
       
   202         Plugin p2 = Jlink.newPlugin("compress", Collections.emptyMap(), null);
       
   203         if (p2 == null) {
       
   204             throw new Exception("Plugin should not be null");
       
   205         }
       
   206     }
       
   207 
       
   208     private static void test() throws Exception {
       
   209         Jlink jlink = new Jlink();
       
   210         Path output = Paths.get("integrationout");
       
   211         List<Path> modulePaths = new ArrayList<>();
       
   212         File jmods
       
   213                 = JImageGenerator.getJModsDir(new File(System.getProperty("test.jdk")));
       
   214         modulePaths.add(jmods.toPath());
       
   215         Set<String> mods = new HashSet<>();
       
   216         mods.add("java.management");
       
   217         Set<String> limits = new HashSet<>();
       
   218         limits.add("java.management");
       
   219         JlinkConfiguration config = new Jlink.JlinkConfiguration(output,
       
   220                 modulePaths, mods, limits, null);
       
   221 
       
   222         List<Plugin> lst = new ArrayList<>();
       
   223 
       
   224         //Strip debug
       
   225         {
       
   226             Map<String, String> config1 = new HashMap<>();
       
   227             config1.put(StripDebugPlugin.NAME, "");
       
   228             Plugin strip = Jlink.newPlugin("strip-debug", config1, null);
       
   229             lst.add(strip);
       
   230         }
       
   231         // compress
       
   232         {
       
   233             Map<String, String> config1 = new HashMap<>();
       
   234             config1.put(DefaultCompressPlugin.NAME, "2");
       
   235             Plugin compress
       
   236                     = Jlink.newPlugin("compress", config1, null);
       
   237             lst.add(compress);
       
   238         }
       
   239         // Post processor
       
   240         {
       
   241             lst.add(new MyPostProcessor());
       
   242         }
       
   243         // Image builder
       
   244         DefaultImageBuilder builder = new DefaultImageBuilder(true, output);
       
   245         PluginsConfiguration plugins
       
   246                 = new Jlink.PluginsConfiguration(lst, builder, null);
       
   247 
       
   248         jlink.build(config, plugins);
       
   249 
       
   250         if (!Files.exists(output)) {
       
   251             throw new AssertionError("Directory not created");
       
   252         }
       
   253         File jimage = new File(output.toString(), "lib" + File.separator + "modules");
       
   254         if (!jimage.exists()) {
       
   255             throw new AssertionError("jimage not generated");
       
   256         }
       
   257         File bom = new File(output.toString(), "bom");
       
   258         if (!bom.exists()) {
       
   259             throw new AssertionError("bom not generated");
       
   260         }
       
   261         File release = new File(output.toString(), "release");
       
   262         if (!release.exists()) {
       
   263             throw new AssertionError("release not generated");
       
   264         }
       
   265 
       
   266         if (!Files.exists(output.resolve("toto.txt"))) {
       
   267             throw new AssertionError("Post processing not called");
       
   268         }
       
   269 
       
   270     }
       
   271 
       
   272     private static void testOrder() throws Exception {
       
   273         Jlink jlink = new Jlink();
       
   274         Path output = Paths.get("integrationout2");
       
   275         List<Path> modulePaths = new ArrayList<>();
       
   276         File jmods
       
   277                 = JImageGenerator.getJModsDir(new File(System.getProperty("test.jdk")));
       
   278         modulePaths.add(jmods.toPath());
       
   279         Set<String> mods = new HashSet<>();
       
   280         mods.add("java.management");
       
   281         Set<String> limits = new HashSet<>();
       
   282         limits.add("java.management");
       
   283         JlinkConfiguration config = new Jlink.JlinkConfiguration(output,
       
   284                 modulePaths, mods, limits, null);
       
   285 
       
   286         List<Plugin> lst = new ArrayList<>();
       
   287 
       
   288         // Order is Plug1>Plug2>Plug3
       
   289         // Plug1
       
   290 
       
   291 
       
   292         // TRANSFORMER 3, must be after 2.
       
   293         {
       
   294             Set<String> after = new HashSet<>();
       
   295             after.add(MyPlugin1.NAME+"2");
       
   296             lst.add(new MyPlugin1(3, after, Collections.emptySet()));
       
   297         }
       
   298 
       
   299         // TRANSFORMER 2, must be after 1.
       
   300         {
       
   301             Set<String> after = new HashSet<>();
       
   302             after.add(MyPlugin1.NAME+"1");
       
   303             lst.add(new MyPlugin1(2, after, Collections.emptySet()));
       
   304         }
       
   305 
       
   306         // TRANSFORMER 1
       
   307         {
       
   308             Set<String> before = new HashSet<>();
       
   309             before.add(MyPlugin1.NAME+"2");
       
   310             lst.add(new MyPlugin1(1, Collections.emptySet(), before));
       
   311         }
       
   312 
       
   313         // Image builder
       
   314         DefaultImageBuilder builder = new DefaultImageBuilder(false, output);
       
   315         PluginsConfiguration plugins
       
   316                 = new Jlink.PluginsConfiguration(lst, builder, null);
       
   317 
       
   318         jlink.build(config, plugins);
       
   319 
       
   320         if (ordered.isEmpty()) {
       
   321             throw new AssertionError("Plugins not called");
       
   322         }
       
   323         List<Integer> clone = new ArrayList<>();
       
   324         clone.addAll(ordered);
       
   325         Collections.sort(clone);
       
   326         if (!clone.equals(ordered)) {
       
   327             throw new AssertionError("Ordered is not properly sorted" + ordered);
       
   328         }
       
   329     }
       
   330 
       
   331     private static void testCycleOrder() throws Exception {
       
   332         Jlink jlink = new Jlink();
       
   333         Path output = Paths.get("integrationout3");
       
   334         List<Path> modulePaths = new ArrayList<>();
       
   335         File jmods
       
   336                 = JImageGenerator.getJModsDir(new File(System.getProperty("test.jdk")));
       
   337         modulePaths.add(jmods.toPath());
       
   338         Set<String> mods = new HashSet<>();
       
   339         mods.add("java.management");
       
   340         Set<String> limits = new HashSet<>();
       
   341         limits.add("java.management");
       
   342         JlinkConfiguration config = new Jlink.JlinkConfiguration(output,
       
   343                 modulePaths, mods, limits, null);
       
   344 
       
   345         List<Plugin> lst = new ArrayList<>();
       
   346 
       
   347         // packager 1
       
   348         {
       
   349             Set<String> before = new HashSet<>();
       
   350             before.add(MyPlugin1.NAME+"2");
       
   351             lst.add(new MyPlugin1(1, Collections.emptySet(), before));
       
   352         }
       
   353 
       
   354         // packager 2
       
   355         {
       
   356             Set<String> before = new HashSet<>();
       
   357             before.add(MyPlugin1.NAME+"1");
       
   358             lst.add(new MyPlugin1(2, Collections.emptySet(), before));
       
   359         }
       
   360 
       
   361         // Image builder
       
   362         DefaultImageBuilder builder = new DefaultImageBuilder(false, output);
       
   363         PluginsConfiguration plugins
       
   364                 = new Jlink.PluginsConfiguration(lst, builder, null);
       
   365         boolean failed = false;
       
   366         try {
       
   367             jlink.build(config, plugins);
       
   368             failed = true;
       
   369         } catch (Exception ex) {
       
   370             // XXX OK
       
   371         }
       
   372         if (failed) {
       
   373             throw new AssertionError("Should have failed");
       
   374         }
       
   375     }
       
   376 }