diff --git a/test_runner/src/main/kotlin/ftl/adapter/AndroidOsVersionsFetch.kt b/test_runner/src/main/kotlin/ftl/adapter/AndroidOsVersionsFetch.kt new file mode 100644 index 0000000000..3e173c5fc1 --- /dev/null +++ b/test_runner/src/main/kotlin/ftl/adapter/AndroidOsVersionsFetch.kt @@ -0,0 +1,11 @@ +package ftl.adapter + +import ftl.adapter.google.toApiModel +import ftl.api.OsVersion +import ftl.client.google.androidOsVersions + +object AndroidOsVersionsFetch : + OsVersion.Android.Fetch, + (String) -> List by { + androidOsVersions(it).toApiModel() + } diff --git a/test_runner/src/main/kotlin/ftl/adapter/IosVersionsFetch.kt b/test_runner/src/main/kotlin/ftl/adapter/IosVersionsFetch.kt new file mode 100644 index 0000000000..69a298ccdb --- /dev/null +++ b/test_runner/src/main/kotlin/ftl/adapter/IosVersionsFetch.kt @@ -0,0 +1,11 @@ +package ftl.adapter + +import ftl.adapter.google.toApiModel +import ftl.api.OsVersion +import ftl.client.google.iosOsVersions + +object IosVersionsFetch : + OsVersion.Ios.Fetch, + (String) -> List by { + iosOsVersions(it).toApiModel() + } diff --git a/test_runner/src/main/kotlin/ftl/adapter/google/AndroidOsVersions.kt b/test_runner/src/main/kotlin/ftl/adapter/google/AndroidOsVersions.kt new file mode 100644 index 0000000000..a5dd51c6c7 --- /dev/null +++ b/test_runner/src/main/kotlin/ftl/adapter/google/AndroidOsVersions.kt @@ -0,0 +1,24 @@ +package ftl.adapter.google + +import com.google.testing.model.AndroidVersion +import com.google.testing.model.Date +import com.google.testing.model.Distribution +import ftl.api.OsVersion + +fun List.toApiModel() = map { + it.toApiModel() +} + +private fun AndroidVersion.toApiModel() = OsVersion.Android( + apiLevel, + codeName, + distribution?.toApiModel(), + id, + releaseDate?.toApiModel(), + tags, + versionString +) + +private fun Distribution.toApiModel() = OsVersion.Distribution(marketShare, measurementTime) + +private fun Date.toApiModel() = OsVersion.Date(day, month, year) diff --git a/test_runner/src/main/kotlin/ftl/adapter/google/IosOsVersions.kt b/test_runner/src/main/kotlin/ftl/adapter/google/IosOsVersions.kt new file mode 100644 index 0000000000..1c1cdd61de --- /dev/null +++ b/test_runner/src/main/kotlin/ftl/adapter/google/IosOsVersions.kt @@ -0,0 +1,10 @@ +package ftl.adapter.google + +import com.google.testing.model.IosVersion +import ftl.api.OsVersion + +fun List.toApiModel() = map { + it.toApiModel() +} + +private fun IosVersion.toApiModel() = OsVersion.Ios(id, majorVersion, minorVersion, supportedXcodeVersionIds, tags) diff --git a/test_runner/src/main/kotlin/ftl/api/OsVersion.kt b/test_runner/src/main/kotlin/ftl/api/OsVersion.kt new file mode 100644 index 0000000000..54c6169896 --- /dev/null +++ b/test_runner/src/main/kotlin/ftl/api/OsVersion.kt @@ -0,0 +1,39 @@ +package ftl.api + +import ftl.adapter.AndroidOsVersionsFetch +import ftl.adapter.IosVersionsFetch + +val fetchAndroidOsVersion: OsVersion.Android.Fetch get() = AndroidOsVersionsFetch +val fetchIosOsVersion: OsVersion.Ios.Fetch get() = IosVersionsFetch + +object OsVersion { + + data class Android( + val apiLevel: Int?, + val codeName: String?, + val distribution: Distribution?, + val id: String?, + val releaseDate: Date?, + val tags: List?, + val versionString: String?, + ) { + interface Fetch : (String) -> List + } + + data class Ios( + val id: String, + val majorVersion: Int, + val minorVersion: Int, + val supportedXcodeVersionIds: List, + val tags: List, + ) { + interface Fetch : (String) -> List + } + + data class Distribution( + val marketShare: Double, + val measurementTime: String, + ) + + data class Date(val day: Int?, val month: Int?, val year: Int?) +} diff --git a/test_runner/src/main/kotlin/ftl/client/google/AndroidCatalog.kt b/test_runner/src/main/kotlin/ftl/client/google/AndroidCatalog.kt index 7b2522d4a6..d4b84f82e2 100644 --- a/test_runner/src/main/kotlin/ftl/client/google/AndroidCatalog.kt +++ b/test_runner/src/main/kotlin/ftl/client/google/AndroidCatalog.kt @@ -5,10 +5,10 @@ import com.google.testing.model.AndroidDeviceCatalog import com.google.testing.model.AndroidModel import com.google.testing.model.Orientation import flank.common.logLn +import ftl.api.fetchAndroidOsVersion import ftl.environment.android.getDescription import ftl.environment.android.toCliTable import ftl.environment.asPrintableTable -import ftl.environment.common.toCliTable import ftl.environment.getLocaleDescription import ftl.gc.GcTesting import ftl.http.executeWithRetry @@ -32,9 +32,9 @@ object AndroidCatalog { fun getModels(projectId: String): List = deviceCatalog(projectId).models.orEmpty() - fun supportedVersionsAsTable(projectId: String) = getVersionsList(projectId).toCliTable() + fun supportedVersionsAsTable(projectId: String) = fetchAndroidOsVersion(projectId).toCliTable() - fun describeSoftwareVersion(projectId: String, versionId: String) = getVersionsList(projectId).getDescription(versionId) + fun describeSoftwareVersion(projectId: String, versionId: String) = fetchAndroidOsVersion(projectId).getDescription(versionId) private fun getVersionsList(projectId: String) = deviceCatalog(projectId).versions diff --git a/test_runner/src/main/kotlin/ftl/client/google/OsVersion.kt b/test_runner/src/main/kotlin/ftl/client/google/OsVersion.kt new file mode 100644 index 0000000000..943b979d6c --- /dev/null +++ b/test_runner/src/main/kotlin/ftl/client/google/OsVersion.kt @@ -0,0 +1,24 @@ +package ftl.client.google + +import com.google.testing.model.AndroidVersion +import com.google.testing.model.IosVersion +import ftl.gc.GcTesting +import ftl.http.executeWithRetry + +fun androidOsVersions(projectId: String): List = + GcTesting.get.testEnvironmentCatalog() + .get("android") + .setProjectId(projectId) + .executeWithRetry() + .androidDeviceCatalog + .versions + .orEmpty() + +fun iosOsVersions(projectId: String): List = + GcTesting.get.testEnvironmentCatalog() + .get("ios") + .setProjectId(projectId) + .executeWithRetry() + .iosDeviceCatalog + .versions + .orEmpty() diff --git a/test_runner/src/main/kotlin/ftl/domain/DescribeAndroidTestEnvironment.kt b/test_runner/src/main/kotlin/ftl/domain/DescribeAndroidTestEnvironment.kt index dbb325d99b..e26137120c 100644 --- a/test_runner/src/main/kotlin/ftl/domain/DescribeAndroidTestEnvironment.kt +++ b/test_runner/src/main/kotlin/ftl/domain/DescribeAndroidTestEnvironment.kt @@ -2,6 +2,7 @@ package ftl.domain import flank.common.logLn import ftl.api.Platform +import ftl.api.fetchAndroidOsVersion import ftl.api.fetchDeviceModelAndroid import ftl.api.fetchIpBlocks import ftl.api.fetchNetworkProfiles @@ -20,8 +21,9 @@ interface DescribeAndroidTestEnvironment { fun DescribeAndroidTestEnvironment.invoke() { val projectId = AndroidArgs.loadOrDefault(Paths.get(configPath)).project + // TODO move toCliTable() to presentation layer during refactor of presentation after #1728 + logLn(fetchAndroidOsVersion(projectId).toCliTable()) logLn(fetchDeviceModelAndroid(projectId).toCliTable()) // TODO move toCliTable() to presentation layer during refactor of presentation after #1728 - logLn(AndroidCatalog.supportedVersionsAsTable(projectId)) logLn(AndroidCatalog.localesAsTable(projectId)) logLn(fetchSoftwareCatalog().toCliTable()) logLn(fetchNetworkProfiles().toCliTable()) diff --git a/test_runner/src/main/kotlin/ftl/domain/ListAndroidVersions.kt b/test_runner/src/main/kotlin/ftl/domain/ListAndroidVersions.kt index 47f710431c..3f8ba0482d 100644 --- a/test_runner/src/main/kotlin/ftl/domain/ListAndroidVersions.kt +++ b/test_runner/src/main/kotlin/ftl/domain/ListAndroidVersions.kt @@ -1,8 +1,9 @@ package ftl.domain import flank.common.logLn +import ftl.api.fetchAndroidOsVersion import ftl.args.AndroidArgs -import ftl.client.google.AndroidCatalog +import ftl.environment.android.toCliTable import java.nio.file.Paths interface ListAndroidVersions { @@ -10,5 +11,6 @@ interface ListAndroidVersions { } operator fun ListAndroidVersions.invoke() { - logLn(AndroidCatalog.supportedVersionsAsTable(AndroidArgs.loadOrDefault(Paths.get(configPath)).project)) + // TODO move toCliTable() to presentation layer during refactor of presentation after #1728 + logLn(fetchAndroidOsVersion(AndroidArgs.loadOrDefault(Paths.get(configPath)).project).toCliTable()) } diff --git a/test_runner/src/main/kotlin/ftl/environment/android/AndroidSoftwareVersionDescription.kt b/test_runner/src/main/kotlin/ftl/environment/android/AndroidSoftwareVersionDescription.kt index 839e85d0c0..71a1790aa4 100644 --- a/test_runner/src/main/kotlin/ftl/environment/android/AndroidSoftwareVersionDescription.kt +++ b/test_runner/src/main/kotlin/ftl/environment/android/AndroidSoftwareVersionDescription.kt @@ -1,21 +1,22 @@ package ftl.environment.android -import com.google.testing.model.AndroidVersion +import ftl.api.OsVersion +import ftl.environment.orUnknown import ftl.run.exception.FlankGeneralError -fun List.getDescription(versionId: String) = findVersion(versionId)?.prepareDescription().orErrorMessage(versionId) +fun List.getDescription(versionId: String) = findVersion(versionId)?.prepareDescription().orErrorMessage(versionId) -private fun List.findVersion(versionId: String) = firstOrNull { it.id == versionId } +private fun List.findVersion(versionId: String) = firstOrNull { it.id == versionId } -private fun AndroidVersion.prepareDescription() = """ +private fun OsVersion.Android.prepareDescription() = """ apiLevel: $apiLevel codeName: $codeName id: '$id' releaseDate: - day: ${releaseDate.day} - month: ${releaseDate.month} - year: ${releaseDate.year} -""".trimIndent().addDataIfExists(tags).addVersion(versionString).trim() + day: ${releaseDate?.day} + month: ${releaseDate?.month} + year: ${releaseDate?.year} +""".trimIndent().addDataIfExists(tags).addVersion(versionString.orUnknown()).trim() private fun String.addVersion(versionString: String) = StringBuilder(this).appendLine("\nversionString: $versionString") .toString() diff --git a/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidSofwareVersions.kt b/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidSofwareVersions.kt index bef0896a9d..3baa33216a 100644 --- a/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidSofwareVersions.kt +++ b/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidSofwareVersions.kt @@ -1,7 +1,6 @@ package ftl.environment.android -import com.google.testing.model.AndroidVersion -import com.google.testing.model.Date +import ftl.api.OsVersion import ftl.environment.OS_VERSION_ID import ftl.environment.TAGS import ftl.environment.TestEnvironmentInfo @@ -13,9 +12,9 @@ import ftl.reports.api.twoDigitString import ftl.util.applyColorsUsing import ftl.util.buildTable -fun List.toCliTable() = createTestEnvironmentInfo().createAndroidSoftwareVersionsTable() +fun List.toCliTable() = createTestEnvironmentInfo().createAndroidSoftwareVersionsTable() -private fun List.createTestEnvironmentInfo() = +private fun List.createTestEnvironmentInfo() = fold(mutableMapOf>()) { softwareInfo, softwareVersion -> softwareInfo.apply { getOrCreateList(OS_VERSION_ID).add(softwareVersion.id.orUnknown()) @@ -27,7 +26,7 @@ private fun List.createTestEnvironmentInfo() = } } -private fun Date?.printableReleaseDate() = +private fun OsVersion.Date?.printableReleaseDate() = if (this == null || year == null || month == null || day == null) "UNKNOWN" else "$year-${month.twoDigitString()}-${day.twoDigitString()}" diff --git a/test_runner/src/test/kotlin/ftl/android/AndroidCatalogTest.kt b/test_runner/src/test/kotlin/ftl/android/AndroidCatalogTest.kt index fdc01ba119..08e47f5859 100644 --- a/test_runner/src/test/kotlin/ftl/android/AndroidCatalogTest.kt +++ b/test_runner/src/test/kotlin/ftl/android/AndroidCatalogTest.kt @@ -2,6 +2,7 @@ package ftl.android import com.google.common.truth.Truth.assertThat import com.google.testing.model.AndroidDevice +import ftl.api.fetchAndroidOsVersion import ftl.api.fetchDeviceModelAndroid import ftl.client.google.AndroidCatalog import ftl.environment.android.toCliTable @@ -89,7 +90,7 @@ class AndroidCatalogTest { val expectedSeparatorCount = expectedHeaders.size + 1 // when - val devicesTable = AndroidCatalog.supportedVersionsAsTable(projectId) + val devicesTable = fetchAndroidOsVersion(projectId).toCliTable() val headers = devicesTable.lines()[1] // then diff --git a/test_runner/src/test/kotlin/ftl/environment/android/AndroidSoftwareVersionDescriptionTest.kt b/test_runner/src/test/kotlin/ftl/environment/android/AndroidSoftwareVersionDescriptionTest.kt index 78aaa46e65..c88f68ffb7 100644 --- a/test_runner/src/test/kotlin/ftl/environment/android/AndroidSoftwareVersionDescriptionTest.kt +++ b/test_runner/src/test/kotlin/ftl/environment/android/AndroidSoftwareVersionDescriptionTest.kt @@ -1,7 +1,6 @@ package ftl.environment.android -import com.google.testing.model.AndroidVersion -import com.google.testing.model.Date +import ftl.api.OsVersion import ftl.test.util.TestHelper.getThrowable import org.junit.Assert import org.junit.Test @@ -10,18 +9,19 @@ class AndroidSoftwareVersionDescriptionTest { @Test fun `should return software version with tag if any tag exists`() { val versions = listOf( - AndroidVersion().apply { - id = "26" - apiLevel = 26 - codeName = "Oreo" - versionString = "8.0.x" - releaseDate = Date().apply { - day = 21 - month = 8 + OsVersion.Android( + id = "26", + apiLevel = 26, + codeName = "Oreo", + versionString = "8.0.x", + releaseDate = OsVersion.Date( + day = 21, + month = 8, year = 2017 - } - tags = listOf("default") - } + ), + tags = listOf("default"), + distribution = null + ) ) val localesDescription = versions.getDescription("26") @@ -43,17 +43,19 @@ class AndroidSoftwareVersionDescriptionTest { @Test fun `should return software version without tag if no tags`() { val versions = listOf( - AndroidVersion().apply { - id = "23" - apiLevel = 23 - codeName = "Marshmallow" - versionString = "6.0.x" - releaseDate = Date().apply { - day = 5 - month = 10 - year = 2015 - } - } + OsVersion.Android( + id = "23", + apiLevel = 23, + codeName = "Marshmallow", + versionString = "6.0.x", + releaseDate = OsVersion.Date( + day = 5, + month = 10, + year = 2015, + ), + distribution = null, + tags = null + ) ) val localesDescription = versions.getDescription("23") @@ -72,7 +74,7 @@ class AndroidSoftwareVersionDescriptionTest { @Test fun `should return error message if version not found`() { - val versions = listOf() + val versions = listOf() val versionName = "test" val localesDescription = getThrowable { versions.getDescription(versionName) } val expected = "ERROR: '$versionName' is not a valid OS version"