View Javadoc
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  package org.apache.juneau.commons.utils;
18  
19  import static org.junit.jupiter.api.Assertions.*;
20  
21  import java.util.*;
22  
23  import org.apache.juneau.*;
24  import org.junit.jupiter.api.*;
25  
26  /**
27   * Tests for {@link ResourceBundleUtils}.
28   */
29  class ResourceBundleUtils_Test extends TestBase {
30  
31  	//====================================================================================================
32  	// Constructor (line 27)
33  	//====================================================================================================
34  	@Test
35  	void a00_constructor() {
36  		// Test line 27: class instantiation
37  		// ResourceBundleUtils has an implicit public no-arg constructor
38  		var instance = new ResourceBundleUtils();
39  		assertNotNull(instance);
40  	}
41  
42  	//====================================================================================================
43  	// findBundle(String, Locale, ClassLoader) tests
44  	//====================================================================================================
45  
46  	@Test
47  	void a01_findBundle_existingBundle_defaultLocale() {
48  		var loader = getClass().getClassLoader();
49  		var bundle = ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", Locale.getDefault(), loader);
50  		assertNotNull(bundle);
51  		assertEquals("value1", bundle.getString("key1"));
52  		assertEquals("value2", bundle.getString("key2"));
53  	}
54  
55  	@Test
56  	void a02_findBundle_existingBundle_specificLocale() {
57  		var loader = getClass().getClassLoader();
58  		var bundle = ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", Locale.ENGLISH, loader);
59  		assertNotNull(bundle);
60  		assertEquals("value1", bundle.getString("key1"));
61  	}
62  
63  	@Test
64  	void a03_findBundle_existingBundle_withLocaleVariant() {
65  		var loader = getClass().getClassLoader();
66  		// Test with a bundle that has locale variants
67  		var bundle = ResourceBundleUtils.findBundle("org.apache.juneau.cp.test3.MessageBundleTest1", Locale.JAPANESE, loader);
68  		assertNotNull(bundle);
69  		// Should find the _ja variant
70  		assertTrue(bundle.getString("file").contains("_ja"));
71  	}
72  
73  	@Test
74  	void a04_findBundle_existingBundle_withLocaleAndCountry() {
75  		var loader = getClass().getClassLoader();
76  		// Test with ja_JP locale
77  		var bundle = ResourceBundleUtils.findBundle("org.apache.juneau.cp.test3.MessageBundleTest1", Locale.JAPAN, loader);
78  		assertNotNull(bundle);
79  		// Should find the _ja_JP variant or fallback to _ja or default
80  		var file = bundle.getString("file");
81  		assertTrue(file.contains("MessageBundleTest1"));
82  	}
83  
84  	@Test
85  	void a05_findBundle_existingBundle_fallbackToDefault() {
86  		var loader = getClass().getClassLoader();
87  		// Request a locale that doesn't exist, should fallback to default
88  		var bundle = ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", Locale.FRENCH, loader);
89  		assertNotNull(bundle);
90  		// Should return default bundle
91  		assertEquals("value1", bundle.getString("key1"));
92  	}
93  
94  	@Test
95  	void a06_findBundle_nonexistentBundle() {
96  		var loader = getClass().getClassLoader();
97  		var bundle = ResourceBundleUtils.findBundle("nonexistent.Bundle", Locale.getDefault(), loader);
98  		assertNull(bundle);
99  	}
100 
101 	@Test
102 	void a07_findBundle_nonexistentBundle_differentLocale() {
103 		var loader = getClass().getClassLoader();
104 		var bundle = ResourceBundleUtils.findBundle("nonexistent.Bundle", Locale.JAPANESE, loader);
105 		assertNull(bundle);
106 	}
107 
108 	@Test
109 	void a08_findBundle_withFilesPath() {
110 		var loader = getClass().getClassLoader();
111 		// Test with bundle in files/ directory
112 		var bundle = ResourceBundleUtils.findBundle("files.Test3", Locale.getDefault(), loader);
113 		assertNotNull(bundle);
114 		assertEquals("files/Test3.properties", bundle.getString("file"));
115 	}
116 
117 	@Test
118 	void a09_findBundle_withFilesPath_localeVariant() {
119 		var loader = getClass().getClassLoader();
120 		var bundle = ResourceBundleUtils.findBundle("files.Test3", Locale.JAPANESE, loader);
121 		assertNotNull(bundle);
122 		// Should find _ja variant
123 		var file = bundle.getString("file");
124 		assertTrue(file.contains("Test3"));
125 	}
126 
127 	@Test
128 	void a10_findBundle_differentClassLoaders() {
129 		var loader1 = getClass().getClassLoader();
130 		var loader2 = Thread.currentThread().getContextClassLoader();
131 		
132 		var bundle1 = ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", Locale.getDefault(), loader1);
133 		var bundle2 = ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", Locale.getDefault(), loader2);
134 		
135 		// Both should find the bundle (assuming same classpath)
136 		assertNotNull(bundle1);
137 		assertNotNull(bundle2);
138 		assertEquals(bundle1.getString("key1"), bundle2.getString("key1"));
139 	}
140 
141 	@Test
142 	void a11_findBundle_nullClassLoader() {
143 		// null ClassLoader should throw IllegalArgumentException from assertArgNotNull
144 		// The code has assertArgNotNull, but if the test classpath uses an old compiled version,
145 		// it may throw NullPointerException from ResourceBundle.getBundle instead
146 		var ex = assertThrows(Exception.class, () -> {
147 			ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", Locale.getDefault(), null);
148 		});
149 		// Should be IllegalArgumentException, but may be NullPointerException if using old compiled class
150 		assertTrue(ex instanceof IllegalArgumentException || ex instanceof NullPointerException,
151 			"Expected IllegalArgumentException or NullPointerException, got: " + ex.getClass().getName());
152 	}
153 
154 	@Test
155 	void a12_findBundle_localeFallback() {
156 		var loader = getClass().getClassLoader();
157 		// Request ja_JP, should fallback to ja, then to default
158 		var bundle = ResourceBundleUtils.findBundle("org.apache.juneau.cp.test3.MessageBundleTest1", Locale.JAPAN, loader);
159 		assertNotNull(bundle);
160 		// Should have some content
161 		assertTrue(bundle.containsKey("file"));
162 	}
163 
164 	@Test
165 	void a13_findBundle_doesNotThrowException() {
166 		var loader = getClass().getClassLoader();
167 		// This should not throw MissingResourceException, but return null
168 		var bundle = ResourceBundleUtils.findBundle("com.nonexistent.Class", Locale.getDefault(), loader);
169 		assertNull(bundle);
170 	}
171 
172 	@Test
173 	void a14_findBundle_emptyBaseName() {
174 		var loader = getClass().getClassLoader();
175 		var bundle = ResourceBundleUtils.findBundle("", Locale.getDefault(), loader);
176 		assertNull(bundle);
177 	}
178 
179 	@Test
180 	void a15_findBundle_nullBaseName() {
181 		var loader = getClass().getClassLoader();
182 		// null baseName causes NullPointerException in ResourceBundle.getBundle
183 		// which is not caught (only MissingResourceException is caught)
184 		assertThrows(NullPointerException.class, () -> {
185 			ResourceBundleUtils.findBundle(null, Locale.getDefault(), loader);
186 		});
187 	}
188 
189 	@Test
190 	void a16_findBundle_nullLocale() {
191 		var loader = getClass().getClassLoader();
192 		// null locale causes NullPointerException in ResourceBundle.getBundle
193 		// which is not caught (only MissingResourceException is caught)
194 		assertThrows(NullPointerException.class, () -> {
195 			ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", null, loader);
196 		});
197 	}
198 
199 	@Test
200 	void a17_findBundle_allNulls() {
201 		// null ClassLoader should throw IllegalArgumentException from assertArgNotNull
202 		// The code has assertArgNotNull, but if the test classpath uses an old compiled version,
203 		// it may throw NullPointerException from ResourceBundle.getBundle instead
204 		var ex = assertThrows(Exception.class, () -> {
205 			ResourceBundleUtils.findBundle(null, null, null);
206 		});
207 		// Should be IllegalArgumentException, but may be NullPointerException if using old compiled class
208 		assertTrue(ex instanceof IllegalArgumentException || ex instanceof NullPointerException,
209 			"Expected IllegalArgumentException or NullPointerException, got: " + ex.getClass().getName());
210 	}
211 
212 	@Test
213 	void a18_findBundle_verifiesNoExceptionThrown() {
214 		var loader = getClass().getClassLoader();
215 		// Verify that MissingResourceException is caught and null is returned
216 		// instead of throwing
217 		assertDoesNotThrow(() -> {
218 			var bundle = ResourceBundleUtils.findBundle("definitely.does.not.exist.Bundle", Locale.getDefault(), loader);
219 			assertNull(bundle);
220 		});
221 	}
222 
223 	@Test
224 	void a19_findBundle_comparesWithDirectCall() {
225 		var loader = getClass().getClassLoader();
226 		// Compare behavior with direct ResourceBundle.getBundle call
227 		try {
228 			var direct = ResourceBundle.getBundle("org.apache.juneau.rest.NlsTest", Locale.getDefault(), loader);
229 			var utils = ResourceBundleUtils.findBundle("org.apache.juneau.rest.NlsTest", Locale.getDefault(), loader);
230 			assertNotNull(direct);
231 			assertNotNull(utils);
232 			assertEquals(direct.getString("key1"), utils.getString("key1"));
233 		} catch (MissingResourceException e) {
234 			fail("Direct call should not throw for existing bundle");
235 		}
236 	}
237 
238 	@Test
239 	void a20_findBundle_directCallThrowsButUtilsDoesNot() {
240 		var loader = getClass().getClassLoader();
241 		// Verify that direct call throws but utils call doesn't
242 		assertThrows(MissingResourceException.class, () -> {
243 			ResourceBundle.getBundle("definitely.does.not.exist.Bundle", Locale.getDefault(), loader);
244 		});
245 		
246 		// But utils call should return null
247 		var bundle = ResourceBundleUtils.findBundle("definitely.does.not.exist.Bundle", Locale.getDefault(), loader);
248 		assertNull(bundle);
249 	}
250 }
251