Merge "Track libcore java.util.logging update to ojdk8u60"
diff --git a/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java b/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java
index 58f1e49..082a36d 100644
--- a/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java
+++ b/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java
@@ -617,6 +617,42 @@
         mockManager.removePropertyChangeListener(null);
     }
 
+    public void testLoggerLevelInitialized_explicit() throws SecurityException, IOException {
+        // mock LogManager
+        mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
+        assertNotNull(mockManager.getProperty("handlers"));
+
+        // Before the Android O (and before the openJdk8) the logger level
+        // value was  unconditionally overwritten by a value taken from properties.
+        // Starting from Android O, the value is only set from properties if it wasn't
+        // initialized before.
+        Logger foo = new MockLogger(FOO, null);
+        assertNull(foo.getLevel());
+        assertEquals(0, foo.getHandlers().length);
+        // Explicit set before the .addLogger
+        foo.setLevel(Level.ALL);
+        foo.addHandler(new ConsoleHandler());
+        assertTrue(mockManager.addLogger(foo));
+        assertEquals(Level.ALL, foo.getLevel());
+    }
+
+    public void testLoggerLevelInitialized() throws SecurityException, IOException {
+        // mock LogManager
+        mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
+        assertNotNull(mockManager.getProperty("handlers"));
+
+        // Before the Android O (and before the openJdk8) the logger level
+        // value was  unconditionally overwritten by a value taken from properties.
+        // Starting from Android O, the value is only set from properties if it wasn't
+        // initialized before.
+        Logger foo = new MockLogger(FOO, null);
+        assertNull(foo.getLevel());
+        assertEquals(0, foo.getHandlers().length);
+        foo.addHandler(new ConsoleHandler());
+        assertTrue(mockManager.addLogger(foo));
+        assertEquals(Level.WARNING, foo.getLevel());
+    }
+
     public void testReset() throws SecurityException, IOException {
         // mock LogManager
         mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
@@ -624,7 +660,6 @@
         Logger foo = new MockLogger(FOO, null);
         assertNull(foo.getLevel());
         assertEquals(0, foo.getHandlers().length);
-        foo.setLevel(Level.ALL);
         foo.addHandler(new ConsoleHandler());
         assertTrue(mockManager.addLogger(foo));
         assertEquals(Level.WARNING, foo.getLevel());
diff --git a/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LoggerTest.java b/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LoggerTest.java
index 997431f..bb22d29 100644
--- a/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LoggerTest.java
+++ b/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LoggerTest.java
@@ -23,10 +23,12 @@
 
 import java.io.InputStream;
 import java.util.Arrays;
+import java.util.Enumeration;
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.Properties;
 import java.util.ResourceBundle;
+import java.util.function.Supplier;
 import java.util.logging.Filter;
 import java.util.logging.Handler;
 import java.util.logging.Level;
@@ -1320,7 +1322,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.CONFIG);
-        child.config(null);
+        child.config((String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1334,11 +1336,70 @@
         assertSame(r.getThrown(), null);
 
         this.sharedLogger.setLevel(Level.INFO);
-        this.sharedLogger.config(null);
+        this.sharedLogger.config((String)null);
         assertTrue(CallVerificationStack.getInstance().empty());
     }
 
     /*
+      * Test config(Supplier<String>) with normal values.
+      */
+    public void testConfig_Supplier() {
+        this.sharedLogger.setLevel(Level.CONFIG);
+        this.sharedLogger.config(() -> "config msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "config msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.CONFIG);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.config(() -> "config again");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+
+
+    /*
+      * Test config(Supplier<String>) with null values.
+      */
+    public void testConfig_Supplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.CONFIG);
+        child.config(() -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.CONFIG);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.config(() -> (String)null);
+        assertTrue(CallVerificationStack.getInstance().empty());
+
+        try {
+            child.config((Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test fine(String) with normal values.
       */
     public void testFine_Normal() {
@@ -1363,6 +1424,30 @@
     }
 
     /*
+      * Test fine(Supplier<String>) with normal values.
+      */
+    public void testFine_Supplier() {
+        this.sharedLogger.setLevel(Level.FINE);
+        this.sharedLogger.fine(() -> "fine msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertEquals(r.getMessage(), "fine msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.FINE);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.CONFIG);
+        this.sharedLogger.fine(() -> "fine again");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
       * Test fine(String) with null values.
       */
     public void testFine_Null() {
@@ -1370,9 +1455,8 @@
         Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
         child.addHandler(new MockHandler());
         child.setParent(parent);
-
         child.setLevel(Level.FINE);
-        child.fine(null);
+        child.fine((String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1386,11 +1470,43 @@
         assertSame(r.getThrown(), null);
 
         this.sharedLogger.setLevel(Level.CONFIG);
-        this.sharedLogger.fine(null);
+        this.sharedLogger.fine((String)null);
         assertTrue(CallVerificationStack.getInstance().empty());
     }
 
     /*
+      * Test fine(Supplier<String>) with null values.
+      */
+    public void testFine_Supplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+        child.setLevel(Level.FINE);
+        child.fine(() -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.FINE);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.CONFIG);
+        this.sharedLogger.fine(() -> (String)null);
+        assertTrue(CallVerificationStack.getInstance().empty());
+
+        try {
+            child.fine((Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test finer(String) with normal values.
       */
     public void testFiner_Normal() {
@@ -1415,6 +1531,31 @@
     }
 
     /*
+      * Test finer(Supplier<String>) with normal values.
+      */
+    public void testFiner_Supplier() {
+        this.sharedLogger.setLevel(Level.FINER);
+        this.sharedLogger.finer(() -> "finer msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "finer msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.FINER);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.FINE);
+        this.sharedLogger.finer(() -> "finer again");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+
+    /*
       * Test finer(String) with null values.
       */
     public void testFiner_Null() {
@@ -1424,7 +1565,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.FINER);
-        child.finer(null);
+        child.finer((String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1438,11 +1579,44 @@
         assertSame(r.getThrown(), null);
 
         this.sharedLogger.setLevel(Level.FINE);
-        this.sharedLogger.finer(null);
+        this.sharedLogger.finer((String)null);
         assertTrue(CallVerificationStack.getInstance().empty());
     }
 
     /*
+      * Test finer(Supplier<String>) with null values.
+      */
+    public void testFiner_Supplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.FINER);
+        child.finer(() -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.FINER);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.FINE);
+        this.sharedLogger.finer(() -> (String)null);
+        assertTrue(CallVerificationStack.getInstance().empty());
+
+        try {
+            child.finer((Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test finest(String) with normal values.
       */
     public void testFinest_Normal() {
@@ -1467,6 +1641,31 @@
     }
 
     /*
+      * Test finest(Supplier<String>) with normal values.
+      */
+    public void testFinest_Supplier() {
+        this.sharedLogger.setLevel(Level.FINEST);
+        this.sharedLogger.finest(() -> "finest msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "finest msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.FINEST);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.FINER);
+        this.sharedLogger.finest(() -> "finest again");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+
+    /*
       * Test finest(String) with null values.
       */
     public void testFinest_Null() {
@@ -1476,7 +1675,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.FINEST);
-        child.finest(null);
+        child.finest((String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1490,11 +1689,44 @@
         assertSame(r.getThrown(), null);
 
         this.sharedLogger.setLevel(Level.FINER);
-        this.sharedLogger.finest(null);
+        this.sharedLogger.finest((String)null);
         assertTrue(CallVerificationStack.getInstance().empty());
     }
 
     /*
+      * Test finest(Supplier<String>) with null values.
+      */
+    public void testFinest_Supplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.FINEST);
+        child.finest(() -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.FINEST);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.FINER);
+        this.sharedLogger.finest(() -> (String)null);
+        assertTrue(CallVerificationStack.getInstance().empty());
+
+        try {
+            child.finest((Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test info(String) with normal values.
       */
     public void testInfo_Normal() {
@@ -1519,6 +1751,30 @@
     }
 
     /*
+      * Test info(Supplier<String>) with normal values.
+      */
+    public void testInfo_Supplier() {
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.info(() -> "info msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "info msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.WARNING);
+        this.sharedLogger.info(() -> "info again");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
       * Test info(String) with null values.
       */
     public void testInfo_Null() {
@@ -1528,7 +1784,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.INFO);
-        child.info(null);
+        child.info((String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1542,11 +1798,44 @@
         assertSame(r.getThrown(), null);
 
         this.sharedLogger.setLevel(Level.WARNING);
-        this.sharedLogger.info(null);
+        this.sharedLogger.info((String)null);
         assertTrue(CallVerificationStack.getInstance().empty());
     }
 
     /*
+      * Test info(Supplier<String>) with null values.
+      */
+    public void testInfo_Supplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.INFO);
+        child.info(() -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.WARNING);
+        this.sharedLogger.info(() -> (String)null);
+        assertTrue(CallVerificationStack.getInstance().empty());
+
+        try {
+            child.info((Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test warning(String) with normal values.
       */
     public void testWarning_Normal() {
@@ -1571,6 +1860,30 @@
     }
 
     /*
+      * Test warning(Supplier<String>) with normal values.
+      */
+    public void testWarning_Supplier() {
+        this.sharedLogger.setLevel(Level.WARNING);
+        this.sharedLogger.warning(() -> "warning msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "warning msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.WARNING);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.SEVERE);
+        this.sharedLogger.warning(() -> "warning again");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
       * Test warning(String) with null values.
       */
     public void testWarning_Null() {
@@ -1580,7 +1893,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.WARNING);
-        child.warning(null);
+        child.warning((String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1594,11 +1907,44 @@
         assertSame(r.getThrown(), null);
 
         this.sharedLogger.setLevel(Level.SEVERE);
-        this.sharedLogger.warning(null);
+        this.sharedLogger.warning((String)null);
         assertTrue(CallVerificationStack.getInstance().empty());
     }
 
     /*
+      * Test warning(Supplier<String>) with null values.
+      */
+    public void testWarning_Supplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.WARNING);
+        child.warning(() -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.WARNING);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.SEVERE);
+        this.sharedLogger.warning(() -> (String)null);
+        assertTrue(CallVerificationStack.getInstance().empty());
+
+        try {
+            child.warning((Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test severe(String) with normal values.
       */
     public void testSevere_Normal() {
@@ -1623,6 +1969,30 @@
     }
 
     /*
+      * Test severe(Supplier<String>) with normal values.
+      */
+    public void testSevere_Supplier() {
+        this.sharedLogger.setLevel(Level.SEVERE);
+        this.sharedLogger.severe(() -> "severe msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "severe msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.SEVERE);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger.severe(() -> "severe again");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
       * Test severe(String) with null values.
       */
     public void testSevere_Null() {
@@ -1632,7 +2002,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.SEVERE);
-        child.severe(null);
+        child.severe((String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1646,11 +2016,44 @@
         assertSame(r.getThrown(), null);
 
         this.sharedLogger.setLevel(Level.OFF);
-        this.sharedLogger.severe(null);
+        this.sharedLogger.severe((String)null);
         assertTrue(CallVerificationStack.getInstance().empty());
     }
 
     /*
+      * Test severe(Supplier<String>) with null values.
+      */
+    public void testSevere_Supplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.SEVERE);
+        child.severe(() -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.SEVERE);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger.severe(() -> (String)null);
+        assertTrue(CallVerificationStack.getInstance().empty());
+
+        try {
+            child.severe((Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test log(Level, String) with normal values.
       */
     public void testLog_LevelString_Normal() {
@@ -1677,6 +2080,32 @@
     }
 
     /*
+      * Test log(Level, Supplier<String>) with normal values.
+      */
+    public void testLog_LevelSupplier() {
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.log(Level.INFO, () -> "log(Level, String) msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "log(Level, String) msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.log(Level.CONFIG, () -> "log(Level, String) msg");
+        assertTrue(CallVerificationStack.getInstance().empty());
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger.log(Level.OFF, () -> "log(Level, String) msg");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
       * Test log(Level, String) with null message.
       */
     public void testLog_LevelString_NullMsg() {
@@ -1686,7 +2115,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.INFO);
-        child.log(Level.INFO, null);
+        child.log(Level.INFO, (String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1701,6 +2130,35 @@
     }
 
     /*
+      * Test log(Level, Supplier<String>) with null message.
+      */
+    public void testLog_LevelSupplier_NullMsg() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.INFO);
+        child.log(Level.INFO, () -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        try {
+            child.log(Level.INFO, (Supplier<String>) null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
+    /*
       * Test log(Level, String) with null level.
       */
     public void testLog_LevelString_NullLevel() {
@@ -1919,6 +2377,67 @@
         }
     }
 
+
+    /*
+      * Test log(Level, Throwable, Supplier<String>) with normal values.
+      */
+    public void testLog_LevelThrowableSupplier_Normal() {
+        Throwable t = new Throwable();
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.log(Level.INFO, t,
+                () -> "log(Level, Throwable, Supplier<String>) msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "log(Level, Throwable, Supplier<String>) msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), t);
+
+        this.sharedLogger.log(Level.CONFIG, t,
+                () -> "log(Level, Throwable, Supplier<String>) msg");
+        assertTrue(CallVerificationStack.getInstance().empty());
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger
+                .log(Level.OFF, "log(Level, Throwable, Supplier<String>) msg", t);
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+
+    /*
+      * Test log(Level, Throwable, Supplier<String>) with null message and throwable.
+      */
+    public void testLog_LevelThrowableSupplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.INFO);
+        child.log(Level.INFO, (Throwable) null, () -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        try {
+            child.log(Level.INFO, (Throwable) null, (Supplier<String>)null);
+            fail();
+        } catch(NullPointerException expected) {}
+    }
+
     /*
       * Test logp(Level, String, String, String) with normal values.
       */
@@ -1958,7 +2477,7 @@
         child.setParent(parent);
 
         child.setLevel(Level.INFO);
-        child.logp(Level.INFO, null, null, null);
+        child.logp(Level.INFO, (String)null, (String)null, (String)null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
         assertSame(r.getLoggerName(), child.getName());
@@ -1986,6 +2505,78 @@
     }
 
     /*
+      * Test logp(Level, String, String, Supplier<String>) with normal values.
+      */
+    public void testLogp_LevelStringStringSupplier_Normal() {
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.logp(Level.INFO, "sourceClass", "sourceMethod",
+                () -> "logp(Level, String, String, Supplier<String>) msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(), "logp(Level, String, String, Supplier<String>) msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), "sourceClass");
+        assertSame(r.getSourceMethodName(), "sourceMethod");
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.logp(Level.CONFIG, "sourceClass", "sourceMethod",
+                 () -> "logp(Level, String, String, Supplier<String>) msg");
+        assertTrue(CallVerificationStack.getInstance().empty());
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger.logp(Level.OFF, "sourceClass", "sourceMethod",
+                 () -> "logp(Level, String, String, Supplier<String>) msg");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
+      * Test logp(Level, String, String, Supplier<String>) with null message.
+      */
+    public void testLogp_LevelStringStringSupplier_NullMsg() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.INFO);
+        child.logp(Level.INFO, (String)null, (String)null, () -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        try {
+            child.logp(Level.INFO, (String)null, (String)null, (Supplier<String>)null);
+            fail();
+        } catch(NullPointerException expected) {}
+
+    }
+
+    /*
+      * Test logp(Level, String, String, Supplier<String>) with null level.
+      */
+    public void testLogp_LevelStringStringSupplier_NullLevel() {
+        // this.sharedLogger.setLevel(Level.OFF);
+        try {
+            this.sharedLogger.logp(null, "sourceClass", "sourceMethod",
+                    () -> "logp(Level, String, String, String) msg");
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+        }
+    }
+
+    /*
       * Test logp(Level, String, String, String, Object) with normal values.
       */
     public void testLogp_LevelStringStringStringObject_Normal() {
@@ -2202,6 +2793,80 @@
     }
 
     /*
+      * Test logp(Level, String, String, Throwable, Supplier<String>) with normal values.
+      */
+    public void testLogp_LevelStringStringThrowableSupplier_Normal() {
+        Throwable t = new Throwable();
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.logp(Level.INFO, "sourceClass", "sourceMethod", t,
+                () -> "logp(Level, String, String, Throwable, Supplier<String>) msg");
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(),
+                "logp(Level, String, String, Throwable, Supplier<String>) msg");
+        assertSame(r.getResourceBundleName(), this.sharedLogger
+                .getResourceBundleName());
+        assertSame(r.getResourceBundle(), this.sharedLogger.getResourceBundle());
+        assertSame(r.getSourceClassName(), "sourceClass");
+        assertSame(r.getSourceMethodName(), "sourceMethod");
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), t);
+
+        this.sharedLogger.logp(Level.CONFIG, "sourceClass", "sourceMethod", t,
+                () -> "logp(Level, String, String, Throwable, Supplier<String>) msg");
+        assertTrue(CallVerificationStack.getInstance().empty());
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger.logp(Level.OFF, "sourceClass", "sourceMethod", t,
+                () -> "logp(Level, String, String, Throwable, Supplier<String>) msg");
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
+      * Test logp(Level, String, String, Throwable, Supplier<String>) with null message and
+      * throwable.
+      */
+    public void testLogp_LevelStringStringThrowableSupplier_Null() {
+        Logger child = new MockLogger("childLogger", null);
+        Logger parent = new MockLogger("parentLogger", VALID_RESOURCE_BUNDLE2);
+        child.addHandler(new MockHandler());
+        child.setParent(parent);
+
+        child.setLevel(Level.INFO);
+        child.logp(Level.INFO, null, null, (Throwable) null, () -> (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), child.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), parent.getResourceBundleName());
+        assertSame(r.getResourceBundle(), parent.getResourceBundle());
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+
+        try {
+            child.logp(Level.INFO, null, null, (Throwable) null, (Supplier<String>) null);
+            fail();
+        } catch (NullPointerException expected) {}
+    }
+
+    /*
+      * Test logp(Level, String, String, Throwable, Supplier<String>) with null level.
+      */
+    public void testLogp_LevelStringStringThrowableSupplier_NullLevel() {
+        // this.sharedLogger.setLevel(Level.OFF);
+        try {
+            this.sharedLogger.logp(null, "sourceClass", "sourceMethod",
+                    new Throwable(), () -> "log(Level, String, String, Throwable, Supplier) msg");
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+        }
+    }
+
+    /*
       * Test logrb(Level, String, String, String, String) with normal values.
       */
     public void testLogrb_LevelStringStringString_Normal() {
@@ -2433,7 +3098,7 @@
       */
     public void testLogrb_LevelStringStringStringObjects_NullMsgObj() {
         this.sharedLogger.setLevel(Level.INFO);
-        this.sharedLogger.logrb(Level.INFO, null, null, null, null,
+        this.sharedLogger.logrb(Level.INFO, (String)null, (String)null, (String)null, (String)null,
                 (Object[]) null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
@@ -2496,6 +3161,87 @@
     }
 
     /*
+      * Test logrb(Level, String, String, ResourceBundle, String, Object...) with normal
+      * values.
+      */
+    public void testLogrb_LevelStringStringResourceBundleStringObjectEllipsis_Normal() {
+        Object[] params = new Object[2];
+        params[0] = new Object();
+        params[1] = new Object();
+        this.sharedLogger.setLevel(Level.INFO);
+        ResourceBundle rb = ResourceBundle.getBundle(VALID_RESOURCE_BUNDLE2);
+        this.sharedLogger.logrb(Level.INFO, "sourceClass", "sourceMethod",
+                rb,
+                "logrb(Level, String, String, ResourceBundle, String, Object...) msg",
+                params[0], params[1]);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(),
+                "logrb(Level, String, String, ResourceBundle, String, Object...) msg");
+        assertSame(r.getResourceBundleName(), VALID_RESOURCE_BUNDLE2);
+        assertSame(r.getSourceClassName(), "sourceClass");
+        assertSame(r.getSourceMethodName(), "sourceMethod");
+        assertSame(r.getLevel(), Level.INFO);
+        assertEquals(2, r.getParameters().length);
+        assertSame(params[0], r.getParameters()[0]);
+        assertSame(params[1], r.getParameters()[1]);
+        assertSame(r.getThrown(), null);
+
+        this.sharedLogger.logrb(Level.CONFIG, "sourceClass", "sourceMethod",
+                rb,
+                "logrb(Level, String, String, ResourceBundle, String, Object...) msg",
+                params[0], params[1]);
+        assertTrue(CallVerificationStack.getInstance().empty());
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger.logrb(Level.OFF, "sourceClass", "sourceMethod",
+                VALID_RESOURCE_BUNDLE2,
+                "logrb(Level, String, String, ResourceBundle, String, Object...) msg",
+                params);
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
+      * Test logrb(Level, String, String, ResourceBundle, String, Object...) with null
+      * message and object.
+      */
+    public void testLogrb_LevelStringStringResourceBundleStringObjectEllipsis_NullMsgObj() {
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.logrb(Level.INFO, (String)null, (String)null, (ResourceBundle)null,
+                (String)null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), null);
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+    }
+
+    /*
+      * Test logrb(Level, String, String, ResourceBundle, String, Object...) with null
+      * level.
+      */
+    public void testLogrb_LevelStringStringResourceBundleStringObjectEllipsis_NullLevel() {
+        // this.sharedLogger.setLevel(Level.OFF);
+        ResourceBundle rb = ResourceBundle.getBundle(VALID_RESOURCE_BUNDLE2);
+        try {
+            this.sharedLogger
+                    .logrb(
+                            null,
+                            "sourceClass",
+                            "sourceMethod",
+                            rb,
+                            "logrb(Level, String, String, ResourceBundle, String, Object...) msg");
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+        }
+    }
+
+    /*
       * Test logrb(Level, String, String, String, String, Throwable) with normal
       * values.
       */
@@ -2536,9 +3282,9 @@
       * Test logrb(Level, String, String, String, String, Throwable) with null
       * message and throwable.
       */
-    public void testLogrb_LevelStringTStringStringhrowable_NullMsgObj() {
+    public void testLogrb_LevelStringStringStringThrowable_NullMsgObj() {
         this.sharedLogger.setLevel(Level.INFO);
-        this.sharedLogger.logrb(Level.INFO, null, null, null, null,
+        this.sharedLogger.logrb(Level.INFO, (String)null, (String)null, (String)null, (String)null,
                 (Throwable) null);
         LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
         assertTrue(CallVerificationStack.getInstance().empty());
@@ -2597,6 +3343,85 @@
     }
 
     /*
+      * Test logrb(Level, String, String, ResourceBundle, String, Throwable) with normal
+      * values.
+      */
+    public void testLogrb_LevelStringStringResourceBundleStringThrowable_Normal() {
+        Throwable t = new Throwable();
+        ResourceBundle rb = ResourceBundle.getBundle(VALID_RESOURCE_BUNDLE2);
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.logrb(Level.parse("1611"), "sourceClass",
+                "sourceMethod", rb,
+                "logrb(Level, String, String, ResourceBundle, String, Throwable) msg",
+                t);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertEquals(r.getMessage(),
+                "logrb(Level, String, String, ResourceBundle, String, Throwable) msg");
+        assertSame(r.getResourceBundleName(), VALID_RESOURCE_BUNDLE2);
+        assertSame(r.getSourceClassName(), "sourceClass");
+        assertSame(r.getSourceMethodName(), "sourceMethod");
+        assertSame(r.getLevel(), Level.parse("1611"));
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), t);
+        assertNull(Level.parse("1611").getResourceBundleName());
+
+        this.sharedLogger.logrb(Level.CONFIG, "sourceClass", "sourceMethod",
+                rb,
+                "logrb(Level, String, String, ResourceBundle, String, Throwable) msg",
+                t);
+        assertTrue(CallVerificationStack.getInstance().empty());
+        this.sharedLogger.setLevel(Level.OFF);
+        this.sharedLogger.logrb(Level.OFF, "sourceClass", "sourceMethod",
+                rb,
+                "logrb(Level, String, String, ResourceBundle, String, Throwable) msg",
+                t);
+        assertTrue(CallVerificationStack.getInstance().empty());
+    }
+
+    /*
+      * Test logrb(Level, String, String, ResourceBundle, String, Throwable) with null
+      * message and throwable.
+      */
+    public void testLogrb_LevelStringStringResourceBundleStringThrowable_NullMsgObj() {
+        this.sharedLogger.setLevel(Level.INFO);
+        this.sharedLogger.logrb(Level.INFO, (String)null, (String)null, (ResourceBundle)null,
+                (String)null, (Throwable) null);
+        LogRecord r = (LogRecord) CallVerificationStack.getInstance().pop();
+        assertTrue(CallVerificationStack.getInstance().empty());
+        assertSame(r.getLoggerName(), this.sharedLogger.getName());
+        assertNull(r.getMessage());
+        assertSame(r.getResourceBundleName(), null);
+        assertSame(r.getSourceClassName(), null);
+        assertSame(r.getSourceMethodName(), null);
+        assertSame(r.getLevel(), Level.INFO);
+        assertNull(r.getParameters());
+        assertSame(r.getThrown(), null);
+    }
+
+    /*
+      * Test logrb(Level, String, String, ResourceBundle, String, Throwable) with null
+      * level.
+      */
+    public void testLogrb_LevelStringStringResourceBundleStringThrowable_NullLevel() {
+        ResourceBundle rb = ResourceBundle.getBundle(VALID_RESOURCE_BUNDLE2);
+        // this.sharedLogger.setLevel(Level.OFF);
+        try {
+            this.sharedLogger
+                    .logrb(
+                            null,
+                            "sourceClass",
+                            "sourceMethod",
+                            rb,
+                            "log(Level, String, String, ResourceBundle, String, Throwable) msg",
+                            new Throwable());
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+        }
+    }
+
+    /*
       * Test log(LogRecord) for a normal log record. Meanwhile the logger has an
       * appropriate level, no filter, no parent.
       */
@@ -3033,6 +3858,73 @@
         }
     }
 
+
+    /*
+     * test setResourceBundle
+     */
+    public void test_setResourceBundle() throws Exception {
+        assertNull(LogManager.getLogManager().getLogger("testSetResourceBundle"));
+
+        // Create a new logger
+        Logger log1 = Logger.getLogger("testSetResourceBundle");
+        assertNull(log1.getResourceBundle());
+
+        // Set bundle
+        ResourceBundle resourceBundle = ResourceBundle.getBundle(VALID_RESOURCE_BUNDLE);
+        log1.setResourceBundle(resourceBundle);
+
+        assertEquals(VALID_VALUE, log1.getResourceBundle().getString(VALID_KEY));
+        assertEquals(log1.getResourceBundleName(), VALID_RESOURCE_BUNDLE);
+
+        // Set again the same bundle
+        log1.setResourceBundle(resourceBundle);
+        assertEquals(VALID_VALUE, log1.getResourceBundle().getString(VALID_KEY));
+        assertEquals(log1.getResourceBundleName(), VALID_RESOURCE_BUNDLE);
+
+        // Try different one and fail
+        ResourceBundle anotherResourceBundle = ResourceBundle.getBundle(VALID_RESOURCE_BUNDLE2);
+        try {
+            log1.setResourceBundle(anotherResourceBundle);
+            fail();
+        } catch(IllegalArgumentException expected) {
+        }
+    }
+
+    /*
+     * test setResourceBundle
+     */
+    public void test_setResourceBundle_badInputs() throws Exception {
+        assertNull(LogManager.getLogManager().getLogger("testSetResourceBundle_badInputs"));
+
+        // Create a new logger
+        Logger log1 = Logger.getLogger("testSetResourceBundle_badInputs");
+        assertNull(log1.getResourceBundle());
+
+        // NPE
+        try {
+            log1.setResourceBundle(null);
+            fail();
+        } catch(NullPointerException expected) {
+        }
+
+        // ResourceBundle with an empty name
+        try {
+            log1.setResourceBundle(new ResourceBundle() {
+                    @Override
+                    protected Object handleGetObject(String key) {
+                        return null;
+                    }
+
+                    @Override
+                    public Enumeration<String> getKeys() {
+                        return null;
+                    }
+                });
+            fail();
+        } catch(IllegalArgumentException expected) {
+        }
+    }
+
     /*
       * A mock logger, used to test the protected constructors and fields.
       */