Skip to content
This repository was archived by the owner on Aug 30, 2023. It is now read-only.

Commit c891d6a

Browse files
fix: Asserting events on Envelope sent to Transport (#548)
Co-authored-by: Bruno Garcia <bruno@brunogarcia.com>
1 parent 7845eb8 commit c891d6a

File tree

14 files changed

+186
-143
lines changed

14 files changed

+186
-143
lines changed

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,9 @@ Sentry SDK for Java and Android
2121
| sentry-android-core | [![sentry-android-core](https://img.shields.io/bintray/v/getsentry/sentry-android/io.sentry:sentry-android-core)](https://bintray.com/getsentry/sentry-android/io.sentry:sentry-android-core?tab=overview) | 14 |
2222
| sentry-android-ndk | [![sentry-android-ndk](https://img.shields.io/bintray/v/getsentry/sentry-android/io.sentry:sentry-android-ndk)](https://bintray.com/getsentry/sentry-android/io.sentry:sentry-android-ndk?tab=overview) | 16 |
2323
| sentry-android-timber | [![sentry-android-timber](https://img.shields.io/bintray/v/getsentry/sentry-android/io.sentry:sentry-android-timber)](https://bintray.com/getsentry/sentry-android/io.sentry:sentry-android-timber?tab=overview) | 14 |
24-
| sentry-core | [![sentry-core](https://img.shields.io/bintray/v/getsentry/sentry-android/io.sentry:sentry-core)](https://bintray.com/getsentry/sentry-android/io.sentry:sentry-core?tab=overview) | 14 |
25-
| sentry | [![sentry](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry?tab=overview) | |
24+
| sentry | [![sentry](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry?tab=overview) | 14 |
2625
| sentry-spring-boot-starter | [![sentry-spring-boot-starter](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry-spring-boot-starter)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry-spring-boot-starter?tab=overview) | |
2726
| sentry-spring | [![sentry-spring](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry-spring)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry-spring?tab=overview) | |
28-
| sentry-spring-boot-starter | [![sentry-spring-boot-starter](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry-spring-boot-starter)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry-spring-boot-starter?tab=overview) | |
29-
| sentry-appengine | [![sentry-appengine](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry-appengine)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry-appengine?tab=overview) | |
3027
| sentry-log4j | [![sentry-log4j](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry-log4j)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry-log4j?tab=overview) | |
3128
| sentry-log4j2 | [![sentry-log4j2](https://img.shields.io/bintray/v/getsentry/sentry-java/io.sentry:sentry-log4j2)](https://bintray.com/getsentry/sentry-java/io.sentry:sentry-log4j2?tab=overview) | |
3229

sentry-core/src/main/java/io/sentry/core/SentryEnvelopeItem.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package io.sentry.core;
22

33
import io.sentry.core.util.Objects;
4+
import java.io.BufferedReader;
45
import java.io.BufferedWriter;
6+
import java.io.ByteArrayInputStream;
57
import java.io.ByteArrayOutputStream;
68
import java.io.IOException;
9+
import java.io.InputStreamReader;
710
import java.io.OutputStreamWriter;
11+
import java.io.Reader;
812
import java.io.Writer;
913
import java.nio.charset.Charset;
1014
import java.util.concurrent.Callable;
@@ -72,6 +76,16 @@ public final class SentryEnvelopeItem {
7276
return new SentryEnvelopeItem(itemHeader, () -> cachedItem.getBytes());
7377
}
7478

79+
public @Nullable SentryEvent getEvent(final @NotNull ISerializer serializer) throws Exception {
80+
if (header == null || header.getType() != SentryItemType.Event) {
81+
return null;
82+
}
83+
try (final Reader eventReader =
84+
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(getData()), UTF_8))) {
85+
return serializer.deserializeEvent(eventReader);
86+
}
87+
}
88+
7589
public static @NotNull SentryEnvelopeItem fromEvent(
7690
final @NotNull ISerializer serializer, final @NotNull SentryEvent event) throws IOException {
7791
Objects.requireNonNull(serializer, "ISerializer is required.");

sentry-log4j2/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ dependencies {
3131
compileOnly(Config.CompileOnly.jetbrainsAnnotations)
3232

3333
// tests
34+
testImplementation(project(":sentry-test-support"))
3435
testImplementation(kotlin(Config.kotlinStdLib))
3536
testImplementation(Config.TestLibs.kotlinTestJunit)
3637
testImplementation(Config.TestLibs.mockitoKotlin)

sentry-log4j2/src/test/kotlin/io/sentry/log4j2/SentryAppenderTest.kt

Lines changed: 42 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package io.sentry.log4j2
22

3-
import com.nhaarman.mockitokotlin2.check
43
import com.nhaarman.mockitokotlin2.mock
54
import com.nhaarman.mockitokotlin2.verify
65
import io.sentry.core.HubAdapter
7-
import io.sentry.core.SentryEvent
86
import io.sentry.core.SentryLevel
97
import io.sentry.core.transport.ITransport
8+
import io.sentry.test.checkEvent
109
import java.time.Instant
1110
import java.time.LocalDateTime
1211
import java.time.ZoneId
@@ -74,11 +73,11 @@ class SentryAppenderTest {
7473
logger.debug("testing message conversion {}, {}", 1, 2)
7574

7675
await.untilAsserted {
77-
verify(fixture.transport).send(check { it: SentryEvent ->
78-
assertEquals("testing message conversion 1, 2", it.message.formatted)
79-
assertEquals("testing message conversion {}, {}", it.message.message)
80-
assertEquals(listOf("1", "2"), it.message.params)
81-
assertEquals("io.sentry.log4j2.SentryAppenderTest", it.logger)
76+
verify(fixture.transport).send(checkEvent { event ->
77+
assertEquals("testing message conversion 1, 2", event.message.formatted)
78+
assertEquals("testing message conversion {}, {}", event.message.message)
79+
assertEquals(listOf("1", "2"), event.message.params)
80+
assertEquals("io.sentry.log4j2.SentryAppenderTest", event.logger)
8281
})
8382
}
8483
}
@@ -92,8 +91,8 @@ class SentryAppenderTest {
9291
logger.debug("testing event date")
9392

9493
await.untilAsserted {
95-
verify(fixture.transport).send(check { it: SentryEvent ->
96-
val eventTime = Instant.ofEpochMilli(it.timestamp.time)
94+
verify(fixture.transport).send(checkEvent { event ->
95+
val eventTime = Instant.ofEpochMilli(event.timestamp.time)
9796
.atZone(ZoneId.systemDefault())
9897
.toLocalDateTime()
9998

@@ -110,8 +109,8 @@ class SentryAppenderTest {
110109
logger.trace("testing trace level")
111110

112111
await.untilAsserted {
113-
verify(fixture.transport).send(check { it: SentryEvent ->
114-
assertEquals(SentryLevel.DEBUG, it.level)
112+
verify(fixture.transport).send(checkEvent { event ->
113+
assertEquals(SentryLevel.DEBUG, event.level)
115114
})
116115
}
117116
}
@@ -123,8 +122,8 @@ class SentryAppenderTest {
123122
logger.debug("testing debug level")
124123

125124
await.untilAsserted {
126-
verify(fixture.transport).send(check { it: SentryEvent ->
127-
assertEquals(SentryLevel.DEBUG, it.level)
125+
verify(fixture.transport).send(checkEvent { event ->
126+
assertEquals(SentryLevel.DEBUG, event.level)
128127
})
129128
}
130129
}
@@ -136,8 +135,8 @@ class SentryAppenderTest {
136135
logger.info("testing info level")
137136

138137
await.untilAsserted {
139-
verify(fixture.transport).send(check { it: SentryEvent ->
140-
assertEquals(SentryLevel.INFO, it.level)
138+
verify(fixture.transport).send(checkEvent { event ->
139+
assertEquals(SentryLevel.INFO, event.level)
141140
})
142141
}
143142
}
@@ -149,8 +148,8 @@ class SentryAppenderTest {
149148
logger.warn("testing warn level")
150149

151150
await.untilAsserted {
152-
verify(fixture.transport).send(check { it: SentryEvent ->
153-
assertEquals(SentryLevel.WARNING, it.level)
151+
verify(fixture.transport).send(checkEvent { event ->
152+
assertEquals(SentryLevel.WARNING, event.level)
154153
})
155154
}
156155
}
@@ -162,8 +161,8 @@ class SentryAppenderTest {
162161
logger.error("testing error level")
163162

164163
await.untilAsserted {
165-
verify(fixture.transport).send(check { it: SentryEvent ->
166-
assertEquals(SentryLevel.ERROR, it.level)
164+
verify(fixture.transport).send(checkEvent { event ->
165+
assertEquals(SentryLevel.ERROR, event.level)
167166
})
168167
}
169168
}
@@ -175,8 +174,8 @@ class SentryAppenderTest {
175174
logger.fatal("testing fatal level")
176175

177176
await.untilAsserted {
178-
verify(fixture.transport).send(check { it: SentryEvent ->
179-
assertEquals(SentryLevel.FATAL, it.level)
177+
verify(fixture.transport).send(checkEvent { event ->
178+
assertEquals(SentryLevel.FATAL, event.level)
180179
})
181180
}
182181
}
@@ -188,8 +187,8 @@ class SentryAppenderTest {
188187
logger.warn("testing thread information")
189188

190189
await.untilAsserted {
191-
verify(fixture.transport).send(check { it: SentryEvent ->
192-
assertNotNull(it.getExtra("thread_name"))
190+
verify(fixture.transport).send(checkEvent { event ->
191+
assertNotNull(event.getExtra("thread_name"))
193192
})
194193
}
195194
}
@@ -202,8 +201,8 @@ class SentryAppenderTest {
202201
logger.warn("testing MDC tags")
203202

204203
await.untilAsserted {
205-
verify(fixture.transport).send(check { it: SentryEvent ->
206-
assertEquals(mapOf("key" to "value"), it.contexts["Context Data"])
204+
verify(fixture.transport).send(checkEvent { event ->
205+
assertEquals(mapOf("key" to "value"), event.contexts["Context Data"])
207206
})
208207
}
209208
}
@@ -215,22 +214,8 @@ class SentryAppenderTest {
215214
logger.warn("testing without MDC tags")
216215

217216
await.untilAsserted {
218-
verify(fixture.transport).send(check { it: SentryEvent ->
219-
assertFalse(it.contexts.containsKey("MDC"))
220-
})
221-
}
222-
}
223-
224-
@Test
225-
fun `attaches throwable`() {
226-
fixture.minimumEventLevel = Level.WARN
227-
val logger = fixture.getSut()
228-
val throwable = RuntimeException("something went wrong")
229-
logger.warn("testing throwable", throwable)
230-
231-
await.untilAsserted {
232-
verify(fixture.transport).send(check { it: SentryEvent ->
233-
assertEquals(throwable, it.throwable)
217+
verify(fixture.transport).send(checkEvent { event ->
218+
assertFalse(event.contexts.containsKey("MDC"))
234219
})
235220
}
236221
}
@@ -242,11 +227,11 @@ class SentryAppenderTest {
242227
logger.info("testing sdk version")
243228

244229
await.untilAsserted {
245-
verify(fixture.transport).send(check { it: SentryEvent ->
246-
assertEquals(BuildConfig.SENTRY_LOG4J2_SDK_NAME, it.sdk.name)
247-
assertEquals(BuildConfig.VERSION_NAME, it.sdk.version)
248-
assertNotNull(it.sdk.packages)
249-
assertTrue(it.sdk.packages!!.any { pkg ->
230+
verify(fixture.transport).send(checkEvent { event ->
231+
assertEquals(BuildConfig.SENTRY_LOG4J2_SDK_NAME, event.sdk.name)
232+
assertEquals(BuildConfig.VERSION_NAME, event.sdk.version)
233+
assertNotNull(event.sdk.packages)
234+
assertTrue(event.sdk.packages!!.any { pkg ->
250235
"maven:sentry-log4j2" == pkg.name &&
251236
BuildConfig.VERSION_NAME == pkg.version
252237
})
@@ -266,10 +251,10 @@ class SentryAppenderTest {
266251
logger.warn("testing message with breadcrumbs")
267252

268253
await.untilAsserted {
269-
verify(fixture.transport).send(check { it: SentryEvent ->
270-
assertEquals(2, it.breadcrumbs.size)
271-
val breadcrumb = it.breadcrumbs[0]
272-
val breadcrumbTime = Instant.ofEpochMilli(it.timestamp.time)
254+
verify(fixture.transport).send(checkEvent { event ->
255+
assertEquals(2, event.breadcrumbs.size)
256+
val breadcrumb = event.breadcrumbs[0]
257+
val breadcrumbTime = Instant.ofEpochMilli(event.timestamp.time)
273258
.atZone(ZoneId.systemDefault())
274259
.toLocalDateTime()
275260
assertTrue { breadcrumbTime.plusSeconds(1).isAfter(utcTime) }
@@ -292,9 +277,9 @@ class SentryAppenderTest {
292277
logger.warn("testing message with breadcrumbs")
293278

294279
await.untilAsserted {
295-
verify(fixture.transport).send(check { it: SentryEvent ->
296-
assertEquals(1, it.breadcrumbs.size)
297-
assertEquals("this should be a breadcrumb", it.breadcrumbs[0].message)
280+
verify(fixture.transport).send(checkEvent { event ->
281+
assertEquals(1, event.breadcrumbs.size)
282+
assertEquals("this should be a breadcrumb", event.breadcrumbs[0].message)
298283
})
299284
}
300285
}
@@ -309,10 +294,10 @@ class SentryAppenderTest {
309294
logger.error("this should be sent as the event")
310295

311296
await.untilAsserted {
312-
verify(fixture.transport).send(check { it: SentryEvent ->
313-
assertEquals(2, it.breadcrumbs.size)
314-
assertEquals("this should be a breadcrumb", it.breadcrumbs[0].message)
315-
assertEquals("this should not be sent as the event but be a breadcrumb", it.breadcrumbs[1].message)
297+
verify(fixture.transport).send(checkEvent { event ->
298+
assertEquals(2, event.breadcrumbs.size)
299+
assertEquals("this should be a breadcrumb", event.breadcrumbs[0].message)
300+
assertEquals("this should not be sent as the event but be a breadcrumb", event.breadcrumbs[1].message)
316301
})
317302
}
318303
}

sentry-logback/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ dependencies {
3030
compileOnly(Config.CompileOnly.jetbrainsAnnotations)
3131

3232
// tests
33+
testImplementation(project(":sentry-test-support"))
3334
testImplementation(kotlin(Config.kotlinStdLib))
3435
testImplementation(Config.TestLibs.kotlinTestJunit)
3536
testImplementation(Config.TestLibs.mockitoKotlin)

0 commit comments

Comments
 (0)