From 1cfb049429f201fc037da82134d2f885ac22fdaa Mon Sep 17 00:00:00 2001 From: Drew Hamilton Date: Mon, 16 Apr 2018 10:46:34 -0500 Subject: [PATCH 1/3] Make logging depth overrideable --- timber/src/main/java/timber/log/Timber.java | 13 ++++++++-- .../src/test/java/timber/log/TimberTest.java | 24 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/timber/src/main/java/timber/log/Timber.java b/timber/src/main/java/timber/log/Timber.java index da5b98adc..9370565b3 100644 --- a/timber/src/main/java/timber/log/Timber.java +++ b/timber/src/main/java/timber/log/Timber.java @@ -590,6 +590,14 @@ protected String createStackElementTag(@NotNull StackTraceElement element) { return tag.substring(0, MAX_TAG_LENGTH); } + /** + * Define how deep the desired tag will be in the call stack. 5 by default, but may need to + * be overridden if you're wrapping Timber or something. + */ + protected int getLoggingDepth() { + return CALL_STACK_INDEX; + } + @Override final String getTag() { String tag = super.getTag(); if (tag != null) { @@ -599,11 +607,12 @@ protected String createStackElementTag(@NotNull StackTraceElement element) { // DO NOT switch this to Thread.getCurrentThread().getStackTrace(). The test will pass // because Robolectric runs them on the JVM but on Android the elements are different. StackTraceElement[] stackTrace = new Throwable().getStackTrace(); - if (stackTrace.length <= CALL_STACK_INDEX) { + final int callStackIndex = getLoggingDepth(); + if (stackTrace.length <= callStackIndex) { throw new IllegalStateException( "Synthetic stacktrace didn't have enough elements: are you using proguard?"); } - return createStackElementTag(stackTrace[CALL_STACK_INDEX]); + return createStackElementTag(stackTrace[callStackIndex]); } /** diff --git a/timber/src/test/java/timber/log/TimberTest.java b/timber/src/test/java/timber/log/TimberTest.java index df509f281..795cd3542 100644 --- a/timber/src/test/java/timber/log/TimberTest.java +++ b/timber/src/test/java/timber/log/TimberTest.java @@ -510,6 +510,23 @@ protected String formatMessage(@NotNull String message, @NotNull Object[] args) .hasNoMoreMessages(); } + @Test public void overrideLoggingDepth() { + final String expectedTag = TimberTest.class.getSimpleName(); + final String testMessage = "Test message"; + + Timber.plant(new Timber.DebugTree() { + @Override + protected int getLoggingDepth() { + return 6; + } + }); + TimberWrapper.v(testMessage); + + assertLog() + .hasVerboseMessage(expectedTag, testMessage) + .hasNoMoreMessages(); + } + private static T truncatedThrowable(Class throwableClass) { try { T throwable = throwableClass.newInstance(); @@ -597,4 +614,11 @@ public void hasNoMoreMessages() { assertThat(items).hasSize(index); } } + + private static final class TimberWrapper { + + public static void v(String message, Object... args) { + Timber.v(message, args); + } + } } From d9aae34cae8c51cf6e1b5ed35b61f2e2036c3187 Mon Sep 17 00:00:00 2001 From: Drew Hamilton Date: Mon, 16 Apr 2018 10:57:18 -0500 Subject: [PATCH 2/3] Clearer logging depth override in test --- timber/src/test/java/timber/log/TimberTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/timber/src/test/java/timber/log/TimberTest.java b/timber/src/test/java/timber/log/TimberTest.java index 795cd3542..69edc4b70 100644 --- a/timber/src/test/java/timber/log/TimberTest.java +++ b/timber/src/test/java/timber/log/TimberTest.java @@ -517,7 +517,7 @@ protected String formatMessage(@NotNull String message, @NotNull Object[] args) Timber.plant(new Timber.DebugTree() { @Override protected int getLoggingDepth() { - return 6; + return super.getLoggingDepth() + 1; } }); TimberWrapper.v(testMessage); From a8ef4b46cea77763c5a370cb8d99df6771d5c4a6 Mon Sep 17 00:00:00 2001 From: Drew Hamilton Date: Mon, 16 Apr 2018 19:49:04 -0500 Subject: [PATCH 3/3] Rename "getLoggingDepth()" to "getTagDepth()" --- timber/src/main/java/timber/log/Timber.java | 4 ++-- timber/src/test/java/timber/log/TimberTest.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/timber/src/main/java/timber/log/Timber.java b/timber/src/main/java/timber/log/Timber.java index 9370565b3..db01ffa6c 100644 --- a/timber/src/main/java/timber/log/Timber.java +++ b/timber/src/main/java/timber/log/Timber.java @@ -594,7 +594,7 @@ protected String createStackElementTag(@NotNull StackTraceElement element) { * Define how deep the desired tag will be in the call stack. 5 by default, but may need to * be overridden if you're wrapping Timber or something. */ - protected int getLoggingDepth() { + protected int getTagDepth() { return CALL_STACK_INDEX; } @@ -607,7 +607,7 @@ protected int getLoggingDepth() { // DO NOT switch this to Thread.getCurrentThread().getStackTrace(). The test will pass // because Robolectric runs them on the JVM but on Android the elements are different. StackTraceElement[] stackTrace = new Throwable().getStackTrace(); - final int callStackIndex = getLoggingDepth(); + final int callStackIndex = getTagDepth(); if (stackTrace.length <= callStackIndex) { throw new IllegalStateException( "Synthetic stacktrace didn't have enough elements: are you using proguard?"); diff --git a/timber/src/test/java/timber/log/TimberTest.java b/timber/src/test/java/timber/log/TimberTest.java index 69edc4b70..d84308e29 100644 --- a/timber/src/test/java/timber/log/TimberTest.java +++ b/timber/src/test/java/timber/log/TimberTest.java @@ -510,14 +510,14 @@ protected String formatMessage(@NotNull String message, @NotNull Object[] args) .hasNoMoreMessages(); } - @Test public void overrideLoggingDepth() { + @Test public void overrideTagDepth() { final String expectedTag = TimberTest.class.getSimpleName(); final String testMessage = "Test message"; Timber.plant(new Timber.DebugTree() { @Override - protected int getLoggingDepth() { - return super.getLoggingDepth() + 1; + protected int getTagDepth() { + return super.getTagDepth() + 1; } }); TimberWrapper.v(testMessage);