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
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
Comment thread
EgorkaKulikov marked this conversation as resolved.

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