test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java

Print this page

        

@@ -37,13 +37,13 @@
 import java.util.ArrayList;
 import java.util.List;
 
 public class LoggingMXBeanTest
 {
-    static String LOGGER_NAME_1 = "com.sun.management.Logger";
-    static String LOGGER_NAME_2 = "com.sun.management.Logger.Logger2";
-    static String UNKNOWN_LOGGER_NAME = "com.sun.management.Unknown";
+    static final String LOGGER_NAME_1 = "com.sun.management.Logger";
+    static final String LOGGER_NAME_2 = "com.sun.management.Logger.Logger2";
+    static final String UNKNOWN_LOGGER_NAME = "com.sun.management.Unknown";
 
     // These instance variables prevent premature logger garbage collection
     // See getLogger() weak reference warnings.
     Logger logger1;
     Logger logger2;

@@ -220,18 +220,41 @@
         List<String> loggers3 = new ArrayList<>(loggers1);
         loggers3.removeAll(loggers2);
         if (loggers3.size() != 0)
             throw new RuntimeException("LoggerNames: unmatched loggers");
 
+        System.out.println("Loggers: " + loggers1);
+
         // verify logger's level  and parent
         for (String logger : loggers1) {
-            if (!mxbean1.getLoggerLevel(logger)
-                    .equals(mxbean2.getLoggerLevel(logger)))
+            // it is conceivable that mxbean1.getLoggerLevel(logger) is null
+            // if logger has been gc'ed.
+            String level1 = mxbean1.getLoggerLevel(logger);
+            String level2 = mxbean2.getLoggerLevel(logger);
+            if (!java.util.Objects.equals(level1, level2)) {
+                boolean mustfail;
+                switch(logger) {
+                    case LOGGER_NAME_1:
+                    case LOGGER_NAME_2:
+                         mustfail = true; // we have a ref on those loggers.
+                              // they should not have been gc'ed.
+                         break;
+                    default:
+                         mustfail = level1 != null && level2 != null;
+                }
+                if (mustfail) {
                 throw new RuntimeException(
                     "LoggerLevel: unmatched level for " + logger
-                    + ", " + mxbean1.getLoggerLevel(logger)
-                    + ", " + mxbean2.getLoggerLevel(logger));
+                            + ", " + level1 + ", " + level2);
+                } else {
+                   System.err.println("WARNING: level was null for " + logger 
+                            + "; Unmatched level for " + logger
+                            + ", " + level1 + ", " + level2 );
+                   continue; // no use to check further - the logger was 
+                             // probably gc'ed        
+                }
+            }
 
             if (!mxbean1.getParentLoggerName(logger)
                     .equals(mxbean2.getParentLoggerName(logger)))
                 throw new RuntimeException(
                     "ParentLoggerName: unmatched parent logger's name for " + logger);