blob: 03d26146837cece22bee735f39aa4920406b63d3 [file] [log] [blame]
/*
* Copyright (c) 2015, 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.
*/
package p3.test;
import java.lang.reflect.Module;
import java.util.logging.Logger;
import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import p2.test.ModuleLoggerAccess;
/*
* Test Logger.getLogger + logger.getResourceBundle in unnamed/named module,
* resources are in named and unnamed modules respectively.
*/
public class ResourceBundleTest {
private static final String RESOURCE_KEY = "OkKey";
private static final String RESOURCE_VALUE = "OK";
private static final String HELP_MSG =
"Test that a class in a %s module %s obtain a logger " +
"which uses a resource bundle %s bundled in " +
"%s module. ( The package in which the resource is " +
"contained is not exported by the module )";
private static final String NAMED_POSITIVE_CLASSBUNDLE_MSG =
String.format(HELP_MSG, "named", "can", "class", "the same");
private static final String UNNAMED_POSITIVE_CLASSBUNDLE_MSG =
String.format(HELP_MSG, "unnamed", "can", "class", "the same");
private static final String NAMED_POSITIVE_PROPERTYBUNDLE_MSG =
String.format(HELP_MSG, "named", "can", "property", "the same");
private static final String UNNAMED_POSITIVE_PROPERTYBUNDLE_MSG =
String.format(HELP_MSG, "unnamed", "can", "property", "the same");
private static final String NAMED_NEGATIVE_CLASSBUNDLE_MSG =
String.format(HELP_MSG, "named", "cannot", "class", "another");
private static final String UNNAMED_NEGATIVE_CLASSBUNDLE_MSG =
String.format(HELP_MSG, "unnamed", "cannot", "class", "another");
private static final String NAMED_NEGATIVE_PROPERTYBUNDLE_MSG =
String.format(HELP_MSG, "named", "cannot", "property", "another");
private static final String UNNAMED_NEGATIVE_PROPERTYBUNDLE_MSG =
String.format(HELP_MSG, "unnamed", "cannot", "property", "another");
public static void main(String[] args) {
verifySetup();
testLoggerRBs();
failToLoadRBs();
}
static void verifySetup() {
Module m = ResourceBundleTest.class.getModule();
System.out.println("Module Name for ResourceBundleTest : " + m.getName());
assertTrue(!m.isNamed());
m = ModuleLoggerAccess.class.getModule();
System.out.println("Module Name for ModuleLoggerAccess : " + m.getName());
assertTrue(m.isNamed());
}
/*
* Positive tests :
* Should be able to access class/property resource bundle in current module,
* no matter named or unnamed module.
*/
static void testLoggerRBs() {
testLoggerClassRBs();
testLoggerPropertyRBs();
}
static void testLoggerClassRBs() {
testLoggerResoureBundle(
Logger.getLogger("mylogger.a", "p3.resource.ClassResource"),
p3.resource.ClassResource.class,
UNNAMED_POSITIVE_CLASSBUNDLE_MSG);
testLoggerResoureBundle(
ModuleLoggerAccess.getLogger("mylogger.b", "p2.resource.ClassResource"),
ModuleLoggerAccess.getResourceClass(),
NAMED_POSITIVE_CLASSBUNDLE_MSG);
}
static void testLoggerPropertyRBs() {
testLoggerResoureBundle(
Logger.getLogger("mylogger.c", "p3.resource.p"),
PropertyResourceBundle.class,
UNNAMED_POSITIVE_PROPERTYBUNDLE_MSG);
testLoggerResoureBundle(
ModuleLoggerAccess.getLogger("mylogger.d", "p2.resource.p"),
PropertyResourceBundle.class,
NAMED_POSITIVE_PROPERTYBUNDLE_MSG);
}
static void testLoggerResoureBundle(Logger logger, Class<?> rbType, String helpMsg) {
System.out.println(helpMsg);
ResourceBundle rb = logger.getResourceBundle();
assertTrue(rbType.isInstance(rb));
assertTrue(RESOURCE_VALUE.equals(rb.getString(RESOURCE_KEY)));
}
/*
* Negative tests :
* MissingResourceException should be thrown when access class/property resource bundle
* from another module, no matter named or unnamed module.
*/
static void failToLoadRBs() {
failToLoadClassRBs();
failToLoadPropertyRBs();
}
static void failToLoadClassRBs() {
// in an unnamed module, try to create a logger with
// class resource bundle in named module m1 or m2.
failToLoadResourceBundle("mylogger.e", "p1.resource.ClassResource",
false, UNNAMED_NEGATIVE_CLASSBUNDLE_MSG);
failToLoadResourceBundle("mylogger.f", "p2.resource.ClassResource",
false, UNNAMED_NEGATIVE_CLASSBUNDLE_MSG);
// in named module m2, try to create a logger with
// class resource bundle in another named module m1.
failToLoadResourceBundle("mylogger.g", "p1.resource.ClassResource",
true, NAMED_NEGATIVE_CLASSBUNDLE_MSG);
}
static void failToLoadPropertyRBs() {
// in an unnamed module, try to create a logger with
// property resource bundle in named module m1 or m2.
failToLoadResourceBundle("mylogger.i", "p1.resource.p",
false, UNNAMED_NEGATIVE_PROPERTYBUNDLE_MSG);
failToLoadResourceBundle("mylogger.j", "p2.resource.p",
false, UNNAMED_NEGATIVE_PROPERTYBUNDLE_MSG);
// in named module m2, try to create a logger with
// property resource bundle in another named module m1.
failToLoadResourceBundle("mylogger.k", "p1.resource.p",
true, NAMED_NEGATIVE_PROPERTYBUNDLE_MSG);
}
static void failToLoadResourceBundle(String loggerName, String rbName,
boolean getLoggerInNamedModule, String helpMsg) {
String msg = String.format(
"Logger : %s. Expected exception is not thrown for ResourceBundle : %s.",
loggerName, rbName);
System.out.println(helpMsg);
try {
if(getLoggerInNamedModule) {
ModuleLoggerAccess.getLogger(loggerName, rbName);
} else {
Logger.getLogger(loggerName, rbName);
}
throw new RuntimeException(msg);
} catch (MissingResourceException expected) {
System.out.println("Get expected exception : " + expected);
return;
}
}
public static void assertTrue(boolean b) {
if (!b) {
throw new RuntimeException("Expect true, get false!");
}
}
}