buildSrc/src/main/kotlin/Avdl.kt
changeset 1 831cffa9c991
child 9 817ec8de14ea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildSrc/src/main/kotlin/Avdl.kt	Fri May 08 21:33:19 2020 -0400
@@ -0,0 +1,129 @@
+/*
+ * Geekttrss is a RSS feed reader application on the Android Platform.
+ *
+ * Copyright (C) 2017-2020 by Frederic-Charles Barthelery.
+ *
+ * This file is part of Geekttrss.
+ *
+ * Geekttrss is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Geekttrss is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Geekttrss.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.geekorum.build
+
+import com.android.build.gradle.AppPlugin
+import com.android.build.gradle.DynamicFeaturePlugin
+import com.android.build.gradle.LibraryPlugin
+import com.android.build.gradle.TestedExtension
+import com.android.build.gradle.api.TestVariant
+import com.geekorum.gradle.avdl.AvdlExtension
+import com.geekorum.gradle.avdl.providers.flydroid.FlydroidPlugin
+import com.geekorum.gradle.avdl.providers.flydroid.flydroid
+import com.geekorum.gradle.avdl.tasks.LaunchDeviceTask
+import com.geekorum.gradle.avdl.tasks.StopDeviceTask
+import com.geekorum.gradle.avdl.tasks.orderForTask
+import com.geekorum.gradle.avdl.tasks.registerAvdlDevicesTask
+import org.gradle.api.Project
+import org.gradle.api.Task
+import org.gradle.api.provider.Provider
+import org.gradle.api.services.BuildService
+import org.gradle.api.services.BuildServiceParameters
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.kotlin.dsl.*
+
+
+fun Project.configureAvdlDevices(flydroidUrl: String, flydroidKey: String) {
+    apply<FlydroidPlugin>()
+
+    val oneInstrumentedTestService = gradle.sharedServices.registerIfAbsent(
+            "oneInstrumentedTest", OneInstrumentedTestService::class.java) {
+        maxParallelUsages.set(1)
+    }
+
+    rootProject.serializeInstrumentedTestTask(oneInstrumentedTestService)
+
+    val android = the<TestedExtension>()
+    configure<AvdlExtension> {
+        devices {
+            android.testVariants.all {
+                register("android-n-${project.path}-$baseName") {
+                    setup = flydroid {
+                        url = flydroidUrl
+                        this.flydroidKey = flydroidKey
+                        // android-q images fail, don't manage to start the tests
+                        image = "android-n"
+                         useTunnel = true
+                    }
+                }
+            }
+        }
+    }
+
+    tasks {
+        var lastStopTask: TaskProvider<out Task>? = null
+        var lastTestTask: TaskProvider<out Task>? = null
+        android.testVariants.all {
+            val (startTask, stopTask ) =
+                registerAvdlDevicesTaskForVariant(this, listOf("android-n-${project.path}-$baseName"))
+            listOf(startTask, stopTask).forEach {
+                it.configure {
+                    usesService(oneInstrumentedTestService)
+                }
+            }
+
+            lastStopTask?.let {
+                startTask.configure {
+                    mustRunAfter(it)
+                }
+            }
+            lastTestTask?.let {
+                startTask.configure {
+                    mustRunAfter(it)
+                }
+            }
+            lastStopTask = stopTask
+            lastTestTask = connectedInstrumentTestProvider
+        }
+    }
+}
+
+private fun TaskContainer.registerAvdlDevicesTaskForVariant(
+    variant: TestVariant, devices: List<String>
+): Pair<TaskProvider<LaunchDeviceTask>, TaskProvider<StopDeviceTask>> {
+    val tasks =
+        registerAvdlDevicesTask(variant.name, devices)
+    tasks.orderForTask(variant.connectedInstrumentTestProvider)
+    return tasks
+}
+
+
+private fun Project.serializeInstrumentedTestTask(oneInstrumentedTestService: Provider<OneInstrumentedTestService>) {
+    fun Project.configureTestTasks() {
+        extensions.configure<TestedExtension> {
+            testVariants.all {
+                connectedInstrumentTestProvider.configure {
+                    usesService(oneInstrumentedTestService)
+                }
+            }
+        }
+    }
+
+    allprojects {
+        val project = this
+        plugins.withType<AppPlugin> { project.configureTestTasks() }
+        plugins.withType<DynamicFeaturePlugin> { project.configureTestTasks() }
+        plugins.withType<LibraryPlugin> { project.configureTestTasks() }
+    }
+}
+
+abstract class OneInstrumentedTestService : BuildService<BuildServiceParameters.None>