From f5a3ae18850fa796205aced32336ad7eb7d14ba0 Mon Sep 17 00:00:00 2001 From: "Sergey.Shanshin" Date: Fri, 9 Jun 2023 15:27:21 +0200 Subject: [PATCH] Removed the dependency on the order of applying of the plugin Now the search for build variants takes place in the `afterEvaluate` action, which is added when `finalizeDsl` is called - thus the Kover code is guaranteed to be executed after creating variants. Additional changes: * added DSL accessors for Kover Default report tasks * added descriptions for Kover report tasks * added functions for getting Kover Android report task names Fixes #362 Fixes #394 Fixes #400 --- .../api/kover-gradle-plugin.api | 3 + .../android/flavors/app/build.gradle.kts | 4 +- .../examples/android/minimal_groovy/gradlew | 185 -------------- .../android/minimal_groovy/gradlew.bat | 89 ------- .../examples/android/minimal_kts/gradlew | 185 -------------- .../examples/android/minimal_kts/gradlew.bat | 89 ------- .../examples/android/multiproject/gradlew | 185 -------------- .../examples/android/multiproject/gradlew.bat | 89 ------- .../test/functional/cases/AccessorsTests.kt | 49 ++++ .../cases/ConfigurationOrderTests.kt | 64 +++++ .../functional/cases/DefaultConfigTests.kt | 2 +- .../functional/cases/MultiProjectTests.kt | 8 +- .../functional/cases/ReportsCachingTests.kt | 8 +- .../functional/cases/TaskFilteringTests.kt | 4 +- .../cases/VersionsInExamplesTests.kt | 4 +- .../functional/framework/checker/Checker.kt | 55 ++-- .../framework/checker/CheckerTypes.kt | 8 +- .../functional/framework/checker/Defaults.kt | 7 +- .../framework/common/Environment.kt | 42 +++- .../configurator/BuildConfigurator.kt | 6 +- .../framework/runner/BuildsRunner.kt | 120 +++++++++ .../framework/runner/CustomizableRunning.kt | 78 ++++++ .../framework/runner/GradleRunner.kt | 32 --- .../runner/{BuildRunner.kt => StepsRunner.kt} | 18 +- .../functional/framework/starter/Commons.kt | 66 +++-- .../functional/framework/starter/Example.kt | 11 +- .../functional/framework/starter/Simple.kt | 65 ----- .../functional/framework/starter/Single.kt | 14 +- .../functional/framework/starter/Sliced.kt | 16 +- .../functional/framework/starter/Template.kt | 8 +- .../framework/writer/BuildWriter.kt | 2 +- .../framework/writer/SettingsWriter.kt | 21 +- .../test/functional/simple/GradleTests.kt | 27 -- .../app/build.gradle.kts | 75 ++++++ .../app/src/main/AndroidManifest.xml | 24 ++ .../kotlinx/kover/test/android/DebugUtil.kt | 7 + .../kover/test/android/MainActivity.kt | 13 + .../java/kotlinx/kover/test/android/Maths.kt | 13 + .../app/src/main/res/layout/activity_main.xml | 36 +++ .../app/src/main/res/values/colors.xml | 10 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 4 + .../kotlinx/kover/test/android/LocalTests.kt | 13 + .../android-inverse-order/build.gradle.kts | 6 + .../android-inverse-order/gradle.properties | 23 ++ .../android-inverse-order/settings.gradle.kts | 19 ++ .../build.gradle.kts | 95 +++++++ .../gradle.properties | 23 ++ .../settings.gradle.kts | 19 ++ .../kotlinx/test/android/DebugAppClass.kt | 7 + .../kotlin/kotlinx/test/jvm/JvmClass.kt | 7 + .../kotlin/kotlinx/test/jvm/JvmTest.kt | 12 + .../src/main/AndroidManifest.xml | 24 ++ .../kotlinx/kover/test/android/DebugUtil.kt | 7 + .../kover/test/android/MainActivity.kt | 13 + .../java/kotlinx/kover/test/android/Maths.kt | 13 + .../src/main/res/layout/activity_main.xml | 36 +++ .../src/main/res/values/colors.xml | 10 + .../src/main/res/values/strings.xml | 3 + .../src/main/res/values/themes.xml | 4 + .../kotlinx/kover/test/android/LocalTests.kt | 13 + .../app/build.gradle.kts | 55 ++++ .../app/src/main/AndroidManifest.xml | 24 ++ .../kotlinx/kover/test/android/DebugUtil.kt | 7 + .../kover/test/android/MainActivity.kt | 13 + .../java/kotlinx/kover/test/android/Maths.kt | 13 + .../app/src/main/res/layout/activity_main.xml | 36 +++ .../app/src/main/res/values/colors.xml | 10 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 4 + .../kotlinx/kover/test/android/LocalTests.kt | 13 + .../build.gradle.kts | 6 + .../gradle.properties | 23 ++ .../settings.gradle.kts | 19 ++ .../app/build.gradle.kts | 55 ++++ .../app/src/main/AndroidManifest.xml | 24 ++ .../kotlinx/kover/test/android/DebugUtil.kt | 7 + .../kover/test/android/MainActivity.kt | 13 + .../java/kotlinx/kover/test/android/Maths.kt | 13 + .../app/src/main/res/layout/activity_main.xml | 36 +++ .../app/src/main/res/values/colors.xml | 10 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 4 + .../kotlinx/kover/test/android/LocalTests.kt | 13 + .../build.gradle.kts | 6 + .../gradle.properties | 23 ++ .../settings.gradle.kts | 19 ++ .../kover/gradle/plugin/KoverGradlePlugin.kt | 5 - .../gradle/plugin/appliers/AppliersCommons.kt | 13 - .../kover/gradle/plugin/appliers/Artifacts.kt | 108 -------- ...kApplier.kt => JvmTestTaskConfigurator.kt} | 31 ++- .../gradle/plugin/appliers/ProjectApplier.kt | 134 +++++----- .../gradle/plugin/appliers/ReportsApplier.kt | 117 --------- .../AndroidVariantApplier.kt} | 141 +++++------ .../appliers/reports/DefaultVariantApplier.kt | 42 ++++ .../appliers/reports/ReportsVariantApplier.kt | 237 ++++++++++++++++++ .../gradle/plugin/commons/Configurations.kt | 18 +- .../kover/gradle/plugin/commons/Naming.kt | 10 +- .../kover/gradle/plugin/commons/Paths.kt | 6 +- .../kover/gradle/plugin/commons/Types.kt | 38 +-- .../kover/gradle/plugin/dsl/Commons.kt | 25 ++ .../dsl/internal/KoverReportExtension.kt | 2 +- .../kover/gradle/plugin/locators/Android.kt | 35 ++- .../plugin/locators/CompilationKitLocator.kt | 33 --- .../plugin/locators/CompilationsListeners.kt | 126 ++++++++++ .../gradle/plugin/locators/EmptyLocator.kt | 18 +- .../plugin/locators/{Commons.kt => Jvm.kt} | 0 .../plugin/locators/KotlinAndroidLocator.kt | 39 +-- .../plugin/locators/KotlinJvmLocator.kt | 33 +-- .../locators/KotlinMultiPlatformLocator.kt | 77 ++++-- .../tasks/reports/AbstractKoverReportTask.kt | 10 +- .../plugin/tasks/reports/KoverHtmlTask.kt | 6 +- .../plugin/tasks/reports/KoverVerifyTask.kt | 6 +- .../plugin/tasks/reports/KoverXmlTask.kt | 6 +- .../tasks/services/KoverAgentJarTask.kt | 11 +- .../services/KoverArtifactGenerationTask.kt | 2 +- .../kover/gradle/plugin/tools/CoverageTool.kt | 32 ++- .../jacoco/JacocoOnlineInstrumentation.kt | 4 +- .../gradle/plugin/tools/jacoco/JacocoTool.kt | 10 +- .../tools/kover/KoverOnlineInstrumentation.kt | 12 +- .../tools/kover/KoverReportAggregator.kt | 2 +- .../gradle/plugin/tools/kover/KoverTool.kt | 10 +- .../gradle/plugin/tools/kover/Verification.kt | 2 +- .../kover/gradle/plugin/util/DynamicBean.kt | 8 + 124 files changed, 2295 insertions(+), 1662 deletions(-) delete mode 100755 kover-gradle-plugin/examples/android/minimal_groovy/gradlew delete mode 100644 kover-gradle-plugin/examples/android/minimal_groovy/gradlew.bat delete mode 100755 kover-gradle-plugin/examples/android/minimal_kts/gradlew delete mode 100644 kover-gradle-plugin/examples/android/minimal_kts/gradlew.bat delete mode 100755 kover-gradle-plugin/examples/android/multiproject/gradlew delete mode 100644 kover-gradle-plugin/examples/android/multiproject/gradlew.bat create mode 100644 kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/AccessorsTests.kt create mode 100644 kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ConfigurationOrderTests.kt create mode 100644 kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/BuildsRunner.kt create mode 100644 kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/CustomizableRunning.kt rename kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/{BuildRunner.kt => StepsRunner.kt} (77%) delete mode 100644 kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Simple.kt delete mode 100644 kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/simple/GradleTests.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/build.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/AndroidManifest.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/DebugUtil.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/MainActivity.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/Maths.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/layout/activity_main.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/colors.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/strings.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/themes.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/test/java/kotlinx/kover/test/android/LocalTests.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/build.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/gradle.properties create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/settings.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/build.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/gradle.properties create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/settings.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/debug/kotlin/kotlinx/test/android/DebugAppClass.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/jvmMain/kotlin/kotlinx/test/jvm/JvmClass.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/jvmTest/kotlin/kotlinx/test/jvm/JvmTest.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/AndroidManifest.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/java/kotlinx/kover/test/android/DebugUtil.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/java/kotlinx/kover/test/android/MainActivity.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/java/kotlinx/kover/test/android/Maths.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/res/layout/activity_main.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/res/values/colors.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/res/values/strings.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/main/res/values/themes.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-mpp-inverse-order/src/test/java/kotlinx/kover/test/android/LocalTests.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/build.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/AndroidManifest.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/java/kotlinx/kover/test/android/DebugUtil.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/java/kotlinx/kover/test/android/MainActivity.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/java/kotlinx/kover/test/android/Maths.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/res/layout/activity_main.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/res/values/colors.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/res/values/strings.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/main/res/values/themes.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/app/src/test/java/kotlinx/kover/test/android/LocalTests.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/build.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/gradle.properties create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-config/settings.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/build.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/AndroidManifest.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/java/kotlinx/kover/test/android/DebugUtil.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/java/kotlinx/kover/test/android/MainActivity.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/java/kotlinx/kover/test/android/Maths.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/res/layout/activity_main.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/res/values/colors.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/res/values/strings.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/main/res/values/themes.xml create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/app/src/test/java/kotlinx/kover/test/android/LocalTests.kt create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/build.gradle.kts create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/gradle.properties create mode 100644 kover-gradle-plugin/src/functionalTest/templates/builds/android-no-variant-for-merge/settings.gradle.kts delete mode 100644 kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/Artifacts.kt rename kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/{JvmTestTaskApplier.kt => JvmTestTaskConfigurator.kt} (66%) delete mode 100644 kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/ReportsApplier.kt rename kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/{AndroidApplier.kt => reports/AndroidVariantApplier.kt} (70%) create mode 100644 kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/reports/DefaultVariantApplier.kt create mode 100644 kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/reports/ReportsVariantApplier.kt delete mode 100644 kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/locators/CompilationKitLocator.kt create mode 100644 kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/locators/CompilationsListeners.kt rename kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/locators/{Commons.kt => Jvm.kt} (100%) diff --git a/kover-gradle-plugin/api/kover-gradle-plugin.api b/kover-gradle-plugin/api/kover-gradle-plugin.api index 910b1a8b..cefbd978 100644 --- a/kover-gradle-plugin/api/kover-gradle-plugin.api +++ b/kover-gradle-plugin/api/kover-gradle-plugin.api @@ -182,6 +182,9 @@ public final class kotlinx/kover/gradle/plugin/dsl/KoverNames { public static final field INSTANCE Lkotlinx/kover/gradle/plugin/dsl/KoverNames; public static final field PROJECT_EXTENSION_NAME Ljava/lang/String; public static final field REPORT_EXTENSION_NAME Ljava/lang/String; + public final fun androidHtmlReport (Ljava/lang/String;)Ljava/lang/String; + public final fun androidVerifyReport (Ljava/lang/String;)Ljava/lang/String; + public final fun androidXmlReport (Ljava/lang/String;)Ljava/lang/String; } public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverProjectExtension { diff --git a/kover-gradle-plugin/examples/android/flavors/app/build.gradle.kts b/kover-gradle-plugin/examples/android/flavors/app/build.gradle.kts index 2564929d..58c7ebd8 100644 --- a/kover-gradle-plugin/examples/android/flavors/app/build.gradle.kts +++ b/kover-gradle-plugin/examples/android/flavors/app/build.gradle.kts @@ -121,8 +121,8 @@ koverReport { mergeWith("app1AppDebug") } - androidReports("release") { - // filters for all report types only of 'release' build type + androidReports("app1AppRelease") { + // filters for all report types only of 'app1AppRelease' build variant filters { excludes { classes( diff --git a/kover-gradle-plugin/examples/android/minimal_groovy/gradlew b/kover-gradle-plugin/examples/android/minimal_groovy/gradlew deleted file mode 100755 index 4f906e0c..00000000 --- a/kover-gradle-plugin/examples/android/minimal_groovy/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/kover-gradle-plugin/examples/android/minimal_groovy/gradlew.bat b/kover-gradle-plugin/examples/android/minimal_groovy/gradlew.bat deleted file mode 100644 index 107acd32..00000000 --- a/kover-gradle-plugin/examples/android/minimal_groovy/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/kover-gradle-plugin/examples/android/minimal_kts/gradlew b/kover-gradle-plugin/examples/android/minimal_kts/gradlew deleted file mode 100755 index 4f906e0c..00000000 --- a/kover-gradle-plugin/examples/android/minimal_kts/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/kover-gradle-plugin/examples/android/minimal_kts/gradlew.bat b/kover-gradle-plugin/examples/android/minimal_kts/gradlew.bat deleted file mode 100644 index 107acd32..00000000 --- a/kover-gradle-plugin/examples/android/minimal_kts/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/kover-gradle-plugin/examples/android/multiproject/gradlew b/kover-gradle-plugin/examples/android/multiproject/gradlew deleted file mode 100755 index 4f906e0c..00000000 --- a/kover-gradle-plugin/examples/android/multiproject/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/kover-gradle-plugin/examples/android/multiproject/gradlew.bat b/kover-gradle-plugin/examples/android/multiproject/gradlew.bat deleted file mode 100644 index 107acd32..00000000 --- a/kover-gradle-plugin/examples/android/multiproject/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/AccessorsTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/AccessorsTests.kt new file mode 100644 index 00000000..088d11ca --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/AccessorsTests.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.kover.gradle.plugin.test.functional.cases + +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.generateBuild +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.runWithParams +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +internal class AccessorsTests { + @Test + fun testDefaultAccessors() { + val build = generateBuild { dir -> + dir.resolve("settings.gradle.kts").createNewFile() + + dir.resolve("build.gradle.kts").writeText( + """ + plugins { + kotlin("jvm") version "1.8.0" + id("org.jetbrains.kotlinx.kover") version "DEV" + } + + + group = "org.jetbrains" + version = "1.0-SNAPSHOT" + + repositories { + mavenCentral() + } + + tasks.register("custom") { + dependsOn(tasks.koverHtmlReport) + dependsOn(tasks.koverXmlReport) + dependsOn(tasks.koverVerify) + } + """.trimIndent() + ) + }.generate("Test accessors", "custom") + + val result = build.runWithParams("custom") + + // skipped because there is no tests, but tasks are triggered + assertEquals("SKIPPED", result.taskOutcome(":koverXmlReport")) + assertEquals("SKIPPED", result.taskOutcome(":koverHtmlReport")) + assertEquals("SKIPPED", result.taskOutcome(":koverVerify")) + } +} \ No newline at end of file diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ConfigurationOrderTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ConfigurationOrderTests.kt new file mode 100644 index 00000000..9842f27e --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ConfigurationOrderTests.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.kover.gradle.plugin.test.functional.cases + +import kotlinx.kover.gradle.plugin.test.functional.framework.checker.CheckerContext +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.buildFromTemplate +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.generateBuild +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.runWithParams +import kotlinx.kover.gradle.plugin.test.functional.framework.starter.TemplateTest +import org.junit.jupiter.api.Test +import kotlin.test.assertContains +import kotlin.test.assertEquals +import kotlin.test.assertFalse + +internal class ConfigurationOrderTests { + /** + * A test to verify that the order of application of the Kover plugin does not affect the correct operation. + * Kover + Kotlin Android Plugin + */ + @TemplateTest("android-inverse-order", [":app:koverXmlReport", ":app:koverXmlReportRelease"]) + fun CheckerContext.testAndroidInverseOrder() { + subproject(":app") { + checkXmlReport() + checkXmlReport("release") + checkOutcome(":app:koverXmlReport", "SUCCESS") + checkOutcome(":app:koverXmlReportRelease", "SUCCESS") + } + } + + /** + * A test to verify that the order of application of the Kover plugin does not affect the correct operation. + * Kover + Kotlin Multiplatform Plugin with Android target + */ + @TemplateTest("android-mpp-inverse-order", [":koverXmlReport", ":koverXmlReportRelease"]) + fun CheckerContext.testAndroidMppInverseOrder() { + checkXmlReport() + checkXmlReport("release") + checkOutcome(":koverXmlReport", "SUCCESS") + checkOutcome(":koverXmlReportRelease", "SUCCESS") + } + + @Test + fun testIllegalVariantNameInConfig() { + val buildSource = buildFromTemplate("android-no-variant-for-config") + val build = buildSource.generate("No variant config", "template") + val buildResult = build.runWithParams("clean") + + assertFalse(buildResult.isSuccessful, "Build must fall") + assertContains(buildResult.output, "impossible to configure Android reports for it") + } + + @Test + fun testIllegalVariantNameInMerge() { + val buildSource = buildFromTemplate("android-no-variant-for-merge") + val build = buildSource.generate("No variant merge", "template") + val buildResult = build.runWithParams("clean") + + assertFalse(buildResult.isSuccessful, "Build must fall") + assertContains(buildResult.output, "impossible to merge default reports with its measurements") + } + +} \ No newline at end of file diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/DefaultConfigTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/DefaultConfigTests.kt index 2c4b13ab..b9b0ef59 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/DefaultConfigTests.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/DefaultConfigTests.kt @@ -15,7 +15,7 @@ internal class DefaultConfigTests { } run("koverXmlReport", "koverHtmlReport") { - checkDefaultRawReport() + checkDefaultBinReport() checkDefaultReports() } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/MultiProjectTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/MultiProjectTests.kt index b4d374cc..f1d53b5b 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/MultiProjectTests.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/MultiProjectTests.kt @@ -75,14 +75,14 @@ internal class MultiProjectTests { } run("koverXmlReport", "koverHtmlReport", "koverVerify") { - checkDefaultRawReport(false) + checkDefaultBinReport(false) checkOutcome("koverHtmlReport", "SKIPPED") checkOutcome("koverXmlReport", "SKIPPED") checkOutcome("koverVerify", "SKIPPED") subproject(subprojectPath) { - checkDefaultRawReport(false) + checkDefaultBinReport(false) checkOutcome("koverHtmlReport", "SKIPPED") checkOutcome("koverXmlReport", "SKIPPED") checkOutcome("koverVerify", "SKIPPED") @@ -112,14 +112,14 @@ internal class MultiProjectTests { } run("koverXmlReport", "koverHtmlReport", "koverVerify") { - checkDefaultRawReport(false) + checkDefaultBinReport(false) checkOutcome("koverHtmlReport", "SKIPPED") checkOutcome("koverXmlReport", "SKIPPED") checkOutcome("koverVerify", "SKIPPED") subproject(subprojectPath) { - checkDefaultRawReport(false) + checkDefaultBinReport(false) checkOutcome("koverHtmlReport", "SKIPPED") checkOutcome("koverXmlReport", "SKIPPED") checkOutcome("koverVerify", "SKIPPED") diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ReportsCachingTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ReportsCachingTests.kt index 2b7184e2..4667d32f 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ReportsCachingTests.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ReportsCachingTests.kt @@ -16,7 +16,7 @@ internal class ReportsCachingTests { reportAndCheck("UP-TO-DATE") run("clean") { - checkDefaultRawReport(false) + checkDefaultBinReport(false) checkDefaultReports(false) } reportAndCheck("SUCCESS") @@ -32,7 +32,7 @@ internal class ReportsCachingTests { reportAndCheck("SUCCESS", true) run("clean", "--build-cache") { - checkDefaultRawReport(false) + checkDefaultBinReport(false) checkDefaultReports(false) } reportAndCheck("FROM-CACHE", true) @@ -70,7 +70,7 @@ internal class ReportsCachingTests { } reportAndCheck("SUCCESS", true) run("clean", "--build-cache") { - checkDefaultRawReport(false) + checkDefaultBinReport(false) checkDefaultReports(false) } reportAndCheck("FROM-CACHE", true) @@ -84,7 +84,7 @@ internal class ReportsCachingTests { arrayOf("koverXmlReport", "koverHtmlReport") } run(*args) { - checkDefaultRawReport() + checkDefaultBinReport() checkDefaultReports() checkOutcome("test", outcome) checkOutcome("koverXmlReport", outcome) diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/TaskFilteringTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/TaskFilteringTests.kt index 6e22d72a..8dac37da 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/TaskFilteringTests.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/TaskFilteringTests.kt @@ -35,8 +35,8 @@ internal class TaskFilteringTests { contains("Task '${defaultTestTaskName(slice.type)}' will be skipped because no tests were executed") } - // if task `test` is excluded from instrumentation then the raw report is not created for it - checkDefaultRawReport(false) + // if task `test` is excluded from instrumentation then the binary report is not created for it + checkDefaultBinReport(false) } } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/VersionsInExamplesTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/VersionsInExamplesTests.kt index 9e14ec4c..a8addd51 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/VersionsInExamplesTests.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/VersionsInExamplesTests.kt @@ -7,7 +7,7 @@ package kotlinx.kover.gradle.plugin.test.functional.cases import kotlinx.kover.gradle.plugin.commons.* import kotlinx.kover.gradle.plugin.dsl.* import kotlinx.kover.gradle.plugin.test.functional.framework.checker.* -import kotlinx.kover.gradle.plugin.test.functional.framework.common.releaseVersion +import kotlinx.kover.gradle.plugin.test.functional.framework.common.releaseVersionParam import kotlinx.kover.gradle.plugin.test.functional.framework.starter.* import org.junit.jupiter.api.Test import kotlin.test.assertTrue @@ -27,7 +27,7 @@ internal class VersionsInExamplesTests { private fun ProjectAnalysisData.checkVersionsInProject(): Boolean { // check version of Kover plugin if applied if (definedKoverVersion != null) { - if (releaseVersion != definedKoverVersion) { + if (releaseVersionParam != definedKoverVersion) { return false } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Checker.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Checker.kt index e19dcb36..6ca297a0 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Checker.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Checker.kt @@ -44,8 +44,8 @@ private class CheckerContextImpl( ) : CheckerContext { override val output: String = result.output - override val defaultRawReport: String - get() = rawReportsDirectory + "/" + defaultTestTaskName(project.kotlinPlugin.type!!) + "." + project.toolVariant.vendor.rawReportExtension + override val defaultBinReport: String + get() = binReportsDirectory + "/" + defaultTestTaskName(project.kotlinPlugin.type!!) + "." + project.toolVariant.vendor.binReportExtension override val hasError: Boolean get() = !result.isSuccessful @@ -110,24 +110,22 @@ private class CheckerContextImpl( VerifyReportCheckerImpl(this, verificationResultFile.readText()).checker() } - override fun checkDefaultRawReport(mustExist: Boolean) { + override fun checkDefaultBinReport(mustExist: Boolean) { if (mustExist) { - file(defaultRawReport) { - assertTrue(exists(), "Default raw report is not exists: $defaultRawReport") - assertTrue(length() > 0, "Default raw report is empty: $defaultRawReport") + file(defaultBinReport) { + assertTrue(exists(), "Default binary report is not exists: $defaultBinReport") + assertTrue(length() > 0, "Default binary report is empty: $defaultBinReport") } } else { - file(defaultRawReport) { - assertFalse(exists(), "Default raw report must not exist: $defaultRawReport" ) + file(defaultBinReport) { + assertFalse(exists(), "Default binary report must not exist: $defaultBinReport" ) } } } override fun checkDefaultReports(mustExist: Boolean) { - checkReports( - defaultXmlReport(), - defaultHtmlReport(), mustExist - ) + checkXmlReport(mustExist = mustExist) + checkHtmlReport(mustExist = mustExist) } override fun checkOutcome(taskNameOrPath: String, expectedOutcome: String) { @@ -149,22 +147,23 @@ private class CheckerContextImpl( checker(taskLog) } - override fun checkReports(xmlPath: String, htmlPath: String, mustExist: Boolean) { - if (mustExist) { - file(xmlPath) { - assertTrue(exists(), "XML file must exist '$xmlPath'") - assertTrue(length() > 0, "XML file mustn't be empty '$xmlPath'") - } - file(htmlPath) { - assertTrue(exists(), "HTML report must exists '$htmlPath'") - assertTrue(isDirectory, "HTML report must be directory '$htmlPath'" ) - } - } else { - file(xmlPath) { - assertFalse(exists(), "XML file mustn't exist '$xmlPath'") + override fun checkXmlReport(variantName: String, mustExist: Boolean) { + file("${defaultReportsDir}/report$variantName.xml") { + if (mustExist) { + assertTrue(exists(), "XML report file for ${if (variantName.isEmpty()) "variant '$variantName'" else "default variant"} must exist") + } else { + assertFalse(exists(), "XML report file for ${if (variantName.isEmpty()) "variant '$variantName'" else "default variant"} mustn't exist") } - file(htmlPath) { - assertFalse(exists(), "HTML report mustn't exist '$htmlPath'") + } + } + + override fun checkHtmlReport(variantName: String, mustExist: Boolean) { + file("${defaultReportsDir}/html${variantName.capitalized()}") { + if (mustExist) { + assertTrue(exists(), "HTML report for ${if (variantName.isEmpty()) "variant '$variantName'" else "default variant"} must exist") + assertTrue(isDirectory, "HTML report for ${if (variantName.isEmpty()) "variant '$variantName'" else "default variant"} must be directory" ) + } else { + assertFalse(exists(), "XML report file for ${if (variantName.isEmpty()) "variant '$variantName'" else "default variant"} mustn't exist") } } } @@ -302,12 +301,14 @@ private fun String.kotlinPluginType(language: ScriptLanguage): AppliedKotlinPlug when { contains("""kotlin("jvm")""") -> AppliedKotlinPlugin(KotlinPluginType.JVM) contains("""kotlin("multiplatform")""") -> AppliedKotlinPlugin(KotlinPluginType.MULTIPLATFORM) + contains("""org.jetbrains.kotlin.android""") -> AppliedKotlinPlugin(KotlinPluginType.ANDROID) else -> AppliedKotlinPlugin(null) } } else { when { contains("""org.jetbrains.kotlin.jvm""") -> AppliedKotlinPlugin(KotlinPluginType.JVM) contains("""org.jetbrains.kotlin.multiplatform""") -> AppliedKotlinPlugin(KotlinPluginType.MULTIPLATFORM) + contains("""org.jetbrains.kotlin.android""") -> AppliedKotlinPlugin(KotlinPluginType.ANDROID) else -> AppliedKotlinPlugin(null) } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/CheckerTypes.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/CheckerTypes.kt index dc7769c4..0505ea26 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/CheckerTypes.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/CheckerTypes.kt @@ -33,12 +33,14 @@ internal interface CheckerContext { fun verification(checker: VerifyReportChecker.() -> Unit) - val defaultRawReport: String - fun checkReports(xmlPath: String, htmlPath: String, mustExist: Boolean) + val defaultBinReport: String + + fun checkXmlReport(variantName: String = "", mustExist: Boolean = true) + fun checkHtmlReport(variantName: String = "", mustExist: Boolean = true) fun checkOutcome(taskNameOrPath: String, expectedOutcome: String) fun taskNotCalled(taskNameOrPath: String) fun checkDefaultReports(mustExist: Boolean = true) - fun checkDefaultRawReport(mustExist: Boolean = true) + fun checkDefaultBinReport(mustExist: Boolean = true) } /** diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Defaults.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Defaults.kt index 76e8c1ab..2c4c3c4f 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Defaults.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/checker/Defaults.kt @@ -14,11 +14,12 @@ internal fun defaultTestTaskName(projectType: KotlinPluginType): String { } } -internal fun defaultXmlReport() = "reports/kover/report.xml" -internal fun defaultHtmlReport() = "reports/kover/html" +internal const val defaultReportsDir = "reports/kover" + +internal fun defaultXmlReport() = "$defaultReportsDir/report.xml" internal fun errorsDirectory() = "kover/errors" -internal const val rawReportsDirectory = "kover/raw-reports" +internal const val binReportsDirectory = "kover/bin-reports" internal const val verificationErrorFile = "reports/kover/verify.err" diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/common/Environment.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/common/Environment.kt index 0535606d..c6efe7e9 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/common/Environment.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/common/Environment.kt @@ -14,30 +14,37 @@ internal const val ANDROID_HOME_ENV = "ANDROID_HOME" /** * Version of current Kover build. */ -internal val koverVersion = System.getProperty("koverVersion") +internal val koverVersionCurrent = System.getProperty("koverVersion") ?: throw Exception("System property 'koverVersion' not defined for functional tests") /** * Version of most recent Kover release. */ -internal val releaseVersion = System.getProperty("kover.release.version") +internal val releaseVersionParam = System.getProperty("kover.release.version") ?: throw Exception("System property 'kover.release.version' not defined for functional tests") /** * Kotlin version for sliced generated tests. */ -internal val kotlinVersion = System.getProperty("kotlinVersion") +internal val kotlinVersionCurrent = System.getProperty("kotlinVersion") ?: throw Exception("System property 'kotlinVersion' not defined for functional tests") /** * Overridden Kotlin version for all tests. */ -internal val overriddenTestKotlinVersion = System.getProperty("kover.test.kotlin.version") +internal val overriddenKotlinVersionParam = System.getProperty("kover.test.kotlin.version") /** * Custom version of Gradle runner for functional tests. */ -internal val gradleWrapperVersion: String? = System.getProperty("kover.test.gradle.version") +internal val gradleWrapperVersionParam: String? = System.getProperty("kover.test.gradle.version") + +/** + * Result path to the Android SDK. `null` if not defined. + */ +internal val androidSdkDirParam: String? = System.getProperty("kover.test.android.sdk")?: System.getenv(ANDROID_HOME_ENV) + + /** * Flag to run functional tests within debug agent. @@ -49,11 +56,6 @@ internal val isDebugEnabled: Boolean = System.getProperty("isDebugEnabled") != n */ internal val isAndroidTestDisabled: Boolean = System.getProperty("kover.test.android.disable") != null -/** - * Result path to the Android SDK. `null` if not defined. - */ -internal val androidSdkDir: String? = System.getProperty("kover.test.android.sdk")?: System.getenv(ANDROID_HOME_ENV) - /** * Path to the local maven repository with the current Kover build. */ @@ -67,8 +69,26 @@ internal fun logInfo(message: String) { } } +internal val testLogsEnabled = System.getProperty("testLogsEnabled") == "true" + + +/** + * Directory with builds templates + */ +internal val templateBuildsDir = File("src/functionalTest/templates/builds") + +/** + * Directory with example projects + */ +internal val examplesDir = File("examples") + +/** + * Directory with additional gradle wrappers + */ internal val gradleWrappersRoot = File("gradle-wrappers") +/** + * Directory with Gradle wrapper that runs functional tests + */ internal val defaultGradleWrapperDir = File("..") -internal val testLogsEnabled = System.getProperty("testLogsEnabled") == "true" diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/configurator/BuildConfigurator.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/configurator/BuildConfigurator.kt index e6a49384..71b7a190 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/configurator/BuildConfigurator.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/configurator/BuildConfigurator.kt @@ -7,7 +7,7 @@ package kotlinx.kover.gradle.plugin.test.functional.framework.configurator import kotlinx.kover.gradle.plugin.dsl.* import kotlinx.kover.gradle.plugin.test.functional.framework.checker.* import kotlinx.kover.gradle.plugin.test.functional.framework.common.* -import kotlinx.kover.gradle.plugin.test.functional.framework.common.kotlinVersion +import kotlinx.kover.gradle.plugin.test.functional.framework.common.kotlinVersionCurrent import kotlinx.kover.gradle.plugin.test.functional.framework.writer.* internal fun createConfigurator(): BuildConfigurator { @@ -56,8 +56,8 @@ private open class TestBuildConfigurator : BuildConfigurator { addProject(path, name) { plugins { if (path == ":") { - kotlin(kotlinVersion) - kover(koverVersion) + kotlin(kotlinVersionCurrent) + kover(koverVersionCurrent) } else { kotlin() kover() diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/BuildsRunner.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/BuildsRunner.kt new file mode 100644 index 00000000..a1d98424 --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/BuildsRunner.kt @@ -0,0 +1,120 @@ +/* + * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.kover.gradle.plugin.test.functional.framework.runner + +import kotlinx.kover.gradle.plugin.test.functional.framework.common.ANDROID_HOME_ENV +import kotlinx.kover.gradle.plugin.test.functional.framework.common.isDebugEnabled +import kotlinx.kover.gradle.plugin.test.functional.framework.common.logInfo +import kotlinx.kover.gradle.plugin.test.functional.framework.common.uri +import kotlinx.kover.gradle.plugin.test.functional.framework.starter.patchSettingsFile +import java.io.File +import java.nio.file.Files + + +internal fun createBuildSource(localMavenDir: String, koverVersion: String): BuildSource { + return BuildSourceImpl(localMavenDir, koverVersion) +} + +internal interface BuildSource { + var overriddenKotlinVersion: String? + + fun copyFrom(rootProjectDir: File) + + fun from(rootProjectDir: File) + + fun generate(buildName: String, buildType: String): GradleBuild +} + +internal interface GradleBuild { + val targetDir: File + + fun run(args: List, env: BuildEnv): BuildResult + + fun clear() +} + +internal data class BuildEnv( + val wrapperDir: File, + val androidSdkDir: String? = null, + val disableBuildCacheByDefault: Boolean = true +) + +private class BuildSourceImpl(val localMavenDir: String, val koverVersion: String) : BuildSource { + private var dir: File? = null + + private var copy: Boolean = false + + override var overriddenKotlinVersion: String? = null + + override fun copyFrom(rootProjectDir: File) { + dir = rootProjectDir + copy = true + } + + override fun from(rootProjectDir: File) { + dir = rootProjectDir + copy = false + } + + override fun generate(buildName: String, buildType: String): GradleBuild { + val actualDir = dir ?: throw Exception("No source was specified for the build") + val targetDir = if (copy) { + val tmpDir = Files.createTempDirectory("${buildName.substringAfterLast('/')}-").toFile() + actualDir.copyRecursively(tmpDir) + tmpDir + } else { + actualDir + } + + targetDir.patchSettingsFile( + "$buildType '$buildName', project dir: ${targetDir.uri}", + koverVersion, localMavenDir, overriddenKotlinVersion + ) + + return GradleBuildImpl(targetDir, copy, buildName, buildType) + } +} + + +private class GradleBuildImpl( + override val targetDir: File, + private val delete: Boolean, + private val buildName: String, + private val buildType: String +) : GradleBuild { + private var runCount = 0 + + override fun run(args: List, env: BuildEnv): BuildResult { + logInfo("Starting build $buildType '$buildName' with commands '${args.joinToString(" ")}'") + + val gradleArgs: MutableList = mutableListOf() + gradleArgs += args + + if (env.disableBuildCacheByDefault) { + if (args.none { it == "--build-cache" }) gradleArgs += "--no-build-cache" + } + + if (isDebugEnabled) { + gradleArgs += "-Dorg.gradle.debug=true" + gradleArgs += "--no-daemon" + } + + logInfo("Run Gradle commands $gradleArgs for project '${targetDir.canonicalPath}' with wrapper '${env.wrapperDir.canonicalPath}'") + + val envVars: MutableMap = mutableMapOf() + env.androidSdkDir?.also { dir -> envVars[ANDROID_HOME_ENV] = dir } + + val result = targetDir.buildGradleByShell(runCount++, env.wrapperDir, gradleArgs, envVars) + logInfo("Success build $buildType '$buildName'") + return result + } + + override fun clear() { + if (delete) { + logInfo("Deleting build for '$buildName' the directory ${targetDir.uri}") + targetDir.deleteRecursively() + } + } +} diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/CustomizableRunning.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/CustomizableRunning.kt new file mode 100644 index 00000000..c6cde81a --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/CustomizableRunning.kt @@ -0,0 +1,78 @@ +/* + * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.kover.gradle.plugin.test.functional.framework.runner + +import kotlinx.kover.gradle.plugin.test.functional.framework.common.* +import kotlinx.kover.gradle.plugin.test.functional.framework.common.androidSdkDirParam +import kotlinx.kover.gradle.plugin.test.functional.framework.common.koverVersionCurrent +import kotlinx.kover.gradle.plugin.test.functional.framework.common.defaultGradleWrapperDir +import kotlinx.kover.gradle.plugin.test.functional.framework.common.examplesDir +import kotlinx.kover.gradle.plugin.test.functional.framework.common.gradleWrapperVersionParam +import kotlinx.kover.gradle.plugin.test.functional.framework.common.localRepositoryPath +import kotlinx.kover.gradle.plugin.test.functional.framework.common.overriddenKotlinVersionParam +import kotlinx.kover.gradle.plugin.test.functional.framework.common.templateBuildsDir +import java.io.File +import java.nio.file.Files + +internal fun buildFromTemplate(templateName: String): BuildSource { + val source = createBuildSource(localRepositoryPath, koverVersionCurrent) + source.overriddenKotlinVersion = overriddenKotlinVersionParam + + val dir = templateBuildsDir.resolve(templateName) + if (!dir.exists()) { + throw Exception("Template not found: '$templateName'") + } + source.copyFrom(dir) + + return source +} + +internal fun buildFromExample(examplePath: String): BuildSource { + val source = createBuildSource(localRepositoryPath, koverVersionCurrent) + source.overriddenKotlinVersion = overriddenKotlinVersionParam + + val exampleDir = examplesDir.resolve(examplePath) + if (!exampleDir.exists()) { + throw Exception("Example not found: '$exampleDir'") + } + source.copyFrom(exampleDir) + + return source +} + +internal fun generateBuild(generator: (File) -> Unit): BuildSource { + val dir = Files.createTempDirectory("generated-build-").toFile() + + generator(dir) + val source = createBuildSource(localRepositoryPath, koverVersionCurrent) + source.overriddenKotlinVersion = overriddenKotlinVersionParam + source.from(dir) + + return source +} + + +internal fun GradleBuild.runWithParams(args: List): BuildResult { + val wrapperDir = + if (gradleWrapperVersionParam == null) defaultGradleWrapperDir else getWrapper(gradleWrapperVersionParam) + + val buildEnv = BuildEnv(wrapperDir, androidSdkDirParam) + + return run(args, buildEnv) +} +internal fun GradleBuild.runWithParams(vararg args: String): BuildResult { + val wrapperDir = + if (gradleWrapperVersionParam == null) defaultGradleWrapperDir else getWrapper(gradleWrapperVersionParam) + + val buildEnv = BuildEnv(wrapperDir, androidSdkDirParam) + + return run(args.toList(), buildEnv) +} + +private fun getWrapper(version: String): File { + val wrapperDir = gradleWrappersRoot.resolve(version) + if (!wrapperDir.exists()) throw Exception("Wrapper for Gradle version '$version' is not supported by functional tests") + return wrapperDir +} diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/GradleRunner.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/GradleRunner.kt index b8fbafdf..18c1c48f 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/GradleRunner.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/GradleRunner.kt @@ -4,35 +4,8 @@ package kotlinx.kover.gradle.plugin.test.functional.framework.runner -import kotlinx.kover.gradle.plugin.test.functional.framework.common.* -import kotlinx.kover.gradle.plugin.test.functional.framework.common.isDebugEnabled import java.io.* -/** - * Options: - * - build cache - disabled by default, to enable it, you need to pass the "--build-cache" argument. - * - Gradle daemon - is not used by default, a new process is started for each test, which stops when the run is finished. - */ -internal fun File.runGradleBuild(args: List, runIndex: Int = 0): BuildResult { - val gradleArgs: MutableList = mutableListOf() - gradleArgs += args - if (args.none { it == "--build-cache" }) gradleArgs += "--no-build-cache" - - if (isDebugEnabled) { - gradleArgs += "-Dorg.gradle.debug=true" - gradleArgs += "--no-daemon" - } - - val wrapperDir = if (gradleWrapperVersion == null) defaultGradleWrapperDir else getWrapper(gradleWrapperVersion) - - logInfo("Run Gradle commands $gradleArgs for project '${this.canonicalPath}' with wrapper '${wrapperDir.canonicalPath}'") - - val env: MutableMap = mutableMapOf() - androidSdkDir?.also { env[ANDROID_HOME_ENV] = it } - - return buildGradleByShell(runIndex, wrapperDir, gradleArgs, env) -} - internal class BuildResult(exitCode: Int, private val logFile: File) { val isSuccessful: Boolean = exitCode == 0 @@ -78,11 +51,6 @@ internal class BuildResult(exitCode: Int, private val logFile: File) { } } -private fun getWrapper(version: String): File { - val wrapperDir = gradleWrappersRoot.resolve(version) - if (!wrapperDir.exists()) throw Exception("Wrapper for Gradle version '$version' is not supported by functional tests") - return wrapperDir -} internal fun File.buildGradleByShell( runIndex: Int, diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/BuildRunner.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/StepsRunner.kt similarity index 77% rename from kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/BuildRunner.kt rename to kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/StepsRunner.kt index 1830bf8b..fb41745c 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/BuildRunner.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/runner/StepsRunner.kt @@ -10,31 +10,31 @@ import kotlinx.kover.gradle.plugin.test.functional.framework.common.logInfo import kotlinx.kover.gradle.plugin.test.functional.framework.configurator.* import java.io.* -internal fun File.runAndCheck(steps: List) { +internal fun GradleBuild.runAndCheck(steps: List) { logInfo( """ -Project builds are being started, directory ${this.absolutePath} +Project builds are being started, directory ${targetDir.absolutePath} ======== START SCRIPT ======== -${this.buildScript()} +${this.targetDir.buildScript()} ======== END SCRIPT ======== """.trimIndent() ) steps.forEachIndexed { i, step -> - val description = "step #$i, ${step.name}\nProject dir: ${this.uri}" + val description = "step #$i, ${step.name}\nProject dir: ${targetDir.uri}" - when(step) { + when (step) { is TestGradleStep -> { - val runResult = this.runGradleBuild(step.args, i) - createCheckerContext(runResult) - .check(description, step.errorExpected, step.checker) + val runResult = this.runWithParams(step.args) + targetDir.createCheckerContext(runResult).check(description, step.errorExpected, step.checker) } + is TestFileEditStep -> { if (File(step.filePath).isAbsolute) { throw Exception("It is not allowed to edit a file by an absolute path. For $description") } - val file = this.resolve(step.filePath) + val file = this.targetDir.resolve(step.filePath) if (!file.exists()) { throw Exception("Project file not found for editing. For $description") } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Commons.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Commons.kt index de3f377f..05295655 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Commons.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Commons.kt @@ -8,20 +8,22 @@ import kotlinx.kover.gradle.plugin.test.functional.framework.checker.CheckerCont import kotlinx.kover.gradle.plugin.test.functional.framework.checker.check import kotlinx.kover.gradle.plugin.test.functional.framework.checker.createCheckerContext import kotlinx.kover.gradle.plugin.test.functional.framework.common.* -import kotlinx.kover.gradle.plugin.test.functional.framework.runner.runGradleBuild +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.BuildSource +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.GradleBuild +import kotlinx.kover.gradle.plugin.test.functional.framework.runner.runWithParams import kotlinx.kover.gradle.plugin.test.functional.framework.writer.* import org.junit.jupiter.api.extension.* import java.io.* import java.lang.reflect.AnnotatedElement import java.lang.reflect.Method -import java.nio.file.Files private const val DIR_PARAM = "build-directory" private const val CHECKER_PARAM = "checker-context" -internal class RunCommand(val name: String, val projectDir: File, val gradleArgs: List) +internal class RunCommand(val name: String, val buildSource: BuildSource, val gradleArgs: List) -internal abstract class DirectoryBasedGradleTest: BeforeTestExecutionCallback, InvocationInterceptor, ParameterResolver { +internal abstract class DirectoryBasedGradleTest : BeforeTestExecutionCallback, InvocationInterceptor, + ParameterResolver { protected abstract fun readAnnotationArgs(element: AnnotatedElement?): RunCommand protected abstract val testType: String @@ -29,24 +31,15 @@ internal abstract class DirectoryBasedGradleTest: BeforeTestExecutionCallback, I // BeforeTestExecutionCallback override fun beforeTestExecution(context: ExtensionContext) { val args = readAnnotationArgs(context.element.orElse(null)) - val targetDir = Files.createTempDirectory("${args.name}-").toFile() - if (!args.projectDir.exists()) { - error("Could not find the $testType '${args.name}' with directory ${args.projectDir.uri}") - } - - logInfo("Before building $testType '${args.name}' in target directory ${targetDir.uri}") - - args.projectDir.copyRecursively(targetDir) - targetDir.patchSettingsFile("$testType '${args.name}', project dir: ${targetDir.uri}") + val build = args.buildSource.generate(args.name, testType) + logInfo("Before building $testType '${args.name}' in target directory ${build.targetDir.uri}") - logInfo("Starting build $testType '${args.name}' with commands '${args.gradleArgs.joinToString(" ")}'") - val runResult = targetDir.runGradleBuild(args.gradleArgs) - logInfo("Success build $testType '${args.name}'") - val checkerContext = targetDir.createCheckerContext(runResult) + val runResult = build.runWithParams(args.gradleArgs) + val checkerContext = build.targetDir.createCheckerContext(runResult) val store = context.getStore(ExtensionContext.Namespace.GLOBAL) - store.put(DIR_PARAM, targetDir) + store.put(DIR_PARAM, build) store.put(CHECKER_PARAM, checkerContext) } @@ -60,16 +53,16 @@ internal abstract class DirectoryBasedGradleTest: BeforeTestExecutionCallback, I val templateName = annotationArgs.name val store = extensionContext.getStore(ExtensionContext.Namespace.GLOBAL) - val dir = store.get(DIR_PARAM, File::class.java) + val build = store.get(DIR_PARAM, GradleBuild::class.java) val checker = store.get(CHECKER_PARAM, CheckerContext::class.java) logInfo("Before checking $testType '$templateName'") - checker.check("$testType '$templateName'\nProject dir: ${dir.uri}") { + checker.check("$testType '$templateName'\nProject dir: ${build.targetDir.uri}") { invocation.proceed() } - logInfo("Deleting the directory ${dir.uri}") - dir.deleteRecursively() + logInfo("Deleting the directory ${build.targetDir.uri}") + build.clear() } // ParameterResolver @@ -85,15 +78,18 @@ internal abstract class DirectoryBasedGradleTest: BeforeTestExecutionCallback, I } - - /** * Override Kover version and add local repository to find artifact for current build. */ @Suppress("UNUSED_PARAMETER") -internal fun File.patchSettingsFile(description: String) { +internal fun File.patchSettingsFile( + description: String, + koverVersion: String, + localRepositoryPath: String, + overrideKotlinVersion: String? +) { val settingsFile = (listFiles()?.firstOrNull { it.name == "settings.gradle" || it.name == "settings.gradle.kts" } - ?: throw Exception("No Gradle settings file in project ${this.canonicalPath}")) + ?: throw Exception("No Gradle settings file in project ${this.uri}")) val language = if (settingsFile.name.endsWith(".kts")) ScriptLanguage.KOTLIN else ScriptLanguage.GROOVY val originLines = settingsFile.readLines() @@ -108,7 +104,12 @@ internal fun File.patchSettingsFile(description: String) { writer.appendLine("pluginManagement {") val pluginManagementWriter = FormattedWriter { l -> writer.append(l) } - pluginManagementWriter.writePluginManagement(language) + pluginManagementWriter.writePluginManagement( + language, + koverVersion, + localRepositoryPath, + overrideKotlinVersion + ) if (!isPluginManagement) { writer.appendLine("}") @@ -118,7 +119,18 @@ internal fun File.patchSettingsFile(description: String) { } else { writer.appendLine(line) } + } + if (originLines.isEmpty()) { + writer.appendLine("pluginManagement {") + val pluginManagementWriter = FormattedWriter { l -> writer.append(l) } + pluginManagementWriter.writePluginManagement( + language, + koverVersion, + localRepositoryPath, + overrideKotlinVersion + ) + writer.appendLine("}") } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Example.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Example.kt index 93d2817d..6249fc29 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Example.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Example.kt @@ -26,10 +26,8 @@ internal annotation class ExamplesTest( val commands: Array = ["build"] ) -private const val EXAMPLES_DIR = "examples" - internal fun allExamples(): List { - return File(EXAMPLES_DIR).subdirs().flatMap { it.subdirs() } + return File("examples").subdirs().flatMap { it.subdirs() } } private class ExampleGradleTest : DirectoryBasedGradleTest() { @@ -37,11 +35,10 @@ private class ExampleGradleTest : DirectoryBasedGradleTest() { val annotation = (element?.getAnnotation(ExamplesTest::class.java) ?: error("Test not marked by '${ExamplesTest::class.qualifiedName}' annotation")) - val exampleDir = File(EXAMPLES_DIR, annotation.exampleDir) - val exampleName = exampleDir.name + val exampleName = annotation.exampleDir + val buildSource = buildFromExample(exampleName) val commands = annotation.commands.toList() - - return RunCommand(exampleName, exampleDir, commands) + return RunCommand(exampleName, buildSource, commands) } override val testType: String = "Example" diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Simple.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Simple.kt deleted file mode 100644 index 1bc17636..00000000 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Simple.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.kover.gradle.plugin.test.functional.framework.starter - -import kotlinx.kover.gradle.plugin.test.functional.framework.common.* -import kotlinx.kover.gradle.plugin.test.functional.framework.common.logInfo -import org.junit.jupiter.api.* -import org.junit.jupiter.api.extension.* -import java.io.* -import java.lang.reflect.* -import java.nio.file.* - - -@Target(AnnotationTarget.FUNCTION) -@Retention(AnnotationRetention.RUNTIME) -@Test -@Extensions( - ExtendWith(SimpleTestParams::class), - ExtendWith(SimpleTestInterceptor::class) -) -internal annotation class SimpleTest - -private const val TMP_PREFIX = "kover-simple-" -private const val DIR_PARAM = "directory" - -private class SimpleTestParams : ParameterResolver { - override fun supportsParameter(parameterContext: ParameterContext, extensionContext: ExtensionContext): Boolean { - return parameterContext.index == 0 && File::class.java.isAssignableFrom(parameterContext.parameter.type) - } - - override fun resolveParameter(parameterContext: ParameterContext, extensionContext: ExtensionContext): Any { - val dir = Files.createTempDirectory(TMP_PREFIX).toFile() - - logInfo("Starting simple test with directory ${dir.uri}") - - // we don't have to check the index, because only one parameter is used - val store = extensionContext.getStore(ExtensionContext.Namespace.GLOBAL) - store.put(DIR_PARAM, dir) - return dir - } -} - -private class SimpleTestInterceptor : InvocationInterceptor { - override fun interceptTestMethod( - invocation: InvocationInterceptor.Invocation, - invocationContext: ReflectiveInvocationContext, - extensionContext: ExtensionContext - ) { - val store = extensionContext.getStore(ExtensionContext.Namespace.GLOBAL) - val dir = store.get(DIR_PARAM, File::class.java) ?: throw IllegalStateException( - "Single parameter with type 'java.io.File' is expected for a test. " + - "Moreover, it can be a receiver, for example 'fun File.myTest()'" - ) - - try { - invocation.proceed() - } catch (e: Throwable) { - throw AssertionError("${e.message}\nProject dir: ${dir.uri}", e) - } - logInfo("Test successfully, deleting directory ${dir.uri}") - dir.deleteRecursively() - } -} diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Single.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Single.kt index 7613c8e8..54966f3f 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Single.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Single.kt @@ -30,7 +30,6 @@ internal annotation class GeneratedTest( ) private const val CONFIGURATOR_PARAM = "configurator" -private const val TMP_PREFIX = "kover-generated-" private class SingleTestParams : ParameterResolver { override fun supportsParameter(parameterContext: ParameterContext, extensionContext: ExtensionContext): Boolean { @@ -68,14 +67,15 @@ private class SingleTestInterceptor : InvocationInterceptor { val tool = if (annotation.defaultTool) null else annotation.tool val slice = BuildSlice(annotation.language, annotation.type, tool) - val dir = Files.createTempDirectory(TMP_PREFIX).toFile() val config = configurator.prepare() - dir.writeBuild(config, slice) - logInfo("Build was created for slice ($slice) in directory ${dir.uri}") + val buildSource = generateBuild { dir -> + dir.writeBuild(config, slice) + logInfo("Build was created for slice ($slice) in directory ${dir.uri}") + } - dir.runAndCheck(config.steps) + val build = buildSource.generate(slice.toString(), "single generated") + build.runAndCheck(config.steps) // clear directory if where are no errors - logInfo("Build successfully for slice ($slice), deleting the directory ${dir.uri}") - dir.deleteRecursively() + build.clear() } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Sliced.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Sliced.kt index 70cd7e2c..151be457 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Sliced.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Sliced.kt @@ -32,8 +32,6 @@ internal interface SlicedBuildConfigurator : BuildConfigurator { val slice: BuildSlice } -private const val TMP_PREFIX = "kover-sliced-build-" - private val ALL_LANGUAGES = listOf(ScriptLanguage.KOTLIN, ScriptLanguage.GROOVY) private val ALL_TOOLS = listOf(CoverageToolVendor.KOVER, CoverageToolVendor.JACOCO) private val ALL_TYPES = listOf(KotlinPluginType.JVM, KotlinPluginType.MULTIPLATFORM) @@ -61,16 +59,16 @@ private class SlicedTestInterceptor : InvocationInterceptor { logInfo("Starting configuration for slice ($slice)") invocation.proceed() logInfo("Starting writing build for slice ($slice)") - - val dir = Files.createTempDirectory(TMP_PREFIX).toFile() val config = configurator.prepare() - dir.writeBuild(config, slice) - logInfo("Build was created for slice ($slice) in directory ${dir.uri}") - dir.runAndCheck(config.steps) + val buildSource = generateBuild { dir -> + dir.writeBuild(config, slice) + logInfo("Build was created for slice ($slice) in directory ${dir.uri}") + } + val build = buildSource.generate(slice.toString(), "sliced generated") + build.runAndCheck(config.steps) // clear directory if where are no errors - logInfo("Build successfully for slice ($slice), deleting the directory ${dir.uri}") - dir.deleteRecursively() + build.clear() } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Template.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Template.kt index 2851b04d..146c1799 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Template.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/starter/Template.kt @@ -20,8 +20,6 @@ import java.nio.file.* @Extensions(ExtendWith(TemplateGradleTest::class)) internal annotation class TemplateTest(val templateName: String, val commands: Array) -private const val TEMPLATES_DIR = "src/functionalTest/templates/builds" - private class TemplateGradleTest : DirectoryBasedGradleTest() { override fun readAnnotationArgs(element: AnnotatedElement?): RunCommand { @@ -29,10 +27,10 @@ private class TemplateGradleTest : DirectoryBasedGradleTest() { ?: throw IllegalStateException("Test not marked by '${TemplateTest::class.qualifiedName}' annotation") val templateName = annotation.templateName - val templateDir = File(TEMPLATES_DIR).resolve(templateName) - val commands = annotation.commands.toList() - return RunCommand(templateName, templateDir, commands) + val sources = buildFromTemplate(templateName) + val commands = annotation.commands.toList() + return RunCommand(templateName, sources, commands) } override val testType: String = "Template" diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/BuildWriter.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/BuildWriter.kt index f108944a..3bda093b 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/BuildWriter.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/BuildWriter.kt @@ -9,7 +9,7 @@ import kotlinx.kover.gradle.plugin.test.functional.framework.configurator.* import java.io.* internal fun File.writeBuild(build: TestBuildConfig, slice: BuildSlice) { - this.resolve("settings.${slice.scriptExtension}").writeSettings(build, slice) + this.resolve("settings.${slice.scriptExtension}").writeSettings(build) build.projects.forEach { (path, conf) -> this.subproject(path).writeProject(conf, slice) } } diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/SettingsWriter.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/SettingsWriter.kt index bb6720ce..039eaadb 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/SettingsWriter.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/framework/writer/SettingsWriter.kt @@ -5,19 +5,20 @@ package kotlinx.kover.gradle.plugin.test.functional.framework.writer import kotlinx.kover.gradle.plugin.test.functional.framework.common.* -import kotlinx.kover.gradle.plugin.test.functional.framework.common.BuildSlice -import kotlinx.kover.gradle.plugin.test.functional.framework.common.localRepositoryPath import kotlinx.kover.gradle.plugin.test.functional.framework.configurator.TestBuildConfig import java.io.* -internal fun FormattedWriter.writePluginManagement(language: ScriptLanguage) { +internal fun FormattedWriter.writePluginManagement(language: ScriptLanguage, + koverVersion: String, + localRepositoryPath: String, + overrideKotlinVersion: String?) { call("resolutionStrategy") { call("eachPlugin") { line("if (requested.id.id == \"org.jetbrains.kotlinx.kover\") { useVersion(\"$koverVersion\") }") - if (overriddenTestKotlinVersion != null) { - line("if (requested.id.id == \"org.jetbrains.kotlin.jvm\") useVersion(\"$overriddenTestKotlinVersion\")") - line("if (requested.id.id == \"org.jetbrains.kotlin.multiplatform\") useVersion(\"$overriddenTestKotlinVersion\")") - line("if (requested.id.id == \"org.jetbrains.kotlin.android\") useVersion(\"$overriddenTestKotlinVersion\")") + if (overrideKotlinVersion != null) { + line("if (requested.id.id == \"org.jetbrains.kotlin.jvm\") useVersion(\"$overrideKotlinVersion\")") + line("if (requested.id.id == \"org.jetbrains.kotlin.multiplatform\") useVersion(\"$overrideKotlinVersion\")") + line("if (requested.id.id == \"org.jetbrains.kotlin.android\") useVersion(\"$overrideKotlinVersion\")") } } } @@ -30,12 +31,8 @@ internal fun FormattedWriter.writePluginManagement(language: ScriptLanguage) { } -internal fun File.writeSettings(build: TestBuildConfig, slice: BuildSlice) { +internal fun File.writeSettings(build: TestBuildConfig) { writeScript { - call("pluginManagement") { - writePluginManagement(slice.language) - } - line("") line("""rootProject.name = "kover-functional-test"""") build.projects.keys.forEach { path -> if (path != ":") { diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/simple/GradleTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/simple/GradleTests.kt deleted file mode 100644 index 1a425a82..00000000 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/simple/GradleTests.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.kover.gradle.plugin.test.functional.simple - -import kotlinx.kover.gradle.plugin.test.functional.framework.runner.* -import kotlinx.kover.gradle.plugin.test.functional.framework.starter.* -import java.io.* -import kotlin.test.* - -class GradleTests { - - /** - * An example to show how you can design your own builds in the test function, run and check them. - */ - @SimpleTest - fun File.test() { - resolve("build.gradle.kts").writeText("""""") - resolve("settings.gradle.kts").writeText("""rootProject.name = "empty-project"""") - - val result = runGradleBuild(listOf("tasks")) - val buildLog = result.output - - assertTrue(buildLog.contains("BUILD SUCCESSFUL")) - } -} diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/build.gradle.kts b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/build.gradle.kts new file mode 100644 index 00000000..7c5b1b9c --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/build.gradle.kts @@ -0,0 +1,75 @@ +plugins { + id ("org.jetbrains.kotlinx.kover") + id ("com.android.application") + id ("org.jetbrains.kotlin.android") +} + +android { + namespace = "kotlinx.kover.test.android" + compileSdk = 32 + + defaultConfig { + applicationId = "kotlinx.kover.test.android" + minSdk = 21 + targetSdk = 31 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = true + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + viewBinding = true + } +} + +dependencies { + implementation("androidx.core:core-ktx:1.8.0") + implementation("androidx.appcompat:appcompat:1.5.0") + implementation("com.google.android.material:material:1.6.1") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + testImplementation("junit:junit:4.13.2") +} + + +/* + * Kover configs + */ + +koverReport { + defaults { + mergeWith("release") + } + + androidReports("release") { + // filters for all report types only of 'release' build type + filters { + excludes { + classes( + "*Fragment", + "*Fragment\$*", + "*Activity", + "*Activity\$*", + "*.databinding.*", + "*.BuildConfig", + + // excludes debug classes + "*.DebugUtil" + ) + } + } + } + +} diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/AndroidManifest.xml b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..358fac25 --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/DebugUtil.kt b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/DebugUtil.kt new file mode 100644 index 00000000..efe82040 --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/DebugUtil.kt @@ -0,0 +1,7 @@ +package kotlinx.kover.test.android + +object DebugUtil { + fun log(message: String) { + println("DEBUG: $message") + } +} \ No newline at end of file diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/MainActivity.kt b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/MainActivity.kt new file mode 100644 index 00000000..1caaf5b6 --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/MainActivity.kt @@ -0,0 +1,13 @@ +package kotlinx.kover.test.android + +import android.os.Bundle +import android.app.Activity + +class MainActivity : Activity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } + +} diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/Maths.kt b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/Maths.kt new file mode 100644 index 00000000..03edc099 --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/java/kotlinx/kover/test/android/Maths.kt @@ -0,0 +1,13 @@ +package kotlinx.kover.test.android + +object Maths { + fun sum(a: Int, b: Int): Int { + DebugUtil.log("invoked sum") + return a + b + } + + fun sub(a: Int, b: Int): Int { + DebugUtil.log("invoked sub") + return a - b + } +} \ No newline at end of file diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/layout/activity_main.xml b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..ee57d166 --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/colors.xml b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..f8c6127d --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/strings.xml b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..fa43411e --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Android Test + \ No newline at end of file diff --git a/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/themes.xml b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..0b4cfc4c --- /dev/null +++ b/kover-gradle-plugin/src/functionalTest/templates/builds/android-inverse-order/app/src/main/res/values/themes.xml @@ -0,0 +1,4 @@ + + +