All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kotlinx.kover.maven.plugin.mojo.VerifyMojo.kt Maven / Gradle / Ivy

/*
 * Copyright 2017-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

package kotlinx.kover.maven.plugin.mojo

import kotlinx.kover.features.jvm.*
import kotlinx.kover.maven.plugin.MavenBound
import kotlinx.kover.maven.plugin.MavenRule
import kotlinx.kover.maven.plugin.MavenRuleFilters
import kotlinx.kover.maven.plugin.mojo.abstracts.AbstractCoverageTaskMojo
import org.apache.maven.plugin.MojoFailureException
import org.apache.maven.plugins.annotations.LifecyclePhase
import org.apache.maven.plugins.annotations.Mojo
import org.apache.maven.plugins.annotations.Parameter
import java.io.File

/**
 * Mojo to verify coverage by specified rules.
 */
@Mojo(name = "verify", defaultPhase = LifecyclePhase.VERIFY)
class VerifyMojo : AbstractCoverageTaskMojo() {
    @Parameter(property = "kover.warningInsteadOfFailure", defaultValue = "false", required = true)
    private var warningInsteadOfFailure: Boolean = false

    @Parameter
    private val rules: MutableList = mutableListOf()

    override fun processCoverage(
        binaryReports: List,
        outputDirs: List,
        sourceDirs: List,
        filters: ClassFilters
    ) {
        if (rules.isEmpty()) {
            log.info("No Kover verification rules")
            return
        }

        val tempDir = tempDirectory()

        val violations = mutableListOf()
        // verify rules with filters inherited from mojo
        val rulesWithDefaultFilters = rules.filter { filter -> filter.filters == null }
        violations += KoverLegacyFeatures.verify(
            rulesWithDefaultFilters.map { it.convert() },
            tempDir,
            filters,
            binaryReports,
            outputDirs
        )

        // verify rules with own filters
        rules.filter { filter -> filter.filters != null }.forEach { rule ->
            violations += KoverLegacyFeatures.verify(
                listOf(rule.convert()),
                tempDir,
                rule.filters!!.convert(),
                binaryReports,
                outputDirs
            )
        }

        if (violations.isEmpty()) {
            log.info("Coverage rule checks passed successfully")
        } else {
            val message = "Kover Verification Error\n" + KoverLegacyFeatures.violationMessage(violations)
            if (warningInsteadOfFailure) {
                log.warn(message)
            } else {
                throw MojoFailureException(message)
            }
        }
    }

    private fun MavenRule.convert(): Rule {
        return Rule(name, groupBy, bounds.map { it.convert() })
    }

    private fun MavenBound.convert(): Bound {
        return Bound(minValue?.toBigDecimal(), maxValue?.toBigDecimal(), coverageUnits, aggregationForGroup)
    }

    private fun MavenRuleFilters.convert(): ClassFilters {
        return ClassFilters(
            includes?.classes?.toSet() ?: emptySet(),
            excludes?.classes?.toSet() ?: emptySet(),
            includes?.annotatedBy?.toSet() ?: emptySet(),
            excludes?.annotatedBy?.toSet() ?: emptySet(),
            includes?.inheritedFrom?.toSet() ?: emptySet(),
            excludes?.inheritedFrom?.toSet() ?: emptySet()
        )
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy