| Index: base/android/junit/src/org/chromium/base/LogTest.java
 | 
| diff --git a/base/android/junit/src/org/chromium/base/LogTest.java b/base/android/junit/src/org/chromium/base/LogTest.java
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..14726fe254a00ca1e8b52264d8cf260223083776
 | 
| --- /dev/null
 | 
| +++ b/base/android/junit/src/org/chromium/base/LogTest.java
 | 
| @@ -0,0 +1,93 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +package org.chromium.base;
 | 
| +
 | 
| +import static org.junit.Assert.assertEquals;
 | 
| +import static org.junit.Assert.assertNull;
 | 
| +import static org.junit.Assert.assertTrue;
 | 
| +
 | 
| +import org.chromium.testing.local.LocalRobolectricTestRunner;
 | 
| +import org.junit.Test;
 | 
| +import org.junit.runner.RunWith;
 | 
| +import org.robolectric.annotation.Config;
 | 
| +import org.robolectric.annotation.Implementation;
 | 
| +import org.robolectric.annotation.Implements;
 | 
| +import org.robolectric.shadows.ShadowLog;
 | 
| +
 | 
| +import java.util.List;
 | 
| +
 | 
| +/** Unit tests for {@link Log}. */
 | 
| +@RunWith(LocalRobolectricTestRunner.class)
 | 
| +@Config(manifest = Config.NONE, shadows = {LogTest.PermissiveShadowLog.class})
 | 
| +public class LogTest {
 | 
| +    /** Test method for {@link Log#makeTag(String)} */
 | 
| +    @Test
 | 
| +    public void testMakeTag() {
 | 
| +        assertEquals("chromium.Foo", Log.makeTag("Foo"));
 | 
| +        assertEquals("chromium", Log.makeTag(null));
 | 
| +        assertEquals("chromium", Log.makeTag(""));
 | 
| +    }
 | 
| +
 | 
| +    /** Tests that the computed call origin is the correct one. */
 | 
| +    @Test
 | 
| +    public void callOriginTest() {
 | 
| +        Log.d("Foo", "Bar");
 | 
| +
 | 
| +        List<ShadowLog.LogItem> logs = ShadowLog.getLogs();
 | 
| +        assertEquals("Only one log should be written", 1, logs.size());
 | 
| +
 | 
| +        assertTrue("The origin of the log message (" + logs.get(0).msg + ") looks wrong.",
 | 
| +                logs.get(0).msg.matches("\\[LogTest.java:\\d+\\].*"));
 | 
| +    }
 | 
| +
 | 
| +    /** Tests that exceptions provided to the log functions are properly recognized and printed. */
 | 
| +    @Test
 | 
| +    public void exceptionLoggingTest() {
 | 
| +        Throwable t = new Throwable() {
 | 
| +            @Override
 | 
| +            public String toString() {
 | 
| +                return "MyThrowable";
 | 
| +            }
 | 
| +        };
 | 
| +
 | 
| +        Throwable t2 = new Throwable() {
 | 
| +            @Override
 | 
| +            public String toString() {
 | 
| +                return "MyOtherThrowable";
 | 
| +            }
 | 
| +        };
 | 
| +
 | 
| +        List<ShadowLog.LogItem> logs = ShadowLog.getLogs();
 | 
| +
 | 
| +        // The throwable gets printed out
 | 
| +        Log.i("Foo", "Bar", t);
 | 
| +        assertEquals(t, logs.get(logs.size() - 1).throwable);
 | 
| +        assertEquals("Bar", logs.get(logs.size() - 1).msg);
 | 
| +
 | 
| +        // The throwable can be both added to the message itself and printed out
 | 
| +        Log.i("Foo", "Bar %s", t);
 | 
| +        assertEquals(t, logs.get(logs.size() - 1).throwable);
 | 
| +        assertEquals("Bar MyThrowable", logs.get(logs.size() - 1).msg);
 | 
| +
 | 
| +        // Non throwable are properly identified
 | 
| +        Log.i("Foo", "Bar %s", t, "Baz");
 | 
| +        assertNull(logs.get(logs.size() - 1).throwable);
 | 
| +        assertEquals("Bar MyThrowable", logs.get(logs.size() - 1).msg);
 | 
| +
 | 
| +        // The last throwable is the one used that is going to be printed out
 | 
| +        Log.i("Foo", "Bar %s %s", t, t2);
 | 
| +        assertEquals(t2, logs.get(logs.size() - 1).throwable);
 | 
| +        assertEquals("Bar MyThrowable MyOtherThrowable", logs.get(logs.size() - 1).msg);
 | 
| +    }
 | 
| +
 | 
| +    /** Needed to allow debug/verbose logging that is disabled by default. */
 | 
| +    @Implements(android.util.Log.class)
 | 
| +    public static class PermissiveShadowLog extends ShadowLog {
 | 
| +        @Implementation
 | 
| +        public static boolean isLoggable(String tag, int level) {
 | 
| +            return true;
 | 
| +        }
 | 
| +    }
 | 
| +}
 | 
| 
 |