/* * Copyright (c) 2013, 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.Arrays; 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.LogRecord; import java.util.logging.Logger; import resources.ListBundle; /** * @test * @bug 8013839 * @summary tests Logger.logrb(..., ResourceBundle); * @build TestLogrbResourceBundle resources.ListBundle resources.ListBundle_fr * @run main TestLogrbResourceBundle * @author danielfuchs */ public class TestLogrbResourceBundle { 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 { ResourceBundle lastBundle = null; String lastBundleName = null; Object[] lastParams = null; Throwable lastThrown = null; String lastMessage = null; @Override public void publish(LogRecord record) { lastBundle = record.getResourceBundle(); lastBundleName = record.getResourceBundleName(); lastParams = record.getParameters(); lastThrown = record.getThrown(); lastMessage = record.getMessage(); } @Override public void flush() { } @Override public void close() throws SecurityException { } } /** * We're going to do the same test with each of the different new logrb * forms. * <ul> * <li> LOGRB_NO_ARGS: calling logrb with no message argument. * <li> LOGRB_SINGLE_ARG: calling logrb with a single message argument. * <li> LOGRB_ARG_ARRAY: calling logrb with an array of message arguments. * <li> LOGRB_VARARGS: calling logrb with a variable list of message arguments. * <li> LOGRB_THROWABLE: calling logrb with an exception. * </ul> */ private static enum TestCase { LOGRB_NO_ARGS, LOGRB_SINGLE_ARG, LOGRB_ARG_ARRAY, LOGRB_VARARGS, LOGRB_THROWABLE; public void logrb(Logger logger, ResourceBundle bundle) { switch(this) { case LOGRB_NO_ARGS: logger.logrb(Level.CONFIG, TestLogrbResourceBundle.class.getName(), "main", bundle, "dummy"); break; case LOGRB_SINGLE_ARG: logger.logrb(Level.CONFIG, TestLogrbResourceBundle.class.getName(), "main", bundle, "dummy", "bar"); break; case LOGRB_ARG_ARRAY: logger.logrb(Level.CONFIG, TestLogrbResourceBundle.class.getName(), "main", bundle, "dummy", new Object[] { "bar", "baz"} ); break; case LOGRB_VARARGS: logger.logrb(Level.CONFIG, TestLogrbResourceBundle.class.getName(), "main", bundle, "dummy", "bar", "baz" ); break; case LOGRB_THROWABLE: logger.logrb(Level.CONFIG, TestLogrbResourceBundle.class.getName(), "main", bundle, "dummy", new Exception("dummy exception") ); break; default: } } /** * Checks that the last published logged record had the expected data. * @param handler the TestHandler through which the record was published. */ public void checkLogged(TestHandler handler) { checkLogged(handler.lastMessage, handler.lastParams, handler.lastThrown); } private void checkLogged(String message, Object[] parameters, Throwable thrown) { switch(this) { case LOGRB_NO_ARGS: if ("dummy".equals(message) && thrown == null && (parameters == null || parameters.length == 0)) { return; // OK: all was as expected. } break; case LOGRB_SINGLE_ARG: if ("dummy".equals(message) && thrown == null && parameters != null && parameters.length == 1 && "bar".equals(parameters[0])) { return; // OK: all was as expected. } break; case LOGRB_VARARGS: case LOGRB_ARG_ARRAY: if ("dummy".equals(message) && thrown == null && parameters != null && parameters.length > 1 && Arrays.deepEquals(new Object[] { "bar", "baz"}, parameters)) { return; // OK: all was as expected. } break; case LOGRB_THROWABLE: if ("dummy".equals(message) && thrown != null && thrown.getClass() == Exception.class && "dummy exception".equals(thrown.getMessage())) { return; // OK: all was as expected. } break; default: } // We had some unexpected stuff: throw exception. throw new RuntimeException(this + ": " + "Unexpected content in last published log record: " + "\n\tmessage=\"" + message + "\"" + "\n\tparameters=" + Arrays.toString(parameters) + "\n\tthrown=" + thrown); } } static String getBaseName(ResourceBundle bundle) { return bundle == null ? null : bundle.getBaseBundleName(); } public static void main(String... args) throws Exception { Locale defaultLocale = Locale.getDefault(); final ResourceBundle bundle = ResourceBundle.getBundle(LIST_BUNDLE_NAME); final ResourceBundle bundle_fr = ResourceBundle.getBundle(LIST_BUNDLE_NAME, Locale.FRENCH); final ResourceBundle propertyBundle = ResourceBundle.getBundle(PROPERTY_BUNDLE_NAME); final ResourceBundle propertyBundle_fr = ResourceBundle.getBundle(PROPERTY_BUNDLE_NAME, Locale.FRENCH); Logger foobar = Logger.getLogger("foo.bar"); final TestHandler handler = new TestHandler(); foobar.addHandler(handler); foobar.setLevel(Level.CONFIG); final ResourceBundle anonBundle = new ListBundle(); try { // First we're going to call logrb on a logger that // has no bundle set... // For each possible logrb form... for (TestCase test : TestCase.values()) { // For various resource bundles for (ResourceBundle b : new ResourceBundle[] { anonBundle, bundle, bundle_fr, propertyBundle, anonBundle, null, propertyBundle_fr, }) { // Prints the resource bundle base name (can be null, // we don't enforce non-null names in logrb. final String baseName = getBaseName(b); System.out.println("Testing " + test + " with " + baseName); // log in the 'foobar' logger using bundle 'b' test.logrb(foobar, b); // check that the correct bundle was set in the published // LogRecord if (handler.lastBundle != b) { throw new RuntimeException("Unexpected bundle: " + handler.lastBundle); } // check that the correct bundle name was set in the published // LogRecord if (!Objects.equals(handler.lastBundleName, baseName)) { throw new RuntimeException("Unexpected bundle name: " + handler.lastBundleName); } // check that calling foobar.logrb() had no side effect on // the bundle used by foobar. foobar should still have no // bundle set. if (foobar.getResourceBundle() != null) { throw new RuntimeException("Unexpected bundle: " + foobar.getResourceBundle()); } if (foobar.getResourceBundleName() != null) { throw new RuntimeException("Unexpected bundle: " + foobar.getResourceBundleName()); } // Test that the last published log record had all the // data that this test case had logged (message, parameters, // thrown... test.checkLogged(handler); } } // No we're going to set a resource bundle on the foobar logger // and do it all again... // For the same bundle in two different locales for (ResourceBundle propBundle : new ResourceBundle[] { propertyBundle, propertyBundle_fr, }) { // set the bundle on foobar... foobar.setResourceBundle(propBundle); // check the bundle was correctly set... if (!propBundle.equals(foobar.getResourceBundle())) { throw new RuntimeException("Unexpected bundle: " + foobar.getResourceBundle()); } if (!Objects.equals(getBaseName(propBundle), foobar.getResourceBundleName())) { throw new RuntimeException("Unexpected bundle name: " + foobar.getResourceBundleName()); } System.out.println("Configuring " + foobar.getName() + " with " + propBundle); // for each possible logrb form... for (TestCase test : TestCase.values()) { // for various resource bundles for (ResourceBundle b : new ResourceBundle[] { anonBundle, bundle, null, bundle_fr, propertyBundle, anonBundle, propertyBundle_fr, }) { final String baseName = getBaseName(b); System.out.println("Testing " + test + " with " + baseName); // call foobar.logrb test.logrb(foobar, b); // check which resource bundle was used (should be // the one passed to logrb) if (handler.lastBundle != b) { throw new RuntimeException("Unexpected bundle: " + handler.lastBundle); } if (!Objects.equals(handler.lastBundleName, baseName)) { throw new RuntimeException("Unexpected bundle name: " + handler.lastBundleName); } // Verify there was no side effect on the bundle that // had been previously set on the logger... if (foobar.getResourceBundle() != propBundle) { throw new RuntimeException("Unexpected bundle: " + foobar.getResourceBundle()); } if (!Objects.equals(getBaseName(propBundle), foobar.getResourceBundleName())) { throw new RuntimeException("Unexpected bundle name: " + foobar.getResourceBundleName()); } // Checked that the published LogRecord had the // expected content logged by this test case. test.checkLogged(handler); } } } // Now we're going to the same thing, but with a logger which // has an inherited resource bundle. Logger foobaz = Logger.getLogger("foo.bar.baz"); // check that foobaz has no bundle set locally. if (foobaz.getResourceBundle() != null) { throw new RuntimeException("Unexpected bundle: " + foobaz.getResourceBundle()); } if (foobaz.getResourceBundleName() != null) { throw new RuntimeException("Unexpected bundle: " + foobaz.getResourceBundle()); } // The current locale should have no effect on logrb. Locale.setDefault(Locale.GERMAN); // shouldn't change anything... // for each possible logrb form for (TestCase test : TestCase.values()) { // for various resource bundle for (ResourceBundle b : new ResourceBundle[] { anonBundle, bundle, bundle_fr, propertyBundle, null, anonBundle, propertyBundle_fr, }) { final String baseName = getBaseName(b); System.out.println("Testing " + test + " with " + foobaz.getName() + " and " + baseName); // call foobaz.logrb with the bundle test.logrb(foobaz, b); // check that the bundle passed to logrb was used. if (handler.lastBundle != b) { throw new RuntimeException("Unexpected bundle: " + handler.lastBundle); } if (!Objects.equals(handler.lastBundleName, baseName)) { throw new RuntimeException("Unexpected bundle name: " + handler.lastBundleName); } // check that there was no effect on the bundle set // on foobaz: it should still be null. if (foobaz.getResourceBundle() != null) { throw new RuntimeException("Unexpected bundle: " + foobaz.getResourceBundle()); } if (foobaz.getResourceBundleName() != null) { throw new RuntimeException("Unexpected bundle: " + foobaz.getResourceBundleName()); } // check that the last published log record had all the // data that was logged by this testcase. test.checkLogged(handler); } } } finally { Locale.setDefault(defaultLocale); } } }