Path: blob/master/test/jdk/tools/jlink/plugins/IncludeLocalesPluginTest.java
41149 views
/*1* Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import java.nio.file.Path;24import java.util.Arrays;25import java.util.ArrayList;26import java.util.List;27import java.util.Locale;28import java.util.stream.Collectors;2930import jdk.tools.jlink.plugin.Plugin;31import jdk.tools.jlink.plugin.PluginException;32import jdk.tools.jlink.internal.PluginRepository;33import jdk.tools.jlink.internal.TaskHelper;34import jdk.tools.jlink.internal.plugins.PluginsResourceBundle;35import tests.Helper;36import tests.JImageGenerator;37import tests.JImageValidator;38import tests.Result;3940/*41* @test42* @bug 8152143 8152704 8155649 8165804 8185841 8176841 819091843* 8179071 8202537 8221432 8222098 8251317 825879444* @summary IncludeLocalesPlugin tests45* @author Naoto Sato46* @requires (vm.compMode != "Xcomp" & os.maxMemory >= 2g)47* @library ../../lib48* @modules java.base/jdk.internal.jimage49* jdk.jdeps/com.sun.tools.classfile50* jdk.jlink/jdk.tools.jlink.internal51* jdk.jlink/jdk.tools.jlink.internal.plugins52* jdk.jlink/jdk.tools.jlink.plugin53* jdk.jlink/jdk.tools.jmod54* jdk.jlink/jdk.tools.jimage55* jdk.compiler56* @build tests.*57* @build tools.jlink.plugins.GetAvailableLocales58* @run main/othervm/timeout=180 -Xmx1g IncludeLocalesPluginTest59*/60public class IncludeLocalesPluginTest {6162private final static String moduleName = "IncludeLocalesTest";63private static Helper helper;64private final static int INCLUDE_LOCALES_OPTION = 0;65private final static int ADDMODS_OPTION = 1;66private final static int EXPECTED_LOCATIONS = 2;67private final static int UNEXPECTED_PATHS = 3;68private final static int AVAILABLE_LOCALES = 4;69private final static int ERROR_MESSAGE = 5;7071private static int errors;7273private final static Object[][] testData = {74// Test data should include:75// - --include-locales command line option76// - --add-modules command line option values77// - List of required resources in the result image78// - List of resources that should not exist in the result image79// - List of available locales in the result image80// - Error message8182// without --include-locales option: should include all locales83{84"",85"jdk.localedata",86List.of(87"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",88"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",89"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",90"/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",91"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",92"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",93"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class",94"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_zh.class"),95List.of(),96Arrays.stream(Locale.getAvailableLocales())97// "(root)" for Locale.ROOT rather than ""98.map(loc -> loc.equals(Locale.ROOT) ? "(root)" : loc.toString())99.collect(Collectors.toList()),100"",101},102103// Asterisk works exactly the same as above104{105"--include-locales=*",106"jdk.localedata",107List.of(108"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",109"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",110"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",111"/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",112"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",113"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",114"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class",115"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_zh.class"),116List.of(),117Arrays.stream(Locale.getAvailableLocales())118// "(root)" for Locale.ROOT rather than ""119.map(loc -> loc.equals(Locale.ROOT) ? "(root)" : loc.toString())120.collect(Collectors.toList()),121"",122},123124// World English/Spanish in Latin America125{126"--include-locales=en-001,es-419",127"jdk.localedata",128List.of(129"/jdk.localedata/sun/text/resources/ext/FormatData_en_AU.class",130"/jdk.localedata/sun/text/resources/ext/FormatData_es.class",131"/jdk.localedata/sun/text/resources/ext/FormatData_es_AR.class",132"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",133"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_150.class",134"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_AT.class",135"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_es.class",136"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_es_419.class",137"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_es_AR.class"),138List.of(139"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",140"/jdk.localedata/sun/text/resources/ext/thai_dict",141"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",142"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",143"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",144"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",145"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",146"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class"),147List.of(148"(root)", "en", "en_US", "en_US_#Latn", "en_US_POSIX", "en_001", "en_150", "en_AG", "en_AI",149"en_AT", "en_AU", "en_BB", "en_BE", "en_BM", "en_BS", "en_BW", "en_BZ",150"en_CA", "en_CC", "en_CH", "en_CK", "en_CM", "en_CX", "en_CY", "en_DE",151"en_DG", "en_DK", "en_DM", "en_ER", "en_FI", "en_FJ", "en_FK", "en_FM",152"en_GB", "en_GD", "en_GG", "en_GH", "en_GI", "en_GM", "en_GY", "en_HK",153"en_IE", "en_IL", "en_IM", "en_IN", "en_IO", "en_JE", "en_JM", "en_KE",154"en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_MG", "en_MO",155"en_MS", "en_MT", "en_MU", "en_MW", "en_MY", "en_NA", "en_NF", "en_NG",156"en_NL", "en_NR", "en_NU", "en_NZ", "en_PG", "en_PH", "en_PK", "en_PN",157"en_PW", "en_RW", "en_SB", "en_SC", "en_SD", "en_SE", "en_SG", "en_SH",158"en_SI", "en_SL", "en_SS", "en_SX", "en_SZ", "en_TC", "en_TK", "en_TO",159"en_TT", "en_TV", "en_TZ", "en_UG", "en_VC", "en_VG", "en_VU", "en_WS",160"en_ZA", "en_ZM", "en_ZW", "es", "es_419", "es_AR", "es_BO", "es_BR", "es_BZ",161"es_CL", "es_CO", "es_CR", "es_CU", "es_DO", "es_EC", "es_GT", "es_HN",162"es_MX", "es_NI", "es_PA", "es_PE", "es_PR", "es_PY", "es_SV", "es_US",163"es_UY", "es_VE"),164"",165},166167// All English and Japanese locales168{169"--include-locales=en,ja",170"jdk.localedata",171List.of(172"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",173"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",174"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",175"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class"),176List.of(177"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",178"/jdk.localedata/sun/text/resources/ext/thai_dict",179"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",180"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",181"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",182"/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",183"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class",184"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_zh.class"),185List.of(186"(root)", "en", "en_001", "en_150", "en_AE", "en_AG", "en_AI", "en_AS", "en_AT",187"en_AU", "en_BB", "en_BE", "en_BI", "en_BM", "en_BS", "en_BW", "en_BZ",188"en_CA", "en_CC", "en_CH", "en_CK", "en_CM", "en_CX", "en_CY", "en_DE",189"en_DG", "en_DK", "en_DM", "en_ER", "en_FI", "en_FJ", "en_FK", "en_FM",190"en_GB", "en_GD", "en_GG", "en_GH", "en_GI", "en_GM", "en_GU", "en_GY",191"en_HK", "en_IE", "en_IL", "en_IM", "en_IN", "en_IO", "en_JE", "en_JM",192"en_KE", "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_MG",193"en_MH", "en_MO", "en_MP", "en_MS", "en_MT", "en_MU", "en_MW", "en_MY",194"en_NA", "en_NF", "en_NG", "en_NL", "en_NR", "en_NU", "en_NZ", "en_PG",195"en_PH", "en_PK", "en_PN", "en_PR", "en_PW", "en_RW", "en_SB", "en_SC",196"en_SD", "en_SE", "en_SG", "en_SH", "en_SI", "en_SL", "en_SS", "en_SX",197"en_SZ", "en_TC", "en_TK", "en_TO", "en_TT", "en_TV", "en_TZ", "en_UG",198"en_UM", "en_US", "en_US_#Latn", "en_US_POSIX", "en_VC", "en_VG", "en_VI", "en_VU",199"en_WS", "en_ZA", "en_ZM", "en_ZW", "ja", "ja_JP", "ja_JP_#Jpan",200"ja_JP_JP_#u-ca-japanese"),201"",202},203204// All locales in Austria205{206"--include-locales=*-AT",207"jdk.localedata",208List.of(209"/jdk.localedata/sun/text/resources/ext/FormatData_de.class",210"/jdk.localedata/sun/text/resources/ext/FormatData_de_AT.class",211"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_de.class",212"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_de_AT.class",213"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",214"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_150.class",215"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_AT.class"),216List.of(217"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",218"/jdk.localedata/sun/text/resources/ext/thai_dict",219"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",220"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",221"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",222"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",223"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",224"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",225"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class"),226List.of(227"(root)", "en", "en_001", "en_150", "en_AT", "en_US", "en_US_#Latn", "en_US_POSIX",228"de", "de_AT"),229"",230},231232// All locales in India233{234"--include-locales=*-IN",235"jdk.localedata",236List.of(237"/jdk.localedata/sun/text/resources/ext/FormatData_en_IN.class",238"/jdk.localedata/sun/text/resources/ext/FormatData_hi_IN.class",239"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",240"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_IN.class"),241List.of(242"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",243"/jdk.localedata/sun/text/resources/ext/thai_dict",244"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",245"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",246"/jdk.localedata/sun/text/resources/ext/BreakIteratorResources_th.class",247"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",248"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",249"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",250"/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",251"/jdk.localedata/sun/util/resources/cldr/ext/CalendarData_as_IN.class",252"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",253"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class",254"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_zh.class"),255List.of(256"(root)", "as", "as_IN", "as_IN_#Beng", "bn", "bn_IN", "bo", "bo_IN", "brx", "brx_IN",257"brx_IN_#Deva", "ccp", "ccp_IN", "doi", "doi_IN", "doi_IN_#Deva", "en", "en_001", "en_IN",258"en_US", "en_US_#Latn", "en_US_POSIX", "gu", "gu_IN", "gu_IN_#Gujr", "hi", "hi_IN",259"hi_IN_#Deva", "kn", "kn_IN", "kn_IN_#Knda", "kok", "kok_IN", "kok_IN_#Deva", "ks_IN_#Arab",260"ks_IN", "ks__#Arab", "ks", "mai", "mai_IN", "mai_IN_#Deva", "mni", "mni__#Beng",261"mni_IN", "mni_IN_#Beng", "ml", "ml_IN", "ml_IN_#Mlym", "mr", "mr_IN", "mr_IN_#Deva", "ne",262"ne_IN", "or", "or_IN", "or_IN_#Orya", "pa", "pa__#Guru", "pa_IN", "pa_IN_#Guru", "sa",263"sa_IN", "sa_IN_#Deva", "sat", "sat__#Olck", "sat_IN", "sat_IN_#Olck", "sd", "sd__#Deva",264"sd_IN", "sd_IN_#Deva", "ta", "ta_IN", "ta_IN_#Taml", "te", "te_IN", "te_IN_#Telu", "ur_IN", "ur"),265"",266},267268// Thai269{270"--include-locales=th",271"jdk.localedata",272List.of(273"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",274"/jdk.localedata/sun/text/resources/ext/thai_dict",275"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",276"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",277"/jdk.localedata/sun/text/resources/ext/BreakIteratorResources_th.class",278"/jdk.localedata/sun/text/resources/ext/FormatData_th.class"),279List.of(280"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",281"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",282"/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",283"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",284"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",285"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_zh.class"),286List.of(287"(root)", "en", "en_US", "en_US_#Latn", "en_US_POSIX", "th", "th_TH",288"th_TH_#Thai", "th_TH_TH_#u-nu-thai"),289"",290},291292// Hong Kong293{294"--include-locales=zh-HK",295"jdk.localedata",296List.of(297"/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",298"/jdk.localedata/sun/text/resources/ext/FormatData_zh_HK.class",299"/jdk.localedata/sun/text/resources/ext/FormatData_zh_TW.class",300"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_zh.class"),301List.of(302"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",303"/jdk.localedata/sun/text/resources/ext/thai_dict",304"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",305"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",306"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",307"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",308"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",309"/jdk.localedata/sun/text/resources/ext/FormatData_zh_CN.class",310"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",311"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",312"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class"),313List.of(314"(root)", "en", "en_US", "en_US_#Latn", "en_US_POSIX", "zh", "zh__#Hans", "zh__#Hant",315"zh_HK", "zh_HK_#Hans", "zh_HK_#Hant"),316"",317},318319// Simplified Chinese320{321"--include-locales=zh-Hans",322"jdk.localedata",323List.of(324"/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",325"/jdk.localedata/sun/text/resources/ext/FormatData_zh_CN.class",326"/jdk.localedata/sun/text/resources/ext/FormatData_zh_SG.class",327"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_zh.class"),328List.of(329"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",330"/jdk.localedata/sun/text/resources/ext/thai_dict",331"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",332"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",333"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",334"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",335"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",336"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",337"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",338"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class"),339List.of(340"(root)", "en", "en_US", "en_US_#Latn", "en_US_POSIX", "zh", "zh__#Hans", "zh_CN",341"zh_CN_#Hans", "zh_HK", "zh_HK_#Hans", "zh_MO", "zh_MO_#Hans", "zh_SG", "zh_SG_#Hans"),342"",343},344345// Norwegian346{347"--include-locales=nb,nn,no",348"jdk.localedata",349List.of(350"/jdk.localedata/sun/text/resources/ext/FormatData_no.class",351"/jdk.localedata/sun/text/resources/ext/FormatData_no_NO.class",352"/jdk.localedata/sun/text/resources/ext/FormatData_no_NO_NY.class",353"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_nb.class",354"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_nn.class",355"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_no.class"),356List.of(357"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",358"/jdk.localedata/sun/text/resources/ext/thai_dict",359"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",360"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",361"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",362"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",363"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",364"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",365"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",366"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class"),367List.of(368"(root)", "en", "en_US", "en_US_#Latn", "en_US_POSIX", "nb", "nb_NO",369"nb_NO_#Latn", "nb_SJ", "nn", "nn_NO", "nn_NO_#Latn", "no", "no_NO", "no_NO_NY",370"no_NO_#Latn"),371"",372},373374// Hebrew/Indonesian/Yiddish375{376"--include-locales=he,id,yi",377"jdk.localedata",378List.of(379"/jdk.localedata/sun/text/resources/ext/FormatData_he.class",380"/jdk.localedata/sun/text/resources/ext/FormatData_he_IL.class",381"/jdk.localedata/sun/text/resources/ext/FormatData_id.class",382"/jdk.localedata/sun/text/resources/ext/FormatData_id_ID.class",383"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_he.class",384"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_id.class",385"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_yi.class"),386List.of(387"/jdk.localedata/sun/text/resources/ext/LineBreakIteratorData_th",388"/jdk.localedata/sun/text/resources/ext/thai_dict",389"/jdk.localedata/sun/text/resources/ext/WordBreakIteratorData_th",390"/jdk.localedata/sun/text/resources/ext/BreakIteratorInfo_th.class",391"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",392"/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",393"/jdk.localedata/sun/text/resources/ext/FormatData_th.class",394"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class",395"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",396"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_th.class"),397List.of(398"(root)", "en", "en_US", "en_US_#Latn", "en_US_POSIX", "id", "id_ID",399"id_ID_#Latn", "he", "he_IL", "he_IL_#Hebr", "yi", "yi_001", "yi_001_#Hebr"),400"",401},402403// Langtag including extensions. Should be ignored.404{405"--include-locales=en,ja-u-nu-thai",406"jdk.localedata",407List.of(408"/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",409"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_en_001.class"),410List.of(411"/jdk.localedata/sun/text/resources/cldr/ext/FormatData_ja.class",412"/jdk.localedata/sun/text/resources/ext/FormatData_th.class"),413List.of(414"(root)", "en", "en_001", "en_150", "en_AE", "en_AG", "en_AI", "en_AS", "en_AT",415"en_AU", "en_BB", "en_BE", "en_BI", "en_BM", "en_BS", "en_BW", "en_BZ",416"en_CA", "en_CC", "en_CH", "en_CK", "en_CM", "en_CX", "en_CY", "en_DE",417"en_DG", "en_DK", "en_DM", "en_ER", "en_FI", "en_FJ", "en_FK", "en_FM",418"en_GB", "en_GD", "en_GG", "en_GH", "en_GI", "en_GM", "en_GU", "en_GY",419"en_HK", "en_IE", "en_IL", "en_IM", "en_IN", "en_IO", "en_JE", "en_JM",420"en_KE", "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_MG",421"en_MH", "en_MO", "en_MP", "en_MS", "en_MT", "en_MU", "en_MW", "en_MY",422"en_NA", "en_NF", "en_NG", "en_NL", "en_NR", "en_NU", "en_NZ", "en_PG",423"en_PH", "en_PK", "en_PN", "en_PR", "en_PW", "en_RW", "en_SB", "en_SC",424"en_SD", "en_SE", "en_SG", "en_SH", "en_SI", "en_SL", "en_SS", "en_SX",425"en_SZ", "en_TC", "en_TK", "en_TO", "en_TT", "en_TV", "en_TZ", "en_UG",426"en_UM", "en_US", "en_US_#Latn", "en_US_POSIX", "en_VC", "en_VG", "en_VI", "en_VU",427"en_WS", "en_ZA", "en_ZM", "en_ZW"),428"",429},430431// Error case: No matching locales432{433"--include-locales=xyz",434"jdk.localedata",435null,436null,437null,438new PluginException(String.format(439PluginsResourceBundle.getMessage("include-locales.nomatchinglocales"), "xyz"))440.getMessage(),441},442443// Error case: Invalid argument444{445"--include-locales=en,zh_HK",446"jdk.localedata",447null,448null,449null,450new PluginException(String.format(451PluginsResourceBundle.getMessage("include-locales.invalidtag"), "zh_hk"))452.getMessage(),453},454455// Error case: jdk.localedata is not added456{457"--include-locales=en-US",458"java.base",459null,460null,461null,462new PluginException(463PluginsResourceBundle.getMessage("include-locales.localedatanotfound"))464.getMessage(),465},466};467468public static void main(String[] args) throws Exception {469helper = Helper.newHelper();470if (helper == null) {471System.err.println("Test not run");472return;473}474helper.generateDefaultModules();475476for (Object[] data : testData) {477// create image for each test data478Result result;479if (data[INCLUDE_LOCALES_OPTION].toString().isEmpty()) {480System.out.println("Invoking jlink with no --include-locales option");481result = JImageGenerator.getJLinkTask()482.modulePath(helper.defaultModulePath())483.output(helper.createNewImageDir(moduleName))484.addMods((String) data[ADDMODS_OPTION])485.call();486} else {487System.out.println("Invoking jlink with \"" + data[INCLUDE_LOCALES_OPTION] + "\"");488result = JImageGenerator.getJLinkTask()489.modulePath(helper.defaultModulePath())490.output(helper.createNewImageDir(moduleName))491.addMods((String) data[ADDMODS_OPTION])492.option((String) data[INCLUDE_LOCALES_OPTION])493.call();494}495496String errorMsg = (String) data[ERROR_MESSAGE];497if (errorMsg.isEmpty()) {498Path image = result.assertSuccess();499500// test locale data entries501testLocaleDataEntries(image,502(List<String>) data[EXPECTED_LOCATIONS],503(List<String>) data[UNEXPECTED_PATHS]);504505// test available locales506testAvailableLocales(image, (List<String>) data[AVAILABLE_LOCALES]);507} else {508result.assertFailure(new TaskHelper(TaskHelper.JLINK_BUNDLE)509.getMessage("error.prefix") + " " +errorMsg);510System.out.println("\tExpected failure: " + result.getMessage());511}512}513514if (errors > 0) {515throw new RuntimeException("Test failed");516}517}518519private static void testLocaleDataEntries(Path image, List<String> expectedLocations,520List<String> unexpectedPaths) throws Exception {521System.out.println("testLocaleDataEntries:");522try {523JImageValidator.validate(524image.resolve("lib").resolve("modules"),525expectedLocations, unexpectedPaths);526} catch (Exception e) {527System.out.println("\tFailed with: " + e);528e.printStackTrace();529errors++;530}531}532533private static void testAvailableLocales(Path image, List<String> availableLocales) throws Exception {534System.out.println("testAvailableLocales:");535Path launcher = image.resolve("bin/java" +536(System.getProperty("os.name").startsWith("Windows") ? ".exe" : ""));537List<String> args = new ArrayList<>(availableLocales.size() + 2);538args.add(launcher.toString());539args.add("GetAvailableLocales");540args.addAll(availableLocales);541Process proc = new ProcessBuilder(args).inheritIO().start();542543int len = Math.min(10, args.size());544String command = args.subList(0, len).stream().collect(Collectors.joining(" "))545+ (len < availableLocales.size() ? " ..." : "");546547int status = proc.waitFor();548if (status == 0) {549System.out.println("\tDone\t" + command);550} else {551System.out.println("\tExit " + status + "\t" + command);552errors++;553}554System.out.println();555}556}557558559