blob: d0b236d6fc878a5ac855f4e5b829ae788f38899a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.harmony.tests.java.util;
import junit.framework.TestCase;
import tests.support.resource.Support_Resources;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListResourceBundle;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.ResourceBundle.Control;
import java.util.Scanner;
import static java.util.ResourceBundle.Control.*;
/**
* Test cases for java.util.ResourceBundle.Control
*
* @since 1.6
*/
public class ControlTest extends TestCase {
/**
* Control with format:FORMAT_PROPERTIES
*/
private Control controlP;
/**
* Control with format:FORMAT_CLASS
*/
private Control controlC;
/**
* Control with format:FORMAT_DEFAULT
*/
private Control control;
/**
* {@link java.util.ResourceBundle.Control#Control()}.
*/
@SuppressWarnings("nls")
public void test_Constructor() {
class SubControl extends Control {
SubControl() {
super();
}
}
Control subControl = new SubControl();
assertEquals(FORMAT_DEFAULT, subControl.getFormats(""));
assertFalse(control.equals(subControl));
}
/**
* Test for all the public constants.
*
* {@link java.util.ResourceBundle.Control#FORMAT_CLASS}
* {@link java.util.ResourceBundle.Control#FORMAT_DEFAULT}
* {@link java.util.ResourceBundle.Control#FORMAT_PROPERTIES}
* {@link java.util.ResourceBundle.Control#TTL_DONT_CACHE}
* {@link java.util.ResourceBundle.Control#TTL_NO_EXPIRATION_CONTROL}
*/
@SuppressWarnings("nls")
public void test_Constants() {
List<String> list = FORMAT_CLASS;
assertEquals(1, list.size());
assertEquals("java.class", list.get(0));
list = FORMAT_PROPERTIES;
assertEquals(1, list.size());
assertEquals("java.properties", list.get(0));
list = FORMAT_DEFAULT;
assertEquals(2, list.size());
assertEquals("java.class", list.get(0));
assertEquals("java.properties", list.get(1));
try {
FORMAT_CLASS.add("");
fail("Should throw UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// expected
}
try {
FORMAT_DEFAULT.add("");
fail("Should throw UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// expected
}
try {
FORMAT_PROPERTIES.add("");
fail("Should throw UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// expected
}
Class<?> unmodifiableListClass = Collections.unmodifiableList(
new ArrayList<String>()).getClass();
assertEquals(FORMAT_CLASS.getClass(), unmodifiableListClass);
assertEquals(FORMAT_DEFAULT.getClass(), unmodifiableListClass);
assertEquals(FORMAT_PROPERTIES.getClass(), unmodifiableListClass);
assertEquals(-1L, TTL_DONT_CACHE);
assertEquals(-2L, TTL_NO_EXPIRATION_CONTROL);
}
/**
* {@link java.util.ResourceBundle.Control#getControl(java.util.List)}.
*/
@SuppressWarnings("nls")
public void test_getControl_LList() {
// singleton
assertSame(control, Control.getControl(FORMAT_DEFAULT));
assertSame(controlC, Control.getControl(FORMAT_CLASS));
assertSame(controlP, Control.getControl(FORMAT_PROPERTIES));
// class
assertTrue(control.getClass() == Control.class);
assertTrue(controlC.getClass() != Control.class);
assertTrue(controlP.getClass() != Control.class);
// formats: need not same, just need equal
List<String> list = new ArrayList<String>(FORMAT_CLASS);
assertSame(controlC, Control.getControl(list));
// can add
list.add(FORMAT_PROPERTIES.get(0));
assertSame(control, Control.getControl(list));
// exceptions
try {
Control.getControl(null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
list = new ArrayList<String>();
try {
Control.getControl(list);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
list = new ArrayList<String>(FORMAT_CLASS);
// java.class -> JAVA.CLASS
list.set(0, list.get(0).toUpperCase());
try {
Control.getControl(list);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
list = new ArrayList<String>(FORMAT_CLASS);
list.add("");
try {
Control.getControl(list);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* {@link java.util.ResourceBundle.Control#getNoFallbackControl(java.util.List)}.
*/
@SuppressWarnings("nls")
public void test_getNoFallbackControl_LList() {
assertNotSame(control, Control.getNoFallbackControl(FORMAT_DEFAULT));
assertNotSame(controlC, Control.getNoFallbackControl(FORMAT_CLASS));
assertNotSame(controlP, Control.getNoFallbackControl(FORMAT_PROPERTIES));
controlP = Control.getNoFallbackControl(FORMAT_PROPERTIES);
controlC = Control.getNoFallbackControl(FORMAT_CLASS);
control = Control.getNoFallbackControl(FORMAT_DEFAULT);
// singleton
assertSame(control, Control.getNoFallbackControl(FORMAT_DEFAULT));
assertSame(controlC, Control.getNoFallbackControl(FORMAT_CLASS));
assertSame(controlP, Control.getNoFallbackControl(FORMAT_PROPERTIES));
// class
assertTrue(control.getClass() != Control.class);
assertTrue(controlC.getClass() != Control.class);
assertTrue(controlP.getClass() != Control.class);
// format
assertEquals(FORMAT_CLASS, controlC.getFormats(""));
assertEquals(FORMAT_DEFAULT, control.getFormats(""));
assertEquals(FORMAT_PROPERTIES, controlP.getFormats(""));
// no fall back locale
Locale defaultLocale = Locale.getDefault();
Locale.setDefault(new Locale("TestLanguage", "TestCountry", "Var"));
assertNull(control.getFallbackLocale("message", Locale.US));
try {
control.getFallbackLocale("message", null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.getFallbackLocale(null, Locale.US);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
Locale.setDefault(defaultLocale);
// formats: need not same, just need equal
List<String> list = new ArrayList<String>(FORMAT_CLASS);
assertSame(controlC, Control.getNoFallbackControl(list));
// can add
list.add(FORMAT_PROPERTIES.get(0));
assertSame(control, Control.getNoFallbackControl(list));
// exceptions
try {
Control.getNoFallbackControl(null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
list = new ArrayList<String>();
try {
Control.getNoFallbackControl(list);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
list = new ArrayList<String>(FORMAT_CLASS);
// java.class -> JAVA.CLASS
list.set(0, list.get(0).toUpperCase());
try {
Control.getNoFallbackControl(list);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
list = new ArrayList<String>(FORMAT_CLASS);
list.add("");
try {
Control.getNoFallbackControl(list);
fail("Should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* {@link java.util.ResourceBundle.Control#getFormats(java.lang.String)}.
*/
@SuppressWarnings("nls")
public void test_getFormats_LString() {
assertEquals(FORMAT_DEFAULT, control.getFormats(""));
assertEquals(FORMAT_PROPERTIES, controlP.getFormats(""));
assertEquals(FORMAT_CLASS, controlC.getFormats(""));
try {
controlC.getFormats(null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* {@link java.util.ResourceBundle.Control#getCandidateLocales(java.lang.String, java.util.Locale)}.
*/
@SuppressWarnings("nls")
public void test_getCandidateLocales_LStringLLocale() {
// the ResourceBundle for this baseName and Locale does not exists
List<Locale> result = control.getCandidateLocales("baseName",
new Locale("one", "two", "three"));
assertEquals(4, result.size());
Locale locale = result.get(0);
assertEquals("one", locale.getLanguage());
assertEquals("TWO", locale.getCountry());
assertEquals("three", locale.getVariant());
assertEquals(new Locale("one", "TWO"), result.get(1));
assertEquals(new Locale("one"), result.get(2));
assertSame(Locale.ROOT, result.get(3));
// ArrayList is not immutable
assertTrue(ArrayList.class == result.getClass());
result = control.getCandidateLocales("baseName", new Locale("one",
"two", ""));
assertEquals(new Locale("one", "TWO"), result.get(0));
assertEquals(new Locale("one"), result.get(1));
assertSame(Locale.ROOT, result.get(2));
result = control.getCandidateLocales("baseName", new Locale("one", "",
"three"));
assertEquals(new Locale("one", "", "three"), result.get(0));
assertEquals(new Locale("one"), result.get(1));
assertSame(Locale.ROOT, result.get(2));
result = control.getCandidateLocales("baseName", new Locale("", "two",
"three"));
assertEquals(new Locale("", "TWO", "three"), result.get(0));
assertEquals(new Locale("", "TWO"), result.get(1));
assertSame(Locale.ROOT, result.get(2));
result = control.getCandidateLocales("baseName", new Locale("", "",
"three"));
assertEquals(new Locale("", "", "three"), result.get(0));
assertSame(Locale.ROOT, result.get(1));
result = control.getCandidateLocales("baseName", new Locale("", "two",
""));
assertEquals(new Locale("", "TWO"), result.get(0));
assertSame(Locale.ROOT, result.get(1));
result = control.getCandidateLocales("baseName", Locale.ROOT);
assertSame(Locale.ROOT, result.get(0));
try {
control.getCandidateLocales(null, Locale.US);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.getCandidateLocales("baseName", null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* {@link java.util.ResourceBundle.Control#getFallbackLocale(java.lang.String, java.util.Locale)}.
*/
@SuppressWarnings("nls")
public void test_getFallbackLocale_LStringLLocale() {
Locale defaultLocale = Locale.getDefault();
Locale testLocale = new Locale("TestLanguage", "TestCountry", "Var");
Locale.setDefault(testLocale);
assertSame(testLocale, control.getFallbackLocale("baseName",
Locale.ROOT));
assertSame(testLocale, control.getFallbackLocale("baseName", Locale.US));
assertSame(null, control.getFallbackLocale("baseName", testLocale));
try {
control.getFallbackLocale(null, Locale.US);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.getFallbackLocale("baseName", null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
// restore
Locale.setDefault(defaultLocale);
}
@SuppressWarnings("nls")
static File copyFile(final URL src) throws IOException {
String tail = src.getFile().split("hyts_resource")[1];
String tmpdir = System.getProperty("java.io.tmpdir");
if (null == tmpdir) {
return null;
}
String copyName = tmpdir + File.separator + "hyts_resource_copy" + tail;
File copy = new File(copyName);
if (copy.exists()) {
copy.delete();
}
copy.createNewFile();
copy.deleteOnExit();
Reader in = new InputStreamReader(src.openStream());
Writer out = new FileWriter(copy);
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
in.close();
out.close();
return copy;
}
static class SubRBStaticPrivate extends ListResourceBundle {
private SubRBStaticPrivate() {
super();
}
@Override
protected Object[][] getContents() {
return null;
}
}
/*
* change the value in the .properties file
*/
@SuppressWarnings("nls")
static void changeProperties(File file) throws FileNotFoundException {
String newValue = "property=changedValue";
PrintWriter writer = new PrintWriter(file);
writer.write(newValue);
writer.flush();
writer.close();
Scanner scanner = new Scanner(file);
assertEquals(newValue, scanner.nextLine());
scanner.close();
}
/**
* {@link java.util.ResourceBundle.Control#getTimeToLive(java.lang.String, java.util.Locale)}.
*/
@SuppressWarnings("nls")
public void test_getTimeToLive_LStringLLocale() {
assertEquals(TTL_NO_EXPIRATION_CONTROL, control.getTimeToLive(
"baseName", Locale.US));
try {
control.getTimeToLive(null, Locale.US);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.getTimeToLive("baseName", null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* @throws Exception
* {@link java.util.ResourceBundle.Control#needsReload(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, java.util.ResourceBundle, long)}.
*/
@SuppressWarnings("nls")
public void test_needsReload_LStringLLocaleLStringLClassLoaderResourceBundleJ()
throws Exception {
String className = "tests.support.Support_TestResource";
String propertiesName = Support_Resources.RESOURCE_PACKAGE_NAME
+ ".hyts_resource";
String propertiesNameCopy = "hyts_resource_copy";
String CLASS = "java.class";
String PROPERTIES = "java.properties";
Locale frFR = new Locale("fr", "FR");
ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
ClassLoader URLLoader = systemLoader;
ResourceBundle bundle = null;
long time = 0L;
final URL srcFile = URLLoader.getResource(control.toResourceName(
control.toBundleName(propertiesName, frFR), "properties"));
assertNotNull(srcFile);
final File copyFile = copyFile(srcFile);
// 1. format = "java.properties"
if (null != URLLoader.getResourceAsStream(copyFile.toURL().toString())) {
Thread.sleep(1000);
bundle = control.newBundle(propertiesNameCopy, frFR, PROPERTIES,
URLLoader, false);
time = System.currentTimeMillis();
assertTrue(bundle.getClass() == PropertyResourceBundle.class);
assertEquals("fr_FR_resource", bundle.getString("property"));
assertFalse(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, URLLoader, bundle, time));
// change the file
Thread.sleep(2000);
changeProperties(copyFile);
assertTrue(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, URLLoader, bundle, time));
// detect again
assertTrue(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, URLLoader, bundle, time));
// long long ago
assertTrue(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, URLLoader, bundle, 2006L));
// other loader
assertFalse(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, systemLoader, bundle, time));
// other bundle
ResourceBundle otherBundle = control.newBundle(propertiesName,
Locale.ROOT, PROPERTIES, systemLoader, false);
assertEquals("parent", otherBundle.getString("property"));
assertTrue(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, URLLoader, otherBundle, time));
otherBundle = control.newBundle(propertiesName, Locale.ROOT,
PROPERTIES, URLLoader, false);
assertEquals("resource", otherBundle.getString("property"));
assertTrue(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, URLLoader, otherBundle, time));
// other time
assertFalse(control.needsReload(propertiesNameCopy, frFR,
PROPERTIES, URLLoader, bundle, System.currentTimeMillis()));
} else {
System.err
.println("Can not find the test file, some code of this test 'test_needsReload_LStringLLocaleLStringLClassLoaderResourceBundleJ' did not run.");
}
// 2. format = "java.class"
bundle = control.newBundle(className, frFR, CLASS, systemLoader, false);
time = System.currentTimeMillis();
assertEquals("frFRValue3", bundle.getString("parent3"));
assertFalse(control.needsReload(className, frFR, CLASS, systemLoader,
bundle, time));
// exceptions
control.needsReload(propertiesName, frFR, PROPERTIES, URLLoader,
bundle, time);
try {
control
.needsReload(null, frFR, PROPERTIES, URLLoader, bundle,
time);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.needsReload(propertiesName, null, PROPERTIES, URLLoader,
bundle, time);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.needsReload(propertiesName, frFR, null, URLLoader, bundle,
time);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.needsReload(propertiesName, frFR, PROPERTIES, null, bundle,
time);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.needsReload(propertiesName, frFR, PROPERTIES, URLLoader,
null, time);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* {@link java.util.ResourceBundle.Control#toBundleName(java.lang.String, java.util.Locale)}.
*/
@SuppressWarnings("nls")
public void test_toBundleName_LStringLLocale() {
assertEquals("baseName_one_TWO_three", control.toBundleName("baseName",
new Locale("one", "two", "three")));
assertEquals("baseName_one_TWO", control.toBundleName("baseName",
new Locale("one", "two")));
assertEquals("baseName_one__three", control.toBundleName("baseName",
new Locale("one", "", "three")));
assertEquals("baseName__TWO_three", control.toBundleName("baseName",
new Locale("", "two", "three")));
assertEquals("baseName_one", control.toBundleName("baseName",
new Locale("one", "", "")));
assertEquals("baseName___three", control.toBundleName("baseName",
new Locale("", "", "three")));
assertEquals("baseName__TWO", control.toBundleName("baseName",
new Locale("", "two", "")));
assertEquals("baseName", control.toBundleName("baseName", new Locale(
"", "", "")));
assertEquals("baseName", control.toBundleName("baseName", Locale.ROOT));
assertEquals("_one_TWO_three", control.toBundleName("", new Locale(
"one", "two", "three")));
assertEquals("", control.toBundleName("", Locale.ROOT));
assertEquals("does.not.exists_one_TWO_three", control.toBundleName(
"does.not.exists", new Locale("one", "two", "three")));
assertEquals("does/not/exists_one_TWO_three", control.toBundleName(
"does/not/exists", new Locale("one", "two", "three")));
assertEquals("does_not_exists__one_TWO_three", control.toBundleName(
"does_not_exists_", new Locale("one", "two", "three")));
assertEquals("...", control.toBundleName("...", Locale.ROOT));
assertEquals("s/./\\//g", control
.toBundleName("s/./\\//g", Locale.ROOT));
assertEquals("123_one", control.toBundleName("123", new Locale("one")));
try {
control.toBundleName(null, Locale.US);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.toBundleName("baseName", null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* {@link java.util.ResourceBundle.Control#toResourceName(java.lang.String, java.lang.String)}.
*/
@SuppressWarnings("nls")
public void test_toResourceNameLStringLString() {
assertEquals("does/not/exists_language_country.someSuffix", control
.toResourceName("does.not.exists_language_country",
"someSuffix"));
assertEquals("does/not/exists_language_country.someSuffix", control
.toResourceName("does/not/exists_language_country",
"someSuffix"));
assertEquals("does///not//exists_language/country.someSuffix", control
.toResourceName("does...not..exists_language.country",
"someSuffix"));
assertEquals("does\\not\\exists_language_country.someSuffix", control
.toResourceName("does\\not\\exists_language_country",
"someSuffix"));
assertEquals("does/not/exists_language_country/.someSuffix", control
.toResourceName("does.not.exists_language_country.",
"someSuffix"));
assertEquals("does/not/exists_language_country../someSuffix", control
.toResourceName("does.not.exists_language_country",
"./someSuffix"));
assertEquals("///.//", control.toResourceName("...", "//"));
assertEquals("///...", control.toResourceName("///", ".."));
assertEquals("123...", control.toResourceName("123", ".."));
assertEquals("base.", control.toResourceName("base", ""));
assertEquals(".suffix", control.toResourceName("", "suffix"));
assertEquals(".", control.toResourceName("", ""));
try {
control.toResourceName(null, "suffix");
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
control.toResourceName("bundleName", null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* @throws java.lang.Exception
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* @throws java.lang.Exception
*/
@Override
protected void setUp() throws Exception {
super.setUp();
controlP = Control.getControl(FORMAT_PROPERTIES);
controlC = Control.getControl(FORMAT_CLASS);
control = Control.getControl(FORMAT_DEFAULT);
}
}