Skip to content

Commit

Permalink
Introduce utbot-usvm module and use it in contest (#2715)
Browse files Browse the repository at this point in the history
  • Loading branch information
EgorkaKulikov authored Dec 13, 2023
1 parent 928d1b0 commit b9726de
Show file tree
Hide file tree
Showing 52 changed files with 424 additions and 384 deletions.
3 changes: 3 additions & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ springVersion=5.3.28
springBootVersion=2.7.13
springSecurityVersion=5.8.5

approximationsVersion=bfce4eedde
usvmVersion=72924ad

# configuration for build server
#
# the following options are passed to gradle command explicitly (see appropriate workflow):
Expand Down
2 changes: 2 additions & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ include("utbot-junit-contest")
include("utbot-analytics")
include("utbot-analytics-torch")

include("utbot-usvm")

include("utbot-cli")

include("utbot-api")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.utbot.fuzzer
package org.utbot.framework.fuzzer

import org.utbot.framework.plugin.api.UtModel
import java.util.*
import java.util.concurrent.atomic.AtomicInteger

Expand Down Expand Up @@ -80,5 +79,3 @@ class ReferencePreservingIntIdGenerator(lowerBound: Int = DEFAULT_LOWER_BOUND) :
const val DEFAULT_LOWER_BOUND: Int = 1500_000_000
}
}

fun UtModel.fuzzed(block: FuzzedValue.() -> Unit = {}): FuzzedValue = FuzzedValue(this).apply(block)
Original file line number Diff line number Diff line change
Expand Up @@ -1201,6 +1201,19 @@ class BuiltinClassId(
}
}

class CgClassId(
name: String,
elementClassId: ClassId? = null,
override val typeParameters: TypeParameters = TypeParameters(),
override val isNullable: Boolean = true,
) : ClassId(name, elementClassId) {
constructor(
classId: ClassId,
typeParameters: TypeParameters = TypeParameters(),
isNullable: Boolean = true,
) : this(classId.name, classId.elementClassId, typeParameters, isNullable)
}

/**
* Field id. Contains field name.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,23 @@ val ExecutableId.isMethod: Boolean
val ExecutableId.isConstructor: Boolean
get() = this is ConstructorId

fun arrayTypeOf(elementType: ClassId, isNullable: Boolean = false): ClassId {
val arrayIdName = "[${elementType.arrayLikeName}"
return when (elementType) {
is BuiltinClassId -> BuiltinClassId(
canonicalName = "${elementType.canonicalName}[]",
simpleName = "${elementType.simpleName}[]",
elementClassId = elementType,
isNullable = isNullable
)
else -> ClassId(
name = arrayIdName,
elementClassId = elementType,
isNullable = isNullable
)
}
}

/**
* Construct MethodId
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
package org.utbot.framework.utils

import org.utbot.framework.plugin.api.BuiltinClassId
import org.utbot.framework.plugin.api.BuiltinConstructorId
import org.utbot.framework.plugin.api.BuiltinMethodId
import org.utbot.framework.plugin.api.CgClassId
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.MethodId
import org.utbot.framework.plugin.api.util.arrayTypeOf
import org.utbot.framework.plugin.api.util.baseStreamClassId
import org.utbot.framework.plugin.api.util.booleanClassId
import org.utbot.framework.plugin.api.util.builtinConstructorId
import org.utbot.framework.plugin.api.util.classClassId
import org.utbot.framework.plugin.api.util.id
import org.utbot.framework.plugin.api.util.intClassId
import org.utbot.framework.plugin.api.util.objectArrayClassId
import org.utbot.framework.plugin.api.util.objectClassId
import org.utbot.framework.plugin.api.util.stringClassId
import org.utbot.framework.plugin.api.util.voidClassId
import sun.misc.Unsafe
import java.lang.invoke.MethodHandles
import java.lang.invoke.MethodType
import java.lang.reflect.Method

/**
* Set of ids of all possible util methods for a given class.
*
* The class may actually not have some of these methods if they
* are not required in the process of code generation (this is the case for [TestClassUtilMethodProvider]).
*/
abstract class UtilMethodProvider(val utilClassId: ClassId) {
val utilMethodIds: Set<MethodId>
get() = setOf(
getUnsafeInstanceMethodId,
createInstanceMethodId,
createArrayMethodId,
setFieldMethodId,
setStaticFieldMethodId,
getFieldValueMethodId,
getStaticFieldValueMethodId,
getEnumConstantByNameMethodId,
deepEqualsMethodId,
arraysDeepEqualsMethodId,
iterablesDeepEqualsMethodId,
streamsDeepEqualsMethodId,
mapsDeepEqualsMethodId,
hasCustomEqualsMethodId,
getArrayLengthMethodId,
consumeBaseStreamMethodId,
buildStaticLambdaMethodId,
buildLambdaMethodId,
getLookupInMethodId,
getLambdaCapturedArgumentTypesMethodId,
getLambdaCapturedArgumentValuesMethodId,
getInstantiatedMethodTypeMethodId,
getLambdaMethodMethodId,
getSingleAbstractMethodMethodId
)

val getUnsafeInstanceMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getUnsafeInstance",
returnType = Unsafe::class.id,
)

