diff --git a/build.gradle b/build.gradle index b2b0d01a0..f0e877a16 100644 --- a/build.gradle +++ b/build.gradle @@ -15,8 +15,8 @@ plugins { id 'org.sonarqube' version '3.4.0.2513' id 'uk.gov.hmcts.java' version '0.12.27' id "com.jfrog.bintray" version "1.8.5" apply false - id "info.solidsoft.pitest" version '1.5.1' apply(false) id "org.jetbrains.gradle.plugin.idea-ext" version "0.7" + id "info.solidsoft.pitest" version '1.5.1' apply false } group = 'uk.gov.hmcts.civil.sdt' @@ -210,6 +210,8 @@ allprojects { annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombokVersion implementation group: 'org.projectlombok', name: 'lombok', version: lombokVersion testImplementation group: 'org.projectlombok', name: 'lombok', version: lombokVersion + testImplementation 'junit:junit:4.13' + testImplementation 'io.rest-assured:rest-assured:4.3.0' testImplementation ("org.springframework.boot:spring-boot-starter-test"){ exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' @@ -313,6 +315,7 @@ subprojects { subproject -> apply plugin: 'io.spring.dependency-management' apply plugin: 'jacoco' apply plugin: 'uk.gov.hmcts.java' + apply plugin: 'info.solidsoft.pitest' sourceSets { unitTest { @@ -452,7 +455,6 @@ subprojects { subproject -> exclude group: 'junit', module: 'junit' exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } - testImplementation group: 'info.solidsoft.gradle.pitest', name: 'gradle-pitest-plugin', version: '1.4.0' testImplementation group: 'org.easymock', name: 'easymock', version: '5.0.1' testImplementation group: 'org.jdom', name: 'jdom2', version: '2.0.6.1' testImplementation group: 'org.dbunit', name: 'dbunit', version: '2.7.3' @@ -463,14 +465,18 @@ subprojects { subproject -> tests to fail when running under openJDK 11.0.17 and above. This dependency can be removed when the bug is fixed. */ testImplementation group: 'xerces', name: 'xercesImpl', version: '2.12.2' + + testImplementation group: 'org.codehaus.sonar-plugins', name: 'sonar-pitest-plugin', version: '0.5' } - sonarqube { - properties { + sonarqube { + properties { property "sonar.sources", "src" property "sonar.tests", "src" property "sonar.test.inclusions", "**/unit-test/**,**/integ-test/**" property "sonar.coverage.jacoco.xmlReportPaths", "${rootDir}/build/reports/jacoco/codeCoverageReport/codeCoverageReport.xml" + property "sonar.pitest.mode", "reuseReport" + property "sonar.pitest.reportsDirectory", "build/reports/pitest" } } @@ -583,6 +589,25 @@ subprojects { subproject -> test.finalizedBy jacocoTestReport check.dependsOn jacocoTestReport + + pitest { + // Note: targetClasses and targetTests are defined in each module's build.gradle file + enableDefaultIncrementalAnalysis = true + historyInputLocation = 'build/reports/pitest/fastermutationtesting' + historyOutputLocation = 'build/reports/pitest/fastermutationtestingoutput' + threads = 15 + testSourceSets = [sourceSets.unitTest] + fileExtensionsToFilter.addAll('xml', 'json') + outputFormats = ['XML', 'HTML', 'CSV'] + mutationThreshold = 0 + coverageThreshold = 0 + maxMutationsPerClass = 15 + jvmArgs = ['-Xms1G', '-Xmx3G'] + timestampedReports = false + failWhenNoMutations = false + detectInlinedCode = true + junit5PluginVersion = '0.14' + } } // end::subprojects[] diff --git a/config/owasp/suppressions.xml b/config/owasp/suppressions.xml index eabdc6b8c..a510c4af2 100644 --- a/config/owasp/suppressions.xml +++ b/config/owasp/suppressions.xml @@ -4,7 +4,7 @@ False Positives - CVE-2022-40705 - see https://github.com/jeremylong/DependencyCheck/issues/5543 + CVE-2022-40705 - see https://github.com/jeremylong/DependencyCheck/issues/5543 CVE-2022-40705 diff --git a/consumers/build.gradle b/consumers/build.gradle index 1a273653b..d2942584f 100644 --- a/consumers/build.gradle +++ b/consumers/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-consumers' @@ -16,18 +14,9 @@ dependencies { implementation project(':producers') implementation project(':transformers') implementation project(':utils') - testImplementation project(':interceptors').sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.unitTest.output - testImplementation project(":producers-api").sourceSets.unitTest.output - testImplementation project(":producers").sourceSets.unitTest.output - testImplementation project(":transformers").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(':interceptors').sourceSets.integTest.output - testImplementation project(":domain").sourceSets.integTest.output - testImplementation project(":producers-api").sourceSets.integTest.output - testImplementation project(":producers").sourceSets.integTest.output - testImplementation project(":transformers").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -38,3 +27,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.consumers.*'] + targetTests = ['uk.gov.moj.sdt.consumers.*'] +} diff --git a/dao-api/build.gradle b/dao-api/build.gradle index e1c40bcee..cd708a6ad 100644 --- a/dao-api/build.gradle +++ b/dao-api/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-dao-api' @@ -12,10 +10,9 @@ dependencyCheck { dependencies { implementation project(':domain') implementation project(':utils') - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -30,3 +27,8 @@ tasks.withType(Test) { sonarqube { skipProject = true } + +pitest { + targetClasses = ['uk.gov.moj.sdt.dao.api.*'] + targetTests = ['uk.gov.moj.sdt.dao.api.*'] +} diff --git a/dao/build.gradle b/dao/build.gradle index 21171f06a..d2705ddcd 100644 --- a/dao/build.gradle +++ b/dao/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-dao' @@ -13,12 +11,9 @@ dependencies { implementation project(':dao-api') implementation project(':domain') implementation project(':utils') - testImplementation project(":dao-api").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":dao-api").sourceSets.integTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -30,3 +25,7 @@ tasks.withType(Test) { useJUnitPlatform() } +pitest { + targetClasses = ['uk.gov.moj.sdt.dao.*'] + targetTests = ['uk.gov.moj.sdt.dao.*'] +} diff --git a/domain/build.gradle b/domain/build.gradle index 14fdc7c1c..dacb5aaec 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -1,8 +1,6 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true - archiveBaseName = 'civil-sdt-domin' + archiveBaseName = 'civil-sdt-domain' } dependencyCheck { @@ -22,3 +20,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.domain.*'] + targetTests = ['uk.gov.moj.sdt.domain.*'] +} diff --git a/handlers-api/build.gradle b/handlers-api/build.gradle index bd1de0b0f..c5f907885 100644 --- a/handlers-api/build.gradle +++ b/handlers-api/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-handlers-api' @@ -14,15 +12,10 @@ dependencies { implementation project(":utils") implementation project(":producers-api") implementation project(":validators") - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":producers-api").sourceSets.unitTest.output - testImplementation project(":validators").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output - testImplementation project(":producers-api").sourceSets.integTest.output - testImplementation project(":validators").sourceSets.integTest.output } bootJar { @@ -32,3 +25,8 @@ bootJar { sonarqube { skipProject = true } + +pitest { + targetClasses = ['uk.gov.moj.sdt.handlers.*'] + targetTests = ['uk.gov.moj.sdt.handlers.*'] +} diff --git a/handlers/build.gradle b/handlers/build.gradle index f55fc515a..265325a14 100644 --- a/handlers/build.gradle +++ b/handlers/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-handlers' @@ -17,21 +15,10 @@ dependencies { implementation project(':services-api') implementation project(':transformers') implementation project(':validators') - testImplementation project(":domain").sourceSets.unitTest.output - testImplementation project(":handlers-api").sourceSets.unitTest.output - testImplementation project(":producers-api").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(':services-api').sourceSets.unitTest.output - testImplementation project(':transformers').sourceSets.unitTest.output - testImplementation project(':validators').sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.integTest.output - testImplementation project(":handlers-api").sourceSets.integTest.output - testImplementation project(":producers-api").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output - testImplementation project(':services-api').sourceSets.integTest.output - testImplementation project(':transformers').sourceSets.integTest.output - testImplementation project(':validators').sourceSets.integTest.output } bootJar { @@ -41,3 +28,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.handlers.*'] + targetTests = ['uk.gov.moj.sdt.handlers.*'] +} diff --git a/interceptors/build.gradle b/interceptors/build.gradle index 1091f99e2..8d5e06129 100644 --- a/interceptors/build.gradle +++ b/interceptors/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-interceptors' @@ -14,14 +12,9 @@ dependencies { implementation project(':dao-api') implementation project(':domain') implementation project(':utils') - testImplementation project(":dao").sourceSets.unitTest.output - testImplementation project(":dao-api").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":dao").sourceSets.integTest.output - testImplementation project(":dao-api").sourceSets.integTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -32,3 +25,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.interceptors.*'] + targetTests = ['uk.gov.moj.sdt.interceptors.*'] +} diff --git a/producers-api/build.gradle b/producers-api/build.gradle index c813f8b91..c6b28db0b 100644 --- a/producers-api/build.gradle +++ b/producers-api/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - sourceSets.main.java.srcDirs += "src-gen/main/java" jar { @@ -14,10 +12,9 @@ dependencyCheck { dependencies { implementation project(':domain') implementation project(':utils') - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -82,4 +79,3 @@ task targetAppInternalEndpointWsdl2Java(type: JavaExec) { compileJava.dependsOn 'sdtEndPointWsdl2Java' compileJava.dependsOn 'sdtInternalEndpointWsdl2Java' compileJava.dependsOn 'targetAppInternalEndpointWsdl2Java' - diff --git a/producers-commissioning/build.gradle b/producers-commissioning/build.gradle index 22271a90b..1f93743a3 100644 --- a/producers-commissioning/build.gradle +++ b/producers-commissioning/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - dependencyCheck { suppressionFile = "${rootDir}/config/owasp/suppressions.xml" } diff --git a/producers/build.gradle b/producers/build.gradle index b6e95ed02..7e67d3353 100644 --- a/producers/build.gradle +++ b/producers/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-producers' @@ -15,17 +13,10 @@ dependencies { implementation project(':utils') implementation project(':producers-api') implementation project(':handlers-api') - testImplementation project(":handlers").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(':producers-api').sourceSets.unitTest.output - testImplementation project(":handlers-api").sourceSets.unitTest.output - testImplementation project(":handlers").sourceSets.integTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output - testImplementation project(':producers-api').sourceSets.integTest.output - testImplementation project(":handlers-api").sourceSets.integTest.output } bootJar { @@ -35,3 +26,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.producers.*'] + targetTests = ['uk.gov.moj.sdt.producers.*'] +} diff --git a/sdt-consumer-sample/build.gradle b/sdt-consumer-sample/build.gradle index 5a8774cf1..49759c2e0 100644 --- a/sdt-consumer-sample/build.gradle +++ b/sdt-consumer-sample/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - dependencyCheck { suppressionFile = "${rootDir}/config/owasp/suppressions.xml" } diff --git a/services-api/build.gradle b/services-api/build.gradle index 675091365..fbb9ad9de 100644 --- a/services-api/build.gradle +++ b/services-api/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-services-api' @@ -12,10 +10,9 @@ dependencyCheck { dependencies { implementation project(':domain') implementation project(':utils') - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -30,3 +27,8 @@ tasks.withType(Test) { sonarqube { skipProject = true } + +pitest { + targetClasses = ['uk.gov.moj.sdt.services.*'] + targetTests = ['uk.gov.moj.sdt.services.*'] +} diff --git a/services/build.gradle b/services/build.gradle index 2913fd194..613d2c0ad 100644 --- a/services/build.gradle +++ b/services/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-services' @@ -18,23 +16,12 @@ dependencies { implementation project(':services-api') implementation project(':utils') implementation project(':validators') - testImplementation project(":consumers").sourceSets.unitTest.output - testImplementation project(":dao").sourceSets.unitTest.output - testImplementation project(":dao-api").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.unitTest.output - testImplementation project(":interceptors").sourceSets.unitTest.output - testImplementation project(":services-api").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":validators").sourceSets.unitTest.output testImplementation project(":consumers").sourceSets.integTest.output testImplementation project(":dao").sourceSets.integTest.output - testImplementation project(":dao-api").sourceSets.integTest.output - testImplementation project(":domain").sourceSets.integTest.output - testImplementation project(":interceptors").sourceSets.integTest.output - testImplementation project(":services-api").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output - testImplementation project(":validators").sourceSets.integTest.output } bootJar { @@ -44,3 +31,8 @@ bootJar { tasks.withType(Test) { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.services.*'] + targetTests = ['uk.gov.moj.sdt.services.*'] +} diff --git a/transformers/build.gradle b/transformers/build.gradle index 6336a72d9..95b297336 100644 --- a/transformers/build.gradle +++ b/transformers/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-transformers' @@ -13,12 +11,9 @@ dependencies { implementation project(':domain') implementation project(':producers-api') implementation project(':utils') - testImplementation project(":domain").sourceSets.unitTest.output - testImplementation project(":producers-api").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.integTest.output - testImplementation project(":producers-api").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -29,3 +24,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.transformers.*'] + targetTests = ['uk.gov.moj.sdt.transformers.*'] +} diff --git a/utils/build.gradle b/utils/build.gradle index 308a82bcb..25cb5afdf 100644 --- a/utils/build.gradle +++ b/utils/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-utils' @@ -16,3 +14,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.utils.*'] + targetTests = ['uk.gov.moj.sdt.utils.*'] +} diff --git a/utils/src/unit-test/java/uk/gov/moj/sdt/utils/logging/LoggingContextTest.java b/utils/src/unit-test/java/uk/gov/moj/sdt/utils/logging/LoggingContextTest.java index e2f655322..9e3617adf 100644 --- a/utils/src/unit-test/java/uk/gov/moj/sdt/utils/logging/LoggingContextTest.java +++ b/utils/src/unit-test/java/uk/gov/moj/sdt/utils/logging/LoggingContextTest.java @@ -30,28 +30,24 @@ * $LastChangedBy: $ */ package uk.gov.moj.sdt.utils.logging; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - +import uk.gov.moj.sdt.utils.AbstractSdtUnitTestBase; +import uk.gov.moj.sdt.utils.logging.api.ILoggingContext; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import uk.gov.moj.sdt.utils.logging.api.ILoggingContext; +import static org.junit.jupiter.api.Assertions.assertTrue; -class LoggingContextTest { +class LoggingContextTest extends AbstractSdtUnitTestBase { ILoggingContext loggingContext; - @BeforeEach - public void setUpLocalTests() { + @Override + public void setUpLocalTests() { loggingContext = new LoggingContext(); - } - @Test - void setMinorLoggingIdTest(){ + void setMinorLoggingIdTest() { //given @@ -62,7 +58,7 @@ void setMinorLoggingIdTest(){ } @Test - void setMajorLoggingIdTest(){ + void setMajorLoggingIdTest() { //given @@ -73,7 +69,7 @@ void setMajorLoggingIdTest(){ } @Test - void getLoggingIdTest(){ + void getLoggingIdTest() { //given @@ -85,7 +81,7 @@ void getLoggingIdTest(){ } @Test - void getLoggingMajorIdOnlyTest(){ + void getLoggingMajorIdOnlyTest() { //given //when @@ -96,15 +92,12 @@ void getLoggingMajorIdOnlyTest(){ } @Test - void getNextLoggingIdTest(){ + void getNextLoggingIdTest() { - //given - - //when - loggingContext.setMinorLoggingId(1L); - loggingContext.setMajorLoggingId(2L); - - //then - assertEquals(1L, LoggingContext.getNextLoggingId()); + // Threads created by mutation tests cause the static logging id to be incremented more than once. To + // prevent "Test will only pass if mutated" error during mutation test just check that logging id is + // incremented by getNextLoggingId() rather than the value returned being equal to an expected value. + long loggingId = LoggingContext.getNextLoggingId(); + assertTrue(LoggingContext.getNextLoggingId() > loggingId, "LoggingId should have been incremented"); } } diff --git a/validators/build.gradle b/validators/build.gradle index 4b7737091..cf3d8423f 100644 --- a/validators/build.gradle +++ b/validators/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'info.solidsoft.pitest' - jar { enabled = true archiveBaseName = 'civil-sdt-validators' @@ -14,14 +12,9 @@ dependencies { implementation project(':dao-api') implementation project(':domain') implementation project(':utils') - testImplementation project(":dao").sourceSets.unitTest.output - testImplementation project(":dao-api").sourceSets.unitTest.output - testImplementation project(":domain").sourceSets.unitTest.output + testImplementation project(":utils").sourceSets.unitTest.output - testImplementation project(":dao").sourceSets.integTest.output - testImplementation project(":dao-api").sourceSets.integTest.output - testImplementation project(":domain").sourceSets.integTest.output testImplementation project(":utils").sourceSets.integTest.output } @@ -32,3 +25,8 @@ bootJar { test { useJUnitPlatform() } + +pitest { + targetClasses = ['uk.gov.moj.sdt.validators.*'] + targetTests = ['uk.gov.moj.sdt.validators.*'] +}