* Copyright (c) 2007, 2022, 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 4049325 4073127 4083270 4106034 4108126 8027930 8171139
@summary test Resource Bundle
@build TestResource TestResource_de TestResource_fr TestResource_fr_CH
@build TestResource_it FakeTestResource
@run main ResourceBundleTest
*/
* This file is available under and governed by the GNU General Public
* License version 2 only, as published by the Free Software Foundation.
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
* (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
* (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
*
* Portions copyright (c) 2007 Sun Microsystems, Inc.
* All Rights Reserved.
*
* The original version of this source code and documentation
* is copyrighted and owned by Taligent, Inc., a wholly-owned
* subsidiary of IBM. These materials are provided under terms
* of a License Agreement between Taligent and Sun. This technology
* is protected by multiple US and International patents.
*
* This notice and attribution to Taligent may not be removed.
* Taligent is a registered trademark of Taligent, Inc.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*
*/
import java.text.*;
import java.util.*;
import java.util.ResourceBundle.Control;
import java.io.*;
import java.net.URL;
public class ResourceBundleTest extends RBTestFmwk {
public static void main(String[] args) throws Exception {
new ResourceBundleTest().run(args);
}
public ResourceBundleTest() {
makePropertiesFile();
}
public void TestResourceBundle() {
Locale saveDefault = Locale.getDefault();
Locale.setDefault(Locale.FRANCE);
ResourceBundle bundle = ResourceBundle.getBundle("TestResource");
if (!bundle.getClass().getName().equals("TestResource_fr"))
errln("Expected TestResource_fr, got " + bundle.getClass().getName());
String test1 = bundle.getString("Time");
if (!test1.equals("Time keeps on slipping..."))
errln("TestResource_fr returned wrong value for \"Time\": got " + test1);
test1 = bundle.getString("For");
if (!test1.equals("Four score and seven years ago..."))
errln("TestResource_fr returned wrong value for \"For\": got " + test1);
String[] test2 = bundle.getStringArray("All");
if (test2.length != 4)
errln("TestResource_fr returned wrong number of elements for \"All\": got " + test2.length);
else if (!test2[0].equals("'Twas brillig, and the slithy toves") ||
!test2[1].equals("Did gyre and gimble in the wabe.") ||
!test2[2].equals("All mimsy were the borogoves,") ||
!test2[3].equals("And the mome raths outgrabe."))
errln("TestResource_fr returned the wrong value for one of the elements in \"All\"");
Object test3 = bundle.getObject("Good");
if (test3 == null || test3.getClass() != Integer.class)
errln("TestResource_fr returned an object of the wrong class for \"Good\"");
else if (((Integer)test3).intValue() != 3)
errln("TestResource_fr returned the wrong value for \"Good\": got " + test3);
test2 = bundle.getStringArray("Men");
if (test2.length != 3)
errln("TestResource_fr returned wrong number of elements for \"Men\": got " + test2.length);
else if (!test2[0].equals("1") ||
!test2[1].equals("2") ||
!test2[2].equals("C"))
errln("TestResource_fr returned the wrong value for one of the elements in \"All\"");
try {
test3 = bundle.getObject("Is");
errln("TestResource_fr returned a value for \"Is\" when it shouldn't: got " + test3);
}
catch (MissingResourceException e) {
}
String[] keys = { "Now", "Time", "For", "All", "Good", "Men", "Come" };
checkKeys(bundle.getKeys(), keys);
Locale.setDefault(saveDefault);
}
public void TestListResourceBundle() {
ResourceBundle bundle = ResourceBundle.getBundle("TestResource",
Locale.of("be", "BY"),
Control.getNoFallbackControl(Control.FORMAT_DEFAULT));
if (!bundle.getClass().getName().equals("TestResource"))
errln("Expected TestResource, got " + bundle.getClass().getName());
doListResourceBundleTest(bundle);
}
* @bug 4073127
* Repeat TestListResourceBundle on TestResource_it, which is a ListResourceBundle
* with NO contents. It should gracefully inherit everything from the root
* TestResource.
*/
public void TestEmptyListResourceBundle() {
ResourceBundle bundle = ResourceBundle.getBundle("TestResource",
Locale.ITALY);
doListResourceBundleTest(bundle);
}
private void doListResourceBundleTest(ResourceBundle bundle) {
String test1 = bundle.getString("Now");
if (!test1.equals("Now is the time for all..."))
errln("TestResource returned wrong value for \"Now\": got " + test1);
test1 = bundle.getString("Time");
if (!test1.equals("Howdy Doody Time!"))
errln("TestResource returned wrong value for \"Time\": got " + test1);
test1 = bundle.getString("Come");
if (!test1.equals("Come into my parlor..."))
errln("TestResource returned wrong value for \"Come\": got " + test1);
Object test3 = bundle.getObject("Good");
if (test3 == null || test3.getClass() != Integer.class)
errln("TestResource returned an object of the wrong class for \"Good\"");
else if (((Integer)test3).intValue() != 27)
errln("TestResource returned the wrong value for \"Good\": got " + test3);
String[] test2 = bundle.getStringArray("Men");
if (test2.length != 3)
errln("TestResource returned wrong number of elements for \"Men\": got " + test2.length);
else if (!test2[0].equals("1") ||
!test2[1].equals("2") ||
!test2[2].equals("C"))
errln("TestResource returned the wrong value for one of the elements in \"All\"");
try {
test3 = bundle.getObject("All");
errln("TestResource_en returned a value for \"All\" when it shouldn't: got " + test3);
}
catch (MissingResourceException e) {
}
String[] keys = { "Now", "Time", "Good", "Men", "Come" };
checkKeys(bundle.getKeys(), keys);
}
* @bug 4049325
* @ summary Bug 4049325 says ResourceBundle.findBundle() uses a hard-coded '/' as
* the directory separator when searching for properties files. Interestingly, it
* still works on my NT installation. I can't tell whether this is a required
* property of all Java implementations (the magic appears to happen ClassLoader.
* getResourceAsStream(), which is a native function) or a lucky property of my
* particular implementation. If this bug regresses, this test may still pass
* because a lower-level facility translates the / to the platform-specific separator
* for us.
*/
public void TestPropertyResourceBundle() {
ResourceBundle bundle = ResourceBundle.getBundle("TestResource",
Locale.of("es", "ES"));
String test = bundle.getString("Now");
if (!test.equals("How now brown cow"))
errln("TestResource_es returned wrong value for \"Now\": got " + test);
test = bundle.getString("Is");
if (!test.equals("Is there a dog?"))
errln("TestResource_es returned wrong value for \"Is\": got " + test);
test = bundle.getString("The");
if (!test.equals("The rain in Spain"))
errln("TestResource_es returned wrong value for \"The\": got " + test);
test = bundle.getString("Time");
if (!test.equals("Time marches on..."))
errln("TestResource_es returned wrong value for \"Time\": got " + test);
String[] test2 = bundle.getStringArray("Men");
if (test2.length != 3)
errln("TestResource returned wrong number of elements for \"Men\": got " + test2.length);
else if (!test2[0].equals("1") ||
!test2[1].equals("2") ||
!test2[2].equals("C"))
errln("TestResource returned the wrong value for one of the elements in \"All\"");
try {
test = bundle.getString("All");
errln("TestResource_es returned a value for \"All\" when it shouldn't: got " + test);
}
catch (MissingResourceException e) {
}
String[] keys = { "Now", "Is", "The", "Time", "Good", "Men", "Come" };
checkKeys(bundle.getKeys(), keys);
}
* @bug 4108126
*/
public void TestGetLocale() {
ResourceBundle test = ResourceBundle.getBundle("TestResource",
Locale.of("fr", "CH"));
Locale locale = test.getLocale();
if (!(locale.getLanguage().equals("fr")) || !(locale.getCountry().equals("CH")))
errln("Actual locale for TestResource_fr_CH should have been fr_CH, got " + locale);
test = ResourceBundle.getBundle("TestResource",
Locale.of("fr", "BE"));
locale = test.getLocale();
if (!(locale.getLanguage().equals("fr")) || !(locale.getCountry().equals("")))
errln("Actual locale for TestResource_fr_BE should have been fr, got " + locale);
test = ResourceBundle.getBundle("TestResource",
Locale.of("iw", "IL"),
Control.getNoFallbackControl(Control.FORMAT_DEFAULT));
locale = test.getLocale();
if (!(locale.getLanguage().equals("")) || !(locale.getCountry().equals("")))
errln("Actual locale for TestResource_iw_IL should have been the root locale, got "
+ locale);
}
* @bug 4083270
*/
public void TestNonSubclass() {
Object test1 = ResourceBundle.getBundle("FakeTestResource",
Locale.US);
if (!(test1 instanceof ResourceBundle))
errln("Got back a " + test1.getClass().getName() + " instead of a PropertyResourceBundle when looking for FakeTestResource.");
ResourceBundle test = (ResourceBundle)test1;
String message = test.getString("message");
if (!message.equals("Hello!"))
errln("Supposedly found FakeTestResource.properties, but it had the wrong contents.");
}
* @bug 4106034
*/
public void TestErrorMessage() {
final String className = "TestResource";
final String keyName = "DontGetThis";
ResourceBundle bundle = ResourceBundle.getBundle(className,
Locale.ITALY);
try {
Object o = bundle.getObject(keyName);
errln(bundle.getClass().getName()+" returned a value for tag \""+keyName+"\" when it should have thrown an exception. It returned "+o);
} catch (MissingResourceException e) {
String message = e.getMessage();
boolean found = false;
if (message.indexOf(className) < 0) {
errln("MissingResourceException error message did not contain class name.");
}
if (message.indexOf(keyName) < 0) {
errln("MissingResourceException error message did not contain resource key name.");
}
}
}
* @bug 8171139
* @summary Make sure clearCache() clears cached ResourceBundle instances
*/
public void TestClearCache() {
final String className = "TestResource";
Locale loc = Locale.getDefault();
ResourceBundle rb1 = ResourceBundle.getBundle(className, loc);
ResourceBundle.clearCache();
ResourceBundle rb2 = ResourceBundle.getBundle(className, loc);
if (rb1 == rb2) {
errln("clearCache(no-arg) did not clear cache");
}
ClassLoader cl1 = new DummyClassLoader();
rb1 = ResourceBundle.getBundle(className, loc, cl1);
if (rb1 == rb2) {
errln("Same bundle was returned for different class loaders");
}
ResourceBundle.clearCache(cl1);
rb2= ResourceBundle.getBundle(className, loc, cl1);
if (rb1 == rb2) {
errln("clearCache(classLoader) did not clear cache");
}
ClassLoader cl2 = new DummyClassLoader();
rb1 = ResourceBundle.getBundle(className, loc, cl2);
if (rb1 == rb2) {
errln("Same bundle was returned for different class loaders");
}
ResourceBundle.clearCache(cl1);
rb2 = ResourceBundle.getBundle(className, loc, cl2);
if (rb1 != rb2) {
errln("clearCache(classLoader) incorrectly cleared cache");
}
}
private void makePropertiesFile() {
try {
String classesDir = System.getProperty("test.classes", ".");
File file = new File(classesDir, "TestResource_es.properties");
if (!file.exists()) {
FileOutputStream stream = new FileOutputStream(file);
Properties props = new Properties();
props.put("Now", "How now brown cow");
props.put("Is", "Is there a dog?");
props.put("The", "The rain in Spain");
props.put("Time", "Time marches on...");
props.save(stream, "Test property list");
stream.close();
}
file = new File(classesDir, "FakeTestResource.properties");
if (!file.exists()) {
FileOutputStream stream = new FileOutputStream(file);
Properties props = new Properties();
props.put("message", "Hello!");
props.save(stream, "Test property list");
stream.close();
}
}
catch (java.io.IOException e) {
errln("Got exception: " + e);
}
}
private void checkKeys(Enumeration testKeys, String[] expectedKeys) {
Hashtable hash = new Hashtable();
String element;
int elementCount = 0;
for (int i=0; i < expectedKeys.length; i++)
hash.put(expectedKeys[i], expectedKeys[i]);
while (testKeys.hasMoreElements()) {
element = (String)testKeys.nextElement();
elementCount++;
if (!hash.containsKey(element))
errln(element + " missing from key list.");
}
if (elementCount != expectedKeys.length)
errln("Wrong number of elements in key list: expected " + expectedKeys.length +
" got " + elementCount);
}
private static class DummyClassLoader extends ClassLoader {
public DummyClassLoader() {
super(DummyClassLoader.class.getClassLoader());
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
return DummyClassLoader.class.getClassLoader().loadClass(name);
}
public URL getResource(String name) {
return DummyClassLoader.class.getClassLoader().getResource(name);
}
public InputStream getResourceAsStream(String name) {
return DummyClassLoader.class.getClassLoader().getResourceAsStream(name);
}
}
}