Skip to content

Commit d4d7efc

Browse files
authored
Avoid MissingState being use as stateBefore (#2506)
1 parent 188f682 commit d4d7efc

File tree

9 files changed

+40
-24
lines changed

9 files changed

+40
-24
lines changed

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/SimpleUtExecutionInstrumentation.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class SimpleUtExecutionInstrumentation(
4646
methodSignature: String,
4747
arguments: ArgumentList,
4848
parameters: Any?,
49-
phasesWrapper: PhasesController.(invokeBasePhases: () -> UtConcreteExecutionResult) -> UtConcreteExecutionResult
49+
phasesWrapper: PhasesController.(invokeBasePhases: () -> PreliminaryUtConcreteExecutionResult) -> PreliminaryUtConcreteExecutionResult
5050
): UtConcreteExecutionResult {
5151
if (parameters !is UtConcreteExecutionData) {
5252
throw IllegalArgumentException("Argument parameters must be of type UtConcreteExecutionData, but was: ${parameters?.javaClass}")
@@ -115,8 +115,7 @@ class SimpleUtExecutionInstrumentation(
115115
Triple(executionResult, stateAfter, newInstrumentation)
116116
}
117117

118-
UtConcreteExecutionResult(
119-
parameters.stateBefore,
118+
PreliminaryUtConcreteExecutionResult(
120119
stateAfter,
121120
executionResult,
122121
coverage,
@@ -127,7 +126,7 @@ class SimpleUtExecutionInstrumentation(
127126
applyPostprocessing()
128127
}
129128
}
130-
}
129+
}.toCompleteUtConcreteExecutionResult(stateBefore = stateBefore)
131130
}
132131

133132
override fun getStaticField(fieldId: FieldId): Result<UtModel> =

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/UtExecutionInstrumentation.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,26 @@ data class UtConcreteExecutionData(
2222
val timeout: Long
2323
)
2424

25+
/**
26+
* [UtConcreteExecutionResult] that has not yet been populated with extra data, e.g.:
27+
* - updated `stateBefore: EnvironmentModels`
28+
* - `detectedMockingCandidates: Set<ExecutableId>` (not yet implemented, see #2321)
29+
*/
30+
data class PreliminaryUtConcreteExecutionResult(
31+
val stateAfter: EnvironmentModels,
32+
val result: UtExecutionResult,
33+
val coverage: Coverage,
34+
val newInstrumentation: List<UtInstrumentation>? = null,
35+
) {
36+
fun toCompleteUtConcreteExecutionResult(stateBefore: EnvironmentModels) = UtConcreteExecutionResult(
37+
stateBefore,
38+
stateAfter,
39+
result,
40+
coverage,
41+
newInstrumentation,
42+
)
43+
}
44+
2545
data class UtConcreteExecutionResult(
2646
val stateBefore: EnvironmentModels,
2747
val stateAfter: EnvironmentModels,
@@ -31,6 +51,7 @@ data class UtConcreteExecutionResult(
3151
) {
3252
override fun toString(): String = buildString {
3353
appendLine("UtConcreteExecutionResult(")
54+
appendLine("stateBefore=$stateBefore")
3455
appendLine("stateAfter=$stateAfter")
3556
appendLine("result=$result")
3657
appendLine("coverage=$coverage)")
@@ -52,7 +73,7 @@ interface UtExecutionInstrumentation : Instrumentation<UtConcreteExecutionResult
5273
methodSignature: String,
5374
arguments: ArgumentList,
5475
parameters: Any?,
55-
phasesWrapper: PhasesController.(invokeBasePhases: () -> UtConcreteExecutionResult) -> UtConcreteExecutionResult
76+
phasesWrapper: PhasesController.(invokeBasePhases: () -> PreliminaryUtConcreteExecutionResult) -> PreliminaryUtConcreteExecutionResult
5677
): UtConcreteExecutionResult
5778

5879
interface Factory<out TInstrumentation : UtExecutionInstrumentation> : Instrumentation.Factory<UtConcreteExecutionResult, TInstrumentation> {

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/phases/ExecutionPhase.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.utbot.instrumentation.instrumentation.execution.phases
22

33
import com.jetbrains.rd.util.getLogger
44
import org.utbot.common.measureTime
5-
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
5+
import org.utbot.instrumentation.instrumentation.execution.PreliminaryUtConcreteExecutionResult
66
import org.utbot.rd.loggers.debug
77

88
private val logger = getLogger<ExecutionPhase>()
@@ -13,7 +13,7 @@ abstract class ExecutionPhaseException(override val message: String) : Exception
1313
class ExecutionPhaseError(phase: String, override val cause: Throwable) : ExecutionPhaseException(phase)
1414

1515
// Execution will be stopped, but considered successful, result will be returned
16-
class ExecutionPhaseStop(phase: String, val result: UtConcreteExecutionResult) : ExecutionPhaseException(phase)
16+
class ExecutionPhaseStop(phase: String, val result: PreliminaryUtConcreteExecutionResult) : ExecutionPhaseException(phase)
1717

1818
interface ExecutionPhase {
1919
fun wrapError(e: Throwable): ExecutionPhaseException

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/phases/InvocationPhase.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import org.utbot.framework.plugin.api.MissingState
55
import org.utbot.framework.plugin.api.TimeoutException
66
import org.utbot.framework.plugin.api.UtTimeoutException
77
import org.utbot.instrumentation.instrumentation.Instrumentation
8-
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
8+
import org.utbot.instrumentation.instrumentation.execution.PreliminaryUtConcreteExecutionResult
99

1010

1111
/**
@@ -20,8 +20,7 @@ class InvocationPhase(
2020
return when (e) {
2121
is TimeoutException -> ExecutionPhaseStop(
2222
message,
23-
UtConcreteExecutionResult(
24-
stateBefore = MissingState,
23+
PreliminaryUtConcreteExecutionResult(
2524
stateAfter = MissingState,
2625
result = UtTimeoutException(e),
2726
coverage = Coverage()

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/phases/ModelConstructionPhase.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import org.utbot.framework.plugin.api.util.jField
77
import org.utbot.framework.plugin.api.visible.UtStreamConsumingException
88
import org.utbot.instrumentation.instrumentation.et.ExplicitThrowInstruction
99
import org.utbot.instrumentation.instrumentation.et.TraceHandler
10-
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
10+
import org.utbot.instrumentation.instrumentation.execution.PreliminaryUtConcreteExecutionResult
1111
import org.utbot.instrumentation.instrumentation.execution.constructors.UtCompositeModelStrategy
1212
import org.utbot.instrumentation.instrumentation.execution.constructors.UtModelWithCompositeOriginConstructor
1313
import org.utbot.instrumentation.instrumentation.execution.constructors.UtModelConstructor
@@ -27,8 +27,7 @@ class ModelConstructionPhase(
2727
return when (e) {
2828
is TimeoutException -> ExecutionPhaseStop(
2929
message,
30-
UtConcreteExecutionResult(
31-
stateBefore = MissingState,
30+
PreliminaryUtConcreteExecutionResult(
3231
stateAfter = MissingState,
3332
result = UtTimeoutException(e),
3433
coverage = Coverage()

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/phases/PhasesController.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import org.utbot.framework.plugin.api.util.utContext
1212
import org.utbot.framework.plugin.api.util.withUtContext
1313
import org.utbot.instrumentation.instrumentation.Instrumentation
1414
import org.utbot.instrumentation.instrumentation.et.TraceHandler
15+
import org.utbot.instrumentation.instrumentation.execution.PreliminaryUtConcreteExecutionResult
1516
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionData
16-
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
1717
import org.utbot.instrumentation.instrumentation.execution.context.InstrumentationContext
1818
import java.security.AccessControlException
1919

@@ -39,15 +39,14 @@ class PhasesController(
3939

4040
val postprocessingPhase = PostprocessingPhase()
4141

42-
inline fun computeConcreteExecutionResult(block: PhasesController.() -> UtConcreteExecutionResult): UtConcreteExecutionResult {
42+
inline fun computeConcreteExecutionResult(block: PhasesController.() -> PreliminaryUtConcreteExecutionResult): PreliminaryUtConcreteExecutionResult {
4343
try {
4444
return this.block()
4545
} catch (e: ExecutionPhaseStop) {
4646
return e.result
4747
} catch (e: ExecutionPhaseError) {
4848
if (e.cause.cause is AccessControlException) {
49-
return UtConcreteExecutionResult(
50-
stateBefore = MissingState,
49+
return PreliminaryUtConcreteExecutionResult(
5150
stateAfter = MissingState,
5251
result = UtSandboxFailure(e.cause.cause!!),
5352
coverage = Coverage()

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/phases/StatisticsCollectionPhase.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.utbot.framework.plugin.api.util.id
66
import org.utbot.framework.plugin.api.util.utContext
77
import org.utbot.instrumentation.instrumentation.et.EtInstruction
88
import org.utbot.instrumentation.instrumentation.et.TraceHandler
9-
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
9+
import org.utbot.instrumentation.instrumentation.execution.PreliminaryUtConcreteExecutionResult
1010
import org.utbot.instrumentation.instrumentation.execution.ndd.NonDeterministicResultStorage
1111
import java.util.*
1212

@@ -22,8 +22,7 @@ class StatisticsCollectionPhase(
2222
return when (e) {
2323
is TimeoutException -> ExecutionPhaseStop(
2424
message,
25-
UtConcreteExecutionResult(
26-
stateBefore = MissingState,
25+
PreliminaryUtConcreteExecutionResult(
2726
stateAfter = MissingState,
2827
result = UtTimeoutException(e),
2928
coverage = Coverage()

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/execution/phases/ValueConstructionPhase.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import java.util.IdentityHashMap
55
import org.utbot.instrumentation.instrumentation.execution.constructors.InstrumentationContextAwareValueConstructor
66
import org.utbot.instrumentation.instrumentation.execution.context.InstrumentationContext
77
import org.utbot.framework.plugin.api.util.isInaccessibleViaReflection
8-
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
8+
import org.utbot.instrumentation.instrumentation.execution.PreliminaryUtConcreteExecutionResult
99

1010
typealias ConstructedParameters = List<UtConcreteValue<*>>
1111
typealias ConstructedStatics = Map<FieldId, UtConcreteValue<*>>
@@ -26,8 +26,7 @@ class ValueConstructionPhase(
2626

2727
override fun wrapError(e: Throwable): ExecutionPhaseException = ExecutionPhaseStop(
2828
phase = this.javaClass.simpleName,
29-
result = UtConcreteExecutionResult(
30-
stateBefore = MissingState,
29+
result = PreliminaryUtConcreteExecutionResult(
3130
stateAfter = MissingState,
3231
result = when(e) {
3332
is TimeoutException -> UtTimeoutException(e)

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/spring/SpringUtExecutionInstrumentation.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.utbot.framework.plugin.api.UtModel
1414
import org.utbot.framework.plugin.api.util.id
1515
import org.utbot.framework.plugin.api.util.jClass
1616
import org.utbot.instrumentation.instrumentation.ArgumentList
17+
import org.utbot.instrumentation.instrumentation.execution.PreliminaryUtConcreteExecutionResult
1718
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
1819
import org.utbot.instrumentation.instrumentation.execution.UtExecutionInstrumentation
1920
import org.utbot.instrumentation.instrumentation.execution.constructors.UtModelConstructor
@@ -64,7 +65,7 @@ class SpringUtExecutionInstrumentation(
6465
methodSignature: String,
6566
arguments: ArgumentList,
6667
parameters: Any?,
67-
phasesWrapper: PhasesController.(invokeBasePhases: () -> UtConcreteExecutionResult) -> UtConcreteExecutionResult
68+
phasesWrapper: PhasesController.(invokeBasePhases: () -> PreliminaryUtConcreteExecutionResult) -> PreliminaryUtConcreteExecutionResult
6869
): UtConcreteExecutionResult = synchronized(this) {
6970
getRelevantBeans(clazz).forEach { beanName -> springApi.resetBean(beanName) }
7071
return delegateInstrumentation.invoke(clazz, methodSignature, arguments, parameters) { invokeBasePhases ->

0 commit comments

Comments
 (0)