jdk/test/tools/jlink/plugins/PluginOrderTest.java
changeset 39737 4da8463b3d33
parent 39736 f939432eb32a
parent 39559 0bd60e219fd0
child 39738 15fea8b870eb
equal deleted inserted replaced
39736:f939432eb32a 39737:4da8463b3d33
     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  /*
       
    25  * @test
       
    26  * @summary Test order of plugins
       
    27  * @author Jean-Francois Denise
       
    28  * @library ../../lib
       
    29  * @modules java.base/jdk.internal.jimage
       
    30  *          jdk.jdeps/com.sun.tools.classfile
       
    31  *          jdk.jlink/jdk.tools.jlink.internal
       
    32  *          jdk.jlink/jdk.tools.jmod
       
    33  *          jdk.jlink/jdk.tools.jimage
       
    34  *          jdk.compiler
       
    35  * @build tests.*
       
    36  * @run main/othervm PluginOrderTest
       
    37  */
       
    38 import java.util.ArrayList;
       
    39 import java.util.Collections;
       
    40 import java.util.HashSet;
       
    41 import java.util.List;
       
    42 import java.util.Map;
       
    43 import java.util.Set;
       
    44 
       
    45 import jdk.tools.jlink.internal.PluginOrderingGraph;
       
    46 import jdk.tools.jlink.plugin.Plugin;
       
    47 import jdk.tools.jlink.plugin.Plugin.Category;
       
    48 import jdk.tools.jlink.plugin.ModulePool;
       
    49 
       
    50 public class PluginOrderTest {
       
    51 
       
    52     public static void main(String[] args) throws Exception {
       
    53 
       
    54         validGraph0();
       
    55         validGraph1();
       
    56 
       
    57         boolean failed = false;
       
    58 
       
    59         try {
       
    60             withCycles0();
       
    61             failed = true;
       
    62         } catch (Exception ex) {
       
    63             //ok
       
    64             System.err.println(ex.getMessage());
       
    65         }
       
    66         if (failed) {
       
    67             throw new Exception("Should have failed");
       
    68         }
       
    69 
       
    70         try {
       
    71             withCycles1();
       
    72             failed = true;
       
    73         } catch (Exception ex) {
       
    74             //ok
       
    75             System.err.println(ex.getMessage());
       
    76         }
       
    77         if (failed) {
       
    78             throw new Exception("Should have failed");
       
    79         }
       
    80 
       
    81         try {
       
    82             withCycles2();
       
    83             failed = true;
       
    84         } catch (Exception ex) {
       
    85             //ok
       
    86             System.err.println(ex.getMessage());
       
    87         }
       
    88         if (failed) {
       
    89             throw new Exception("Should have failed");
       
    90         }
       
    91     }
       
    92 
       
    93     private static void validGraph0() throws Exception {
       
    94         Set<String> set = new HashSet<>();
       
    95         set.add("plug2");
       
    96         List<Plugin> plugins = new ArrayList<>();
       
    97         plugins.add(new Plug("plug2", Collections.emptySet(), Collections.emptySet(),
       
    98                 Category.TRANSFORMER));
       
    99         plugins.add(new Plug("plug1", set, Collections.emptySet(), Category.TRANSFORMER));
       
   100         List<Plugin> ordered = PluginOrderingGraph.sort(plugins);
       
   101         if (ordered.get(0) != plugins.get(1) || ordered.get(1) != plugins.get(0)) {
       
   102             throw new Exception("Invalid sorting");
       
   103         }
       
   104     }
       
   105 
       
   106     private static void validGraph1() {
       
   107         Set<String> lst1 = new HashSet<>();
       
   108         lst1.add("plug2");
       
   109         lst1.add("plug3");
       
   110         Plugin p1 = new Plug("plug1", lst1, Collections.emptySet(), Category.TRANSFORMER);
       
   111 
       
   112         Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   113 
       
   114         Set<String> lst3 = new HashSet<>();
       
   115         lst3.add("plug4");
       
   116         lst3.add("plug6");
       
   117         Plugin p3 = new Plug("plug3", lst3, Collections.emptySet(), Category.TRANSFORMER);
       
   118 
       
   119         Plugin p4 = new Plug("plug4", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   120 
       
   121         Set<String> lst5 = new HashSet<>();
       
   122         lst5.add("plug3");
       
   123         lst5.add("plug1");
       
   124         lst5.add("plug2");
       
   125         lst5.add("plug6");
       
   126         Plugin p5 = new Plug("plug5", lst5, Collections.emptySet(), Category.TRANSFORMER);
       
   127 
       
   128         Set<String> lst6 = new HashSet<>();
       
   129         lst6.add("plug4");
       
   130         lst6.add("plug2");
       
   131         Plugin p6 = new Plug("plug6", lst6, Collections.emptySet(), Category.TRANSFORMER);
       
   132 
       
   133         Plugin p7 = new Plug("plug7", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   134 
       
   135         Plugin p8 = new Plug("plug8", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   136 
       
   137         List<Plugin> plugins = new ArrayList<>();
       
   138         plugins.add(p1);
       
   139         plugins.add(p2);
       
   140         plugins.add(p3);
       
   141         plugins.add(p4);
       
   142         plugins.add(p5);
       
   143         plugins.add(p6);
       
   144         plugins.add(p7);
       
   145         plugins.add(p8);
       
   146 
       
   147         PluginOrderingGraph.sort(plugins);
       
   148     }
       
   149 
       
   150     private static void withCycles0() throws Exception {
       
   151         Set<String> set2 = new HashSet<>();
       
   152         set2.add("plug1");
       
   153         List<Plugin> plugins = new ArrayList<>();
       
   154         plugins.add(new Plug("plug2", set2, Collections.emptySet(),
       
   155                 Category.TRANSFORMER));
       
   156 
       
   157         Set<String> set1 = new HashSet<>();
       
   158         set1.add("plug2");
       
   159         plugins.add(new Plug("plug1", set1, Collections.emptySet(), Category.TRANSFORMER));
       
   160         PluginOrderingGraph.sort(plugins);
       
   161 
       
   162     }
       
   163 
       
   164     private static void withCycles2() {
       
   165         Set<String> lst1 = new HashSet<>();
       
   166         lst1.add("plug2");
       
   167         lst1.add("plug3");
       
   168         Plugin p1 = new Plug("plug1", lst1, Collections.emptySet(), Category.TRANSFORMER);
       
   169 
       
   170         Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   171 
       
   172         Set<String> lst3 = new HashSet<>();
       
   173         lst3.add("plug4");
       
   174         lst3.add("plug6");
       
   175         Plugin p3 = new Plug("plug3", lst3, Collections.emptySet(), Category.TRANSFORMER);
       
   176 
       
   177         Plugin p4 = new Plug("plug4", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   178 
       
   179         Set<String> lst5 = new HashSet<>();
       
   180         lst5.add("plug3");
       
   181         lst5.add("plug1");
       
   182         lst5.add("plug2");
       
   183         Plugin p5 = new Plug("plug5", lst5, Collections.emptySet(), Category.TRANSFORMER);
       
   184 
       
   185         Set<String> lst6 = new HashSet<>();
       
   186         lst6.add("plug4");
       
   187         lst6.add("plug1");
       
   188         Plugin p6 = new Plug("plug6", lst6, Collections.emptySet(), Category.TRANSFORMER);
       
   189 
       
   190         Plugin p7 = new Plug("plug7", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   191 
       
   192         Plugin p8 = new Plug("plug8", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   193 
       
   194         List<Plugin> plugins = new ArrayList<>();
       
   195         plugins.add(p1);
       
   196         plugins.add(p2);
       
   197         plugins.add(p3);
       
   198         plugins.add(p4);
       
   199         plugins.add(p5);
       
   200         plugins.add(p6);
       
   201         plugins.add(p7);
       
   202         plugins.add(p8);
       
   203         PluginOrderingGraph.sort(plugins);
       
   204     }
       
   205 
       
   206     private static void withCycles1() {
       
   207         Set<String> lst1 = new HashSet<>();
       
   208         lst1.add("plug2");
       
   209         lst1.add("plug3");
       
   210         Plugin p = new Plug("plug1", lst1, Collections.emptySet(), Category.TRANSFORMER);
       
   211         Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER);
       
   212 
       
   213         Set<String> lst3 = new HashSet<>();
       
   214         lst3.add("plug2");
       
   215 
       
   216         Set<String> lst4 = new HashSet<>();
       
   217         lst4.add("plug1");
       
   218 
       
   219         Plugin p3 = new Plug("plug3", lst4, lst3, Category.TRANSFORMER);
       
   220         List<Plugin> plugins = new ArrayList<>();
       
   221         plugins.add(p);
       
   222         plugins.add(p2);
       
   223         plugins.add(p3);
       
   224         PluginOrderingGraph.sort(plugins);
       
   225     }
       
   226 
       
   227     private static class Plug implements Plugin {
       
   228 
       
   229         private final Set<String> isBefore;
       
   230         private final Set<String> isAfter;
       
   231         private final Category category;
       
   232         private final String name;
       
   233 
       
   234         private Plug(String name, Set<String> isBefore, Set<String> isAfter, Category category) {
       
   235             this.name = name;
       
   236             this.isBefore = isBefore;
       
   237             this.isAfter = isAfter;
       
   238             this.category = category;
       
   239         }
       
   240 
       
   241         @Override
       
   242         public Set<String> isAfter() {
       
   243             return isAfter;
       
   244         }
       
   245 
       
   246         @Override
       
   247         public Set<String> isBefore() {
       
   248             return isBefore;
       
   249         }
       
   250 
       
   251         @Override
       
   252         public String toString() {
       
   253             return name;
       
   254         }
       
   255 
       
   256         @Override
       
   257         public void visit(ModulePool in, ModulePool out) {
       
   258 
       
   259         }
       
   260 
       
   261         @Override
       
   262         public Category getType() {
       
   263             return category;
       
   264         }
       
   265 
       
   266         @Override
       
   267         public String getName() {
       
   268             return name;
       
   269         }
       
   270     }
       
   271 }