From ab73251af084fb14488f5bad195bd1baa0e00bf0 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Thu, 25 Aug 2022 15:46:53 +0200 Subject: [PATCH] [Gradle] Implement KT50161AndroidBuildCacheTest to cover KT-50161 --- .../android/KT50161AndroidBuildCacheTest.kt | 71 +++++++++++++++++++ .../app/build.gradle | 26 +++++++ .../app/proguard-rules.pro | 21 ++++++ .../revolut/cmdemo/ExampleInstrumentedTest.kt | 24 +++++++ .../app/src/main/AndroidManifest.xml | 4 ++ .../src/main/java/com/revolut/cmdemo/Demo.kt | 8 +++ .../com/revolut/cmdemo/ExampleUnitTest.kt | 17 +++++ .../build.gradle | 31 ++++++++ .../gradle.properties | 3 + .../settings.gradle | 1 + 10 files changed, 206 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KT50161AndroidBuildCacheTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/proguard-rules.pro create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/androidTest/java/com/revolut/cmdemo/ExampleInstrumentedTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/java/com/revolut/cmdemo/Demo.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/test/java/com/revolut/cmdemo/ExampleUnitTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KT50161AndroidBuildCacheTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KT50161AndroidBuildCacheTest.kt new file mode 100644 index 00000000000..8335271ace0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KT50161AndroidBuildCacheTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.android + +import org.gradle.api.logging.configuration.WarningMode +import org.gradle.testkit.runner.BuildResult +import org.gradle.testkit.runner.BuildTask +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.fail +import org.junit.jupiter.api.io.TempDir +import java.nio.file.Path + +@AndroidGradlePluginTests +@DisplayName("Android Build Cache Test for KT-50161") +class KT50161AndroidBuildCacheTest : KGPBaseTest() { + + @GradleAndroidTest + @DisplayName("test build cache w/ enabled variant filter") + fun testBuildCacheWithVariantFilter( + gradleVersion: GradleVersion, + agpVersion: String, + jdkVersion: JdkVersions.ProvidedJdk, + @TempDir localBuildCacheDir: Path + ) { + project( + "kt-50161-androidBuildCacheWithVariantFilter", + gradleVersion, + defaultBuildOptions.copy( + androidVersion = agpVersion, + buildCacheEnabled = true, + warningMode = WarningMode.Summary + ), + buildJdk = jdkVersion.location, + ) { + enableLocalBuildCache(localBuildCacheDir) + + build("assembleDebug") { + assertTasksExecuted(":app:assembleDebug") + getCompileKotlinTasks().forEach { task -> + assertTasksExecuted(task.path) + } + } + build("clean") + + build("assembleDebug") { + getCompileKotlinTasks().forEach { task -> + assertTasksFromCache(task.path) + } + } + build("clean") + + build("assembleDebug", "-PenableVariantFilter") { + assertOutputContains("enableVariantFilter") + getCompileKotlinTasks().forEach { task -> + assertTasksFromCache(task.path) + } + } + } + } + + private fun BuildResult.getCompileKotlinTasks(): List { + val compileTasks = tasks.filter { it.path.lowercase().contains("compile") && it.path.lowercase().contains("kotlin") } + if (compileTasks.isEmpty()) fail("Expected at least one compile task to be executed. Found $tasks") + return compileTasks + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/build.gradle new file mode 100644 index 00000000000..99f82431efe --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/build.gradle @@ -0,0 +1,26 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +repositories { + mavenLocal() + google() + mavenCentral() +} + +android { + compileSdkVersion 31 + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } +} + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/proguard-rules.pro b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/proguard-rules.pro new file mode 100644 index 00000000000..481bb434814 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/androidTest/java/com/revolut/cmdemo/ExampleInstrumentedTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/androidTest/java/com/revolut/cmdemo/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000..75675a1a5e6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/androidTest/java/com/revolut/cmdemo/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.revolut.cmdemo + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.revolut.cmdemo", appContext.packageName) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..dc14e57538a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/java/com/revolut/cmdemo/Demo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/java/com/revolut/cmdemo/Demo.kt new file mode 100644 index 00000000000..5481fd43766 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/main/java/com/revolut/cmdemo/Demo.kt @@ -0,0 +1,8 @@ +package com.revolut.cmdemo + +class Demo { + + fun sayIt() { + println("Hello World!") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/test/java/com/revolut/cmdemo/ExampleUnitTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/test/java/com/revolut/cmdemo/ExampleUnitTest.kt new file mode 100644 index 00000000000..6a9892847c5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/app/src/test/java/com/revolut/cmdemo/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.revolut.cmdemo + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/build.gradle new file mode 100644 index 00000000000..597907ed9ca --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/build.gradle @@ -0,0 +1,31 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + mavenLocal() + google() + mavenCentral() + } + + dependencies { + classpath('com.android.tools.build:gradle:' + android_tools_version) + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +subprojects { project -> + project.plugins.withId('com.android.application') { + boolean enableVariantFilter = properties.containsKey("enableVariantFilter") + if (enableVariantFilter) { + logger.quiet("enableVariantFilter") + android { + variantFilter { variant -> + variant.ignore = variant.buildType.name != 'debug' + } + } + } + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/gradle.properties new file mode 100644 index 00000000000..0695addabbc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/gradle.properties @@ -0,0 +1,3 @@ +android.useAndroidX=true +android.enableJetifier=true +kotlin.code.style=official diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/settings.gradle new file mode 100644 index 00000000000..e7b4def49cb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-50161-androidBuildCacheWithVariantFilter/settings.gradle @@ -0,0 +1 @@ +include ':app'