Skip to content
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 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