From a88dc8026b54a8aeaa7bc555c928cca4ff83ad16 Mon Sep 17 00:00:00 2001 From: Nikita Stroganov Date: Mon, 11 Jul 2022 16:00:06 +0300 Subject: [PATCH 1/4] Support for excluding private methods in utbot-gradle (#482) --- .../plugin/sarif/SarifExtensionProvider.kt | 5 +++ .../plugin/sarif/TargetClassWrapper.kt | 16 ++++++-- utbot-gradle/docs/utbot-gradle.md | 7 ++++ .../plugin/extension/SarifGradleExtension.kt | 6 +++ .../extension/SarifGradleExtensionProvider.kt | 5 +++ .../plugin/wrappers/SourceSetWrapper.kt | 3 +- .../SarifGradleExtensionProviderTest.kt | 37 +++++++++++++++++++ utbot-maven/docs/utbot-maven.md | 5 +++ .../plugin/GenerateTestsAndSarifReportMojo.kt | 6 +++ .../SarifMavenConfigurationProvider.kt | 3 ++ .../plugin/wrappers/MavenProjectWrapper.kt | 3 +- .../SarifMavenConfigurationProviderTest.kt | 7 +++- .../test/resources/project-to-test/pom.xml | 1 + 13 files changed, 97 insertions(+), 7 deletions(-) diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/SarifExtensionProvider.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/SarifExtensionProvider.kt index 46e65a514a..a8a633ec0d 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/SarifExtensionProvider.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/SarifExtensionProvider.kt @@ -39,6 +39,11 @@ interface SarifExtensionProvider { */ val markGeneratedTestsDirectoryAsTestSourcesRoot: Boolean + /** + * Generate tests for private methods or not. + */ + val testPrivateMethods: Boolean + val testFramework: TestFramework val mockFramework: MockFramework diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt index e0e51c2ed7..73b9d2c8db 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt @@ -4,6 +4,7 @@ import org.utbot.framework.plugin.api.UtMethod import java.io.File import kotlin.reflect.KCallable import kotlin.reflect.KClass +import kotlin.reflect.KVisibility import kotlin.reflect.jvm.kotlinFunction /** @@ -14,13 +15,22 @@ data class TargetClassWrapper( val classUnderTest: KClass<*>, val sourceCodeFile: File, val testsCodeFile: File, - val sarifReportFile: File + val sarifReportFile: File, + val testPrivateMethods: Boolean = false ) { /** * Returns the methods of the class [classUnderTest] declared by the user. */ - fun targetMethods() = - classUnderTest.java.declaredMethods.map { + val targetMethods: List> = run { + val declaredMethods = classUnderTest.java.declaredMethods.map { UtMethod(it.kotlinFunction as KCallable<*>, classUnderTest) } + if (testPrivateMethods) { + declaredMethods + } else { + declaredMethods.filter { + it.callable.visibility != KVisibility.PRIVATE + } + } + } } \ No newline at end of file diff --git a/utbot-gradle/docs/utbot-gradle.md b/utbot-gradle/docs/utbot-gradle.md index 9a66118212..6284b72068 100644 --- a/utbot-gradle/docs/utbot-gradle.md +++ b/utbot-gradle/docs/utbot-gradle.md @@ -40,6 +40,7 @@ __Groovy:__ generatedTestsRelativeRoot = 'build/generated/test' sarifReportsRelativeRoot = 'build/generated/sarif' markGeneratedTestsDirectoryAsTestSourcesRoot = true + testPrivateMethods = false testFramework = 'junit5' mockFramework = 'mockito' generationTimeout = 60000L @@ -58,6 +59,7 @@ __Kotlin DSL:__ generatedTestsRelativeRoot.set("build/generated/test") sarifReportsRelativeRoot.set("build/generated/sarif") markGeneratedTestsDirectoryAsTestSourcesRoot.set(true) + testPrivateMethods.set(false) testFramework.set("junit5") mockFramework.set("mockito") generationTimeout.set(60000L) @@ -78,6 +80,7 @@ generateTestsAndSarifReport -PprojectRoot='C:/.../SomeDirectory' -PgeneratedTestsRelativeRoot='build/generated/test' -PsarifReportsRelativeRoot='build/generated/sarif' + -PtestPrivateMethods='false' -PtestFramework=junit5 -PmockFramework=mockito -PgenerationTimeout=60000 @@ -112,6 +115,10 @@ generateTestsAndSarifReport - Mark the directory with generated tests as `test sources root` or not. - By default, `true` is used. +- `testPrivateMethods`– + - Generate tests for private methods or not. + - By default, `false` is used. + - `testFramework` – - The name of the test framework to be used. - Can be one of: diff --git a/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtension.kt b/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtension.kt index 1ebbc1dfda..7737836899 100644 --- a/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtension.kt +++ b/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtension.kt @@ -43,6 +43,12 @@ abstract class SarifGradleExtension { @get:Input abstract val markGeneratedTestsDirectoryAsTestSourcesRoot: Property + /** + * Generate tests for private methods or not. + */ + @get:Input + abstract val testPrivateMethods: Property + /** * Can be one of: 'junit4', 'junit5', 'testng'. */ diff --git a/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProvider.kt b/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProvider.kt index 0784115db8..0464a51b28 100644 --- a/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProvider.kt +++ b/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProvider.kt @@ -52,6 +52,11 @@ class SarifGradleExtensionProvider( get() = extension.markGeneratedTestsDirectoryAsTestSourcesRoot.orNull ?: true + override val testPrivateMethods: Boolean + get() = taskParameters["testPrivateMethods"]?.let { it == "true"} + ?: extension.testPrivateMethods.orNull + ?: false + override val testFramework: TestFramework get() = (taskParameters["testFramework"] ?: extension.testFramework.orNull) ?.let(::testFrameworkParse) diff --git a/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapper.kt b/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapper.kt index 47dff001b8..2b306a514c 100644 --- a/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapper.kt +++ b/utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapper.kt @@ -90,7 +90,8 @@ class SourceSetWrapper( classUnderTest, sourceCodeFile, createTestsCodeFile(classFqn), - createSarifReportFile(classFqn) + createSarifReportFile(classFqn), + parentProject.sarifProperties.testPrivateMethods ) } diff --git a/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProviderTest.kt b/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProviderTest.kt index d52610a6b6..8db032a787 100644 --- a/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProviderTest.kt +++ b/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProviderTest.kt @@ -211,6 +211,43 @@ class SarifGradleExtensionProviderTest { } } + @Nested + @DisplayName("testPrivateMethods") + inner class TestPrivateMethodsTest { + @Test + fun `should be false by default`() { + setTestPrivateMethodsInExtension(null) + assertEquals(false, extensionProvider.testPrivateMethods) + } + + @Test + fun `should be provided from the extension`() { + setTestPrivateMethodsInExtension(true) + assertEquals(true, extensionProvider.testPrivateMethods) + } + + @Test + fun `should be provided from the task parameters`() { + setTestPrivateMethodsInTaskParameters(true) + assertEquals(true, extensionProvider.testPrivateMethods) + } + + @Test + fun `should be provided from the task parameters, not from the extension`() { + setTestPrivateMethodsInTaskParameters(false) + setTestPrivateMethodsInExtension(true) + assertEquals(false, extensionProvider.testPrivateMethods) + } + + private fun setTestPrivateMethodsInExtension(value: Boolean?) { + Mockito.`when`(extensionMock.testPrivateMethods).thenReturn(createBooleanProperty(value)) + } + + private fun setTestPrivateMethodsInTaskParameters(value: Boolean) { + extensionProvider.taskParameters = mapOf("testPrivateMethods" to "$value") + } + } + @Nested @DisplayName("testFramework") inner class TestFrameworkTest { diff --git a/utbot-maven/docs/utbot-maven.md b/utbot-maven/docs/utbot-maven.md index d0949de8ca..33dc3a7af9 100644 --- a/utbot-maven/docs/utbot-maven.md +++ b/utbot-maven/docs/utbot-maven.md @@ -40,6 +40,7 @@ For example, the following configuration may be used: target/generated/test target/generated/sarif true + false junit5 mockito 60000L @@ -79,6 +80,10 @@ For example, the following configuration may be used: - Mark the directory with generated tests as `test sources root` or not. - By default, `true` is used. +- `testPrivateMethods`– + - Generate tests for private methods or not. + - By default, `false` is used. + - `testFramework` – - The name of the test framework to be used. - Can be one of: diff --git a/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/GenerateTestsAndSarifReportMojo.kt b/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/GenerateTestsAndSarifReportMojo.kt index 3728b39162..bedc8b9c41 100644 --- a/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/GenerateTestsAndSarifReportMojo.kt +++ b/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/GenerateTestsAndSarifReportMojo.kt @@ -71,6 +71,12 @@ class GenerateTestsAndSarifReportMojo : AbstractMojo() { @Parameter(defaultValue = "true") internal var markGeneratedTestsDirectoryAsTestSourcesRoot: Boolean = true + /** + * Generate tests for private methods or not. + */ + @Parameter(defaultValue = "false") + internal var testPrivateMethods: Boolean = false + /** * Can be one of: 'junit4', 'junit5', 'testng'. */ diff --git a/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProvider.kt b/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProvider.kt index 985308fc0a..7864898ad1 100644 --- a/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProvider.kt +++ b/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProvider.kt @@ -33,6 +33,9 @@ class SarifMavenConfigurationProvider( override val markGeneratedTestsDirectoryAsTestSourcesRoot: Boolean get() = generateTestsAndSarifReportMojo.markGeneratedTestsDirectoryAsTestSourcesRoot + override val testPrivateMethods: Boolean + get() = generateTestsAndSarifReportMojo.testPrivateMethods + override val testFramework: TestFramework get() = testFrameworkParse(generateTestsAndSarifReportMojo.testFramework) diff --git a/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/wrappers/MavenProjectWrapper.kt b/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/wrappers/MavenProjectWrapper.kt index bd72310590..99176c11c8 100644 --- a/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/wrappers/MavenProjectWrapper.kt +++ b/utbot-maven/src/main/kotlin/org/utbot/maven/plugin/wrappers/MavenProjectWrapper.kt @@ -125,7 +125,8 @@ class MavenProjectWrapper( classUnderTest, sourceCodeFile, createTestsCodeFile(classFqn), - createSarifReportFile(classFqn) + createSarifReportFile(classFqn), + sarifProperties.testPrivateMethods ) } diff --git a/utbot-maven/src/test/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProviderTest.kt b/utbot-maven/src/test/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProviderTest.kt index a9bcc6317f..3e2663dbf2 100644 --- a/utbot-maven/src/test/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProviderTest.kt +++ b/utbot-maven/src/test/kotlin/org/utbot/maven/plugin/extension/SarifMavenConfigurationProviderTest.kt @@ -52,18 +52,21 @@ class SarifMavenConfigurationProviderTest : AbstractMojoTestCase() { Assertions.assertEquals(true, configurationProvider.markGeneratedTestsDirectoryAsTestSourcesRoot) } + @Test + fun `testPrivateMethods should be provided from the configuration`() { + Assertions.assertEquals(true, configurationProvider.testPrivateMethods) + } + @Test fun `testFramework should be provided from the configuration`() { Assertions.assertEquals(Junit5, configurationProvider.testFramework) } - @Test fun `mockFramework should be provided from the configuration`() { Assertions.assertEquals(MockFramework.MOCKITO, configurationProvider.mockFramework) } - @Test fun `generationTimeout should be provided from the configuration`() { Assertions.assertEquals(10000, configurationProvider.generationTimeout) diff --git a/utbot-maven/src/test/resources/project-to-test/pom.xml b/utbot-maven/src/test/resources/project-to-test/pom.xml index e5e3f239b7..65897fb59f 100644 --- a/utbot-maven/src/test/resources/project-to-test/pom.xml +++ b/utbot-maven/src/test/resources/project-to-test/pom.xml @@ -30,6 +30,7 @@ target/generated/test target/generated/sarif true + true junit5 mockito 10000 From b740a5203401a5429b149dd985f7bcce344cd2e0 Mon Sep 17 00:00:00 2001 From: Nikita Stroganov Date: Tue, 12 Jul 2022 10:26:45 +0300 Subject: [PATCH 2/4] Fix after review --- .../plugin/sarif/TargetClassWrapper.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt index 73b9d2c8db..a2c2698ca9 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/TargetClassWrapper.kt @@ -1,10 +1,10 @@ package org.utbot.framework.plugin.sarif import org.utbot.framework.plugin.api.UtMethod +import org.utbot.framework.plugin.api.util.executableId import java.io.File import kotlin.reflect.KCallable import kotlin.reflect.KClass -import kotlin.reflect.KVisibility import kotlin.reflect.jvm.kotlinFunction /** @@ -22,15 +22,16 @@ data class TargetClassWrapper( * Returns the methods of the class [classUnderTest] declared by the user. */ val targetMethods: List> = run { - val declaredMethods = classUnderTest.java.declaredMethods.map { - UtMethod(it.kotlinFunction as KCallable<*>, classUnderTest) - } - if (testPrivateMethods) { - declaredMethods + val allDeclaredMethods = classUnderTest.java.declaredMethods + val neededDeclaredMethods = if (testPrivateMethods) { + allDeclaredMethods.toList() } else { - declaredMethods.filter { - it.callable.visibility != KVisibility.PRIVATE + allDeclaredMethods.filter { + !it.executableId.isPrivate } } + neededDeclaredMethods.map { + UtMethod(it.kotlinFunction as KCallable<*>, classUnderTest) + } } } \ No newline at end of file From 92b68acd97fb9476756469ea87e0a575cd540a59 Mon Sep 17 00:00:00 2001 From: Nikita Stroganov Date: Tue, 12 Jul 2022 17:07:21 +0300 Subject: [PATCH 3/4] Add mocking to tests --- .../org/utbot/gradle/plugin/wrappers/SourceSetWrapperTest.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapperTest.kt b/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapperTest.kt index 5a98a7354c..e315c3021c 100644 --- a/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapperTest.kt +++ b/utbot-gradle/src/test/kotlin/org/utbot/gradle/plugin/wrappers/SourceSetWrapperTest.kt @@ -30,6 +30,7 @@ class SourceSetWrapperTest { Mockito.`when`(sarifPropertiesMock.codegenLanguage).thenReturn(CodegenLanguage.JAVA) Mockito.`when`(sarifPropertiesMock.generatedTestsRelativeRoot).thenReturn("test") Mockito.`when`(sarifPropertiesMock.sarifReportsRelativeRoot).thenReturn("sarif") + Mockito.`when`(sarifPropertiesMock.testPrivateMethods).thenReturn(true) val gradleProject = GradleProjectWrapper(project, sarifPropertiesMock) val sourceSetWrapper = SourceSetWrapper(project.mainSourceSet, gradleProject) @@ -47,6 +48,7 @@ class SourceSetWrapperTest { Mockito.`when`(sarifPropertiesMock.codegenLanguage).thenReturn(CodegenLanguage.JAVA) Mockito.`when`(sarifPropertiesMock.generatedTestsRelativeRoot).thenReturn("test") Mockito.`when`(sarifPropertiesMock.sarifReportsRelativeRoot).thenReturn("sarif") + Mockito.`when`(sarifPropertiesMock.testPrivateMethods).thenReturn(true) val gradleProject = GradleProjectWrapper(project, sarifPropertiesMock) val sourceSetWrapper = SourceSetWrapper(project.mainSourceSet, gradleProject) @@ -66,6 +68,7 @@ class SourceSetWrapperTest { Mockito.`when`(sarifPropertiesMock.generatedTestsRelativeRoot).thenReturn("test") Mockito.`when`(sarifPropertiesMock.sarifReportsRelativeRoot).thenReturn("sarif") + Mockito.`when`(sarifPropertiesMock.testPrivateMethods).thenReturn(true) val gradleProject = GradleProjectWrapper(project, sarifPropertiesMock) val sourceSetWrapper = SourceSetWrapper(project.mainSourceSet, gradleProject) @@ -79,6 +82,7 @@ class SourceSetWrapperTest { Mockito.`when`(sarifPropertiesMock.generatedTestsRelativeRoot).thenReturn("test") Mockito.`when`(sarifPropertiesMock.sarifReportsRelativeRoot).thenReturn("sarif") + Mockito.`when`(sarifPropertiesMock.testPrivateMethods).thenReturn(true) val gradleProject = GradleProjectWrapper(project, sarifPropertiesMock) val sourceSetWrapper = SourceSetWrapper(project.mainSourceSet, gradleProject) From 9c257da4797fb3be62059abaf4eb0ac4ac53714b Mon Sep 17 00:00:00 2001 From: Nikita Stroganov Date: Wed, 13 Jul 2022 10:08:54 +0300 Subject: [PATCH 4/4] Fix after rebase --- .../framework/plugin/sarif/GenerateTestsAndSarifReportFacade.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/GenerateTestsAndSarifReportFacade.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/GenerateTestsAndSarifReportFacade.kt index d4f3363d0b..408756e25f 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/GenerateTestsAndSarifReportFacade.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/plugin/sarif/GenerateTestsAndSarifReportFacade.kt @@ -71,7 +71,7 @@ class GenerateTestsAndSarifReportFacade( private fun generateTestCases(targetClass: TargetClassWrapper, workingDirectory: Path): List = TestCaseGenerator.generate( - targetClass.targetMethods(), + targetClass.targetMethods, sarifProperties.mockStrategy, sarifProperties.classesToMockAlways, sarifProperties.generationTimeout