Skip to content

Commit ea995b9

Browse files
authored
Reduce the overridding surface area for integration test setup (#1989)
## Goal Simplify how you can use blocking executors for background and priority workers. This allows us to then not have to create new instances of `EmbFakeLogger` for integration tests, thus allowing us to just set the internal error exclusion when instantiating an instance of that for the integration test rule. In turn, this allows us to get rid of the poorly named/documented factory method for `FakeEmbLogger`.
2 parents 9044a8f + e39b3e6 commit ea995b9

File tree

17 files changed

+216
-208
lines changed

17 files changed

+216
-208
lines changed

embrace-android-core/src/test/java/io/embrace/android/embracesdk/internal/injection/DataSourceModuleImplTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal class DataSourceModuleImplTest {
1616
fakeInitModule,
1717
FakeWorkerThreadModule(
1818
fakeInitModule = fakeInitModule,
19-
testWorkerName = Worker.Background.NonIoRegWorker
19+
testWorker = Worker.Background.NonIoRegWorker
2020
),
2121
)
2222
assertSame(module.dataCaptureOrchestrator, module.embraceFeatureRegistry)

embrace-android-core/src/test/java/io/embrace/android/embracesdk/internal/session/SessionOrchestrationModuleImplTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ internal class SessionOrchestrationModuleImplTest {
2525
private val configService = FakeConfigService()
2626
private val workerThreadModule = FakeWorkerThreadModule(
2727
fakeInitModule = initModule,
28-
testWorkerName = Worker.Background.NonIoRegWorker
28+
testWorker = Worker.Background.NonIoRegWorker
2929
)
3030

3131
@Test

embrace-android-features/src/test/java/io/embrace/android/embracesdk/internal/crash/LastRunCrashVerifierTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ internal class LastRunCrashVerifierTest {
2525
mockCrashFileMarker = mockk()
2626
lastRunCrashVerifier = LastRunCrashVerifier(mockCrashFileMarker)
2727
fakeWorkerThreadModule =
28-
FakeWorkerThreadModule(fakeInitModule = FakeInitModule(), testWorkerName = Worker.Background.NonIoRegWorker)
28+
FakeWorkerThreadModule(fakeInitModule = FakeInitModule(), testWorker = Worker.Background.NonIoRegWorker)
2929
worker = fakeWorkerThreadModule.backgroundWorker(Worker.Background.NonIoRegWorker)
3030
}
3131

embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/FlutterInternalInterfaceTest.kt

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@ package io.embrace.android.embracesdk.testcases
22

33
import androidx.test.ext.junit.runners.AndroidJUnit4
44
import io.embrace.android.embracesdk.LogExceptionType
5-
import io.embrace.android.embracesdk.fakes.FakeClock
5+
import io.embrace.android.embracesdk.concurrency.BlockingScheduledExecutorService
66
import io.embrace.android.embracesdk.fakes.config.FakeInstrumentedConfig
77
import io.embrace.android.embracesdk.fakes.config.FakeProjectConfig
8-
import io.embrace.android.embracesdk.fakes.createForIntegrationTest
9-
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
10-
import io.embrace.android.embracesdk.fakes.injection.FakeWorkerThreadModule
118
import io.embrace.android.embracesdk.internal.EmbraceInternalApi
129
import io.embrace.android.embracesdk.internal.payload.AppFramework
1310
import io.embrace.android.embracesdk.internal.worker.Worker
@@ -35,19 +32,14 @@ internal class FlutterInternalInterfaceTest {
3532
appFramework = "flutter"
3633
))
3734

35+
private lateinit var executor: BlockingScheduledExecutorService
36+
3837
@Rule
3938
@JvmField
4039
val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule {
41-
val clock = FakeClock(SdkIntegrationTestRule.DEFAULT_SDK_START_TIME_MS)
42-
val fakeInitModule = FakeInitModule(clock = clock, logger = createForIntegrationTest())
43-
EmbraceSetupInterface(
44-
overriddenClock = clock,
45-
overriddenInitModule = fakeInitModule,
46-
overriddenWorkerThreadModule = FakeWorkerThreadModule(
47-
fakeInitModule = fakeInitModule,
48-
testWorkerName = Worker.Background.LogMessageWorker
49-
)
50-
)
40+
EmbraceSetupInterface(workerToFake = Worker.Background.LogMessageWorker).also {
41+
executor = it.getFakedWorkerExecutor()
42+
}
5143
}
5244

5345
@Test
@@ -249,9 +241,7 @@ internal class FlutterInternalInterfaceTest {
249241
}
250242

251243
private fun flushLogs() {
252-
val executor = (testRule.setup.overriddenWorkerThreadModule as FakeWorkerThreadModule).executor
253244
executor.runCurrentlyBlocked()
254-
val logOrchestrator = testRule.bootstrapper.logModule.logOrchestrator
255-
logOrchestrator.flush(false)
245+
testRule.bootstrapper.logModule.logOrchestrator.flush(false)
256246
}
257247
}

embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/AeiFeatureTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ internal class AeiFeatureTest {
6565

6666
@Rule
6767
@JvmField
68-
val testRule = SdkIntegrationTestRule()
68+
val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule()
6969

7070
private val jvmCrash = TestAeiData(
7171
ApplicationExitInfo.REASON_CRASH,

embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/AnrFeatureTest.kt

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@ package io.embrace.android.embracesdk.testcases.features
22

33
import androidx.test.ext.junit.runners.AndroidJUnit4
44
import io.embrace.android.embracesdk.concurrency.BlockingScheduledExecutorService
5-
import io.embrace.android.embracesdk.fakes.FakeClock
6-
import io.embrace.android.embracesdk.fakes.FakeConfigService
7-
import io.embrace.android.embracesdk.fakes.createForIntegrationTest
8-
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
9-
import io.embrace.android.embracesdk.fakes.injection.FakeWorkerThreadModule
105
import io.embrace.android.embracesdk.internal.anr.detection.BlockedThreadDetector
116
import io.embrace.android.embracesdk.internal.clock.nanosToMillis
12-
import io.embrace.android.embracesdk.internal.injection.createAnrModule
137
import io.embrace.android.embracesdk.internal.payload.Envelope
148
import io.embrace.android.embracesdk.internal.payload.SessionPayload
159
import io.embrace.android.embracesdk.internal.payload.Span
@@ -22,7 +16,6 @@ import org.junit.Assert.assertEquals
2216
import org.junit.Rule
2317
import org.junit.Test
2418
import org.junit.runner.RunWith
25-
import java.util.concurrent.atomic.AtomicReference
2619

2720
private const val START_TIME_MS = 10000000000L
2821
private const val INTERVAL_MS = 100L
@@ -40,27 +33,17 @@ internal class AnrFeatureTest {
4033
@Rule
4134
@JvmField
4235
val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule {
43-
val clock = FakeClock(currentTime = START_TIME_MS)
44-
val initModule = FakeInitModule(clock, createForIntegrationTest(throwOnInternalError = false))
45-
val workerThreadModule =
46-
FakeWorkerThreadModule(initModule, Worker.Background.AnrWatchdogWorker).apply {
47-
anrMonitorThread = AtomicReference(Thread.currentThread())
48-
}
49-
anrMonitorExecutor = workerThreadModule.executor.apply { blockingMode = false }
50-
val anrModule = createAnrModule(
51-
initModule,
52-
FakeConfigService(),
53-
workerThreadModule
54-
)
55-
blockedThreadDetector = anrModule.blockedThreadDetector
56-
5736
EmbraceSetupInterface(
5837
currentTimeMs = START_TIME_MS,
59-
overriddenClock = clock,
60-
overriddenInitModule = initModule,
61-
overriddenWorkerThreadModule = workerThreadModule,
62-
fakeAnrModule = anrModule
63-
)
38+
workerToFake = Worker.Background.AnrWatchdogWorker,
39+
anrMonitoringThread = Thread.currentThread()
40+
).also {
41+
with(it) {
42+
anrMonitorExecutor = getFakedWorkerExecutor()
43+
anrMonitorExecutor.blockingMode = false
44+
blockedThreadDetector = getBlockedThreadDetector()
45+
}
46+
}
6447
}
6548

6649
@Test
@@ -183,25 +166,29 @@ internal class AnrFeatureTest {
183166
assertEquals(endTime, span.endTimeNanos?.nanosToMillis())
184167

185168
// assert span attributes
186-
span.attributes?.assertMatches(mapOf(
187-
"emb.type" to "perf.thread_blockage",
188-
"interval_code" to expectedIntervalCode
189-
))
169+
span.attributes?.assertMatches(
170+
mapOf(
171+
"emb.type" to "perf.thread_blockage",
172+
"interval_code" to expectedIntervalCode
173+
)
174+
)
190175

191176
val events = checkNotNull(span.events)
192177

193178
events.forEachIndexed { index, event ->
194179
assertEquals("perf.thread_blockage_sample", event.name)
195180

196181
// assert attributes
197-
event.attributes?.assertMatches(mapOf(
198-
"emb.type" to "perf.thread_blockage_sample",
199-
"sample_overhead" to 0,
200-
"sample_code" to when {
201-
index < MAX_SAMPLE_COUNT -> "0"
202-
else -> "1"
203-
}
204-
))
182+
event.attributes?.assertMatches(
183+
mapOf(
184+
"emb.type" to "perf.thread_blockage_sample",
185+
"sample_overhead" to 0,
186+
"sample_code" to when {
187+
index < MAX_SAMPLE_COUNT -> "0"
188+
else -> "1"
189+
}
190+
)
191+
)
205192

206193
// assert interval time
207194
val expectedTime = startTime + ANR_THRESHOLD_MS + ((index + 1) * INTERVAL_MS)

embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/DisableSdkFeatureTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import android.content.Context
44
import androidx.test.core.app.ApplicationProvider
55
import androidx.test.ext.junit.runners.AndroidJUnit4
66
import io.embrace.android.embracesdk.assertions.returnIfConditionMet
7-
import io.embrace.android.embracesdk.fakes.createForIntegrationTest
7+
import io.embrace.android.embracesdk.fakes.FakeEmbLogger
88
import io.embrace.android.embracesdk.internal.delivery.storage.StorageLocation
99
import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule
1010
import org.junit.Assert.assertEquals
@@ -38,7 +38,7 @@ internal class DisableSdkFeatureTest {
3838
@Before
3939
fun setUp() {
4040
val ctx = ApplicationProvider.getApplicationContext<Context>()
41-
embraceDirs = StorageLocation.values().map { it.asFile(ctx, createForIntegrationTest()).value }
41+
embraceDirs = StorageLocation.values().map { it.asFile(ctx, FakeEmbLogger()).value }
4242
}
4343

4444
@Test

embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/LogFeatureTest.kt

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@ package io.embrace.android.embracesdk.testcases.features
33
import androidx.test.ext.junit.runners.AndroidJUnit4
44
import io.embrace.android.embracesdk.LogExceptionType
55
import io.embrace.android.embracesdk.Severity
6-
import io.embrace.android.embracesdk.fakes.FakeClock
6+
import io.embrace.android.embracesdk.concurrency.BlockingScheduledExecutorService
77
import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig
88
import io.embrace.android.embracesdk.fakes.config.FakeInstrumentedConfig
9-
import io.embrace.android.embracesdk.fakes.createForIntegrationTest
10-
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
11-
import io.embrace.android.embracesdk.fakes.injection.FakeWorkerThreadModule
129
import io.embrace.android.embracesdk.internal.payload.Envelope
1310
import io.embrace.android.embracesdk.internal.payload.LogPayload
1411
import io.embrace.android.embracesdk.internal.utils.getSafeStackTrace
@@ -26,20 +23,14 @@ import org.junit.runner.RunWith
2623
internal class LogFeatureTest {
2724

2825
private val instrumentedConfig = FakeInstrumentedConfig(enabledFeatures = FakeEnabledFeatureConfig(bgActivityCapture = true))
26+
private lateinit var executor: BlockingScheduledExecutorService
2927

3028
@Rule
3129
@JvmField
3230
val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule {
33-
val clock = FakeClock(SdkIntegrationTestRule.DEFAULT_SDK_START_TIME_MS)
34-
val fakeInitModule = FakeInitModule(clock = clock, logger = createForIntegrationTest())
35-
EmbraceSetupInterface(
36-
overriddenClock = clock,
37-
overriddenInitModule = fakeInitModule,
38-
overriddenWorkerThreadModule = FakeWorkerThreadModule(
39-
fakeInitModule = fakeInitModule,
40-
testWorkerName = Worker.Background.LogMessageWorker
41-
)
42-
)
31+
EmbraceSetupInterface(workerToFake = Worker.Background.LogMessageWorker).also {
32+
executor = it.getFakedWorkerExecutor()
33+
}
4334
}
4435

4536
@Test
@@ -394,11 +385,8 @@ internal class LogFeatureTest {
394385
}
395386

396387
private fun flushLogs() {
397-
val executor =
398-
(testRule.setup.overriddenWorkerThreadModule as FakeWorkerThreadModule).executor
399388
executor.runCurrentlyBlocked()
400-
val logOrchestrator = testRule.bootstrapper.logModule.logOrchestrator
401-
logOrchestrator.flush(false)
389+
testRule.bootstrapper.logModule.logOrchestrator.flush(false)
402390
}
403391

404392
private fun getEmbraceSeverity(severityNumber: Int): Severity {

embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/UiLoadTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ internal class UiLoadTest {
125125
),
126126
persistedRemoteConfig = RemoteConfig(uiLoadInstrumentationEnabled = true),
127127
setupAction = {
128-
preLaunchTimeMs = overriddenClock.now()
128+
preLaunchTimeMs = getClock().now()
129129
},
130130
testCaseAction = {
131131
simulateOpeningActivities(
@@ -179,7 +179,7 @@ internal class UiLoadTest {
179179
),
180180
persistedRemoteConfig = RemoteConfig(uiLoadInstrumentationEnabled = true),
181181
setupAction = {
182-
preLaunchTimeMs = overriddenClock.now()
182+
preLaunchTimeMs = getClock().now()
183183
},
184184
testCaseAction = {
185185
simulateOpeningActivities(
@@ -245,7 +245,7 @@ internal class UiLoadTest {
245245
),
246246
persistedRemoteConfig = RemoteConfig(uiLoadInstrumentationEnabled = true),
247247
setupAction = {
248-
preLaunchTimeMs = overriddenClock.now()
248+
preLaunchTimeMs = getClock().now()
249249
},
250250
testCaseAction = {
251251
simulateOpeningActivities(
@@ -300,7 +300,7 @@ internal class UiLoadTest {
300300
),
301301
persistedRemoteConfig = RemoteConfig(uiLoadInstrumentationEnabled = true),
302302
setupAction = {
303-
preLaunchTimeMs = overriddenClock.now()
303+
preLaunchTimeMs = getClock().now()
304304
},
305305
testCaseAction = {
306306
simulateOpeningActivities(
@@ -356,7 +356,7 @@ internal class UiLoadTest {
356356
),
357357
persistedRemoteConfig = RemoteConfig(uiLoadInstrumentationEnabled = true),
358358
setupAction = {
359-
preLaunchTimeMs = overriddenClock.now()
359+
preLaunchTimeMs = getClock().now()
360360
},
361361
testCaseAction = {
362362
simulateOpeningActivities(

0 commit comments

Comments
 (0)