avito-android
217 строк · 6.9 Кб
1import com.avito.instrumentation.configuration.InstrumentationConfiguration
2import com.avito.instrumentation.configuration.InstrumentationFilter.FromRunHistory
3import com.avito.instrumentation.configuration.KubernetesViaCredentials
4import com.avito.instrumentation.configuration.report.ReportConfig
5import com.avito.instrumentation.reservation.request.Device
6import com.avito.kotlin.dsl.getMandatoryStringProperty
7import com.avito.kotlin.dsl.getOptionalStringProperty
8import java.time.Duration
9
10plugins {
11id("convention.kotlin-android-app")
12id("com.avito.android.instrumentation-tests")
13}
14
15android {
16
17namespace = "com.avito.android.ui"
18
19defaultConfig {
20versionName = "1.0"
21versionCode = 1
22testInstrumentationRunner = "com.avito.android.test.app.core.TestAppRunner"
23
24val instrumentationArgs = mapOf(
25"videoRecording" to "failed",
26)
27
28// These arguments are updated in IDE configuration only after sync!
29testInstrumentationRunnerArguments.putAll(instrumentationArgs)
30}
31
32testOptions {
33execution = "ANDROIDX_TEST_ORCHESTRATOR"
34}
35
36packagingOptions {
37resources.pickFirsts.add("META-INF/okhttp.kotlin_module")
38}
39}
40
41dependencies {
42implementation(libs.androidXtracing) {
43because("androidx libs bring 1.0.0 instead of 1.1.0")
44because("https://github.com/android/android-test/issues/1755")
45}
46implementation(libs.appcompat)
47implementation(libs.material)
48implementation(libs.playServicesBase)
49implementation(libs.recyclerView)
50implementation(libs.swipeRefreshLayout)
51
52implementation(project(":subprojects:android-lib:proxy-toast"))
53
54androidTestImplementation(project(":subprojects:test-runner:test-inhouse-runner"))
55androidTestImplementation(project(":subprojects:test-runner:test-report-android"))
56androidTestImplementation(project(":subprojects:test-runner:test-annotations"))
57androidTestImplementation(project(":subprojects:test-runner:report-viewer"))
58androidTestImplementation(project(":subprojects:android-test:ui-testing-core"))
59androidTestImplementation(project(":subprojects:android-test:toast-rule"))
60androidTestImplementation(project(":subprojects:common:truth-extensions"))
61
62androidTestUtil(libs.testOrchestrator)
63}
64
65val avitoRegistry = getOptionalStringProperty("avito.registry")
66
67instrumentation {
68val reportKey = "avito.report.sender"
69val reportConfig = when (getOptionalStringProperty(reportKey, "noop")) {
70"noop" -> ReportConfig.NoOp
71"runner" -> ReportConfig.ReportViewer.SendFromRunner(
72reportApiUrl = getMandatoryStringProperty("avito.report.url"),
73reportViewerUrl = getMandatoryStringProperty("avito.report.viewerUrl"),
74fileStorageUrl = getMandatoryStringProperty("avito.fileStorage.url"),
75planSlug = "UiTestingCoreApp",
76jobSlug = "FunctionalTests"
77)
78
79else -> throw IllegalArgumentException("Invalid value for $reportKey property")
80}
81
82report.set(reportConfig)
83
84logcatTags = setOf(
85"UITestRunner:*",
86"ActivityManager:*",
87"ReportTestListener:*",
88"StorageJsonTransport:*",
89"TestReport:*",
90"VideoCaptureListener:*",
91"TestRunner:*",
92"SystemDialogsManager:*",
93"AndroidJUnitRunner:*",
94"ito.android.de:*", // по этому тэгу система пишет логи об использовании hidden/restricted api https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
95"*:E"
96)
97
98filters {
99register("ci") {
100fromSource.excludeFlaky = true
101fromRunHistory.excludePreviousStatuses(
102setOf(
103FromRunHistory.RunStatus.Success,
104FromRunHistory.RunStatus.Manual
105)
106)
107}
108
109register("local") {
110fromSource
111}
112}
113
114environments {
115register<KubernetesViaCredentials>("kubernetes") {
116token.set(getMandatoryStringProperty("kubernetesToken"))
117url.set(getMandatoryStringProperty("kubernetesUrl"))
118namespace.set(getMandatoryStringProperty("kubernetesNamespace"))
119}
120}
121
122experimental {
123useLegacyExtensionsV1Beta.set(false)
124}
125
126val defaultCpuRequest = "1.15"
127val defaultCpuLimit = "1.3"
128val defaultMemoryLimit = "4Gi"
129
130val emulator24 = Device.CloudEmulator(
131name = "api24",
132api = 24,
133model = "Android_SDK_built_for_x86",
134image = emulatorImage(24, "3a1f15409f37"),
135cpuCoresRequest = defaultCpuRequest,
136cpuCoresLimit = defaultCpuLimit,
137memoryLimit = defaultMemoryLimit
138)
139
140configurations {
141register("local") {
142filter = "local"
143targets {
144register("api34") {
145deviceName = "API34"
146scheduling {
147quota {
148retryCount = 1
149minimumSuccessCount = 1
150}
151testsCountBasedReservation {
152device = Device.LocalEmulator.device(34, "sdk_gphone64_x86_64")
153maximum = 1
154testsPerEmulator = 1
155}
156}
157}
158}
159}
160
161register(
162"PRCheck",
163instrumentationConfiguration(
164targetDevices = setOf(emulator24),
165)
166)
167}
168}
169
170fun instrumentationConfiguration(
171targetDevices: Set<Device>,
172): Action<InstrumentationConfiguration> {
173return Action {
174testRunnerExecutionTimeout = Duration.ofMinutes(10)
175instrumentationTaskTimeout = Duration.ofMinutes(10)
176reportSkippedTests = true
177filter = "ci"
178
179targetDevices.forEach { targetDevice ->
180targets {
181register(targetDevice.name) {
182scheduling {
183deviceName = targetDevice.name
184
185quota {
186retryCount = 1
187minimumSuccessCount = 1
188}
189
190testsCountBasedReservation {
191device = targetDevice
192minimum = 1
193maximum = 5
194testsPerEmulator = 12
195}
196}
197}
198}
199}
200}
201}
202
203fun emulatorImage(api: Int, label: String): String {
204return if (avitoRegistry != null) {
205"$avitoRegistry/android/emulator-hermetic-$api:$label"
206} else {
207"avitotech/android-emulator-$api:$label"
208}
209}
210
211val isLocalCheck = project.providers.gradleProperty("localCheck").getOrElse("false").toBoolean()
212
213if (!isLocalCheck) {
214tasks.check {
215dependsOn(tasks.named("instrumentationPRCheckKubernetes"))
216}
217}
218