Skip to content

Commit

Permalink
begin populating new session payload
Browse files Browse the repository at this point in the history
  • Loading branch information
fractalwrench committed Mar 11, 2024
1 parent b943585 commit c555f57
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 12 deletions.
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")
}
}

0 comments on commit c555f57

Please sign in to comment.