Skip to content

Commit 876c5e3

Browse files
authored
Rn/pull dirs (#54)
* Changing type of directoriesToPull to list * adding option to pull screenshots * account for devicesetup being null * update * formatting * addressing review comments
1 parent 310c767 commit 876c5e3

File tree

7 files changed

+105
-13
lines changed

7 files changed

+105
-13
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ internal class FirebaseTestLabController(
107107
clientInfo: ClientInfo? = null,
108108
sharding: ShardingOption?,
109109
deviceSetup: DeviceSetup?,
110-
devicePicker: DevicePicker? = null
110+
devicePicker: DevicePicker? = null,
111+
pullScreenshots: Boolean = false
111112
): List<TestMatrix> {
112113
val devices = (devicePicker ?: defaultDevicePicker).pickDevices()
113114
logger.info {
@@ -121,7 +122,8 @@ internal class FirebaseTestLabController(
121122
environmentMatrix = listOf(it).createEnvironmentMatrix(),
122123
clientInfo = clientInfo,
123124
sharding = sharding,
124-
deviceSetup = deviceSetup
125+
deviceSetup = deviceSetup,
126+
pullScreenshots = pullScreenshots
125127
)
126128
}
127129
}

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import dev.androidx.ci.generated.ftl.GoogleCloudStorage
2828
import dev.androidx.ci.generated.ftl.ResultStorage
2929
import dev.androidx.ci.generated.ftl.ShardingOption
3030
import dev.androidx.ci.generated.ftl.TestMatrix
31+
import dev.androidx.ci.generated.ftl.TestSetup
3132
import dev.androidx.ci.generated.ftl.TestSpecification
3233
import dev.androidx.ci.generated.ftl.ToolResultsHistory
3334
import dev.androidx.ci.testRunner.dto.TestRun
@@ -66,6 +67,7 @@ internal class TestMatrixStore(
6667
clientInfo: ClientInfo?,
6768
sharding: ShardingOption?,
6869
deviceSetup: DeviceSetup?,
70+
pullScreenshots: Boolean = false
6971
): TestMatrix {
7072

7173
val testRunId = TestRun.createId(
@@ -99,6 +101,7 @@ internal class TestMatrixStore(
99101
deviceSetup = deviceSetup,
100102
appApk = appApk,
101103
testApk = testApk,
104+
pullScreenshots = pullScreenshots
102105
)
103106
)
104107
logger.info {
@@ -160,7 +163,8 @@ internal class TestMatrixStore(
160163
sharding: ShardingOption?,
161164
deviceSetup: DeviceSetup?,
162165
appApk: UploadedApk,
163-
testApk: UploadedApk
166+
testApk: UploadedApk,
167+
pullScreenshots: Boolean = false
164168
): TestMatrix {
165169
val packageName = firebaseTestLabApi.getApkDetails(
166170
FileReference(
@@ -170,6 +174,23 @@ internal class TestMatrixStore(
170174
val historyId = toolsResultStore.getHistoryId(
171175
packageName
172176
)
177+
// Directory on the device that is used to store the output files as defined here:
178+
// https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:test/screenshot/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.kt;l=90
179+
val screenshotsDirectory = "/sdcard/Android/data/$packageName/cache/androidx_screenshots"
180+
val testSetup = if (deviceSetup != null) {
181+
if (pullScreenshots) {
182+
deviceSetup
183+
.directoriesToPull
184+
.add(screenshotsDirectory)
185+
}
186+
deviceSetup.toTestSetup()
187+
} else {
188+
TestSetup(
189+
directoriesToPull = if (pullScreenshots)
190+
listOf(screenshotsDirectory)
191+
else null
192+
)
193+
}
173194
return TestMatrix(
174195
projectId = firebaseProjectId,
175196
flakyTestAttempts = 2,
@@ -186,7 +207,7 @@ internal class TestMatrixStore(
186207
),
187208
shardingOption = sharding
188209
),
189-
testSetup = deviceSetup?.toTestSetup(),
210+
testSetup = testSetup
190211
),
191212
clientInfo = clientInfo,
192213
environmentMatrix = environmentMatrix,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ interface TestRunnerService {
7777
clientInfo: ClientInfo?,
7878
sharding: ShardingOption?,
7979
deviceSetup: DeviceSetup?,
80-
devicePicker: (TestEnvironmentCatalog) -> List<AndroidDevice>
80+
devicePicker: (TestEnvironmentCatalog) -> List<AndroidDevice>,
81+
pullScreenshots: Boolean = false
8182
): ScheduleTestsResponse
8283

8384
/**

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,17 @@ internal class TestRunnerServiceImpl internal constructor(
9797
clientInfo: ClientInfo?,
9898
sharding: ShardingOption?,
9999
deviceSetup: DeviceSetup?,
100-
devicePicker: (TestEnvironmentCatalog) -> List<AndroidDevice>
100+
devicePicker: (TestEnvironmentCatalog) -> List<AndroidDevice>,
101+
pullScreenshots: Boolean
101102
): TestRunnerService.ScheduleTestsResponse {
102103
val testMatrices = testLabController.submitTests(
103104
appApk = appApk ?: apkStore.getPlaceholderApk(),
104105
testApk = testApk,
105106
clientInfo = clientInfo,
106107
sharding = sharding,
107108
deviceSetup = deviceSetup,
108-
devicePicker = devicePicker
109+
devicePicker = devicePicker,
110+
pullScreenshots = pullScreenshots
109111
)
110112
return TestRunnerService.ScheduleTestsResponse.create(
111113
testMatrices

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ data class DeviceSetup(
2121
* to external storage, the system will replace it with the external storage path prefix for that
2222
* device.
2323
*/
24-
val directoriesToPull: Set<String>? = null,
24+
var directoriesToPull: MutableList<String> = mutableListOf(),
2525
/**
2626
* List of instrumentation arguments to be passed into the runner.
2727
*/
@@ -36,7 +36,7 @@ data class DeviceSetup(
3636
)
3737
)
3838
},
39-
directoriesToPull = directoriesToPull?.toList(),
39+
directoriesToPull = directoriesToPull,
4040
environmentVariables = instrumentationArguments?.map {
4141
it.toEnvironmentVariable()
4242
}

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

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ internal class TestMatrixStoreTest {
9090
)
9191
val deviceSetup = DeviceSetup(
9292
additionalApks = listOf(extraApk),
93-
directoriesToPull = setOf("/sdcard/foo/bar"),
93+
directoriesToPull = mutableListOf("/sdcard/foo/bar"),
9494
instrumentationArguments = listOf(
9595
DeviceSetup.InstrumentationArgument(
9696
key = "foo",
@@ -220,6 +220,63 @@ internal class TestMatrixStoreTest {
220220
assertThat(reUploadedAfterDeletion.testMatrixId).isNotEqualTo(testMatrix.testMatrixId)
221221
}
222222

223+
@Test
224+
fun pullScreenshots() = runBlocking<Unit> {
225+
val appApk = createFakeApk("app.pak")
226+
val testApk = createFakeApk("test.apk")
227+
val testPackageName = firebaseTestLabApi.getApkDetails(
228+
FileReference(testApk.gcsPath.path)
229+
).apkDetail?.apkManifest?.packageName
230+
val deviceSetup = DeviceSetup(
231+
directoriesToPull = mutableListOf("/sdcard/foo1/bar1")
232+
)
233+
store.getOrCreateTestMatrix(
234+
appApk = appApk,
235+
testApk = testApk,
236+
environmentMatrix = envMatrix1,
237+
clientInfo = null,
238+
deviceSetup = deviceSetup,
239+
sharding = null,
240+
pullScreenshots = true
241+
)
242+
243+
assertThat(firebaseTestLabApi.getTestMatrices()).hasSize(1)
244+
val matrix = firebaseTestLabApi.getTestMatrices().first()
245+
matrix.testSpecification.let {
246+
assertThat(
247+
it.testSetup?.directoriesToPull
248+
).containsAtLeastElementsIn(deviceSetup.directoriesToPull)
249+
assertThat(
250+
it.testSetup?.directoriesToPull
251+
).contains("/sdcard/Android/data/$testPackageName/cache/androidx_screenshots")
252+
}
253+
}
254+
255+
@Test
256+
fun pullScreenshotsWithoutDeviceSetup() = runBlocking<Unit> {
257+
val appApk = createFakeApk("app.pak")
258+
val testApk = createFakeApk("test.apk")
259+
val testPackageName = firebaseTestLabApi.getApkDetails(
260+
FileReference(testApk.gcsPath.path)
261+
).apkDetail?.apkManifest?.packageName
262+
store.getOrCreateTestMatrix(
263+
appApk = appApk,
264+
testApk = testApk,
265+
environmentMatrix = envMatrix1,
266+
clientInfo = null,
267+
deviceSetup = null,
268+
sharding = null,
269+
pullScreenshots = true
270+
)
271+
272+
assertThat(firebaseTestLabApi.getTestMatrices()).hasSize(1)
273+
val matrix = firebaseTestLabApi.getTestMatrices().first()
274+
matrix.testSpecification.let {
275+
assertThat(
276+
it.testSetup?.directoriesToPull
277+
).containsExactly("/sdcard/Android/data/$testPackageName/cache/androidx_screenshots")
278+
}
279+
}
223280
private fun createFakeApk(name: String) = UploadedApk(
224281
gcsPath = GcsPath("gs://foo/bar/$name"),
225282
apkInfo = ApkInfo(

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ class TestRunnerServiceImplTest {
111111
) {
112112
apk1Bytes
113113
}
114+
val testPackageName = fakeBackend.fakeFirebaseTestLabApi.getApkDetails(
115+
dev.androidx.ci.generated.ftl.FileReference(upload1.gcsPath.path)
116+
).apkDetail?.apkManifest?.packageName
114117
val result = subject.scheduleTests(
115118
testApk = upload1,
116119
appApk = null,
@@ -213,13 +216,14 @@ class TestRunnerServiceImplTest {
213216
sharding = null,
214217
deviceSetup = DeviceSetup(
215218
additionalApks = listOf(extraApk),
216-
directoriesToPull = setOf("/sdcard/foo/bar"),
219+
directoriesToPull = mutableListOf("/sdcard/foo/bar"),
217220
instrumentationArguments = listOf(
218221
DeviceSetup.InstrumentationArgument("key1", "value1"),
219222
DeviceSetup.InstrumentationArgument("key2", "value2")
220223
)
221224
),
222-
devicePicker = devicePicker
225+
devicePicker = devicePicker,
226+
pullScreenshots = true
223227
)
224228
withDeviceInfo.testMatrices.single().testSpecification.testSetup!!.let { testSetup ->
225229
assertThat(
@@ -230,9 +234,14 @@ class TestRunnerServiceImplTest {
230234
)
231235
assertThat(
232236
testSetup.directoriesToPull
233-
).containsExactly(
237+
).contains(
234238
"/sdcard/foo/bar"
235239
)
240+
assertThat(
241+
testSetup.directoriesToPull
242+
).contains(
243+
"/sdcard/Android/data/$testPackageName/cache/androidx_screenshots"
244+
)
236245
assertThat(
237246
testSetup.additionalApks?.map {
238247
it.location?.gcsPath

0 commit comments

Comments
 (0)