From 8ee63128748035d24ddb1a4456c89b94c8c90b46 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 9 Nov 2023 18:42:07 +0300 Subject: [PATCH 1/3] Try to get classId from arrays with JacoDb --- .../org/utbot/contest/usvm/ContestUsvm.kt | 1 + .../org/utbot/contest/usvm/ConverterUtils.kt | 16 +++++++++----- .../contest/usvm/JcToUtExecutionConverter.kt | 8 ++++--- .../contest/usvm/JcToUtModelConverter.kt | 4 +++- .../usvm/UTestInst2UtModelConverter.kt | 16 ++++++++------ .../src/main/resources/classes/samples/list | 22 +------------------ 6 files changed, 29 insertions(+), 38 deletions(-) diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ContestUsvm.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ContestUsvm.kt index 97b073b2f0..5b57c784ac 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ContestUsvm.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ContestUsvm.kt @@ -221,6 +221,7 @@ fun runUsvmGeneration( try { JcToUtExecutionConverter( jcExecution = it, + jcClasspath = jcDbContainer.cp, idGenerator = idGenerator, instructionIdProvider = instructionIdProvider, utilMethodProvider = codeGenerator.context.utilMethodProvider diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt index 70c2551142..e321696dd0 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt @@ -2,10 +2,12 @@ package org.utbot.contest.usvm import org.jacodb.analysis.library.analyzers.thisInstance import org.jacodb.api.JcClassOrInterface +import org.jacodb.api.JcClasspath import org.jacodb.api.JcField import org.jacodb.api.JcMethod import org.jacodb.api.JcType import org.jacodb.api.TypeName +import org.jacodb.api.ext.findClassOrNull import org.usvm.instrumentation.testcase.api.UTestInst import org.usvm.instrumentation.testcase.descriptor.UTestObjectDescriptor import org.usvm.instrumentation.testcase.descriptor.UTestValueDescriptor @@ -21,15 +23,17 @@ import org.utbot.framework.plugin.api.util.id import org.utbot.framework.plugin.api.util.objectClassId import org.utbot.framework.plugin.api.util.utContext -fun JcMethod.toExecutableId(): ExecutableId { +fun JcMethod.toExecutableId(classpath: JcClasspath): ExecutableId { val type = this.thisInstance.type.classId - val parameters = this.parameters.map { it.type.classId } + val parameters = this.parameters.map { it.type.findClassId(classpath) } if (isConstructor) { return ConstructorId(type, parameters) } - return MethodId(type, this.name, this.returnType.classId, parameters) + val returnClassId = this.returnType.findClassId(classpath) + + return MethodId(type, this.name, returnClassId, parameters) } val JcType?.classId: ClassId @@ -39,9 +43,9 @@ val JcType?.classId: ClassId val JcClassOrInterface.classId: ClassId get() = this.toJavaClass(utContext.classLoader).id -//TODO usvm-sbft: incorrectly converts types of com.google.common.util.concurrent.AtomicDoubleArray. parameters -val TypeName.classId: ClassId - get() = ClassId(this.typeName) +fun TypeName.findClassId(classpath: JcClasspath): ClassId = + classpath.findClassOrNull(this.typeName)?.classId + ?: error("Can not construct classId for $this") val JcField.fieldId: FieldId get() = toJavaField(utContext.classLoader)!!.fieldId diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtExecutionConverter.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtExecutionConverter.kt index 0f76278ec5..d5b874e06c 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtExecutionConverter.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtExecutionConverter.kt @@ -2,6 +2,7 @@ package org.utbot.contest.usvm import mu.KotlinLogging import org.jacodb.api.JcClassOrInterface +import org.jacodb.api.JcClasspath import org.jacodb.api.JcTypedMethod import org.jacodb.api.cfg.JcInst import org.jacodb.api.ext.jcdbSignature @@ -36,6 +37,7 @@ private val logger = KotlinLogging.logger {} class JcToUtExecutionConverter( private val jcExecution: JcExecution, + private val jcClasspath: JcClasspath, private val idGenerator: IdGenerator, private val instructionIdProvider: InstructionIdProvider, utilMethodProvider: UtilMethodProvider, @@ -45,10 +47,10 @@ class JcToUtExecutionConverter( private var jcToUtModelConverter: JcToUtModelConverter init { - val instToModelConverter = UTestInst2UtModelConverter(idGenerator, utilMethodProvider) + val instToModelConverter = UTestInst2UtModelConverter(idGenerator, jcClasspath, utilMethodProvider) instToModelConverter.processUTest(jcExecution.uTest) - jcToUtModelConverter = JcToUtModelConverter(idGenerator, instToModelConverter) + jcToUtModelConverter = JcToUtModelConverter(idGenerator, jcClasspath, instToModelConverter) } fun convert(): UtExecution? { @@ -129,7 +131,7 @@ class JcToUtExecutionConverter( .associate { (jcField, uTestDescr) -> jcField.fieldId to modelConverter.convert(uTestDescr) } - val executableId: ExecutableId = method.method.toExecutableId() + val executableId: ExecutableId = method.method.toExecutableId(jcClasspath) return EnvironmentModels(thisInstance, parameters, statics, executableId) } diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtModelConverter.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtModelConverter.kt index ef3f5285b0..3f0763f7c6 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtModelConverter.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtModelConverter.kt @@ -1,5 +1,6 @@ package org.utbot.contest.usvm +import org.jacodb.api.JcClasspath import org.usvm.instrumentation.testcase.api.UTestExpression import org.usvm.instrumentation.testcase.descriptor.UTestArrayDescriptor import org.usvm.instrumentation.testcase.descriptor.UTestClassDescriptor @@ -27,6 +28,7 @@ import java.lang.Throwable class JcToUtModelConverter( private val idGenerator: IdGenerator, + private val jcClasspath: JcClasspath, private val instToUtModelConverter: UTestInst2UtModelConverter, ) { private val descriptorToModelCache = mutableMapOf() @@ -57,7 +59,7 @@ class JcToUtModelConverter( fields += valueDescriptor.fields .entries .associate { (jcField, fieldDescr) -> - val fieldId = FieldId(jcField.type.classId, jcField.name) + val fieldId = FieldId(jcField.type.findClassId(jcClasspath), jcField.name) val fieldModel = convert(fieldDescr) fieldId to fieldModel } diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/UTestInst2UtModelConverter.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/UTestInst2UtModelConverter.kt index 0ceab1c6aa..4f842ce304 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/UTestInst2UtModelConverter.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/UTestInst2UtModelConverter.kt @@ -1,5 +1,6 @@ package org.utbot.contest.usvm +import org.jacodb.api.JcClasspath import org.usvm.instrumentation.testcase.UTest import org.usvm.instrumentation.testcase.api.UTestAllocateMemoryCall import org.usvm.instrumentation.testcase.api.UTestArithmeticExpression @@ -50,6 +51,7 @@ import org.utbot.fuzzer.IdGenerator class UTestInst2UtModelConverter( private val idGenerator: IdGenerator, + private val jcClasspath: JcClasspath, private val utilMethodProvider: UtilMethodProvider, ) { private val exprToModelCache = mutableMapOf() @@ -101,7 +103,7 @@ class UTestInst2UtModelConverter( val instanceModel = processExpr(instanceExpr) require(instanceModel is UtAssembleModel) - val fieldType = uTestInst.field.type.classId + val fieldType = uTestInst.field.type.findClassId(jcClasspath) val fieldName = uTestInst.field.name val setValueModel = processExpr(uTestInst.value) @@ -147,7 +149,7 @@ class UTestInst2UtModelConverter( is UTestConstructorCall -> { val constructorCall = UtExecutableCallModel( instance = null, - executable = uTestExpr.method.toExecutableId(), + executable = uTestExpr.method.toExecutableId(jcClasspath), params = uTestExpr.args.map { arg -> processExpr(arg) }, @@ -167,7 +169,7 @@ class UTestInst2UtModelConverter( val methodCall = UtExecutableCallModel( instance = instanceModel, - executable = uTestExpr.method.toExecutableId(), + executable = uTestExpr.method.toExecutableId(jcClasspath), params = uTestExpr.args.map { arg -> processExpr(arg) }, ) @@ -188,7 +190,7 @@ class UTestInst2UtModelConverter( modelName = "", instantiationCall = UtExecutableCallModel( instance = null, - executable = uTestExpr.method.toExecutableId(), + executable = uTestExpr.method.toExecutableId(jcClasspath), params = uTestExpr.args.map { arg -> processExpr(arg) }, ), ) @@ -234,7 +236,7 @@ class UTestInst2UtModelConverter( executable = utilMethodProvider.getFieldValueMethodId, params = listOf( instanceModel, - UtPrimitiveModel(uTestExpr.field.type.classId.name), + UtPrimitiveModel(uTestExpr.field.type), UtPrimitiveModel(uTestExpr.field.name), ), ) @@ -252,7 +254,7 @@ class UTestInst2UtModelConverter( instance = null, executable = utilMethodProvider.getStaticFieldValueMethodId, params = listOf( - UtPrimitiveModel(uTestExpr.field.type.classId.name), + UtPrimitiveModel(uTestExpr.field.type), UtPrimitiveModel(uTestExpr.field.name), ), ) @@ -287,7 +289,7 @@ class UTestInst2UtModelConverter( mocks += uTestExpr.methods .entries .associate { (jcMethod, uTestExprs) -> - val executableId: ExecutableId = jcMethod.toExecutableId() + val executableId: ExecutableId = jcMethod.toExecutableId(jcClasspath) val models = uTestExprs.map { expr -> processExpr(expr) } diff --git a/utbot-junit-contest/src/main/resources/classes/samples/list b/utbot-junit-contest/src/main/resources/classes/samples/list index df9d9e4e48..7d2f8d53b0 100644 --- a/utbot-junit-contest/src/main/resources/classes/samples/list +++ b/utbot-junit-contest/src/main/resources/classes/samples/list @@ -1,23 +1,3 @@ -org.utbot.examples.primitives.IntExamples -org.utbot.examples.primitives.ByteExamples -org.utbot.examples.primitives.CharExamples -org.utbot.examples.primitives.FloatExamples -org.utbot.examples.primitives.DoubleExamples -org.utbot.examples.controlflow.Conditions -org.utbot.examples.controlflow.CycleDependedCondition -org.utbot.examples.controlflow.Cycles -org.utbot.examples.controlflow.Switch -org.utbot.examples.recursion.Recursion -org.utbot.examples.math.BitOperators -org.utbot.examples.math.DivRemExamples -org.utbot.examples.math.DoubleFunctions -org.utbot.examples.wrappers.ShortWrapper -org.utbot.examples.wrappers.LongWrapper -org.utbot.examples.wrappers.IntegerWrapper -org.utbot.examples.wrappers.FloatWrapper -org.utbot.examples.wrappers.DoubleWrapper -org.utbot.examples.wrappers.CharacterWrapper -org.utbot.examples.wrappers.ByteWrapper -org.utbot.examples.wrappers.BooleanWrapper +org.utbot.examples.arrays.PrimitiveArrays From 7c975b0fd323a262e54d3cbe54ecbf91206006f8 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 9 Nov 2023 19:03:57 +0300 Subject: [PATCH 2/3] Fix a bug --- .../src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt index e321696dd0..b1377418d7 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ConverterUtils.kt @@ -44,7 +44,7 @@ val JcClassOrInterface.classId: ClassId get() = this.toJavaClass(utContext.classLoader).id fun TypeName.findClassId(classpath: JcClasspath): ClassId = - classpath.findClassOrNull(this.typeName)?.classId + classpath.findTypeOrNull(this.typeName)?.classId ?: error("Can not construct classId for $this") val JcField.fieldId: FieldId From 2570bb9f215359d78dbe6b1f86504cdccb0e6156 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 9 Nov 2023 19:06:06 +0300 Subject: [PATCH 3/3] Add primitive arrays to a list --- .../src/main/resources/classes/samples/list | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/utbot-junit-contest/src/main/resources/classes/samples/list b/utbot-junit-contest/src/main/resources/classes/samples/list index 7d2f8d53b0..b7c98f8862 100644 --- a/utbot-junit-contest/src/main/resources/classes/samples/list +++ b/utbot-junit-contest/src/main/resources/classes/samples/list @@ -1,3 +1,24 @@ +org.utbot.examples.primitives.IntExamples +org.utbot.examples.primitives.ByteExamples +org.utbot.examples.primitives.CharExamples +org.utbot.examples.primitives.FloatExamples +org.utbot.examples.primitives.DoubleExamples +org.utbot.examples.controlflow.Conditions +org.utbot.examples.controlflow.CycleDependedCondition +org.utbot.examples.controlflow.Cycles +org.utbot.examples.controlflow.Switch +org.utbot.examples.recursion.Recursion +org.utbot.examples.math.BitOperators +org.utbot.examples.math.DivRemExamples +org.utbot.examples.math.DoubleFunctions +org.utbot.examples.wrappers.ShortWrapper +org.utbot.examples.wrappers.LongWrapper +org.utbot.examples.wrappers.IntegerWrapper +org.utbot.examples.wrappers.FloatWrapper +org.utbot.examples.wrappers.DoubleWrapper +org.utbot.examples.wrappers.CharacterWrapper +org.utbot.examples.wrappers.ByteWrapper +org.utbot.examples.wrappers.BooleanWrapper org.utbot.examples.arrays.PrimitiveArrays