1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 package org.apache.harmony.tests.java.util;
19 
20 import dalvik.annotation.KnownFailure;
21 import java.io.File;
22 import java.net.MalformedURLException;
23 import java.net.URL;
24 import java.net.URLClassLoader;
25 import java.util.Enumeration;
26 import java.util.Locale;
27 import java.util.MissingResourceException;
28 import java.util.ResourceBundle;
29 import java.util.StringTokenizer;
30 import java.util.Vector;
31 import org.apache.harmony.tests.java.util.support.B;
32 import tests.support.resource.Support_Resources;
33 
34 public class ResourceBundleTest extends junit.framework.TestCase {
35 
test_getCandidateLocales()36     public void test_getCandidateLocales() throws Exception {
37         ResourceBundle.Control c = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT);
38         assertEquals("[en_US, en, ]", c.getCandidateLocales("base", Locale.US).toString());
39         assertEquals("[de_CH, de, ]", c.getCandidateLocales("base", new Locale("de", "CH")).toString());
40     }
41 
42     /**
43      * java.util.ResourceBundle#getBundle(java.lang.String,
44      *        java.util.Locale)
45      */
test_getBundleLjava_lang_StringLjava_util_Locale()46     public void test_getBundleLjava_lang_StringLjava_util_Locale() {
47         ResourceBundle bundle;
48         String name = "tests.support.Support_TestResource";
49         Locale defLocale = Locale.getDefault();
50 
51         Locale.setDefault(new Locale("en", "US"));
52         bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
53         assertEquals("Wrong bundle fr_FR_VAR", "frFRVARValue4", bundle.getString("parent4"));
54 
55         bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "v1"));
56         assertEquals("Wrong bundle fr_FR_v1", "frFRValue4", bundle.getString("parent4"));
57 
58         bundle = ResourceBundle.getBundle(name, new Locale("fr", "US", "VAR"));
59         assertEquals("Wrong bundle fr_US_var", "frValue4", bundle.getString("parent4"));
60 
61         bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "VAR"));
62         assertEquals("Wrong bundle de_FR_var", "enUSValue4", bundle.getString("parent4"));
63 
64         Locale.setDefault(new Locale("fr", "FR", "VAR"));
65         bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "v1"));
66         assertEquals("Wrong bundle de_FR_var 2", "frFRVARValue4", bundle.getString("parent4"));
67 
68         Locale.setDefault(new Locale("de", "US"));
69         bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "var"));
70         assertEquals("Wrong bundle de_FR_var 2", "parentValue4", bundle.getString("parent4")
71                 );
72 
73         try {
74             ResourceBundle.getBundle(null, Locale.US);
75             fail("NullPointerException expected");
76         } catch (NullPointerException ee) {
77             //expected
78         }
79         try {
80             ResourceBundle.getBundle("blah", (Locale) null);
81             fail("NullPointerException expected");
82         } catch (NullPointerException ee) {
83             //expected
84         }
85 
86 
87         try {
88             ResourceBundle.getBundle("", new Locale("xx", "yy"));
89             fail("MissingResourceException expected");
90         } catch (MissingResourceException ee) {
91             //expected
92         }
93     }
94 
95     /**
96      * java.util.ResourceBundle#getBundle(java.lang.String,
97      *        java.util.Locale, java.lang.ClassLoader)
98      */
99     @KnownFailure("It's not allowed to pass null as parent class loader to"
100             + " a new ClassLoader anymore. Maybe we need to change"
101             + " URLClassLoader to allow this? It's not specified.")
test_getBundleLjava_lang_StringLjava_util_LocaleLjava_lang_ClassLoader()102     public void test_getBundleLjava_lang_StringLjava_util_LocaleLjava_lang_ClassLoader() {
103         String classPath = System.getProperty("java.class.path");
104         StringTokenizer tok = new StringTokenizer(classPath, File.pathSeparator);
105         Vector<URL> urlVec = new Vector<URL>();
106         String resPackage = Support_Resources.RESOURCE_PACKAGE;
107         try {
108             while (tok.hasMoreTokens()) {
109                 String path = tok.nextToken();
110                 String url;
111                 if (new File(path).isDirectory())
112                     url = "file:" + path + resPackage + "subfolder/";
113                 else
114                     url = "jar:file:" + path + "!" + resPackage + "subfolder/";
115                 urlVec.addElement(new URL(url));
116             }
117         } catch (MalformedURLException e) {
118         }
119         URL[] urls = new URL[urlVec.size()];
120         for (int i = 0; i < urlVec.size(); i++)
121             urls[i] = urlVec.elementAt(i);
122         URLClassLoader loader = new URLClassLoader(urls, null);
123 
124         String name = Support_Resources.RESOURCE_PACKAGE_NAME
125                 + ".hyts_resource";
126         ResourceBundle bundle = ResourceBundle.getBundle(name, Locale
127                 .getDefault());
128             assertEquals("Wrong value read", "parent", bundle.getString("property"));
129         bundle = ResourceBundle.getBundle(name, Locale.getDefault(), loader);
130         assertEquals("Wrong cached value",
131                 "resource", bundle.getString("property"));
132 
133         try {
134             ResourceBundle.getBundle(null, Locale.getDefault(), loader);
135             fail("NullPointerException expected");
136         } catch (NullPointerException ee) {
137             //expected
138         }
139 
140         try {
141             ResourceBundle.getBundle(name, null, loader);
142             fail("NullPointerException expected");
143         } catch (NullPointerException ee) {
144             //expected
145         }
146 
147         try {
148             ResourceBundle.getBundle(name, Locale.getDefault(), (ClassLoader) null);
149             fail("NullPointerException expected");
150         } catch (NullPointerException ee) {
151             //expected
152         }
153 
154         try {
155             ResourceBundle.getBundle("", Locale.getDefault(), loader);
156             fail("MissingResourceException expected");
157         } catch (MissingResourceException ee) {
158             //expected
159         }
160 
161         // Regression test for Harmony-3823
162         B bb = new B();
163         String s = bb.find("nonexistent");
164         s = bb.find("name");
165         assertEquals("Wrong property got", "Name", s);
166     }
167 
168     /**
169      * java.util.ResourceBundle#getString(java.lang.String)
170      */
test_getStringLjava_lang_String()171     public void test_getStringLjava_lang_String() {
172         ResourceBundle bundle;
173         String name = "tests.support.Support_TestResource";
174         Locale.setDefault(new Locale("en", "US"));
175         bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
176         assertEquals("Wrong value parent4",
177                 "frFRVARValue4", bundle.getString("parent4"));
178         assertEquals("Wrong value parent3",
179                 "frFRValue3", bundle.getString("parent3"));
180         assertEquals("Wrong value parent2",
181                 "frValue2", bundle.getString("parent2"));
182         assertEquals("Wrong value parent1",
183                 "parentValue1", bundle.getString("parent1"));
184         assertEquals("Wrong value child3",
185                 "frFRVARChildValue3", bundle.getString("child3"));
186         assertEquals("Wrong value child2",
187                 "frFRVARChildValue2", bundle.getString("child2"));
188         assertEquals("Wrong value child1",
189                 "frFRVARChildValue1", bundle.getString("child1"));
190 
191         try {
192             bundle.getString(null);
193             fail("NullPointerException expected");
194         } catch (NullPointerException ee) {
195             //expected
196         }
197 
198         try {
199             bundle.getString("");
200             fail("MissingResourceException expected");
201         } catch (MissingResourceException ee) {
202             //expected
203         }
204 
205         try {
206             bundle.getString("IntegerVal");
207             fail("ClassCastException expected");
208         } catch (ClassCastException ee) {
209             //expected
210         }
211     }
test_getBundle_getClassName()212     public void test_getBundle_getClassName() {
213         // Regression test for Harmony-1759
214         Locale locale = Locale.GERMAN;
215         String nonExistentBundle = "Non-ExistentBundle";
216         try {
217             ResourceBundle.getBundle(nonExistentBundle, locale, this.getClass()
218                     .getClassLoader());
219             fail("MissingResourceException expected!");
220         } catch (MissingResourceException e) {
221             assertEquals(nonExistentBundle + "_" + locale, e.getClassName());
222         }
223 
224         try {
225             ResourceBundle.getBundle(nonExistentBundle, locale);
226             fail("MissingResourceException expected!");
227         } catch (MissingResourceException e) {
228             assertEquals(nonExistentBundle + "_" + locale, e.getClassName());
229         }
230 
231         locale = Locale.getDefault();
232         try {
233             ResourceBundle.getBundle(nonExistentBundle);
234             fail("MissingResourceException expected!");
235         } catch (MissingResourceException e) {
236             assertEquals(nonExistentBundle + "_" + locale, e.getClassName());
237         }
238     }
239 
240     class Mock_ResourceBundle extends ResourceBundle {
241         @Override
getKeys()242         public Enumeration<String> getKeys() {
243             return null;
244         }
245 
246         @Override
handleGetObject(String key)247         protected Object handleGetObject(String key) {
248             return null;
249         }
250     }
251 
test_constructor()252     public void test_constructor() {
253         assertNotNull(new Mock_ResourceBundle());
254     }
255 
test_getLocale()256     public void test_getLocale() {
257         ResourceBundle bundle;
258         String name = "tests.support.Support_TestResource";
259         Locale loc = Locale.getDefault();
260         Locale.setDefault(new Locale("en", "US"));
261 
262         bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
263         assertEquals("fr_FR_VAR", bundle.getLocale().toString());
264 
265         bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "v1"));
266         assertEquals("fr_FR", bundle.getLocale().toString());
267 
268         bundle = ResourceBundle.getBundle(name, new Locale("fr", "US", "VAR"));
269         assertEquals("fr", bundle.getLocale().toString());
270 
271         bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "VAR"));
272         assertEquals("en_US", bundle.getLocale().toString());
273 
274         bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "v1"));
275         assertEquals("en_US", bundle.getLocale().toString());
276 
277         bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "var"));
278         assertEquals("en_US", bundle.getLocale().toString());
279 
280         Locale.setDefault(loc);
281     }
282 
test_getObjectLjava_lang_String()283     public void test_getObjectLjava_lang_String() {
284         ResourceBundle bundle;
285         String name = "tests.support.Support_TestResource";
286         Locale.setDefault(new Locale("en", "US"));
287         bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
288         assertEquals("Wrong value parent4",
289                 "frFRVARValue4", (String)bundle.getObject("parent4"));
290         assertEquals("Wrong value parent3",
291                 "frFRValue3", (String)bundle.getObject("parent3"));
292         assertEquals("Wrong value parent2",
293                 "frValue2", (String) bundle.getObject("parent2"));
294         assertEquals("Wrong value parent1",
295                 "parentValue1", (String)bundle.getObject("parent1"));
296         assertEquals("Wrong value child3",
297                 "frFRVARChildValue3", (String)bundle.getObject("child3"));
298         assertEquals("Wrong value child2",
299                 "frFRVARChildValue2", (String) bundle.getObject("child2"));
300         assertEquals("Wrong value child1",
301                 "frFRVARChildValue1", (String)bundle.getObject("child1"));
302         assertEquals("Wrong value IntegerVal",
303                 1, bundle.getObject("IntegerVal"));
304 
305         try {
306             bundle.getObject(null);
307             fail("NullPointerException expected");
308         } catch (NullPointerException ee) {
309             //expected
310         }
311 
312         try {
313             bundle.getObject("");
314             fail("MissingResourceException expected");
315         } catch (MissingResourceException ee) {
316             //expected
317         }
318     }
319 
test_getStringArrayLjava_lang_String()320     public void test_getStringArrayLjava_lang_String() {
321         ResourceBundle bundle;
322         String name = "tests.support.Support_TestResource";
323         Locale.setDefault(new Locale("en", "US"));
324         bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
325 
326         String[] array = bundle.getStringArray("StringArray");
327         for(int i = 0; i < array.length; i++) {
328             assertEquals("Str" + (i + 1), array[i]);
329         }
330 
331         try {
332             bundle.getStringArray(null);
333             fail("NullPointerException expected");
334         } catch (NullPointerException ee) {
335             //expected
336         }
337 
338         try {
339             bundle.getStringArray("");
340             fail("MissingResourceException expected");
341         } catch (MissingResourceException ee) {
342             //expected
343         }
344 
345         try {
346             bundle.getStringArray("IntegerVal");
347             fail("ClassCastException expected");
348         } catch (ClassCastException ee) {
349             //expected
350         }
351     }
352 
test_getBundleLjava_lang_String()353     public void test_getBundleLjava_lang_String() {
354         ResourceBundle bundle;
355         String name = "tests.support.Support_TestResource";
356         Locale defLocale = Locale.getDefault();
357 
358         Locale.setDefault(new Locale("en", "US"));
359         bundle = ResourceBundle.getBundle(name);
360         assertEquals("enUSValue4", bundle.getString("parent4"));
361 
362         Locale.setDefault(new Locale("fr", "FR", "v1"));
363         bundle = ResourceBundle.getBundle(name);
364         assertEquals("Wrong bundle fr_FR_v1", "frFRValue4", bundle.getString("parent4"));
365 
366         Locale.setDefault(new Locale("fr", "US", "VAR"));
367         bundle = ResourceBundle.getBundle(name);
368         assertEquals("Wrong bundle fr_US_var", "frValue4", bundle.getString("parent4"));
369 
370         Locale.setDefault(new Locale("de", "FR", "VAR"));
371         bundle = ResourceBundle.getBundle(name);
372         assertEquals("Wrong bundle de_FR_var", "parentValue4", bundle.getString("parent4"));
373 
374         Locale.setDefault(new Locale("de", "FR", "v1"));
375         bundle = ResourceBundle.getBundle(name);
376         assertEquals("Wrong bundle de_FR_var 2", "parentValue4", bundle.getString("parent4"));
377 
378         Locale.setDefault(new Locale("de", "FR", "var"));
379         bundle = ResourceBundle.getBundle(name);
380         assertEquals("Wrong bundle de_FR_var 2", "parentValue4", bundle.getString("parent4"));
381 
382         try {
383             ResourceBundle.getBundle(null);
384             fail("NullPointerException expected");
385         } catch (NullPointerException ee) {
386             //expected
387         }
388 
389         try {
390             ResourceBundle.getBundle("");
391             fail("MissingResourceException expected");
392         } catch (MissingResourceException ee) {
393             //expected
394         }
395 
396         Locale.setDefault(defLocale);
397     }
398 
399     // http://b/26879578
testBundleWithUtf8Values()400     public void testBundleWithUtf8Values() {
401         ResourceBundle bundle = ResourceBundle.getBundle(
402                 "org.apache.harmony.tests.java.util.TestUtf8ResourceBundle");
403         assertEquals("Страх мой удивительный UTF-8 синтаксического анализа",
404                 bundle.getString("key"));
405     }
406 }
407