Skip to content

Commit 62aa5b0

Browse files
authored
Add summarization for usvm-sbft (#2682)
* Add summarization for usvm-sbft * Add summary setting to the setOption method and do small refactoring
1 parent 2788630 commit 62aa5b0

File tree

5 files changed

+98
-8
lines changed

5 files changed

+98
-8
lines changed

utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ fun setOptions() {
161161
// We need to use assemble model generator to increase readability
162162
UtSettings.useAssembleModelGenerator = true
163163
UtSettings.summaryGenerationType = SummariesGenerationType.LIGHT
164+
UtSettings.enableTestNamesGeneration = true
165+
UtSettings.enableDisplayNameGeneration = false
166+
UtSettings.enableJavaDocGeneration = true
164167
UtSettings.preferredCexOption = false
165168
UtSettings.warmupConcreteExecution = true
166169
UtSettings.testMinimizationStrategyType = TestSelectionStrategyType.COVERAGE_STRATEGY

utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ContestUsvm.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import org.utbot.framework.plugin.api.util.method
3535
import org.utbot.framework.plugin.services.JdkInfoService
3636
import org.utbot.fuzzer.ReferencePreservingIntIdGenerator
3737
import org.utbot.fuzzer.UtFuzzedExecution
38-
import org.utbot.summary.summarizeAll
38+
import org.utbot.summary.usvm.summarizeAll
3939
import java.io.File
4040
import java.net.URLClassLoader
4141
import java.util.*
@@ -267,7 +267,7 @@ fun runUsvmGeneration(
267267

268268
val testSets = testsByMethod.map { (method, executions) ->
269269
UtMethodTestSet(method, minimizeExecutions(executions), jimpleBody = null)
270-
}.summarizeAll(cut.classfileDir.toPath(), sourceFile = null)
270+
}.summarizeAll()
271271

272272
logger.info().measureTime({ "Flushing tests for [${cut.simpleName}] on disk" }) {
273273
writeTestClass(cut, codeGenerator.generateAsString(testSets))

utbot-summary/src/main/kotlin/org/utbot/summary/Summarization.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private fun UtMethodTestSet.summarizeOne(searchDirectory: Path, sourceFile: File
8383
) // TODO: looks weird and don't create the real copy
8484
}
8585

86-
class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDescription>) {
86+
open class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDescription>) {
8787
private val tagGenerator = TagGenerator()
8888
private val jimpleBodyAnalysis = ExecutionStructureAnalysis()
8989

@@ -239,10 +239,7 @@ class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDe
239239
descriptionSource: MethodDescriptionSource = MethodDescriptionSource.FUZZER
240240
): List<UtExecutionCluster> {
241241
val clustersToReturn: MutableList<UtExecutionCluster> = mutableListOf()
242-
val methodTestSet = when (descriptionSource) {
243-
MethodDescriptionSource.FUZZER -> prepareTestSetWithFuzzedExecutions(testSet)
244-
MethodDescriptionSource.SYMBOLIC -> prepareTestSetForByteCodeAnalysis(testSet)
245-
}
242+
val methodTestSet = prepareMethodTestSet(testSet, descriptionSource)
246243

247244
if (methodTestSet.executions.isNotEmpty()) {
248245
methodTestSet.executions.forEach { utExecution ->
@@ -263,7 +260,11 @@ class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDe
263260
MethodDescriptionSource.SYMBOLIC -> {
264261
val executableId = testSet.method
265262
val description = FuzzedMethodDescription(executableId).apply {
263+
packageName = executableId.classId.packageName
264+
className = executableId.classId.simpleName
266265
compilableName = if (!executableId.isConstructor) executableId.name else null
266+
canonicalName = executableId.classId.canonicalName
267+
isNested = executableId.classId.isNested
267268
}
268269
it.suggest(
269270
description,
@@ -309,6 +310,13 @@ class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDe
309310
return clustersToReturn.toList()
310311
}
311312

313+
open fun prepareMethodTestSet(testSet: UtMethodTestSet, descriptionSource: MethodDescriptionSource): UtMethodTestSet{
314+
return when (descriptionSource) {
315+
MethodDescriptionSource.FUZZER -> prepareTestSetWithFuzzedExecutions(testSet)
316+
MethodDescriptionSource.SYMBOLIC -> prepareTestSetForByteCodeAnalysis(testSet)
317+
}
318+
}
319+
312320
/** Filter and copies executions with non-empty paths. */
313321
private fun prepareTestSetForByteCodeAnalysis(testSet: UtMethodTestSet): UtMethodTestSet {
314322
val executions =

utbot-summary/src/main/kotlin/org/utbot/summary/fuzzer/names/MethodBasedNameSuggester.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@ import org.utbot.framework.plugin.api.UtExecutionResult
44
import org.utbot.fuzzer.FuzzedMethodDescription
55
import org.utbot.fuzzer.FuzzedValue
66
import org.utbot.summary.MethodDescriptionSource
7+
import java.util.*
78

89
class MethodBasedNameSuggester(private val source: MethodDescriptionSource = MethodDescriptionSource.FUZZER) : NameSuggester {
910
override fun suggest(
1011
description: FuzzedMethodDescription,
1112
values: List<FuzzedValue>,
1213
result: UtExecutionResult?
1314
): Sequence<TestSuggestedInfo> {
14-
val compilableName = description.compilableName?.capitalize() ?: "Created"
15+
val compilableName = description.compilableName?.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
16+
?: "Created"
1517
// See [Summarization.generateSummariesForTests].
1618
val suffix = if (source == MethodDescriptionSource.FUZZER) "ByFuzzer" else ""
1719
return sequenceOf(TestSuggestedInfo("test${compilableName}${suffix}"))
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.utbot.summary.usvm
2+
3+
import org.utbot.framework.plugin.api.UtMethodTestSet
4+
import mu.KotlinLogging
5+
import org.utbot.common.measureTime
6+
import org.utbot.common.info
7+
import org.utbot.framework.SummariesGenerationType.*
8+
import org.utbot.framework.UtSettings.enableDisplayNameGeneration
9+
import org.utbot.framework.UtSettings.enableJavaDocGeneration
10+
import org.utbot.framework.UtSettings.enableTestNamesGeneration
11+
import org.utbot.framework.UtSettings.summaryGenerationType
12+
import org.utbot.summary.InvokeDescription
13+
import org.utbot.summary.MethodDescriptionSource
14+
import org.utbot.summary.Summarization
15+
import java.io.File
16+
17+
private val logger = KotlinLogging.logger {}
18+
19+
/**
20+
USummarization is used to generate summaries for *usvm-sbft*.
21+
22+
To generate summary, use the following settings:
23+
- *SummariesGenerationType == LIGHT*
24+
- *enableTestNamesGeneration = true*
25+
- *enableDisplayNameGeneration = false*
26+
- *enableJavaDocGeneration = true*
27+
*/
28+
29+
fun Collection<UtMethodTestSet>.summarizeAll(): List<UtMethodTestSet> =
30+
logger.info().measureTime({
31+
"----------------------------------------------------------------------------------------\n" +
32+
"-------------------Summarization started for ${this.size} test cases--------------------\n" +
33+
"----------------------------------------------------------------------------------------"
34+
}) {
35+
this.map {
36+
it.summarizeOne()
37+
}
38+
}
39+
40+
private fun UtMethodTestSet.summarizeOne(): UtMethodTestSet =
41+
logger.info().measureTime({ "Summarization for ${this.method}" }) {
42+
43+
if (summaryGenerationType != LIGHT || !enableTestNamesGeneration || enableDisplayNameGeneration || !enableJavaDocGeneration) {
44+
logger.info {
45+
"Incorrect settings are used to generate Summaries for usvm-sbft"
46+
}
47+
return this
48+
}
49+
50+
USummarization(sourceFile = null, invokeDescriptions = emptyList()).fillSummaries(this)
51+
return this
52+
}
53+
54+
class USummarization(sourceFile: File?, invokeDescriptions: List<InvokeDescription>) :
55+
Summarization(sourceFile, invokeDescriptions) {
56+
57+
/*
58+
* Used to prepare methodTestSet for further generation of summaries.
59+
* In the case of generating tests using USVM, we only need to work with Symbolic tests.
60+
*/
61+
override fun prepareMethodTestSet(
62+
testSet: UtMethodTestSet,
63+
descriptionSource: MethodDescriptionSource
64+
): UtMethodTestSet {
65+
return when (descriptionSource) {
66+
MethodDescriptionSource.FUZZER -> UtMethodTestSet(
67+
method = testSet.method,
68+
executions = emptyList(),
69+
jimpleBody = testSet.jimpleBody,
70+
errors = testSet.errors,
71+
clustersInfo = testSet.clustersInfo
72+
)
73+
74+
MethodDescriptionSource.SYMBOLIC -> testSet
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)