Skip to content

Commit 65dd727

Browse files
SBFT'24 An attempt to support UTestGlobalMock in converters (#2690)
* An attempt to support UTestGlobalMock in converters * Apply review fixes * Corrected valueModels for global constructors mocks
1 parent 623a94f commit 65dd727

File tree

2 files changed

+57
-14
lines changed

2 files changed

+57
-14
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,17 @@ class JcToUtExecutionConverter(
5656
private val toValueConverter = Descriptor2ValueConverter(utContext.classLoader)
5757

5858
private var jcToUtModelConverter: JcToUtModelConverter
59+
private var uTestProcessResult: UTestAnalysisResult
5960

6061
init {
61-
val instToModelConverter = UTestInstToUtModelConverter(idGenerator, jcClasspath, utilMethodProvider)
62-
63-
instToModelConverter.processUTest(jcExecution.uTest)
62+
val instToModelConverter = UTestInstToUtModelConverter(jcExecution.uTest, jcClasspath, idGenerator, utilMethodProvider)
6463
jcToUtModelConverter = JcToUtModelConverter(idGenerator, jcClasspath, instToModelConverter)
64+
65+
uTestProcessResult = instToModelConverter.processUTest()
6566
}
6667

6768
fun convert(): UtExecution? {
6869
val coverage = convertCoverage(getTrace(jcExecution.uTestExecutionResult), jcExecution.method.enclosingType.jcClass)
69-
// TODO usvm-sbft: fill up instrumentation with data from UTest
70-
val instrumentation = emptyList<UtInstrumentation>()
7170

7271
val utUsvmExecution: UtUsvmExecution = when (val executionResult = jcExecution.uTestExecutionResult) {
7372
is UTestExecutionSuccessResult -> UtUsvmExecution(
@@ -78,7 +77,7 @@ class JcToUtExecutionConverter(
7877
jcToUtModelConverter.convert(it, EnvironmentStateKind.FINAL)
7978
} ?: UtVoidModel),
8079
coverage = coverage,
81-
instrumentation = instrumentation,
80+
instrumentation = uTestProcessResult.instrumentation,
8281
)
8382
is UTestExecutionExceptionResult -> {
8483
UtUsvmExecution(
@@ -89,7 +88,7 @@ class JcToUtExecutionConverter(
8988
jcExecution.method,
9089
),
9190
coverage = coverage,
92-
instrumentation = instrumentation,
91+
instrumentation = uTestProcessResult.instrumentation,
9392
)
9493
}
9594

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

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,33 +36,37 @@ import org.usvm.instrumentation.testcase.api.UTestStringExpression
3636
import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
3737
import org.utbot.framework.plugin.api.ExecutableId
3838
import org.utbot.framework.plugin.api.FieldId
39+
import org.utbot.framework.plugin.api.MethodId
3940
import org.utbot.framework.plugin.api.UtArrayModel
4041
import org.utbot.framework.plugin.api.UtAssembleModel
4142
import org.utbot.framework.plugin.api.UtClassRefModel
4243
import org.utbot.framework.plugin.api.UtCompositeModel
4344
import org.utbot.framework.plugin.api.UtExecutableCallModel
4445
import org.utbot.framework.plugin.api.UtInstrumentation
4546
import org.utbot.framework.plugin.api.UtModel
47+
import org.utbot.framework.plugin.api.UtNewInstanceInstrumentation
4648
import org.utbot.framework.plugin.api.UtNullModel
4749
import org.utbot.framework.plugin.api.UtPrimitiveModel
50+
import org.utbot.framework.plugin.api.UtStaticMethodInstrumentation
4851
import org.utbot.framework.plugin.api.util.classClassId
4952
import org.utbot.framework.plugin.api.util.objectClassId
53+
import org.utbot.framework.plugin.api.util.voidClassId
5054
import org.utbot.fuzzer.IdGenerator
5155

5256
class UTestInstToUtModelConverter(
53-
private val idGenerator: IdGenerator<Int>,
57+
private val uTest: UTest,
5458
private val jcClasspath: JcClasspath,
59+
private val idGenerator: IdGenerator<Int>,
5560
private val utilMethodProvider: UtilMethodProvider,
5661
) {
5762
private val exprToModelCache = mutableMapOf<UTestExpression, UtModel>()
5863
private val instrumentations = mutableListOf<UtInstrumentation>()
5964

60-
fun processUTest(uTest: UTest) {
61-
exprToModelCache.clear()
62-
instrumentations.clear()
63-
65+
fun processUTest(): UTestAnalysisResult {
6466
uTest.initStatements.forEach { uInst -> processInst(uInst) }
6567
removeInstantiationCallFromThisInstanceModificationChain(processExpr(uTest.callMethodExpression))
68+
69+
return UTestAnalysisResult(instrumentations)
6670
}
6771

6872
fun findModelByInst(expr: UTestExpression): UtModel {
@@ -301,7 +305,43 @@ class UTestInstToUtModelConverter(
301305
}
302306

303307
is UTestGlobalMock -> {
304-
// TODO usvm-sbft: collect instrumentations here
308+
val methodsToExprs = uTestExpr.methods.entries
309+
val initMethodExprs = methodsToExprs.filter { it.key.isConstructor }
310+
val otherMethodsExprs = methodsToExprs.minus(initMethodExprs.toSet())
311+
312+
otherMethodsExprs
313+
.forEach { (jcMethod, uTestExprs) ->
314+
val methodId = jcMethod.toExecutableId(jcClasspath) as MethodId
315+
val valueModels = uTestExprs.map { expr -> processExpr(expr) }
316+
val methodInstrumentation = UtStaticMethodInstrumentation(
317+
methodId = methodId,
318+
values = valueModels,
319+
)
320+
321+
instrumentations += methodInstrumentation
322+
}
323+
324+
initMethodExprs
325+
.forEach { (jcMethod, uTestExprs) ->
326+
// TODO usvm-sbft-merge: it can be .map { expr -> processExpr(expr) } here
327+
// However, there's no special treatment for cases when <init> method occurs in a global mock
328+
val valueModels = uTestExprs.map { _ -> UtCompositeModel(
329+
id=idGenerator.createId(),
330+
classId = voidClassId,
331+
isMock = true,
332+
)
333+
}
334+
val methodInstrumentation = UtNewInstanceInstrumentation(
335+
classId = jcMethod.enclosingClass.classId,
336+
instances = valueModels,
337+
// [UTestGlobalMock] does not have an equivalent of [callSites],
338+
// but it is used only in UtBot instrumentation. We use USVM one, so it is not a problem.
339+
callSites = emptySet(),
340+
)
341+
342+
instrumentations += methodInstrumentation
343+
}
344+
305345
// UtClassRefModel is returned here for consistency with [Descriptor2ValueConverter]
306346
// which returns Class<*> instance for [UTestGlobalMock] descriptors.
307347
UtClassRefModel(
@@ -320,4 +360,8 @@ class UTestInstToUtModelConverter(
320360
is UTestArrayLengthExpression -> error("This expression type is not supported")
321361
}
322362
}
323-
}
363+
}
364+
365+
data class UTestAnalysisResult(
366+
val instrumentation: List<UtInstrumentation>,
367+
)

0 commit comments

Comments
 (0)