< prev index next >

test/java/util/logging/Level/CustomLevel.java

Print this page

        

*** 1,7 **** /* ! * 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. --- 1,7 ---- /* ! * Copyright (c) 2013, 2016, 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.
*** 20,35 **** * or visit www.oracle.com if you need additional information or have any * questions. */ import java.io.*; import java.util.*; import java.util.logging.*; /* * @test ! * @bug 8026027 * @summary Test Level.parse to look up custom levels by name and its * localized name * * @run main/othervm CustomLevel */ --- 20,38 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ import java.io.*; + import java.lang.ref.Reference; + import java.lang.ref.ReferenceQueue; + import java.lang.ref.WeakReference; import java.util.*; import java.util.logging.*; /* * @test ! * @bug 8026027 6543126 * @summary Test Level.parse to look up custom levels by name and its * localized name * * @run main/othervm CustomLevel */
*** 39,65 **** super(name, value, resourceBundleName); } private static final List<Level> levels = new ArrayList<>(); private static final String RB_NAME = "myresource"; public static void main(String[] args) throws Exception { setupCustomLevels(); // Level.parse will return the custom Level instance ResourceBundle rb = ResourceBundle.getBundle(RB_NAME); for (Level level : levels) { String name = level.getName(); if (!name.equals("WARNING") && !name.equals("INFO")) { // custom level whose name doesn't conflict with any standard one ! checkCustomLevel(Level.parse(name), level); } String localizedName = rb.getString(level.getName()); ! Level l = Level.parse(localizedName); if (l != level) { throw new RuntimeException("Unexpected level " + l + " " + l.getClass()); } } } private static void setupCustomLevels() throws IOException { levels.add(new CustomLevel("EMERGENCY", 1090, RB_NAME)); levels.add(new CustomLevel("ALERT", 1060, RB_NAME)); --- 42,142 ---- super(name, value, resourceBundleName); } private static final List<Level> levels = new ArrayList<>(); private static final String RB_NAME = "myresource"; + + private static class CustomLevelReference extends WeakReference<Level> { + final String name; + final int value; + final String resourceBundleName; + public CustomLevelReference(Level level, ReferenceQueue<Level> queue) { + super(level, queue); + name = level.getName(); + value = level.intValue(); + resourceBundleName = level.getResourceBundleName(); + } + + @Override + public String toString() { + return "CustomLevelReference(\"" + name + "\", " + value + ", \"" + + resourceBundleName + "\")"; + } + } + public static void main(String[] args) throws Exception { setupCustomLevels(); // Level.parse will return the custom Level instance ResourceBundle rb = ResourceBundle.getBundle(RB_NAME); for (Level level : levels) { String name = level.getName(); + Level l = Level.parse(name); if (!name.equals("WARNING") && !name.equals("INFO")) { // custom level whose name doesn't conflict with any standard one ! checkCustomLevel(l, level); ! } else if (l != Level.WARNING && l != Level.INFO ! || !name.equals(l.getName())) { ! throw new RuntimeException("Unexpected level " + formatLevel(l)); } + System.out.println("Level.parse found expected level: " + + formatLevel(l)); String localizedName = rb.getString(level.getName()); ! l = Level.parse(localizedName); if (l != level) { throw new RuntimeException("Unexpected level " + l + " " + l.getClass()); } } + + // Now verify that custom level instances are correctly + // garbage collected when no longer referenced + ReferenceQueue<Level> queue = new ReferenceQueue<>(); + while (!levels.isEmpty()) { + Level l = levels.stream().findAny().get(); + CustomLevelReference ref = new CustomLevelReference(l, queue); + + // remove strong references to l + levels.remove(l); + l = null; + + // Run gc and wait for garbage collection + Reference<? extends Level> ref2; + do { + System.gc(); + Thread.sleep(100); + } while ((ref2 = queue.poll()) == null); + + // Check garbage collected reference + if (ref2 != ref) { + throw new RuntimeException("Unexpected reference: " + ref2); + } + System.out.println(ref2 + " garbage collected"); + final String name = ref.name; + try { + l = Level.parse(name); + if (!name.equals("WARNING") && !name.equals("INFO") + || !name.equals(l.getName())) { + throw new RuntimeException("Unexpected level " + + formatLevel(l)); + } else { + if (l == Level.WARNING || l == Level.INFO) { + System.out.println("Level.parse found expected level: " + + formatLevel(l)); + } else { + throw new RuntimeException("Unexpected level " + + formatLevel(l)); + } + } + } catch (IllegalArgumentException iae) { + if (!name.equals("WARNING") && !name.equals("INFO")) { + System.out.println("Level.parse fired expected exception: " + + iae); + } else { + throw iae; + } + } + } } private static void setupCustomLevels() throws IOException { levels.add(new CustomLevel("EMERGENCY", 1090, RB_NAME)); levels.add(new CustomLevel("ALERT", 1060, RB_NAME));
< prev index next >