11package io.sentry.android.timber
22
3+ import android.util.Log
34import io.sentry.Breadcrumb
45import io.sentry.Scopes
56import io.sentry.SentryLevel
@@ -23,18 +24,19 @@ import timber.log.Timber
2324
2425class SentryTimberTreeTest {
2526 private class Fixture {
26- val scopes = mock<Scopes >()
27- val logs = mock<ILoggerApi >()
28-
29- init {
30- whenever(scopes.logger()).thenReturn(logs)
31- }
27+ lateinit var scopes: Scopes
28+ lateinit var logs: ILoggerApi
3229
3330 fun getSut (
3431 minEventLevel : SentryLevel = SentryLevel .ERROR ,
3532 minBreadcrumbLevel : SentryLevel = SentryLevel .INFO ,
3633 minLogsLevel : SentryLogLevel = SentryLogLevel .INFO ,
37- ): SentryTimberTree = SentryTimberTree (scopes, minEventLevel, minBreadcrumbLevel, minLogsLevel)
34+ ): SentryTimberTree {
35+ logs = mock<ILoggerApi >()
36+ scopes = mock<Scopes >()
37+ whenever(scopes.logger()).thenReturn(logs)
38+ return SentryTimberTree (scopes, minEventLevel, minBreadcrumbLevel, minLogsLevel)
39+ }
3840 }
3941
4042 private val fixture = Fixture ()
@@ -139,6 +141,56 @@ class SentryTimberTreeTest {
139141 verify(fixture.scopes).captureEvent(check { assertEquals(" tag" , it.getTag(" TimberTag" )) })
140142 }
141143
144+ @Test
145+ fun `Tree captures an event with TimberTag tag for debug events` () {
146+ val sut = fixture.getSut(minEventLevel = SentryLevel .INFO )
147+ Timber .plant(sut)
148+ // only available thru static class
149+ Timber .tag(" infoTag" ).i(" message" )
150+ verify(fixture.scopes).captureEvent(check { assertEquals(" infoTag" , it.getTag(" TimberTag" )) })
151+ }
152+
153+ @Test
154+ fun `Tree captures an event with chained tag usage` () {
155+ val sut = fixture.getSut(minEventLevel = SentryLevel .INFO )
156+ Timber .plant(sut)
157+ // only available thru static class
158+ Timber .tag(" infoTag" ).log(Log .INFO , " message" )
159+ verify(fixture.scopes).captureEvent(check { assertEquals(" infoTag" , it.getTag(" TimberTag" )) })
160+ }
161+
162+ @Test
163+ fun `Tree properly propagates all levels` () {
164+ val levels =
165+ listOf (
166+ Pair (Log .DEBUG , SentryLevel .DEBUG ),
167+ Pair (Log .VERBOSE , SentryLevel .DEBUG ),
168+ Pair (Log .INFO , SentryLevel .INFO ),
169+ Pair (Log .WARN , SentryLevel .WARNING ),
170+ Pair (Log .ERROR , SentryLevel .ERROR ),
171+ Pair (Log .ASSERT , SentryLevel .FATAL ),
172+ )
173+
174+ for (level in levels) {
175+ Timber .uprootAll()
176+
177+ val logLevel = level.first
178+ val sentryLevel = level.second
179+
180+ val sut = fixture.getSut(minEventLevel = sentryLevel)
181+ Timber .plant(sut)
182+ // only available thru static class
183+ Timber .tag(" tag" ).log(logLevel, " message" )
184+ verify(fixture.scopes)
185+ .captureEvent(
186+ check {
187+ assertEquals(" tag" , it.getTag(" TimberTag" ))
188+ assertEquals(sentryLevel, it.level)
189+ }
190+ )
191+ }
192+ }
193+
142194 @Test
143195 fun `Tree captures an event without TimberTag tag` () {
144196 val sut = fixture.getSut()
0 commit comments