Skip to content

Commit 80c2328

Browse files
authored
Support -P parameters in the utbot-gradle (#377)
1 parent a92e289 commit 80c2328

File tree

6 files changed

+382
-83
lines changed

6 files changed

+382
-83
lines changed

utbot-gradle/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ pluginBundle {
8787
gradlePlugin {
8888
plugins {
8989
sarifReportPlugin {
90-
version = '1.0.0-alpha-9' // last published version
90+
version = '1.0.0-alpha' // last published version
9191
id = 'org.utbot.gradle.plugin'
9292
displayName = 'UnitTestBot gradle plugin'
9393
description = 'The gradle plugin for generating tests and creating SARIF reports based on UnitTestBot'

utbot-gradle/docs/utbot-gradle.md

+19
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,25 @@ __Kotlin DSL:__
6969
}
7070
```
7171

72+
Also, you can configure the task using `-P<parameterName>=<value>` syntax.
73+
74+
For example,
75+
```Kotlin
76+
generateTestsAndSarifReport
77+
-PtargetClasses='[com.abc.Main, com.qwerty.Util]'
78+
-PprojectRoot='C:/.../SomeDirectory'
79+
-PgeneratedTestsRelativeRoot='build/generated/test'
80+
-PsarifReportsRelativeRoot='build/generated/sarif'
81+
-PtestFramework=junit5
82+
-PmockFramework=mockito
83+
-PgenerationTimeout=60000
84+
-PcodegenLanguage=java
85+
-PmockStrategy='other-packages'
86+
-PstaticsMocking='mock-statics'
87+
-PforceStaticMocking=force
88+
-PclassesToMockAlways='[org.slf4j.Logger, java.util.Random]'
89+
```
90+
7291
**Note:** All configuration fields have default values, so there is no need to configure the plugin if you don't want to.
7392

7493
**Description of fields:**

utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/GenerateTestsAndSarifReportTask.kt

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ open class GenerateTestsAndSarifReportTask @Inject constructor(
3434
*/
3535
@TaskAction
3636
fun generateTestsAndSarifReport() {
37+
// the user specifies the parameters using "-Pname=value"
38+
sarifProperties.taskParameters = project.gradle.startParameter.projectProperties
3739
val rootGradleProject = try {
3840
GradleProjectWrapper(project, sarifProperties)
3941
} catch (t: Throwable) {

utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/extension/SarifGradleExtensionProvider.kt

+64-28
Original file line numberDiff line numberDiff line change
@@ -15,70 +15,106 @@ import java.io.File
1515
/**
1616
* Provides all [SarifGradleExtension] fields in a convenient form:
1717
* Defines default values and a transform function for these fields.
18+
* Takes the fields from the [taskParameters] if they are available there,
19+
* otherwise takes them from the [extension].
1820
*/
1921
class SarifGradleExtensionProvider(
2022
private val project: Project,
21-
private val extension: SarifGradleExtension
23+
private val extension: SarifGradleExtension,
24+
var taskParameters: Map<String, String> = mapOf()
2225
) : SarifExtensionProvider {
2326

2427
override val targetClasses: List<String>
25-
get() = extension.targetClasses
26-
.getOrElse(listOf())
28+
get() = taskParameters["targetClasses"]?.transformKeywordAll()?.parseToList()
29+
?: extension.targetClasses.orNull
30+
?: listOf()
2731

2832
override val projectRoot: File
29-
get() = extension.projectRoot.orNull
33+
get() = (taskParameters["projectRoot"] ?: extension.projectRoot.orNull)
3034
?.toPath()?.toFile()
3135
?: project.projectDir
3236

3337
override val generatedTestsRelativeRoot: String
34-
get() = extension.generatedTestsRelativeRoot.orNull
38+
get() = taskParameters["generatedTestsRelativeRoot"]
39+
?: extension.generatedTestsRelativeRoot.orNull
3540
?: "build/generated/test"
3641

3742
override val sarifReportsRelativeRoot: String
38-
get() = extension.sarifReportsRelativeRoot.orNull
43+
get() = taskParameters["sarifReportsRelativeRoot"]
44+
?: extension.sarifReportsRelativeRoot.orNull
3945
?: "build/generated/sarif"
4046

47+
// We don't get this field from `taskParameters` because marking the directory
48+
// as a test source root is possible while the gradle project is reloading,
49+
// but `taskParameters` become available only when the user runs the gradle task
50+
// `generateTestsAndSarifReport` (that is, after a reloading).
4151
override val markGeneratedTestsDirectoryAsTestSourcesRoot: Boolean
4252
get() = extension.markGeneratedTestsDirectoryAsTestSourcesRoot.orNull
4353
?: true
4454

4555
override val testFramework: TestFramework
46-
get() = extension.testFramework
47-
.map(::testFrameworkParse)
48-
.getOrElse(TestFramework.defaultItem)
56+
get() = (taskParameters["testFramework"] ?: extension.testFramework.orNull)
57+
?.let(::testFrameworkParse)
58+
?: TestFramework.defaultItem
4959

5060
override val mockFramework: MockFramework
51-
get() = extension.mockFramework
52-
.map(::mockFrameworkParse)
53-
.getOrElse(MockFramework.defaultItem)
61+
get() = (taskParameters["mockFramework"] ?: extension.mockFramework.orNull)
62+
?.let(::mockFrameworkParse)
63+
?: MockFramework.defaultItem
5464

5565
override val generationTimeout: Long
56-
get() = extension.generationTimeout
57-
.map(::generationTimeoutParse)
58-
.getOrElse(60 * 1000L) // 60 seconds
66+
get() = (taskParameters["generationTimeout"]?.toLongOrNull() ?: extension.generationTimeout.orNull)
67+
?.let(::generationTimeoutParse)
68+
?: (60 * 1000L) // 60 seconds
5969

6070
override val codegenLanguage: CodegenLanguage
61-
get() = extension.codegenLanguage
62-
.map(::codegenLanguageParse)
63-
.getOrElse(CodegenLanguage.defaultItem)
71+
get() = (taskParameters["codegenLanguage"] ?: extension.codegenLanguage.orNull)
72+
?.let(::codegenLanguageParse)
73+
?: CodegenLanguage.defaultItem
6474

6575
override val mockStrategy: MockStrategyApi
66-
get() = extension.mockStrategy
67-
.map(::mockStrategyParse)
68-
.getOrElse(MockStrategyApi.defaultItem)
76+
get() = (taskParameters["mockStrategy"] ?: extension.mockStrategy.orNull)
77+
?.let(::mockStrategyParse)
78+
?: MockStrategyApi.defaultItem
6979

7080
override val staticsMocking: StaticsMocking
71-
get() = extension.staticsMocking
72-
.map(::staticsMockingParse)
73-
.getOrElse(StaticsMocking.defaultItem)
81+
get() = (taskParameters["staticsMocking"] ?: extension.staticsMocking.orNull)
82+
?.let(::staticsMockingParse)
83+
?: StaticsMocking.defaultItem
7484

7585
override val forceStaticMocking: ForceStaticMocking
76-
get() = extension.forceStaticMocking
77-
.map(::forceStaticMockingParse)
78-
.getOrElse(ForceStaticMocking.defaultItem)
86+
get() = (taskParameters["forceStaticMocking"] ?: extension.forceStaticMocking.orNull)
87+
?.let(::forceStaticMockingParse)
88+
?: ForceStaticMocking.defaultItem
7989

8090
override val classesToMockAlways: Set<ClassId>
8191
get() = classesToMockAlwaysParse(
82-
extension.classesToMockAlways.getOrElse(listOf())
92+
specifiedClasses = taskParameters["classesToMockAlways"]?.parseToList()
93+
?: extension.classesToMockAlways.orNull
94+
?: listOf()
8395
)
96+
97+
/**
98+
* SARIF report file containing static analysis information about all [targetClasses].
99+
*/
100+
val mergedSarifReportFileName: String?
101+
get() = taskParameters["mergedSarifReportFileName"]
102+
103+
// internal
104+
105+
/**
106+
* Keyword "all" is the same as "[]" for [targetClasses], but more user-friendly.
107+
*/
108+
private fun String.transformKeywordAll(): String =
109+
if (this == "all") "[]" else this
110+
111+
/**
112+
* Example: "[A, B, C]" -> ["A", "B", "C"].
113+
*/
114+
private fun String.parseToList() =
115+
this.removePrefix("[")
116+
.removeSuffix("]")
117+
.split(",")
118+
.map { it.trim() }
119+
.filter { it != "" }
84120
}

utbot-gradle/src/main/kotlin/org/utbot/gradle/plugin/wrappers/GradleProjectWrapper.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ class GradleProjectWrapper(
5454
}
5555

5656
/**
57-
* SARIF report file containing results from all others reports from the [project].
57+
* SARIF report file containing results from all other reports from the [project].
5858
*/
5959
val sarifReportFile: File by lazy {
6060
Paths.get(
6161
generatedSarifDirectory.path,
62-
"${project.name}Report.sarif"
62+
sarifProperties.mergedSarifReportFileName ?: "${project.name}Report.sarif"
6363
).toFile().apply {
6464
createNewFileWithParentDirectories()
6565
}

0 commit comments

Comments
 (0)