diff --git a/.codecov.yml b/.codecov.yml index b6dfff974..dc014e99d 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -7,7 +7,7 @@ codecov: coverage: precision: 2 round: down - range: "70...100" + range: "50...100" status: project: default: @@ -45,6 +45,9 @@ flags: iterableapi-ui: paths: - iterableapi-ui/src/main/ + app: + paths: + - app/src/main/ comment: layout: "reach,diff,flags,files,footer" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b66088277..f1cd43dd5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,15 +46,17 @@ jobs: - run: touch local.properties - name: Test - run: ./gradlew :iterableapi:jacocoTestDebugUnitTestReport :iterableapi-ui:jacocoTestDebugUnitTestReport :app:jacocoDebugTestReport + run: | + ./gradlew :iterableapi:jacocoTestDebugUnitTestReport :iterableapi-ui:jacocoTestDebugUnitTestReport :app:jacocoDebugTestReport + find . -name "*.xml" -path "*/build/reports/jacoco/*" - name: Upload coverage data uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: unit-tests path: | - ./**/build/**/jacoco*.xml - ./**/build/**/report.xml + ./**/build/reports/jacoco/**/*.xml + ./**/build/reports/coverage/**/*.xml instrumentation-tests: name: Instrumentation tests @@ -97,7 +99,7 @@ jobs: runs-on: ubuntu-latest needs: [unit-tests, instrumentation-tests] env: - JACOCO_SOURCE_PATH: "iterableapi/src/main/java iterableapi-ui/src/main/java" + JACOCO_SOURCE_PATH: "iterableapi/src/main/java iterableapi-ui/src/main/java app/src/main/java" steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -125,10 +127,8 @@ jobs: with: token: ${{ secrets.CODECOV_TOKEN }} files: | - ./iterableapi/build/reports/jacoco/jacocoTestDebugUnitTestReport/jacocoTestDebugUnitTestReport.xml, - ./iterableapi-ui/build/reports/jacoco/jacocoTestDebugUnitTestReport/jacocoTestDebugUnitTestReport.xml, - ./app/build/reports/jacoco/jacocoDebugTestReport/jacocoDebugTestReport.xml, - ./iterableapi/build/reports/coverage/androidTest/debug/connected/report.xml + ./**/build/reports/jacoco/**/*.xml, + ./**/build/reports/coverage/**/*.xml fail_ci_if_error: false verbose: true @@ -136,7 +136,8 @@ jobs: - name: Upload to Codecov via bash uploader env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - run: bash <(curl -s https://codecov.io/bash) -v + run: | + bash <(curl -s https://codecov.io/bash) -v -s "**/build/reports/jacoco/" -s "**/build/reports/coverage/" - uses: actions/cache@v3 with: diff --git a/app/build.gradle b/app/build.gradle index 8c74f9670..f2ac9a5a8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -109,62 +109,26 @@ task jacocoDebugTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) '**/*$ViewInjector*.class', ] - def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter) //we use "debug" build type for test coverage (can be other) - def sdkTree = fileTree(dir: "${buildDir}/../../iterableapi/build/intermediates/javac/debug/classes", excludes: fileFilter) - def sdkUiTree = fileTree(dir: "${buildDir}/../../iterableapi-ui/build/intermediates/javac/debug/classes", excludes: fileFilter) + def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter) + def kotlinDebugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug", excludes: fileFilter) def mainSrc = "${project.projectDir}/src/main/java" - def sdkSrc = "${project.projectDir}/../iterableapi/src/main/java" - def sdkUiSrc = "${project.projectDir}/../iterableapi-ui/src/main/java" - - sourceDirectories.from = files([mainSrc]) - classDirectories.from = files([debugTree]) - additionalSourceDirs.from = files([sdkSrc, sdkUiSrc]) - additionalClassDirs.from = files([sdkTree, sdkUiTree]) - executionData.from = fileTree(dir: "$buildDir", includes: [ - "jacoco/testDebugUnitTest.exec" - ]) -} - -task jacocoDebugAndroidTestReport(type: JacocoReport, dependsOn: ['connectedCheck']) { - group = "reporting" - description = "Generate Jacoco code coverage report for instumentation tests" - - reports { - xml.required = true - html.required = true - csv.required = false + def mainKotlinSrc = "${project.projectDir}/src/main/kotlin" + + sourceDirectories.setFrom(files([mainSrc, mainKotlinSrc])) + classDirectories.setFrom(files([debugTree, kotlinDebugTree])) + + // Only include unit test execution data by default + def execData = fileTree(dir: "$buildDir", includes: ["jacoco/testDebugUnitTest.exec"]) + + // Add instrumentation test data if available + def instrumentationData = fileTree(dir: "$buildDir", includes: ["outputs/code_coverage/debugAndroidTest/connected/**/coverage.ec"]) + if (instrumentationData.files.size() > 0) { + execData.include(instrumentationData.includes) } + + executionData.setFrom(execData) +} - def fileFilter = [ - '**/*Test*.*', - '**/AutoValue_*.*', - '**/*JavascriptBridge.class', - '**/R.class', - '**/R$*.class', - '**/Manifest*.*', - 'android/**/*.*', - '**/BuildConfig.*', - '**/*$ViewBinder*.*', - '**/*$ViewInjector*.*', - '**/Lambda$*.class', - '**/Lambda.class', - '**/*Lambda.class', - '**/*Lambda*.class', - '**/*$InjectAdapter.class', - '**/*$ModuleAdapter.class', - '**/*$ViewInjector*.class', - ] - - def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter) //we use "debug" build type for test coverage (can be other) - def sdkTree = fileTree(dir: "${buildDir}/../../iterableapi/build/intermediates/javac/debug/classes", excludes: fileFilter) - def sdkUiTree = fileTree(dir: "${buildDir}/../../iterableapi-ui/build/intermediates/javac/debug/classes", excludes: fileFilter) - def mainSrc = "${project.projectDir}/src/main/java" - def sdkSrc = "${project.projectDir}/../iterableapi/src/main/java" - def sdkUiSrc = "${project.projectDir}/../iterableapi-ui/src/main/java" - - sourceDirectories.from = files([mainSrc]) - classDirectories.from = files([debugTree]) - additionalSourceDirs.from = files([sdkSrc, sdkUiSrc]) - additionalClassDirs.from = files([sdkTree, sdkUiTree]) - executionData.from = fileTree(dir: "$buildDir", include: "outputs/code_coverage/debugAndroidTest/connected/**/*.ec") +tasks.matching { it.name.contains('jacocoDebugAndroidTestReport') }.all { task -> + task.enabled = false } \ No newline at end of file diff --git a/iterableapi-ui/build.gradle b/iterableapi-ui/build.gradle index dc4c6f417..3df94e5ab 100644 --- a/iterableapi-ui/build.gradle +++ b/iterableapi-ui/build.gradle @@ -113,10 +113,19 @@ task jacocoTestDebugUnitTestReport(type: JacocoReport, dependsOn: ['testDebugUni def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter) def kotlinDebugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug", excludes: fileFilter) def mainSrc = "${project.projectDir}/src/main/java" - - sourceDirectories.from = files([mainSrc]) - classDirectories.from = files([debugTree, kotlinDebugTree]) - executionData.from = fileTree(dir: "$buildDir", includes: [ - "jacoco/testDebugUnitTest.exec" - ]) + def mainKotlinSrc = "${project.projectDir}/src/main/kotlin" + + sourceDirectories.setFrom(files([mainSrc, mainKotlinSrc])) + classDirectories.setFrom(files([debugTree, kotlinDebugTree])) + + // Only include unit test execution data by default + def execData = fileTree(dir: "$buildDir", includes: ["jacoco/testDebugUnitTest.exec"]) + + // Add instrumentation test data if available + def instrumentationData = fileTree(dir: "$buildDir", includes: ["outputs/code_coverage/debugAndroidTest/connected/**/coverage.ec"]) + if (instrumentationData.files.size() > 0) { + execData.include(instrumentationData.includes) + } + + executionData.setFrom(execData) } diff --git a/iterableapi/build.gradle b/iterableapi/build.gradle index da4cb2b58..667ec340f 100644 --- a/iterableapi/build.gradle +++ b/iterableapi/build.gradle @@ -151,10 +151,19 @@ task jacocoTestDebugUnitTestReport(type: JacocoReport, dependsOn: ['testDebugUni def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter) def kotlinDebugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug", excludes: fileFilter) def mainSrc = "${project.projectDir}/src/main/java" - - sourceDirectories.from = files([mainSrc]) - classDirectories.from = files([debugTree, kotlinDebugTree]) - executionData.from = fileTree(dir: "$buildDir", includes: [ - "jacoco/testDebugUnitTest.exec" - ]) + def mainKotlinSrc = "${project.projectDir}/src/main/kotlin" + + sourceDirectories.setFrom(files([mainSrc, mainKotlinSrc])) + classDirectories.setFrom(files([debugTree, kotlinDebugTree])) + + // Only include unit test execution data by default + def execData = fileTree(dir: "$buildDir", includes: ["jacoco/testDebugUnitTest.exec"]) + + // Add instrumentation test data if available + def instrumentationData = fileTree(dir: "$buildDir", includes: ["outputs/code_coverage/debugAndroidTest/connected/**/coverage.ec"]) + if (instrumentationData.files.size() > 0) { + execData.include(instrumentationData.includes) + } + + executionData.setFrom(execData) } \ No newline at end of file