db85090553
Co-authored-by: Sean Mullan <mullan@openjdk.org> Co-authored-by: Alan Bateman <alanb@openjdk.org> Co-authored-by: Weijun Wang <weijun@openjdk.org> Co-authored-by: Aleksei Efimov <aefimov@openjdk.org> Co-authored-by: Brian Burkhalter <bpb@openjdk.org> Co-authored-by: Daniel Fuchs <dfuchs@openjdk.org> Co-authored-by: Harshitha Onkar <honkar@openjdk.org> Co-authored-by: Joe Wang <joehw@openjdk.org> Co-authored-by: Jorn Vernee <jvernee@openjdk.org> Co-authored-by: Justin Lu <jlu@openjdk.org> Co-authored-by: Kevin Walls <kevinw@openjdk.org> Co-authored-by: Lance Andersen <lancea@openjdk.org> Co-authored-by: Naoto Sato <naoto@openjdk.org> Co-authored-by: Roger Riggs <rriggs@openjdk.org> Co-authored-by: Brent Christian <bchristi@openjdk.org> Co-authored-by: Stuart Marks <smarks@openjdk.org> Co-authored-by: Ian Graves <igraves@openjdk.org> Co-authored-by: Phil Race <prr@openjdk.org> Co-authored-by: Erik Gahlin <egahlin@openjdk.org> Co-authored-by: Jaikiran Pai <jpai@openjdk.org> Reviewed-by: kevinw, aivanov, rriggs, lancea, coffeys, dfuchs, ihse, erikj, cjplummer, coleenp, naoto, mchung, prr, weijun, joehw, azvegint, psadhukhan, bchristi, sundar, attila
369 lines
15 KiB
Java
369 lines
15 KiB
Java
/*
|
|
* Copyright (c) 2013, 2024, 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.
|
|
*/
|
|
import java.util.Locale;
|
|
import java.util.Objects;
|
|
import java.util.ResourceBundle;
|
|
import java.util.logging.Handler;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.LogManager;
|
|
import java.util.logging.LogRecord;
|
|
import java.util.logging.Logger;
|
|
import resources.ListBundle;
|
|
|
|
/**
|
|
* @test
|
|
* @bug 8013839 8189291
|
|
* @summary tests Logger.setResourceBundle;
|
|
* @build TestSetResourceBundle resources.ListBundle resources.ListBundle_fr
|
|
* @run main/othervm TestSetResourceBundle
|
|
* @author danielfuchs
|
|
*/
|
|
public class TestSetResourceBundle {
|
|
|
|
static final String LIST_BUNDLE_NAME = "resources.ListBundle";
|
|
static final String PROPERTY_BUNDLE_NAME = "resources.PropertyBundle";
|
|
|
|
/**
|
|
* A dummy handler class that we can use to check the bundle/bundle name
|
|
* that was present in the last LogRecord instance published.
|
|
*/
|
|
static final class TestHandler extends Handler {
|
|
volatile ResourceBundle lastBundle = null;
|
|
volatile String lastBundleName = null;
|
|
@Override
|
|
public void publish(LogRecord record) {
|
|
lastBundle = record.getResourceBundle();
|
|
lastBundleName = record.getResourceBundleName();
|
|
}
|
|
|
|
@Override
|
|
public void flush() {
|
|
}
|
|
|
|
@Override
|
|
public void close() throws SecurityException {
|
|
}
|
|
}
|
|
|
|
public static void main(String... args) throws Exception {
|
|
|
|
Locale defaultLocale = Locale.getDefault();
|
|
|
|
try {
|
|
test("foo.bar");
|
|
} finally {
|
|
Locale.setDefault(defaultLocale);
|
|
}
|
|
}
|
|
|
|
static String getBaseName(ResourceBundle bundle) {
|
|
return bundle == null ? null : bundle.getBaseBundleName();
|
|
}
|
|
|
|
/**
|
|
* Main test runner.
|
|
* @param loggerName The logger to use.
|
|
* @throws Exception if the test fails.
|
|
*/
|
|
public static void test(String loggerName) throws Exception {
|
|
|
|
System.out.println("Starting test for " + loggerName);
|
|
|
|
final ResourceBundle bundle = ResourceBundle.getBundle(LIST_BUNDLE_NAME);
|
|
Logger foobar = Logger.getLogger(loggerName);
|
|
|
|
// Checks that IAE is thrown if the bundle has a null base name.
|
|
try {
|
|
foobar.setResourceBundle(new ListBundle());
|
|
throw new RuntimeException("Expected exception not raised!");
|
|
} catch (IllegalArgumentException x) {
|
|
System.out.println("Got expected exception: " + x);
|
|
}
|
|
|
|
// Verify that resource bundle was not set.
|
|
if (foobar.getResourceBundle() != null) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ foobar.getResourceBundle());
|
|
}
|
|
if (foobar.getResourceBundleName() != null) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ foobar.getResourceBundleName());
|
|
}
|
|
|
|
// Set acceptable resource bundle on logger.
|
|
foobar.setResourceBundle(bundle);
|
|
|
|
// check that the bundle has been set correctly
|
|
if (bundle != foobar.getResourceBundle()) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ foobar.getResourceBundle());
|
|
}
|
|
if (!Objects.equals(getBaseName(bundle), foobar.getResourceBundleName())) {
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ foobar.getResourceBundleName());
|
|
}
|
|
|
|
// Check that we can replace the bundle with a bundle of the same name.
|
|
final ResourceBundle bundle_fr =
|
|
ResourceBundle.getBundle(LIST_BUNDLE_NAME, Locale.FRENCH);
|
|
foobar.setResourceBundle(bundle_fr);
|
|
|
|
if (bundle_fr != foobar.getResourceBundle()) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ foobar.getResourceBundle());
|
|
}
|
|
if (!Objects.equals(getBaseName(bundle_fr), foobar.getResourceBundleName())) {
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ foobar.getResourceBundleName());
|
|
}
|
|
|
|
// Create a child logger
|
|
final Logger foobaz = Logger.getLogger(loggerName + ".baz");
|
|
|
|
if (foobar != foobaz.getParent()) {
|
|
throw new RuntimeException("Unexpected parent: " +
|
|
foobaz.getParent() + " != " + foobar);
|
|
}
|
|
|
|
// Check that the child logger does not have a bundle set locally
|
|
if (foobaz.getResourceBundle() != null) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ foobaz.getResourceBundle());
|
|
}
|
|
if (foobaz.getResourceBundleName() != null) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ foobaz.getResourceBundleName());
|
|
}
|
|
|
|
|
|
// Add a handler on the child logger.
|
|
final TestHandler handler = new TestHandler();
|
|
foobaz.addHandler(handler);
|
|
|
|
// log a message on the child logger
|
|
foobaz.severe("dummy");
|
|
|
|
// checks that the message has been logged with the bundle
|
|
// inherited from the parent logger
|
|
if (!LIST_BUNDLE_NAME.equals(handler.lastBundleName)) {
|
|
debugLogger(foobaz, foobar, handler);
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ handler.lastBundleName);
|
|
}
|
|
if (!bundle_fr.equals(handler.lastBundle)) {
|
|
debugLogger(foobaz, foobar, handler);
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ handler.lastBundle);
|
|
}
|
|
|
|
// Check that we can get set a bundle on the child logger
|
|
// using Logger.getLogger.
|
|
final Logger foobaz2 = Logger.getLogger(loggerName + ".baz", PROPERTY_BUNDLE_NAME);
|
|
if (foobaz2 != foobaz) {
|
|
throw new RuntimeException("Unexpected logger: " + foobaz2 + " != " + foobaz);
|
|
}
|
|
if (foobar != foobaz.getParent()) {
|
|
throw new RuntimeException("Unexpected parent: " +
|
|
foobaz.getParent() + " != " + foobar);
|
|
}
|
|
|
|
// check that the child logger has the correct bundle.
|
|
// it should no longer inherit it from its parent.
|
|
if (!PROPERTY_BUNDLE_NAME.equals(foobaz2.getResourceBundleName())) {
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ foobaz2.getResourceBundleName());
|
|
}
|
|
|
|
if (!PROPERTY_BUNDLE_NAME.equals(foobaz2.getResourceBundle().getBaseBundleName())) {
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ foobaz2.getResourceBundle().getBaseBundleName());
|
|
}
|
|
|
|
boolean found = false;
|
|
for (Handler h : foobaz2.getHandlers()) {
|
|
if (h == handler) {
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found) {
|
|
throw new RuntimeException("Expected handler not found in: " +
|
|
foobaz2.getName() + "(" + foobaz2.getClass().getName()+")" );
|
|
}
|
|
|
|
// log a message on the child logger
|
|
foobaz2.severe("dummy");
|
|
|
|
|
|
// check that the last published log record has the appropriate
|
|
// bundle.
|
|
if (!PROPERTY_BUNDLE_NAME.equals(handler.lastBundleName)) {
|
|
debugLogger(foobaz2, foobar, handler);
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ handler.lastBundleName);
|
|
}
|
|
if (foobaz2.getResourceBundle() != handler.lastBundle) {
|
|
debugLogger(foobaz2, foobar, handler);
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ handler.lastBundle);
|
|
}
|
|
|
|
// try to set a bundle that has a different name, and checks that
|
|
// it fails in IAE.
|
|
try {
|
|
foobaz2.setResourceBundle(bundle_fr);
|
|
throw new RuntimeException("Expected exception not raised!");
|
|
} catch (IllegalArgumentException x) {
|
|
System.out.println("Got expected exception: " + x);
|
|
}
|
|
|
|
// Test with a subclass of logger which overrides
|
|
// getResourceBundle() and getResourceBundleName()
|
|
Logger customLogger = new Logger(foobar.getName()+".bie", null) {
|
|
@Override
|
|
public ResourceBundle getResourceBundle() {
|
|
return bundle_fr;
|
|
}
|
|
|
|
@Override
|
|
public String getResourceBundleName() {
|
|
return PROPERTY_BUNDLE_NAME;
|
|
}
|
|
};
|
|
|
|
final TestHandler handler2 = new TestHandler();
|
|
customLogger.addHandler(handler2);
|
|
customLogger.setLevel(Level.FINE);
|
|
LogManager.getLogManager().addLogger(customLogger);
|
|
|
|
Logger l = Logger.getLogger(customLogger.getName());
|
|
if (l != customLogger) {
|
|
throw new RuntimeException("Wrong logger: " + l);
|
|
}
|
|
|
|
// log on the custom logger.
|
|
customLogger.fine("dummy");
|
|
|
|
// check that the log record had the correct bundle.
|
|
if (! PROPERTY_BUNDLE_NAME.equals(handler2.lastBundleName)) {
|
|
debugLogger(customLogger, foobar, handler2);
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ handler2.lastBundleName);
|
|
}
|
|
if (! PROPERTY_BUNDLE_NAME.equals(customLogger.getResourceBundleName())) {
|
|
debugLogger(customLogger, foobar, handler2);
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ customLogger.getResourceBundleName());
|
|
}
|
|
if (bundle_fr != handler2.lastBundle) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ handler2.lastBundle);
|
|
}
|
|
if (bundle_fr != customLogger.getResourceBundle()) {
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ customLogger.getResourceBundle());
|
|
}
|
|
|
|
// Do the same thing again with a child of the custom logger.
|
|
Logger biebar = Logger.getLogger(customLogger.getName() + ".bar");
|
|
biebar.fine("dummy");
|
|
|
|
// because getResourceBundleName() is called on parent logger
|
|
// we will have handler2.lastBundleName = PROPERTY_BUNDLE_NAME
|
|
if (!PROPERTY_BUNDLE_NAME.equals(handler2.lastBundleName)) {
|
|
debugLogger(biebar, customLogger, handler2);
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ handler2.lastBundleName);
|
|
}
|
|
// because getResourceBundle() is not called on parent logger
|
|
// we will have getBaseName(handler2.lastBundle) = PROPERTY_BUNDLE_NAME
|
|
// and not handler2.lastBundle = bundle_fr
|
|
if (handler2.lastBundle == null) {
|
|
debugLogger(biebar, customLogger, handler2);
|
|
throw new RuntimeException("Unexpected bundle: "
|
|
+ handler2.lastBundle);
|
|
}
|
|
if (!PROPERTY_BUNDLE_NAME.equals(getBaseName(handler2.lastBundle))) {
|
|
debugLogger(biebar, customLogger, handler2);
|
|
throw new RuntimeException("Unexpected bundle name: "
|
|
+ getBaseName(handler2.lastBundle));
|
|
}
|
|
|
|
// Just make sure that these loggers won't be eagerly GCed...
|
|
if (foobar == null || !loggerName.equals(foobar.getName())) {
|
|
throw new RuntimeException("foobar is null "
|
|
+ "- or doesn't have the expected name: " + foobar);
|
|
}
|
|
if (foobaz == null || !foobaz.getName().startsWith(loggerName)) {
|
|
throw new RuntimeException("foobaz is null "
|
|
+ "- or doesn't have the expected name: " + foobaz);
|
|
}
|
|
if (foobaz2 == null || !foobaz2.getName().startsWith(loggerName)) {
|
|
throw new RuntimeException("foobaz2 is null "
|
|
+ "- or doesn't have the expected name: " + foobaz2);
|
|
}
|
|
if (!customLogger.getName().startsWith(loggerName)) {
|
|
throw new RuntimeException("customLogger "
|
|
+ "doesn't have the expected name: " + customLogger);
|
|
}
|
|
if (!biebar.getName().startsWith(loggerName)) {
|
|
throw new RuntimeException("biebar "
|
|
+ "doesn't have the expected name: " + biebar.getName());
|
|
}
|
|
System.out.println("Test passed for " + loggerName);
|
|
}
|
|
|
|
static void debugLogger(Logger logger, Logger expectedParent, TestHandler handler) {
|
|
final String logName = logger.getName();
|
|
final String prefix = " " + logName;
|
|
System.err.println("Logger " + logName
|
|
+ " logged with bundle name " + handler.lastBundleName
|
|
+ " (" + handler.lastBundle + ")");
|
|
System.err.println(prefix + ".getResourceBundleName() is "
|
|
+ logger.getResourceBundleName());
|
|
System.err.println(prefix + ".getResourceBundle() is "
|
|
+ logger.getResourceBundle());
|
|
final Logger parent = logger.getParent();
|
|
final String pname = parent == null ? null : parent.getName();
|
|
final String pclass = parent == null ? ""
|
|
: ("(" + parent.getClass().getName() + ")");
|
|
final String presn = parent == null ? null
|
|
: parent.getResourceBundleName();
|
|
final ResourceBundle pres = parent == null ? null
|
|
: parent.getResourceBundle();
|
|
System.err.println(prefix + ".getParent() is "
|
|
+ pname + (pname == null ? ""
|
|
: (" " + pclass + ": " + parent)));
|
|
System.err.println(" expected parent is :" + expectedParent);
|
|
System.err.println(prefix + ".parent.getResourceBundleName() is "
|
|
+ presn);
|
|
System.err.println(prefix + ".parent.getResourceBundle() is "
|
|
+ pres);
|
|
System.err.println(" expected parent getResourceBundleName() is "
|
|
+ expectedParent.getResourceBundleName());
|
|
System.err.println(" expected parent.getResourceBundle() is "
|
|
+ expectedParent.getResourceBundle());
|
|
}
|
|
}
|