Skip to content

Commit

Permalink
Fixed lookup for tests if unit tests are disabled in Android config
Browse files Browse the repository at this point in the history
Fixes #405

A small refactoring of DynamicBean was also carried out
  • Loading branch information
shanshin committed Jul 10, 2023
1 parent 706f7b5 commit 10daf69
Show file tree
Hide file tree
Showing 30 changed files with 350 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import kotlinx.kover.gradle.plugin.test.functional.framework.starter.*
internal class AdaptersTests {
@TemplateTest("different-plugins", [":koverXmlReport"])
fun CheckerContext.testMultiplatformReportRoot() {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.CommonClass").assertFullyCovered()
classCounter("org.jetbrains.JvmClass").assertFullyCovered()
}
Expand All @@ -28,7 +28,7 @@ internal class AdaptersTests {
checkDefaultReports(false)

subproject(":subproject-multiplatform") {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.CommonClass").assertFullyCovered()
classCounter("org.jetbrains.JvmClass").assertFullyCovered()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
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.starter.TemplateTest

internal class AndroidConfigsTests {
@TemplateTest("disabledUnitTests", [":app:koverXmlReportDebug"])
fun CheckerContext.testUnitTestsAreDisabledInAgp() {
subproject(":app") {
taskNotCalled("testDebugUnitTest")
checkOutcome("koverXmlReportDebug", "SUCCESS")
xmlReport("debug") {
classCounter("kotlinx.kover.test.android.Maths").assertFullyMissed()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
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.checker.defaultXmlReport
import kotlinx.kover.gradle.plugin.test.functional.framework.starter.TemplateTest

internal class CompilationFiltersTests {
@TemplateTest("sourcesets", ["koverXmlReport"])
fun CheckerContext.testJvmSourceSetFilter() {
xml(defaultXmlReport()) {
xmlReport {
classCounter("kotlinx.kover.examples.sourcesets.ExtraClass").assertAbsent()
}
}

@TemplateTest("sourcesets-mpp", ["koverXmlReport"])
fun CheckerContext.testMppSourceSetFilter() {
xml(defaultXmlReport()) {
xmlReport {
classCounter("kotlinx.kover.examples.sourcesets.ExtraClass").assertAbsent()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ internal class CountersValueTests {

@TemplateTest("counters", ["koverXmlReport"])
fun CheckerContext.testBasicCounterCases() {
xml(defaultXmlReport()) {
xmlReport {
// test on branch counter
methodCounter("org.jetbrains.MyBranchedClass", "foo", type = "BRANCH").assertCovered(1, 3)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ internal class InstrumentationFilteringTests {
}

run("build", "koverXmlReport") {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.ExampleClass").assertFullyMissed()
classCounter("org.jetbrains.SecondClass").assertCovered()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ internal class MultiProjectTests {
}

run(":koverXmlReport", ":koverHtmlReport") {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.CommonClass").assertFullyCovered()
classCounter("org.jetbrains.CommonInternalClass").assertFullyCovered()
classCounter("org.jetbrains.UserClass").assertFullyCovered()
Expand All @@ -45,7 +45,7 @@ internal class MultiProjectTests {

run("koverXmlReport") {
subproject(subprojectPath) {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.UserClass").assertAbsent()

classCounter("org.jetbrains.CommonInternalClass").assertFullyCovered()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package kotlinx.kover.gradle.plugin.test.functional.cases

import kotlinx.kover.gradle.plugin.test.functional.framework.checker.createCheckerContext
import kotlinx.kover.gradle.plugin.test.functional.framework.checker.defaultXmlReport
import kotlinx.kover.gradle.plugin.test.functional.framework.runner.BuildSource
import kotlinx.kover.gradle.plugin.test.functional.framework.runner.buildFromTemplate
import kotlinx.kover.gradle.plugin.test.functional.framework.runner.runWithParams
Expand Down Expand Up @@ -30,7 +29,7 @@ class NoTestReportsTests {
val buildResult = build.runWithParams("koverXmlReport", "koverHtmlReport")
val checkerContext = build.createCheckerContext(buildResult)

checkerContext.xml(defaultXmlReport()) {
checkerContext.xmlReport {
classCounter("kotlinx.kover.templates.ExampleClass").assertFullyMissed()
}
assertTrue(buildResult.isSuccessful)
Expand All @@ -41,7 +40,7 @@ class NoTestReportsTests {
val buildResult = build.runWithParams("koverXmlReport", "koverHtmlReport", "koverVerify")
val checkerContext = build.createCheckerContext(buildResult)

checkerContext.xml(defaultXmlReport()) {
checkerContext.xmlReport {
classCounter("kotlinx.kover.templates.ExampleClass").assertFullyMissed()
}
checkerContext.checkHtmlReport()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package kotlinx.kover.gradle.plugin.test.functional.cases

import kotlinx.kover.gradle.plugin.dsl.*
import kotlinx.kover.gradle.plugin.dsl.MetricType.LINE
import kotlinx.kover.gradle.plugin.test.functional.framework.checker.defaultXmlReport
import kotlinx.kover.gradle.plugin.test.functional.framework.configurator.*
import kotlinx.kover.gradle.plugin.test.functional.framework.starter.*

Expand Down Expand Up @@ -40,7 +39,7 @@ internal class ReportAnnotationFilterTests {
}

run("koverXmlReport", "check") {
xml(defaultXmlReport()) {
xmlReport {
methodCounter("org.jetbrains.NotExcludedClass", "function").assertFullyCovered()
classCounter("org.jetbrains.ExcludedClass").assertAbsent()
methodCounter("org.jetbrains.PartiallyExcludedClass", "function1").assertFullyCovered()
Expand Down Expand Up @@ -93,7 +92,7 @@ internal class ReportAnnotationFilterTests {
}

run("koverXmlReport", "check") {
xml(defaultXmlReport()) {
xmlReport {
methodCounter("org.jetbrains.PartiallyExcludedClass", "function1").assertAbsent()
methodCounter("org.jetbrains.PartiallyExcludedClass", "function2").assertFullyCovered()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
package kotlinx.kover.gradle.plugin.test.functional.cases

import kotlinx.kover.gradle.plugin.dsl.AggregationType
import kotlinx.kover.gradle.plugin.test.functional.framework.checker.defaultXmlReport
import kotlinx.kover.gradle.plugin.test.functional.framework.configurator.*
import kotlinx.kover.gradle.plugin.test.functional.framework.starter.*

Expand Down Expand Up @@ -33,7 +32,7 @@ internal class ReportsFilteringTests {
}
}
run("koverXmlReport", "koverVerify") {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.ExampleClass").assertAbsent()
classCounter("org.jetbrains.SecondClass").assertCovered()
}
Expand Down Expand Up @@ -69,7 +68,7 @@ internal class ReportsFilteringTests {
}
}
run("koverXmlReport", "koverVerify") {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.ExampleClass").assertAbsent()
classCounter("org.jetbrains.SecondClass").assertCovered()
}
Expand Down Expand Up @@ -118,7 +117,7 @@ internal class ReportsFilteringTests {
}
}
run("koverXmlReport", "koverVerify") {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.ExampleClass").assertAbsent()
classCounter("org.jetbrains.SecondClass").assertCovered()
}
Expand All @@ -144,7 +143,7 @@ internal class ReportsFilteringTests {
}
}
run("koverXmlReport") {
xml(defaultXmlReport()) {
xmlReport {
classCounter("org.jetbrains.ExampleClass").assertAbsent()
classCounter("org.jetbrains.Unused").assertAbsent()
classCounter("org.jetbrains.SecondClass").assertFullyCovered()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ internal class VariantUsageTests {
@ExamplesTest("android/variantUsage", [":app:koverXmlReport"])
fun CheckerContext.testAndroidVariantUsage() {
subproject(":app") {
xml(defaultXmlReport()) {
xmlReport {
// check test tasks
checkOutcome(":app:testDebugUnitTest", "SUCCESS")
checkOutcome(":lib:testDebugUnitTest", "SUCCESS")
Expand All @@ -30,7 +30,7 @@ internal class VariantUsageTests {

@ExamplesTest("android/multiplatform", [":koverXmlReport"])
fun CheckerContext.testMultiplatformVariantUsage() {
xml(defaultXmlReport()) {
xmlReport {
// check test tasks
checkOutcome(":app:testDebugUnitTest", "SUCCESS")
checkOutcome(":lib:testDebugUnitTest", "SUCCESS")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,10 @@ private class CheckerContextImpl(
project.buildDir.resolve(name).checker()
}

override fun xml(filename: String, checker: XmlReportChecker.() -> Unit) {
val xmlFile = project.buildDir.resolve(filename)
if (!xmlFile.exists()) throw IllegalStateException("XML file '$filename' not found")
override fun xmlReport(variantName: String, checker: XmlReportChecker.() -> Unit) {
val xmlFilePath = "$defaultReportsDir/report${variantName.capitalized()}.xml"
val xmlFile = project.buildDir.resolve(xmlFilePath)
if (!xmlFile.exists()) throw IllegalStateException("XML file '$xmlFilePath' not found")
XmlReportCheckerImpl(this, xmlFile).checker()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal interface CheckerContext {

fun file(name: String, checker: File.() -> Unit)

fun xml(filename: String, checker: XmlReportChecker.() -> Unit)
fun xmlReport(variantName: String = "", checker: XmlReportChecker.() -> Unit)

fun verification(checker: VerifyReportChecker.() -> Unit)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ internal fun defaultTestTaskName(projectType: KotlinPluginType): String {

internal const val defaultReportsDir = "reports/kover"

internal fun defaultXmlReport() = "$defaultReportsDir/report.xml"

internal fun errorsDirectory() = "kover/errors"

internal const val binReportsDirectory = "kover/bin-reports"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
plugins {
id ("com.android.application")
id ("org.jetbrains.kotlin.android")
id ("org.jetbrains.kotlinx.kover")
}

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
}
}

androidComponents {
beforeVariants { variant ->
variant.enableUnitTest = false
}
}

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")
}

koverReport {
// filters for all report types of all build variants
filters {
excludes {
classes(
"*Fragment",
"*Fragment\$*",
"*Activity",
"*Activity\$*",
"*.databinding.*",
"*.BuildConfig"
)
}
}

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"
)
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<application android:label="@string/app_name">
<uses-library android:name="com.google.android.things" android:required="false" />

<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Make this the first activity that is displayed when the device boots. -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package kotlinx.kover.test.android

object DebugUtil {
fun log(message: String) {
println("DEBUG: $message")
}
}
Original file line number Diff line number Diff line change
@@ -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)
}

}
Original file line number Diff line number Diff line change
@@ -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
}
}
Loading

0 comments on commit 10daf69

Please sign in to comment.