/* * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 5102289 6278334 * @summary Test the default Control implementation. The expiration * functionality of newBundle, getTimeToLive, and needsReload is * tested by ExpirationTest.sh. The factory methods are tested * separately. * @build TestResourceRB * @build NonResourceBundle * @run main DefaultControlTest */ import java.util.*; import static java.util.ResourceBundle.Control.*; public class DefaultControlTest { // The ResourceBundle.Control instance static final ResourceBundle.Control CONTROL = ResourceBundle.Control.getControl(FORMAT_DEFAULT); static final ResourceBundle BUNDLE = new ResourceBundle() { public Enumeration<String> getKeys() { return null; } protected Object handleGetObject(String key) { return null; } }; static final String CLAZZ = FORMAT_CLASS.get(0); static final String PROPERTIES = FORMAT_PROPERTIES.get(0); static final ClassLoader LOADER = DefaultControlTest.class.getClassLoader(); // Full arguments for NPE testing static final Object[] FULLARGS = { "any", Locale.US, FORMAT_PROPERTIES.get(0), LOADER, BUNDLE }; static int errors; public static void main(String[] args) { checkConstants(); // Test getFormats(String) testGetFormats(); // Test getCandidateLocales(String, Locale) testGetCandidateLocales(); // Test getFallbackLocale(String, Locale) testGetFallbackLocale(); // Test newBundle(String, Locale, String, ClassLoader, boolean) testNewBundle(); // Test toBundleName(String, Locale) testToBundleName(); // Test getTimeToLive(String, Locale) testGetTimeToLive(); // Test needsReload(String, Locale, String, ClassLoader, // ResourceBundle, long) testNeedsReload(); // Test toResourceName(String, String) testToResourceName(); if (errors > 0) { throw new RuntimeException("FAILED: " + errors + " error(s)"); } } private static void checkConstants() { // Check FORMAT_* if (!CONTROL.FORMAT_DEFAULT.equals(Arrays.asList("java.class", "java.properties"))) { error("Wrong Control.FORMAT_DEFAULT"); } checkImmutableList(CONTROL.FORMAT_DEFAULT); if (!CONTROL.FORMAT_CLASS.equals(Arrays.asList("java.class"))) { error("Wrong Control.FORMAT_CLASS"); } checkImmutableList(CONTROL.FORMAT_CLASS); if (!CONTROL.FORMAT_PROPERTIES.equals(Arrays.asList("java.properties"))) { error("Wrong Control.FORMAT_PROPERTIES"); } checkImmutableList(CONTROL.FORMAT_PROPERTIES); // Check TTL_* if (CONTROL.TTL_DONT_CACHE != -1) { error("Wrong Control.TTL_DONT_CACHE: %d%n", CONTROL.TTL_DONT_CACHE); } if (CONTROL.TTL_NO_EXPIRATION_CONTROL != -2) { error("Wrong Control.TTL_NO_EXPIRATION_CONTROL: %d%n", CONTROL.TTL_NO_EXPIRATION_CONTROL); } } private static void checkImmutableList(List<String> list) { try { list.add("hello"); error("%s is mutable%n", list); } catch (UnsupportedOperationException e) { } } private static void testGetFormats() { List<String> list = CONTROL.getFormats("foo"); if (list != CONTROL.FORMAT_DEFAULT) { error("getFormats returned " + list); } try { list = CONTROL.getFormats(null); error("getFormats doesn't throw NPE."); } catch (NullPointerException e) { } } private static void testGetCandidateLocales() { Map<Locale, Locale[]> candidateData = new HashMap<Locale, Locale[]>(); candidateData.put(new Locale("ja", "JP", "YOK"), new Locale[] { new Locale("ja", "JP", "YOK"), new Locale("ja", "JP"), new Locale("ja"), new Locale("") }); candidateData.put(new Locale("ja", "JP"), new Locale[] { new Locale("ja", "JP"), new Locale("ja"), new Locale("") }); candidateData.put(new Locale("ja"), new Locale[] { new Locale("ja"), new Locale("") }); candidateData.put(new Locale("ja", "", "YOK"), new Locale[] { new Locale("ja", "", "YOK"), new Locale("ja"), new Locale("") }); candidateData.put(new Locale("", "JP", "YOK"), new Locale[] { new Locale("", "JP", "YOK"), new Locale("", "JP"), new Locale("") }); candidateData.put(new Locale("", "", "YOK"), new Locale[] { new Locale("", "", "YOK"), new Locale("") }); candidateData.put(new Locale("", "JP"), new Locale[] { new Locale("", "JP"), new Locale("") }); candidateData.put(new Locale(""), new Locale[] { new Locale("") }); for (Locale locale : candidateData.keySet()) { List<Locale> candidates = CONTROL.getCandidateLocales("any", locale); List<Locale> expected = Arrays.asList(candidateData.get(locale)); if (!candidates.equals(expected)) { error("Wrong candidates for %s: got %s, expected %s%n", toString(locale), candidates, expected); } } final int NARGS = 2; for (int mask = 0; mask < (1 << NARGS)-1; mask++) { Object[] data = getNpeArgs(NARGS, mask); try { List<Locale> candidates = CONTROL.getCandidateLocales((String) data[0], (Locale) data[1]); error("getCandidateLocales(%s, %s) doesn't throw NPE.%n", data[0], toString((Locale)data[1])); } catch (NullPointerException e) { } } } private static void testGetFallbackLocale() { Locale current = Locale.getDefault(); Locale.setDefault(Locale.ITALY); try { Locale loc = CONTROL.getFallbackLocale("any", Locale.FRANCE); if (loc != Locale.ITALY) { error("getFallbackLocale: got %s, expected %s%n", toString(loc), toString(Locale.ITALY)); } loc = CONTROL.getFallbackLocale("any", Locale.ITALY); if (loc != null) { error("getFallbackLocale: got %s, expected null%n", toString(loc)); } } finally { Locale.setDefault(current); } final int NARGS = 2; for (int mask = 0; mask < (1 << NARGS)-1; mask++) { Object[] data = getNpeArgs(NARGS, mask); try { Locale loc = CONTROL.getFallbackLocale((String) data[0], (Locale) data[1]); error("getFallbackLocale(%s, %s) doesn't throw NPE.%n", data[0], data[1]); } catch (NullPointerException e) { } } } private static void testNewBundle() { int testNo = 0; ResourceBundle rb = null; try { testNo = 1; rb = CONTROL.newBundle("StressOut", Locale.JAPANESE, PROPERTIES, LOADER, false); String s = rb.getString("data"); if (!s.equals("Japan")) { error("newBundle: #%d got %s, expected Japan%n", testNo, s); } testNo = 2; rb = CONTROL.newBundle("TestResourceRB", new Locale(""), CLAZZ, LOADER, false); s = rb.getString("type"); if (!s.equals(CLAZZ)) { error("newBundle: #%d got %s, expected %s%n", testNo, s, CLAZZ); } } catch (Throwable e) { error("newBundle: #%d threw %s%n", testNo, e); e.printStackTrace(); } // Test exceptions try { // MalformedDataRB contains an invalid Unicode notation which // causes to throw an IllegalArgumentException. rb = CONTROL.newBundle("MalformedDataRB", Locale.ENGLISH, PROPERTIES, LOADER, false); error("newBundle: doesn't throw IllegalArgumentException with malformed data."); } catch (IllegalArgumentException iae) { } catch (Exception e) { error("newBundle: threw %s%n", e); } try { rb = CONTROL.newBundle("StressOut", Locale.JAPANESE, "foo.bar", LOADER, false); error("newBundle: doesn't throw IllegalArgumentException with invalid format."); } catch (IllegalArgumentException iae) { } catch (Exception e) { error("newBundle: threw %s%n", e); } try { rb = CONTROL.newBundle("NonResourceBundle", new Locale(""), "java.class", LOADER, false); error("newBundle: doesn't throw ClassCastException with a non-ResourceBundle subclass."); } catch (ClassCastException cce) { } catch (Exception e) { error("newBundle: threw %s%n", e); } // NPE test final int NARGS = 4; for (int mask = 0; mask < (1 << NARGS)-1; mask++) { Object[] data = getNpeArgs(NARGS, mask); Locale loc = (Locale) data[1]; try { rb = CONTROL.newBundle((String) data[0], loc, (String) data[2], (ClassLoader) data[3], false); error("newBundle(%s, %s, %s, %s, false) doesn't throw NPE.%n", data[0], toString(loc), data[2], data[3]); } catch (NullPointerException npe) { } catch (Exception e) { error("newBundle(%s, %s, %s, %s, false) threw %s.%n", data[0], toString(loc), data[2], data[3], e); } } } private static void testGetTimeToLive() { long ttl = CONTROL.getTimeToLive("any", Locale.US); if (ttl != CONTROL.TTL_NO_EXPIRATION_CONTROL) { error("getTimeToLive: got %d, expected %d%n", ttl, CONTROL.TTL_NO_EXPIRATION_CONTROL); } final int NARGS = 2; for (int mask = 0; mask < (1 << NARGS)-1; mask++) { Object[] data = getNpeArgs(NARGS, mask); try { ttl = CONTROL.getTimeToLive((String) data[0], (Locale) data[1]); error("getTimeToLive(%s, %s) doesn't throw NPE.%n", data[0], data[1]); } catch (NullPointerException e) { } } } // The functionality of needsReload is tested by // ExpirationTest.sh. Only parameter checking is tested here. private static void testNeedsReload() { long loadTime = System.currentTimeMillis(); // NPE test final int NARGS = 5; for (int mask = 0; mask < (1 << NARGS)-1; mask++) { Object[] data = getNpeArgs(NARGS, mask); Locale loc = (Locale) data[1]; try { boolean b = CONTROL.needsReload((String) data[0], loc, (String) data[2], (ClassLoader) data[3], (ResourceBundle) data[4], loadTime); error("needsReload(%s, %s, %s, %s, %s, loadTime) doesn't throw NPE.%n", data[0], toString(loc), data[2], data[3], data[4]); } catch (NullPointerException e) { } } } private static void testToBundleName() { final String name = "J2SE"; Map<Locale, String> bundleNames = new HashMap<Locale, String>(); bundleNames.put(new Locale("ja", "JP", "YOK"), name + "_" + "ja" + "_" + "JP" + "_" + "YOK"); bundleNames.put(new Locale("ja", "JP"), name + "_" + "ja" + "_" + "JP"); bundleNames.put(new Locale("ja"), name + "_" + "ja"); bundleNames.put(new Locale("ja", "", "YOK"), name + "_" + "ja" + "_" + "" + "_" + "YOK"); bundleNames.put(new Locale("", "JP", "YOK"), name + "_" + "" + "_" + "JP" + "_" + "YOK"); bundleNames.put(new Locale("", "", "YOK"), name + "_" + "" + "_" + "" + "_" + "YOK"); bundleNames.put(new Locale("", "JP"), name + "_" + "" + "_" + "JP"); bundleNames.put(new Locale(""), name); for (Locale locale : bundleNames.keySet()) { String bn = CONTROL.toBundleName(name, locale); String expected = bundleNames.get(locale); if (!bn.equals(expected)) { error("toBundleName: got %s, expected %s%n", bn, expected); } } final int NARGS = 2; for (int mask = 0; mask < (1 << NARGS)-1; mask++) { Object[] data = getNpeArgs(NARGS, mask); try { String s = CONTROL.toBundleName((String) data[0], (Locale) data[1]); error("toBundleName(%s, %s) doesn't throw NPE.%n", data[0], data[1]); } catch (NullPointerException e) { } } } private static void testToResourceName() { String[][] names = { // bundleName, suffix, expected result { "com.sun.J2SE", "xml", "com/sun/J2SE.xml" }, { ".J2SE", "xml", "/J2SE.xml" }, { "J2SE", "xml", "J2SE.xml" }, { "com/sun/J2SE", "xml", "com/sun/J2SE.xml" }, { "com.sun.J2SE", "", "com/sun/J2SE." }, { ".", "", "/." }, { "", "", "." }, // data for NPE tests { null, "any", null }, { "any", null, null }, { null, null, null }, }; for (String[] data : names) { String result = null; boolean npeThrown = false; try { result = CONTROL.toResourceName(data[0], data[1]); } catch (NullPointerException npe) { npeThrown = true; } String expected = data[2]; if (expected != null) { if (!result.equals(expected)) { error("toResourceName: got %s, expected %s%n", result, data[2]); } } else { if (!npeThrown) { error("toResourceName(%s, %s) doesn't throw NPE.%n", data[0], data[1]); } } } } /** * Produces permutations argument data that contains at least one * null. */ private static Object[] getNpeArgs(int length, int mask) { Object[] data = new Object[length]; for (int i = 0; i < length; i++) { if ((mask & (1 << i)) == 0) { data[i] = null; } else { data[i] = FULLARGS[i]; } } return data; } private static String toString(Locale loc) { if (loc == null) return "null"; return "\"" + loc.getLanguage() + "_" + loc.getCountry() + "_" + loc.getVariant() + "\""; } private static void error(String msg) { System.out.println(msg); errors++; } private static void error(String fmt, Object... args) { System.out.printf(fmt, args); errors++; } }