Skip to content

Commit f4d8979

Browse files
Move UtExecutionInstrumentation to utbot-instrumentation module (#1637)
1 parent 1438c55 commit f4d8979

File tree

54 files changed

+257
-310
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+257
-310
lines changed

utbot-core/src/main/kotlin/org/utbot/common/ReflectionUtil.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ object Reflection {
2222
isAccessible = true
2323
}
2424

25+
2526
@Suppress("UNCHECKED_CAST")
2627
private val fields: Array<Field> =
2728
getDeclaredFields0Method.invoke(Field::class.java, false) as Array<Field>
@@ -43,7 +44,7 @@ object Reflection {
4344
}
4445
}
4546

46-
inline fun <R> AccessibleObject.withAccessibility(block: () -> R): R {
47+
inline fun <T : AccessibleObject, R> T.withAccessibility(block: T.() -> R): R {
4748
val prevAccessibility = isAccessible
4849
isAccessible = true
4950

@@ -64,7 +65,7 @@ inline fun <R> AccessibleObject.withAccessibility(block: () -> R): R {
6465
*
6566
* Also note, that primitive static final fields may be inlined, so may not be possible to change.
6667
*/
67-
inline fun <reified R> Field.withAccessibility(block: () -> R): R {
68+
inline fun <reified R> Field.withAccessibility(block: Field.() -> R): R {
6869
val prevModifiers = modifiers
6970
val prevAccessibility = isAccessible
7071

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.utbot.framework.plugin.api.util
2+
3+
import org.utbot.common.Reflection
4+
import org.utbot.framework.plugin.api.FieldId
5+
import soot.RefType
6+
7+
/**
8+
* Several fields are inaccessible in runtime even via reflection
9+
*/
10+
val FieldId.isInaccessibleViaReflection: Boolean
11+
get() {
12+
val declaringClassName = declaringClass.name
13+
return declaringClassName in inaccessibleViaReflectionClasses ||
14+
(name to declaringClassName) in inaccessibleViaReflectionFields
15+
}
16+
17+
val RefType.isInaccessibleViaReflection: Boolean
18+
get() {
19+
return className in inaccessibleViaReflectionClasses
20+
}
21+
22+
private val inaccessibleViaReflectionClasses = setOf(
23+
"jdk.internal.reflect.ReflectionFactory",
24+
"jdk.internal.reflect.Reflection",
25+
"jdk.internal.loader.ClassLoaderValue",
26+
"sun.reflect.Reflection",
27+
)
28+
29+
private val inaccessibleViaReflectionFields = setOf(
30+
"security" to "java.lang.System",
31+
)
32+
33+
@Suppress("DEPRECATION")
34+
val Class<*>.anyInstance: Any
35+
get() {
36+
// val defaultCtor = declaredConstructors.singleOrNull { it.parameterCount == 0}
37+
// if (defaultCtor != null) {
38+
// try {
39+
// defaultCtor.isAccessible = true
40+
// return defaultCtor.newInstance()
41+
// } catch (e : Throwable) {
42+
// logger.warn(e) { "Can't create object with default ctor. Fallback to Unsafe." }
43+
// }
44+
// }
45+
return Reflection.unsafe.allocateInstance(this)
46+
47+
// val constructors = runCatching {
48+
// arrayOf(getDeclaredConstructor())
49+
// }.getOrElse { declaredConstructors }
50+
//
51+
// return constructors.asSequence().mapNotNull { constructor ->
52+
// runCatching {
53+
// val parameters = constructor.parameterTypes.map { defaultParameterValue(it) }
54+
// val isAccessible = constructor.isAccessible
55+
// try {
56+
// constructor.isAccessible = true
57+
// constructor.newInstance(*parameters.toTypedArray())
58+
// } finally {
59+
// constructor.isAccessible = isAccessible
60+
// }
61+
// }.getOrNull()
62+
// }.firstOrNull() ?: error("Failed to create instance of $this")
63+
}

utbot-framework/src/main/kotlin/org/utbot/engine/util/lambda/LambdaConstructionUtils.kt renamed to utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/util/constructor/LambdaConstructionUtils.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.utbot.engine.util.lambda
1+
package org.utbot.framework.plugin.api.util
22

33
import java.lang.invoke.LambdaMetafactory
44
import java.lang.invoke.MethodHandles
@@ -115,7 +115,7 @@ private fun getSingleAbstractMethod(clazz: Class<*>): Method {
115115
* @return an [Any] that represents an instance of the given functional interface `samType`
116116
* and implements its single abstract method with the behavior of the given lambda.
117117
*/
118-
internal fun constructStaticLambda(
118+
fun constructStaticLambda(
119119
samType: Class<*>,
120120
declaringClass: Class<*>,
121121
lambdaName: String,
@@ -151,7 +151,7 @@ internal fun constructStaticLambda(
151151
* @return an [Any] that represents an instance of the given functional interface `samType`
152152
* and implements its single abstract method with the behavior of the given lambda.
153153
*/
154-
internal fun constructLambda(
154+
fun constructLambda(
155155
samType: Class<*>,
156156
declaringClass: Class<*>,
157157
lambdaName: String,

utbot-framework/src/main/kotlin/org/utbot/engine/ValueConstructor.kt renamed to utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/util/constructor/ValueConstructor.kt

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
package org.utbot.engine
1+
package org.utbot.framework.plugin.api.util.constructor
22

33
import org.utbot.common.Reflection
44
import org.utbot.common.invokeCatching
5+
import org.utbot.common.withAccessibility
56
import org.utbot.framework.plugin.api.ClassId
6-
import org.utbot.engine.util.lambda.CapturedArgument
7-
import org.utbot.engine.util.lambda.constructLambda
8-
import org.utbot.engine.util.lambda.constructStaticLambda
97
import org.utbot.framework.plugin.api.ConstructorId
108
import org.utbot.framework.plugin.api.EnvironmentModels
119
import org.utbot.framework.plugin.api.FieldId
@@ -39,15 +37,16 @@ import org.utbot.framework.plugin.api.UtValueExecution
3937
import org.utbot.framework.plugin.api.UtValueExecutionState
4038
import org.utbot.framework.plugin.api.UtVoidModel
4139
import org.utbot.framework.plugin.api.isMockModel
40+
import org.utbot.framework.plugin.api.util.CapturedArgument
41+
import org.utbot.framework.plugin.api.util.anyInstance
42+
import org.utbot.framework.plugin.api.util.constructLambda
43+
import org.utbot.framework.plugin.api.util.constructStaticLambda
4244
import org.utbot.framework.plugin.api.util.constructor
4345
import org.utbot.framework.plugin.api.util.isStatic
44-
import org.utbot.framework.plugin.api.util.jField
4546
import org.utbot.framework.plugin.api.util.jClass
47+
import org.utbot.framework.plugin.api.util.jField
4648
import org.utbot.framework.plugin.api.util.method
4749
import org.utbot.framework.plugin.api.util.utContext
48-
import org.utbot.framework.util.anyInstance
49-
import org.utbot.instrumentation.process.runSandbox
50-
import java.lang.reflect.Field
5150
import java.lang.reflect.Modifier
5251
import kotlin.reflect.KClass
5352

@@ -435,12 +434,12 @@ class ValueConstructor {
435434
private fun value(model: UtModel) = construct(model, null).value
436435

437436
private fun MethodId.call(args: List<Any?>, instance: Any?): Any? =
438-
method.runSandbox {
439-
invokeCatching(obj = instance, args = args).getOrThrow()
437+
method.withAccessibility {
438+
method.invokeCatching(obj = instance, args = args).getOrThrow()
440439
}
441440

442441
private fun ConstructorId.call(args: List<Any?>): Any? =
443-
constructor.runSandbox {
442+
constructor.withAccessibility {
444443
newInstance(*args.toTypedArray())
445444
}
446445

utbot-framework-test/src/test/kotlin/org/utbot/framework/assemble/AssembleModelGeneratorTests.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,14 @@ import org.utbot.framework.plugin.api.util.intClassId
5757
import org.utbot.framework.plugin.services.JdkInfoDefaultProvider
5858
import org.utbot.framework.util.SootUtils
5959
import org.utbot.framework.util.instanceCounter
60-
import org.utbot.framework.util.modelIdCounter
60+
import java.util.concurrent.atomic.AtomicInteger
6161
import kotlin.reflect.full.functions
6262

6363
/**
6464
* Test classes must be located in the same folder as [AssembleTestUtils] class.
6565
*/
6666
class AssembleModelGeneratorTests {
67+
val modelIdCounter = AtomicInteger(0)
6768

6869
private lateinit var context: AutoCloseable
6970
private lateinit var statementsChain: MutableList<String>

utbot-framework/src/main/kotlin/org/utbot/engine/Mocks.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import org.utbot.framework.plugin.api.MethodId
1111
import org.utbot.framework.plugin.api.UtModel
1212
import org.utbot.framework.plugin.api.id
1313
import org.utbot.framework.plugin.api.util.id
14-
import org.utbot.framework.plugin.api.util.isRefType
1514
import org.utbot.framework.util.executableId
1615
import java.util.concurrent.atomic.AtomicInteger
1716
import kotlin.reflect.KFunction2
@@ -20,7 +19,7 @@ import kotlinx.collections.immutable.persistentListOf
2019
import org.utbot.common.nameOfPackage
2120
import org.utbot.engine.types.OBJECT_TYPE
2221
import org.utbot.engine.util.mockListeners.MockListenerController
23-
import org.utbot.framework.util.isInaccessibleViaReflection
22+
import org.utbot.framework.plugin.api.util.isInaccessibleViaReflection
2423
import soot.BooleanType
2524
import soot.RefType
2625
import soot.Scene

utbot-framework/src/main/kotlin/org/utbot/engine/Resolver.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ import org.utbot.engine.types.TypeRegistry
101101
import org.utbot.engine.types.TypeResolver
102102
import org.utbot.framework.plugin.api.visible.UtStreamConsumingException
103103
import org.utbot.framework.plugin.api.UtStreamConsumingFailure
104+
import org.utbot.framework.plugin.api.util.constructor.ValueConstructor
104105
import org.utbot.framework.plugin.api.util.isStatic
105106

106107
// hack

utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ import org.utbot.framework.plugin.api.util.isConstructor
127127
import org.utbot.framework.plugin.api.util.utContext
128128
import org.utbot.framework.util.executableId
129129
import org.utbot.framework.util.graph
130-
import org.utbot.framework.util.isInaccessibleViaReflection
130+
import org.utbot.framework.plugin.api.util.isInaccessibleViaReflection
131131
import java.lang.reflect.ParameterizedType
132132
import kotlin.collections.plus
133133
import kotlin.collections.plusAssign

utbot-framework/src/main/kotlin/org/utbot/engine/UtBotSymbolicEngine.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ import org.utbot.framework.UtSettings.pathSelectorStepsLimit
3232
import org.utbot.framework.UtSettings.pathSelectorType
3333
import org.utbot.framework.UtSettings.processUnknownStatesDuringConcreteExecution
3434
import org.utbot.framework.UtSettings.useDebugVisualization
35-
import org.utbot.framework.concrete.UtConcreteExecutionData
36-
import org.utbot.framework.concrete.UtConcreteExecutionResult
37-
import org.utbot.framework.concrete.UtExecutionInstrumentation
35+
import org.utbot.framework.util.convertToAssemble
3836
import org.utbot.framework.plugin.api.*
3937
import org.utbot.framework.plugin.api.Step
4038
import org.utbot.framework.plugin.api.util.*
@@ -44,6 +42,9 @@ import org.utbot.fuzzer.*
4442
import org.utbot.fuzzing.*
4543
import org.utbot.fuzzing.utils.Trie
4644
import org.utbot.instrumentation.ConcreteExecutor
45+
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionData
46+
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
47+
import org.utbot.instrumentation.instrumentation.execution.UtExecutionInstrumentation
4748
import soot.jimple.Stmt
4849
import soot.tagkit.ParamNamesTag
4950
import java.lang.reflect.Method
@@ -151,7 +152,6 @@ class UtBotSymbolicEngine(
151152
ConcreteExecutor(
152153
UtExecutionInstrumentation,
153154
classpath,
154-
dependencyPaths
155155
).apply { this.classLoader = utContext.classLoader }
156156

157157
private val featureProcessor: FeatureProcessor? =
@@ -564,7 +564,10 @@ private suspend fun ConcreteExecutor<UtConcreteExecutionResult, UtExecutionInstr
564564
methodUnderTest.classId.name,
565565
methodUnderTest.signature,
566566
arrayOf(),
567-
parameters = UtConcreteExecutionData(stateBefore, instrumentation)
567+
parameters = UtConcreteExecutionData(
568+
stateBefore,
569+
instrumentation
570+
)
568571
).convertToAssemble(methodUnderTest.classId.packageName)
569572

570573
/**

utbot-framework/src/main/kotlin/org/utbot/external/api/UtBotJavaApi.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import org.utbot.framework.codegen.domain.NoStaticMocking
1010
import org.utbot.framework.codegen.domain.StaticsMocking
1111
import org.utbot.framework.codegen.domain.TestFramework
1212
import org.utbot.framework.codegen.services.language.CgLanguageAssistant
13-
import org.utbot.framework.concrete.UtConcreteExecutionData
14-
import org.utbot.framework.concrete.UtConcreteExecutionResult
15-
import org.utbot.framework.concrete.UtExecutionInstrumentation
13+
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionData
14+
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
15+
import org.utbot.instrumentation.instrumentation.execution.UtExecutionInstrumentation
1616
import org.utbot.framework.plugin.api.ClassId
1717
import org.utbot.framework.plugin.api.CodegenLanguage
1818
import org.utbot.framework.plugin.api.MockFramework
@@ -71,7 +71,6 @@ object UtBotJavaApi {
7171
val concreteExecutor = ConcreteExecutor(
7272
UtExecutionInstrumentation,
7373
classpath,
74-
dependencyClassPath
7574
)
7675

7776
testSets.addAll(generateUnitTests(concreteExecutor, methodsForGeneration, classUnderTest))

0 commit comments

Comments
 (0)