Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions 1 CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### Fixes

- [ANR] Removed AndroidTransactionProfiler lock ([#4817](https://github.com/getsentry/sentry-java/pull/4817))
- Fix wrong .super() call in SentryTimberTree ([#4844](https://github.com/getsentry/sentry-java/pull/4844))

### Improvements

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public class SentryTimberTree(

/** Log an info message with optional format args. */
override fun i(message: String?, vararg args: Any?) {
super.d(message, *args)
super.i(message, *args)
logWithSentry(Log.INFO, null, message, *args)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.sentry.android.timber

import android.util.Log
import io.sentry.Breadcrumb
import io.sentry.Scopes
import io.sentry.SentryLevel
Expand All @@ -23,18 +24,19 @@ import timber.log.Timber

class SentryTimberTreeTest {
private class Fixture {
val scopes = mock<Scopes>()
val logs = mock<ILoggerApi>()

init {
whenever(scopes.logger()).thenReturn(logs)
}
lateinit var scopes: Scopes
lateinit var logs: ILoggerApi

fun getSut(
minEventLevel: SentryLevel = SentryLevel.ERROR,
minBreadcrumbLevel: SentryLevel = SentryLevel.INFO,
minLogsLevel: SentryLogLevel = SentryLogLevel.INFO,
): SentryTimberTree = SentryTimberTree(scopes, minEventLevel, minBreadcrumbLevel, minLogsLevel)
): SentryTimberTree {
logs = mock<ILoggerApi>()
scopes = mock<Scopes>()
whenever(scopes.logger()).thenReturn(logs)
return SentryTimberTree(scopes, minEventLevel, minBreadcrumbLevel, minLogsLevel)
}
}

private val fixture = Fixture()
Expand Down Expand Up @@ -139,6 +141,56 @@ class SentryTimberTreeTest {
verify(fixture.scopes).captureEvent(check { assertEquals("tag", it.getTag("TimberTag")) })
}

@Test
fun `Tree captures an event with TimberTag tag for debug events`() {
val sut = fixture.getSut(minEventLevel = SentryLevel.INFO)
Timber.plant(sut)
// only available thru static class
Timber.tag("infoTag").i("message")
verify(fixture.scopes).captureEvent(check { assertEquals("infoTag", it.getTag("TimberTag")) })
}

@Test
fun `Tree captures an event with chained tag usage`() {
val sut = fixture.getSut(minEventLevel = SentryLevel.INFO)
Timber.plant(sut)
// only available thru static class
Timber.tag("infoTag").log(Log.INFO, "message")
verify(fixture.scopes).captureEvent(check { assertEquals("infoTag", it.getTag("TimberTag")) })
}

@Test
fun `Tree properly propagates all levels`() {
val levels =
listOf(
Pair(Log.DEBUG, SentryLevel.DEBUG),
Pair(Log.VERBOSE, SentryLevel.DEBUG),
Pair(Log.INFO, SentryLevel.INFO),
Pair(Log.WARN, SentryLevel.WARNING),
Pair(Log.ERROR, SentryLevel.ERROR),
Pair(Log.ASSERT, SentryLevel.FATAL),
)

for (level in levels) {
Timber.uprootAll()

val logLevel = level.first
val sentryLevel = level.second

val sut = fixture.getSut(minEventLevel = sentryLevel)
Timber.plant(sut)
// only available thru static class
Timber.tag("tag").log(logLevel, "message")
verify(fixture.scopes)
.captureEvent(
check {
assertEquals("tag", it.getTag("TimberTag"))
assertEquals(sentryLevel, it.level)
}
)
}
}

@Test
fun `Tree captures an event without TimberTag tag`() {
val sut = fixture.getSut()
Expand Down
Loading
Morty Proxy This is a proxified and sanitized view of the page, visit original site.