Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Begin populating new session payload #530

Merged
merged 1 commit into from
Mar 11, 2024
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
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package io.embrace.android.embracesdk.capture.envelope

import io.embrace.android.embracesdk.internal.payload.Envelope
import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType

internal fun interface EnvelopeSource<T> {
fun getEnvelope(): Envelope<T>
fun getEnvelope(endType: SessionSnapshotType): Envelope<T>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ package io.embrace.android.embracesdk.capture.envelope
import io.embrace.android.embracesdk.capture.envelope.session.SessionPayloadSource
import io.embrace.android.embracesdk.internal.payload.Envelope
import io.embrace.android.embracesdk.internal.payload.SessionPayload
import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType

internal class SessionEnvelopeSource(
private val sessionPayloadSource: SessionPayloadSource
) : EnvelopeSource<SessionPayload> {

override fun getEnvelope(): Envelope<SessionPayload> {
sessionPayloadSource.getSessionPayload()
override fun getEnvelope(endType: SessionSnapshotType): Envelope<SessionPayload> {
sessionPayloadSource.getSessionPayload(endType)
throw NotImplementedError("Not yet implemented")
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package io.embrace.android.embracesdk.capture.envelope.session

import io.embrace.android.embracesdk.internal.payload.SessionPayload
import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType

/**
* Creates a [SessionPayload] object.
*/
internal fun interface SessionPayloadSource {
fun getSessionPayload(): SessionPayload
fun getSessionPayload(endType: SessionSnapshotType): SessionPayload
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
package io.embrace.android.embracesdk.capture.envelope.session

import io.embrace.android.embracesdk.anr.ndk.NativeThreadSamplerService
import io.embrace.android.embracesdk.internal.payload.SessionPayload
import io.embrace.android.embracesdk.logging.InternalErrorService
import io.embrace.android.embracesdk.session.captureDataSafely
import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType

internal class SessionPayloadSourceImpl : SessionPayloadSource {
internal class SessionPayloadSourceImpl(
private val internalErrorService: InternalErrorService,
private val nativeThreadSamplerService: NativeThreadSamplerService?,
) : SessionPayloadSource {

override fun getSessionPayload(): SessionPayload {
throw NotImplementedError("Not yet implemented")
}
override fun getSessionPayload(endType: SessionSnapshotType) = SessionPayload(
spans = null,
spanSnapshots = null,
internalError = captureDataSafely { internalErrorService.currentExceptionError?.toNewPayload() },
sharedLibSymbolMapping = captureDataSafely { nativeThreadSamplerService?.getNativeSymbols() }
)
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
package io.embrace.android.embracesdk.capture.envelope

import io.embrace.android.embracesdk.capture.envelope.session.SessionPayloadSourceImpl
import io.embrace.android.embracesdk.fakes.FakeInternalErrorService
import io.embrace.android.embracesdk.fakes.FakeNativeThreadSamplerService
import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType
import org.junit.Test

internal class SessionEnvelopeSourceTest {

@Test(expected = NotImplementedError::class)
fun getEnvelope() {
SessionEnvelopeSource(SessionPayloadSourceImpl()).getEnvelope()
SessionEnvelopeSource(
SessionPayloadSourceImpl(
FakeInternalErrorService(),
FakeNativeThreadSamplerService()
)
).getEnvelope(SessionSnapshotType.NORMAL_END)
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,53 @@
package io.embrace.android.embracesdk.capture.envelope.session

import io.embrace.android.embracesdk.fakes.FakeClock
import io.embrace.android.embracesdk.fakes.FakeInternalErrorService
import io.embrace.android.embracesdk.fakes.FakeNativeThreadSamplerService
import io.embrace.android.embracesdk.internal.payload.SessionPayload
import io.embrace.android.embracesdk.payload.LegacyExceptionError
import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test

internal class SessionPayloadSourceImplTest {

@Test(expected = NotImplementedError::class)
fun getSessionPayload() {
SessionPayloadSourceImpl().getSessionPayload()
private lateinit var impl: SessionPayloadSourceImpl

@Before
fun setUp() {
val errorService = FakeInternalErrorService().apply {
currentExceptionError = LegacyExceptionError().apply {
addException(RuntimeException(), "test", FakeClock())
}
}
impl = SessionPayloadSourceImpl(
errorService,
FakeNativeThreadSamplerService()
)
}

@Test
fun `session crash`() {
val payload = impl.getSessionPayload(SessionSnapshotType.JVM_CRASH)
assertPayloadPopulated(payload)
}

@Test
fun `session cache`() {
val payload = impl.getSessionPayload(SessionSnapshotType.PERIODIC_CACHE)
assertPayloadPopulated(payload)
}

@Test
fun `session lifecycle change`() {
val payload = impl.getSessionPayload(SessionSnapshotType.NORMAL_END)
assertPayloadPopulated(payload)
}

private fun assertPayloadPopulated(payload: SessionPayload) {
val err = checkNotNull(payload.internalError)
assertEquals(1, err.count)
assertEquals(mapOf("armeabi-v7a" to "my-symbols"), payload.sharedLibSymbolMapping)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.embrace.android.embracesdk.fakes

import io.embrace.android.embracesdk.anr.ndk.NativeThreadSamplerService
import io.embrace.android.embracesdk.payload.NativeThreadAnrInterval

internal class FakeNativeThreadSamplerService : NativeThreadSamplerService {

var symbols: Map<String, String>? = mapOf("armeabi-v7a" to "my-symbols")

override fun onThreadBlocked(thread: Thread, timestamp: Long) {
TODO("Not yet implemented")
}

override fun onThreadBlockedInterval(thread: Thread, timestamp: Long) {
TODO("Not yet implemented")
}

override fun onThreadUnblocked(thread: Thread, timestamp: Long) {
TODO("Not yet implemented")
}

override fun setupNativeSampler(): Boolean {
TODO("Not yet implemented")
}

override fun monitorCurrentThread(): Boolean {
TODO("Not yet implemented")
}

override fun getNativeSymbols(): Map<String, String>? = symbols

override fun getCapturedIntervals(receivedTermination: Boolean?): List<NativeThreadAnrInterval>? {
TODO("Not yet implemented")
}

override fun cleanCollections() {
TODO("Not yet implemented")
}
}