1
package com.avito.instrumentation
3
import com.android.build.api.variant.AndroidComponentsExtension
4
import com.android.build.gradle.BasePlugin
5
import com.avito.android.stats.statsdConfig
6
import com.avito.instrumentation.configuration.InstrumentationConfiguration
7
import com.avito.instrumentation.configuration.InstrumentationFilter
8
import com.avito.instrumentation.configuration.InstrumentationTestsPluginExtension
9
import com.avito.instrumentation.configuration.KubernetesViaContext
10
import com.avito.instrumentation.configuration.KubernetesViaCredentials
11
import com.avito.instrumentation.configuration.LocalAdb
12
import com.avito.instrumentation.internal.ConfiguratorsFactory
13
import com.avito.instrumentation.internal.ExtensionCorrectnessChecker
14
import com.avito.instrumentation.internal.InstrumentationTaskConfigurator
15
import com.avito.instrumentation.internal.TaskValidatorsFactory
16
import com.avito.kotlin.dsl.getBooleanProperty
17
import com.avito.kotlin.dsl.getMandatoryLongProperty
18
import com.avito.utils.buildFailer
19
import org.gradle.api.Plugin
20
import org.gradle.api.Project
21
import org.gradle.kotlin.dsl.create
22
import org.gradle.kotlin.dsl.register
23
import org.gradle.kotlin.dsl.withType
24
import java.time.Duration
26
public class InstrumentationTestsPlugin : Plugin<Project> {
28
override fun apply(project: Project) {
29
val extension = project.createInstrumentationPluginExtension()
31
// cache enabled only on pr's
32
val buildCacheEnabled = project.getBooleanProperty(
33
name = "avito.instrumentation.buildCacheEnabled",
37
val factory = ConfiguratorsFactory(project, extension, buildCacheEnabled)
39
val filtersFactory = TaskValidatorsFactory()
41
val extensionCorrectnessChecker = ExtensionCorrectnessChecker(extension)
43
project.plugins.withType<BasePlugin> {
45
val androidComponents = project.extensions.getByType(AndroidComponentsExtension::class.java)
47
androidComponents.finalizeDsl { androidExtension ->
48
factory.setupLocalInstrumentationArgsUseCase.setupLocalRunParams(androidExtension)
51
extension.configurationsContainer.all { configuration ->
53
extension.environmentsContainer.all { environment ->
55
// todo how to write "only testBuildType" selector?
57
androidComponents.onVariants { variant ->
59
extensionCorrectnessChecker.check(variant)
61
val configurators = factory.createTaskConfigurators(
62
configuration = configuration,
63
environment = environment,
67
val filters = filtersFactory.create()
69
if (configurators != null && filters.all { it.filter(configuration, environment) }) {
71
project.tasks.register(
72
instrumentationTaskName(
73
configuration = configuration.name,
74
environment = environment.name,
75
flavor = variant.flavorName
77
configureInstrumentationTask(
78
configurators = configurators,
79
configuration = configuration,
80
extension = extension,
90
private fun configureInstrumentationTask(
91
configurators: List<InstrumentationTaskConfigurator>,
92
configuration: InstrumentationConfiguration,
93
extension: InstrumentationTestsPluginExtension,
94
): InstrumentationTestsTask.() -> Unit {
96
timeout.set(configuration.instrumentationTaskTimeout)
99
projectName.set(project.name)
100
statsDConfig.set(project.statsdConfig)
101
buildFailer.set(project.buildFailer)
102
gradleTestKitRun.set(project.getBooleanProperty("isGradleTestKitRun"))
103
logcatTags.set(extension.logcatTags)
104
enableDeviceDebug.set(configuration.enableDeviceDebug)
105
kubernetesHttpTries.set(extension.kubernetesHttpTries.convention(3))
108
extension.adbPullTimeoutSeconds.getOrElse(
109
project.getMandatoryLongProperty("avito.device.adbPullTimeoutSeconds")
114
configurators.forEach {
120
private fun Project.createInstrumentationPluginExtension(): InstrumentationTestsPluginExtension {
121
val extension = extensions.create<InstrumentationTestsPluginExtension>("instrumentation")
123
extension.filters.register("default") {
124
it.fromRunHistory.excludePreviousStatuses(
126
InstrumentationFilter.FromRunHistory.RunStatus.Manual,
127
InstrumentationFilter.FromRunHistory.RunStatus.Success
132
extension.environmentsContainer.registerFactory(KubernetesViaCredentials::class.java) {
133
project.objects.newInstance(KubernetesViaCredentials::class.java, it)
135
extension.environmentsContainer.registerFactory(KubernetesViaContext::class.java) {
136
project.objects.newInstance(KubernetesViaContext::class.java, it)
138
extension.environmentsContainer.registerFactory(LocalAdb::class.java) {
139
project.objects.newInstance(LocalAdb::class.java, it)
142
extension.environmentsContainer.register<LocalAdb>("local")