Add summarization for usvm-sbft by tepa46 · Pull Request #2682 · UnitTestBot/UTBotJava · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import org.utbot.framework.plugin.api.util.method
import org.utbot.framework.plugin.services.JdkInfoService
import org.utbot.fuzzer.ReferencePreservingIntIdGenerator
import org.utbot.fuzzer.UtFuzzedExecution
import org.utbot.summary.summarizeAll
import org.utbot.summary.usvm.summarizeAll
import java.io.File
import java.net.URLClassLoader
import java.util.*
Expand Down Expand Up @@ -265,7 +265,7 @@ fun runUsvmGeneration(

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

logger.info().measureTime({ "Flushing tests for [${cut.simpleName}] on disk" }) {
writeTestClass(cut, codeGenerator.generateAsString(testSets))
Expand Down
18 changes: 13 additions & 5 deletions utbot-summary/src/main/kotlin/org/utbot/summary/Summarization.kt
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ private fun UtMethodTestSet.summarizeOne(searchDirectory: Path, sourceFile: File
) // TODO: looks weird and don't create the real copy
}

class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDescription>) {
open class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDescription>) {
private val tagGenerator = TagGenerator()
private val jimpleBodyAnalysis = ExecutionStructureAnalysis()

Expand Down Expand Up @@ -239,10 +239,7 @@ class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDe
descriptionSource: MethodDescriptionSource = MethodDescriptionSource.FUZZER
): List<UtExecutionCluster> {
val clustersToReturn: MutableList<UtExecutionCluster> = mutableListOf()
val methodTestSet = when (descriptionSource) {
MethodDescriptionSource.FUZZER -> prepareTestSetWithFuzzedExecutions(testSet)
MethodDescriptionSource.SYMBOLIC -> prepareTestSetForByteCodeAnalysis(testSet)
}
val methodTestSet = prepareMethodTestSet(testSet, descriptionSource)

if (methodTestSet.executions.isNotEmpty()) {
methodTestSet.executions.forEach { utExecution ->
Expand All @@ -263,7 +260,11 @@ class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDe
MethodDescriptionSource.SYMBOLIC -> {
val executableId = testSet.method
val description = FuzzedMethodDescription(executableId).apply {
packageName = executableId.classId.packageName
className = executableId.classId.simpleName
compilableName = if (!executableId.isConstructor) executableId.name else null
canonicalName = executableId.classId.canonicalName
isNested = executableId.classId.isNested
}
it.suggest(
description,
Expand Down Expand Up @@ -309,6 +310,13 @@ class Summarization(val sourceFile: File?, val invokeDescriptions: List<InvokeDe
return clustersToReturn.toList()
}

open fun prepareMethodTestSet(testSet: UtMethodTestSet, descriptionSource: MethodDescriptionSource): UtMethodTestSet{
return when (descriptionSource) {
MethodDescriptionSource.FUZZER -> prepareTestSetWithFuzzedExecutions(testSet)
MethodDescriptionSource.SYMBOLIC -> prepareTestSetForByteCodeAnalysis(testSet)
}
}

/** Filter and copies executions with non-empty paths. */
private fun prepareTestSetForByteCodeAnalysis(testSet: UtMethodTestSet): UtMethodTestSet {
val executions =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@ import org.utbot.framework.plugin.api.UtExecutionResult
import org.utbot.fuzzer.FuzzedMethodDescription
import org.utbot.fuzzer.FuzzedValue
import org.utbot.summary.MethodDescriptionSource
import java.util.*

class MethodBasedNameSuggester(private val source: MethodDescriptionSource = MethodDescriptionSource.FUZZER) : NameSuggester {
override fun suggest(
description: FuzzedMethodDescription,
values: List<FuzzedValue>,
result: UtExecutionResult?
): Sequence<TestSuggestedInfo> {
val compilableName = description.compilableName?.capitalize() ?: "Created"
val compilableName = description.compilableName?.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
?: "Created"
// See [Summarization.generateSummariesForTests].
val suffix = if (source == MethodDescriptionSource.FUZZER) "ByFuzzer" else ""
return sequenceOf(TestSuggestedInfo("test${compilableName}${suffix}"))
Expand Down