Skip to content

Commit 5944acd

Browse files
authored
Fixing null check (#59)
* Fixing null check * linting * Updating method names to call artifacts instead of screenshots * addressing feedback
1 parent c8f188f commit 5944acd

File tree

3 files changed

+63
-22
lines changed

3 files changed

+63
-22
lines changed

AndroidXCI/lib/src/main/kotlin/dev/androidx/ci/testRunner/TestRunnerService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ interface TestRunnerService {
9898
* Returns null when the testMatrix is not complete,
9999
* and emptyMap if there are no screenshots associated with the test (non-screenshot tests)
100100
*/
101-
suspend fun getTestMatrixResultsScreenshots(
101+
suspend fun getTestMatrixArtifacts(
102102
testMatrix: TestMatrix,
103103
testIdentifiers: List<TestIdentifier>
104104
): Map<TestIdentifier, List<TestCaseArtifact>>?

AndroidXCI/lib/src/main/kotlin/dev/androidx/ci/testRunner/TestRunnerServiceImpl.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,12 @@ internal class TestRunnerServiceImpl internal constructor(
207207
}
208208
}
209209

210-
private suspend fun findScreenshotFiles(
210+
private suspend fun findArtifacts(
211211
resultPath: GcsPath,
212212
testIdentifiers: List<TestRunnerService.TestIdentifier>
213-
): Map< TestRunnerService.TestIdentifier, List<TestRunnerService.TestCaseArtifact>> {
214-
val screenshotArtifactsBlobs = mutableMapOf<TestRunnerService.TestIdentifier, MutableList<TestRunnerService.TestCaseArtifact>>()
215-
val screenshotArtifacts: Map<TestRunnerService.TestIdentifier, List<TestRunnerService.TestCaseArtifact>>
213+
): Map< TestRunnerService.TestIdentifier, List<TestRunnerService.TestCaseArtifact>>? {
214+
if (testIdentifiers.isEmpty()) return null
215+
val testArtifactsBlobs = mutableMapOf<TestRunnerService.TestIdentifier, MutableList<TestRunnerService.TestCaseArtifact>>()
216216
val testNames = testIdentifiers.associateBy { testIdentifier ->
217217
"${testIdentifier.className}_${testIdentifier.name}"
218218
}
@@ -227,8 +227,11 @@ internal class TestRunnerServiceImpl internal constructor(
227227
visitor.fileName.startsWith(testName)
228228
}
229229
val testIdentifier = testNames[testName]
230+
println("filename = ${visitor.fileName}")
231+
println("testName = $testName")
232+
println("testIdentifier = $testIdentifier")
230233
if (testIdentifier != null) {
231-
screenshotArtifactsBlobs.getOrPut(testIdentifier) {
234+
testArtifactsBlobs.getOrPut(testIdentifier) {
232235
mutableListOf()
233236
}.add(
234237
TestRunnerService.TestCaseArtifact(
@@ -239,8 +242,7 @@ internal class TestRunnerServiceImpl internal constructor(
239242
}
240243
}
241244
}
242-
screenshotArtifacts = screenshotArtifactsBlobs
243-
return screenshotArtifacts
245+
return testArtifactsBlobs
244246
}
245247

246248
suspend fun getTestMatrixResults(
@@ -250,12 +252,12 @@ internal class TestRunnerServiceImpl internal constructor(
250252
return getTestMatrixResults(testMatrix)
251253
}
252254

253-
suspend fun getTestMatrixResultsScreenshots(
255+
suspend fun getTestMatrixArtifacts(
254256
testMatrixId: String,
255257
testIdentifiers: List<TestRunnerService.TestIdentifier>
256258
): Map<TestRunnerService.TestIdentifier, List<TestRunnerService.TestCaseArtifact>>? {
257259
val testMatrix = testLabController.getTestMatrix(testMatrixId) ?: return null
258-
return getTestMatrixResultsScreenshots(testMatrix, testIdentifiers)
260+
return getTestMatrixArtifacts(testMatrix, testIdentifiers)
259261
}
260262

261263
override suspend fun getTestMatrixResults(
@@ -266,13 +268,13 @@ internal class TestRunnerServiceImpl internal constructor(
266268
return findResultFiles(resultPath, testMatrix)
267269
}
268270

269-
override suspend fun getTestMatrixResultsScreenshots(
271+
override suspend fun getTestMatrixArtifacts(
270272
testMatrix: TestMatrix,
271273
testIdentifiers: List<TestRunnerService.TestIdentifier>
272274
): Map<TestRunnerService.TestIdentifier, List<TestRunnerService.TestCaseArtifact>>? {
273275
if (!testMatrix.isComplete()) return null
274276
val resultPath = GcsPath(testMatrix.resultStorage.googleCloudStorage.gcsPath)
275-
return findScreenshotFiles(resultPath, testIdentifiers)
277+
return findArtifacts(resultPath, testIdentifiers)
276278
}
277279

278280
companion object {

AndroidXCI/lib/src/test/kotlin/dev/androidx/ci/testRunner/TestRunnerServiceImplTest.kt

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,11 @@ class TestRunnerServiceImplTest {
332332
"$resultRelativePath/redfin-30-en-portrait/artifacts/sdcard/Android/data/test/cache/androidx_screenshots/class1_name1_emulator_goldResult.textproto",
333333
"class1 name1 emulator textproto".toByteArray(Charsets.UTF_8)
334334
)
335+
// No test is associated with this artifact. findArtifacts should not throw errors, even when unexpected files are encountered
336+
fakeBackend.fakeGoogleCloudApi.upload(
337+
"$resultRelativePath/redfin-30-en-portrait/artifacts/sdcard/Android/data/test/cache/androidx_screenshots/class5_name5_emulator_goldResult.textproto",
338+
"class5 name5 emulator textproto".toByteArray(Charsets.UTF_8)
339+
)
335340

336341
fakeToolsResultApi.addStep(
337342
projectId = fakeBackend.firebaseProjectId,
@@ -380,14 +385,14 @@ class TestRunnerServiceImplTest {
380385

381386
assertThat(result.testRuns).hasSize(1)
382387
result.testRuns.first().let { testRun ->
383-
val testIdentifier = TestRunnerService.TestIdentifier(
388+
val testIdentifier1 = TestRunnerService.TestIdentifier(
384389
className = "class1",
385390
name = "name1",
386391
runNumber = testRun.deviceRun.runNumber
387392
)
388-
val screenshots = subject.getTestMatrixResultsScreenshots(
393+
val screenshots1 = subject.getTestMatrixArtifacts(
389394
testMatrixId,
390-
listOf(testIdentifier)
395+
listOf(testIdentifier1)
391396
)
392397
assertThat(
393398
testRun.deviceRun.deviceId
@@ -415,15 +420,15 @@ class TestRunnerServiceImplTest {
415420
)
416421
assertThat(
417422
testRun.testCaseArtifacts[
418-
testIdentifier
423+
testIdentifier1
419424
]?.size
420425
).isEqualTo(
421426
1
422427
)
423428
// step and logcat both have valid values for test1
424429
assertThat(
425430
testRun.testCaseArtifacts[
426-
testIdentifier
431+
testIdentifier1
427432
]?.first {
428433
it.resourceType == TestRunnerService.TestCaseArtifact.ResourceType.LOGCAT
429434
}?.resultFileResource?.gcsPath.toString()
@@ -432,29 +437,29 @@ class TestRunnerServiceImplTest {
432437
)
433438
assertThat(
434439
testRun.testCaseArtifacts[
435-
testIdentifier
440+
testIdentifier1
436441
]?.first {
437442
it.resourceType == TestRunnerService.TestCaseArtifact.ResourceType.LOGCAT
438443
}?.resultFileResource?.readFully()?.toString(Charsets.UTF_8)
439444
).isEqualTo(
440445
"test1 logcat"
441446
)
442447
assertThat(
443-
screenshots?.get(testIdentifier)?.count {
448+
screenshots1?.get(testIdentifier1)?.count {
444449
it.resourceType == TestRunnerService.TestCaseArtifact.ResourceType.PNG
445450
}
446451
).isEqualTo(
447452
3
448453
)
449454
assertThat(
450-
screenshots?.get(testIdentifier)?.count {
455+
screenshots1?.get(testIdentifier1)?.count {
451456
it.resourceType == TestRunnerService.TestCaseArtifact.ResourceType.TEXTPROTO
452457
}
453458
).isEqualTo(
454459
1
455460
)
456461
assertThat(
457-
screenshots?.get(testIdentifier)?.first {
462+
screenshots1?.get(testIdentifier1)?.first {
458463
it.resourceType == TestRunnerService.TestCaseArtifact.ResourceType.TEXTPROTO
459464
}?.resultFileResource?.gcsPath.toString()
460465
).isEqualTo(
@@ -471,6 +476,19 @@ class TestRunnerServiceImplTest {
471476
)
472477
]
473478
).isNull()
479+
// No screenshots for test2
480+
val testIdentifier2 = TestRunnerService.TestIdentifier(
481+
className = "class2",
482+
name = "name2",
483+
runNumber = testRun.deviceRun.runNumber
484+
)
485+
val screenshots2 = subject.getTestMatrixArtifacts(
486+
testMatrixId,
487+
listOf(testIdentifier2)
488+
)
489+
assertThat(
490+
screenshots2
491+
).isEmpty()
474492
// logcat for test3 is missing from gcloud folder
475493
assertThat(
476494
testRun.testCaseArtifacts[
@@ -481,7 +499,28 @@ class TestRunnerServiceImplTest {
481499
)
482500
]
483501
).isNull()
502+
// No screenshots for test3 either
503+
val testIdentifier3 = TestRunnerService.TestIdentifier(
504+
className = "class2",
505+
name = "name2",
506+
runNumber = testRun.deviceRun.runNumber
507+
)
508+
val screenshots3 = subject.getTestMatrixArtifacts(
509+
testMatrixId,
510+
listOf(testIdentifier3)
511+
)
512+
assertThat(
513+
screenshots3
514+
).isEmpty()
484515
}
516+
// check screenshots is null when list of testIdentifiers is empty
517+
val screenshots = subject.getTestMatrixArtifacts(
518+
testMatrixId,
519+
emptyList()
520+
)
521+
assertThat(
522+
screenshots
523+
).isNull()
485524
}
486525

487526
@Test
@@ -773,7 +812,7 @@ class TestRunnerServiceImplTest {
773812
"name1",
774813
0
775814
)
776-
val screenshots = subject.getTestMatrixResultsScreenshots(
815+
val screenshots = subject.getTestMatrixArtifacts(
777816
testMatrixId,
778817
listOf(testIdentifier)
779818
)

0 commit comments

Comments
 (0)