/**
* Method that creates instance using Unsafe
*/
val createInstanceMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "createInstance",
returnType = CgClassId(objectClassId, isNullable = true),
arguments = arrayOf(stringClassId)
)

val createArrayMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "createArray",
returnType = Array<Any>::class.id,
arguments = arrayOf(stringClassId, intClassId, Array<Any>::class.id)
)

val setFieldMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "setField",
returnType = voidClassId,
arguments = arrayOf(objectClassId, stringClassId, stringClassId, objectClassId)
)

val setStaticFieldMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "setStaticField",
returnType = voidClassId,
arguments = arrayOf(Class::class.id, stringClassId, objectClassId)
)

val getFieldValueMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getFieldValue",
returnType = objectClassId,
arguments = arrayOf(objectClassId, stringClassId, stringClassId)
)

val getStaticFieldValueMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getStaticFieldValue",
returnType = objectClassId,
arguments = arrayOf(Class::class.id, stringClassId)
)

val getEnumConstantByNameMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getEnumConstantByName",
returnType = objectClassId,
arguments = arrayOf(Class::class.id, stringClassId)
)

val deepEqualsMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "deepEquals",
returnType = booleanClassId,
arguments = arrayOf(objectClassId, objectClassId)
)

val arraysDeepEqualsMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "arraysDeepEquals",
returnType = booleanClassId,
arguments = arrayOf(objectClassId, objectClassId)
)

val iterablesDeepEqualsMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "iterablesDeepEquals",
returnType = booleanClassId,
arguments = arrayOf(java.lang.Iterable::class.id, java.lang.Iterable::class.id)
)

val streamsDeepEqualsMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "streamsDeepEquals",
returnType = booleanClassId,
arguments = arrayOf(java.util.stream.BaseStream::class.id, java.util.stream.BaseStream::class.id)
)

val mapsDeepEqualsMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "mapsDeepEquals",
returnType = booleanClassId,
arguments = arrayOf(java.util.Map::class.id, java.util.Map::class.id)
)

val hasCustomEqualsMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "hasCustomEquals",
returnType = booleanClassId,
arguments = arrayOf(Class::class.id)
)

val getArrayLengthMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getArrayLength",
returnType = intClassId,
arguments = arrayOf(objectClassId)
)

val consumeBaseStreamMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "consumeBaseStream",
returnType = voidClassId,
arguments = arrayOf(baseStreamClassId)
)

val buildStaticLambdaMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "buildStaticLambda",
returnType = objectClassId,
arguments = arrayOf(
classClassId,
classClassId,
stringClassId,
arrayTypeOf(capturedArgumentClassId)
)
)

val buildLambdaMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "buildLambda",
returnType = objectClassId,
arguments = arrayOf(
classClassId,
classClassId,
stringClassId,
objectClassId,
arrayTypeOf(capturedArgumentClassId)
)
)

val getLookupInMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getLookupIn",
returnType = MethodHandles.Lookup::class.id,
arguments = arrayOf(classClassId)
)

val getLambdaCapturedArgumentTypesMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getLambdaCapturedArgumentTypes",
returnType = arrayTypeOf(classClassId),
arguments = arrayOf(arrayTypeOf(capturedArgumentClassId))
)

val getLambdaCapturedArgumentValuesMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getLambdaCapturedArgumentValues",
returnType = objectArrayClassId,
arguments = arrayOf(arrayTypeOf(capturedArgumentClassId))
)

val getInstantiatedMethodTypeMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getInstantiatedMethodType",
returnType = MethodType::class.id,
arguments = arrayOf(Method::class.id, arrayTypeOf(classClassId))
)

val getLambdaMethodMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getLambdaMethod",
returnType = Method::class.id,
arguments = arrayOf(classClassId, stringClassId)
)

val getSingleAbstractMethodMethodId: MethodId
get() = utilClassId.utilMethodId(
name = "getSingleAbstractMethod",
returnType = java.lang.reflect.Method::class.id,
arguments = arrayOf(classClassId)
)

val capturedArgumentClassId: BuiltinClassId
get() = BuiltinClassId(
canonicalName = "${utilClassId.name}.CapturedArgument",
simpleName = "CapturedArgument"
)

val capturedArgumentConstructorId: BuiltinConstructorId
get() = builtinConstructorId(capturedArgumentClassId, classClassId, objectClassId)
}

internal fun ClassId.utilMethodId(
name: String,
returnType: ClassId,
vararg arguments: ClassId,
// usually util methods are static, so this argument is true by default
isStatic: Boolean = true
): MethodId =
BuiltinMethodId(this, name, returnType, arguments.toList(), isStatic = isStatic)
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import org.utbot.examples.assemble.DefaultFieldWithDirectAccessor
import org.utbot.examples.assemble.DefaultFieldWithSetter
import org.utbot.examples.assemble.DefaultPackagePrivateField
import org.utbot.examples.assemble.StaticField
import org.utbot.framework.codegen.tree.arrayTypeOf
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.ExecutableId
import org.utbot.framework.plugin.api.FieldId
Expand All @@ -50,6 +49,7 @@ import org.utbot.framework.plugin.api.UtNullModel
import org.utbot.framework.plugin.api.UtPrimitiveModel
import org.utbot.framework.plugin.api.util.UtContext
import org.utbot.framework.plugin.api.util.UtContext.Companion.setUtContext
import org.utbot.framework.plugin.api.util.arrayTypeOf
import org.utbot.framework.plugin.api.util.executableId
import org.utbot.framework.plugin.api.util.id
import org.utbot.framework.plugin.api.util.intArrayClassId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import org.utbot.framework.UtSettings.useDebugVisualization
import org.utbot.framework.context.ApplicationContext
import org.utbot.framework.context.ConcreteExecutionContext
import org.utbot.framework.context.ConcreteExecutionContext.FuzzingContextParams
import org.utbot.framework.fuzzer.ReferencePreservingIntIdGenerator
import org.utbot.framework.plugin.api.*
import org.utbot.framework.plugin.api.Step
import org.utbot.framework.plugin.api.util.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package org.utbot.framework.codegen.domain
import org.utbot.framework.DEFAULT_EXECUTION_TIMEOUT_IN_INSTRUMENTED_PROCESS_MS
import org.utbot.framework.codegen.domain.builtin.mockitoClassId
import org.utbot.framework.codegen.domain.builtin.ongoingStubbingClassId
import org.utbot.framework.codegen.domain.models.CgClassId
import org.utbot.framework.codegen.tree.argumentsClassId
import org.utbot.framework.plugin.api.BuiltinClassId
import org.utbot.framework.plugin.api.CgClassId
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.CodeGenerationSettingBox
import org.utbot.framework.plugin.api.CodeGenerationSettingItem
Expand Down
Loading

0 comments on commit b9726de

Please sign in to comment.