@@ -9,7 +9,6 @@ import org.jacodb.api.ext.jcdbSignature
9
9
import org.usvm.instrumentation.testcase.api.UTestExecutionExceptionResult
10
10
import org.usvm.instrumentation.testcase.api.UTestExecutionFailedResult
11
11
import org.usvm.instrumentation.testcase.api.UTestExecutionInitFailedResult
12
- import org.usvm.instrumentation.testcase.api.UTestExecutionResult
13
12
import org.usvm.instrumentation.testcase.api.UTestExecutionState
14
13
import org.usvm.instrumentation.testcase.api.UTestExecutionSuccessResult
15
14
import org.usvm.instrumentation.testcase.api.UTestExecutionTimedOutResult
@@ -20,6 +19,10 @@ import org.usvm.instrumentation.util.enclosingClass
20
19
import org.usvm.instrumentation.util.enclosingMethod
21
20
import org.utbot.common.isPublic
22
21
import org.utbot.contest.usvm.jc.JcExecution
22
+ import org.utbot.contest.usvm.jc.UTestConcreteExecutionResult
23
+ import org.utbot.contest.usvm.jc.UTestResultWrapper
24
+ import org.utbot.contest.usvm.jc.UTestSymbolicExceptionResult
25
+ import org.utbot.contest.usvm.jc.UTestSymbolicSuccessResult
23
26
import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
24
27
import org.utbot.framework.plugin.api.ClassId
25
28
import org.utbot.framework.plugin.api.Coverage
@@ -65,56 +68,91 @@ class JcToUtExecutionConverter(
65
68
private var uTestProcessResult = instToModelConverter.processUTest()
66
69
67
70
fun convert (): UtExecution ? {
68
- val coverage = convertCoverage(getTrace(jcExecution.uTestExecutionResult ), jcExecution.method.enclosingType.jcClass)
71
+ val coverage = convertCoverage(getTrace(jcExecution.uTestExecutionResultWrapper ), jcExecution.method.enclosingType.jcClass)
69
72
70
- val utUsvmExecution: UtUsvmExecution = when (val executionResult = jcExecution.uTestExecutionResult) {
71
- is UTestExecutionSuccessResult -> UtUsvmExecution (
72
- stateBefore = convertState(executionResult.initialState, EnvironmentStateKind .INITIAL , jcExecution.method),
73
- stateAfter = convertState(executionResult.resultState, EnvironmentStateKind .FINAL , jcExecution.method),
74
- // TODO usvm-sbft: ask why `UTestExecutionSuccessResult.result` is nullable
75
- result = UtExecutionSuccess (executionResult.result?.let {
76
- jcToUtModelConverter.convert(it, EnvironmentStateKind .FINAL )
77
- } ? : UtVoidModel ),
78
- coverage = coverage,
79
- instrumentation = uTestProcessResult.instrumentation,
80
- )
81
- is UTestExecutionExceptionResult -> {
73
+ val utUsvmExecution: UtUsvmExecution = when (jcExecution.uTestExecutionResultWrapper) {
74
+ is UTestSymbolicExceptionResult -> {
82
75
UtUsvmExecution (
83
- stateBefore = convertState(executionResult.initialState, EnvironmentStateKind . INITIAL , jcExecution.method ),
84
- stateAfter = convertState(executionResult.resultState, EnvironmentStateKind . FINAL , jcExecution.method) ,
76
+ stateBefore = constructStateBeforeFromUTest( ),
77
+ stateAfter = MissingState ,
85
78
result = createExecutionFailureResult(
86
- executionResult.cause,
87
- jcExecution.method,
79
+ exceptionDescriptor = UTestExceptionDescriptor (
80
+ type = jcExecution.uTestExecutionResultWrapper.exceptionType,
81
+ message = " " ,
82
+ stackTrace = emptyList(),
83
+ raisedByUserCode = true ,
84
+ ),
85
+ jcTypedMethod = jcExecution.method,
88
86
),
89
87
coverage = coverage,
90
88
instrumentation = uTestProcessResult.instrumentation,
91
89
)
92
90
}
93
91
94
- is UTestExecutionInitFailedResult -> {
95
- logger.warn(convertException(executionResult.cause)) {
96
- " Execution failed before method under test call on ${jcExecution.method.method} "
97
- }
98
- null
99
- }
92
+ is UTestSymbolicSuccessResult -> {
93
+ val resultWrapper = jcExecution.uTestExecutionResultWrapper
94
+ resultWrapper.initStatements.forEach { instToModelConverter.processInst(it) }
95
+ instToModelConverter.processInst(resultWrapper.result)
100
96
101
- is UTestExecutionFailedResult -> {
102
- logger.error(convertException(executionResult.cause)) {
103
- " Concrete execution failed on ${jcExecution.method.method} "
104
- }
105
- null
106
- }
97
+ val resultUtModel = instToModelConverter.findModelByInst(resultWrapper.result)
107
98
108
- is UTestExecutionTimedOutResult -> {
109
- logger.warn { " Timeout on ${jcExecution.method.method} " }
110
99
UtUsvmExecution (
111
100
stateBefore = constructStateBeforeFromUTest(),
112
101
stateAfter = MissingState ,
113
- result = UtTimeoutException ( TimeoutException ( " Concrete execution timed out " ) ),
102
+ result = UtExecutionSuccess (resultUtModel ),
114
103
coverage = coverage,
115
104
instrumentation = uTestProcessResult.instrumentation,
116
105
)
117
106
}
107
+
108
+ is UTestConcreteExecutionResult ->
109
+ when (val executionResult = jcExecution.uTestExecutionResultWrapper.uTestExecutionResult) {
110
+ is UTestExecutionSuccessResult -> UtUsvmExecution (
111
+ stateBefore = convertState(executionResult.initialState, EnvironmentStateKind .INITIAL , jcExecution.method),
112
+ stateAfter = convertState(executionResult.resultState, EnvironmentStateKind .FINAL , jcExecution.method),
113
+ // TODO usvm-sbft: ask why `UTestExecutionSuccessResult.result` is nullable
114
+ result = UtExecutionSuccess (executionResult.result?.let {
115
+ jcToUtModelConverter.convert(it, EnvironmentStateKind .FINAL )
116
+ } ? : UtVoidModel ),
117
+ coverage = coverage,
118
+ instrumentation = uTestProcessResult.instrumentation,
119
+ )
120
+
121
+ is UTestExecutionExceptionResult -> {
122
+ UtUsvmExecution (
123
+ stateBefore = convertState(executionResult.initialState, EnvironmentStateKind .INITIAL , jcExecution.method),
124
+ stateAfter = convertState(executionResult.resultState, EnvironmentStateKind .FINAL , jcExecution.method),
125
+ result = createExecutionFailureResult(executionResult.cause, jcExecution.method),
126
+ coverage = coverage,
127
+ instrumentation = uTestProcessResult.instrumentation,
128
+ )
129
+ }
130
+
131
+ is UTestExecutionInitFailedResult -> {
132
+ logger.warn(convertException(executionResult.cause)) {
133
+ " Execution failed before method under test call on ${jcExecution.method.method} "
134
+ }
135
+ null
136
+ }
137
+
138
+ is UTestExecutionFailedResult -> {
139
+ logger.error(convertException(executionResult.cause)) {
140
+ " Concrete execution failed on ${jcExecution.method.method} "
141
+ }
142
+ null
143
+ }
144
+
145
+ is UTestExecutionTimedOutResult -> {
146
+ logger.warn { " Timeout on ${jcExecution.method.method} " }
147
+ UtUsvmExecution (
148
+ stateBefore = constructStateBeforeFromUTest(),
149
+ stateAfter = MissingState ,
150
+ result = UtTimeoutException (TimeoutException (" Concrete execution timed out" )),
151
+ coverage = coverage,
152
+ instrumentation = uTestProcessResult.instrumentation,
153
+ )
154
+ }
155
+ }
118
156
} ? : return null
119
157
120
158
return utUsvmExecution
@@ -206,12 +244,22 @@ class JcToUtExecutionConverter(
206
244
cache = mutableMapOf ()
207
245
)) as Throwable
208
246
209
- private fun getTrace (executionResult : UTestExecutionResult ): List <JcInst >? = when (executionResult) {
210
- is UTestExecutionExceptionResult -> executionResult.trace
211
- is UTestExecutionInitFailedResult -> executionResult.trace
212
- is UTestExecutionSuccessResult -> executionResult.trace
213
- is UTestExecutionFailedResult -> emptyList()
214
- is UTestExecutionTimedOutResult -> emptyList()
247
+ /* *
248
+ * Gets trace from execution result if it is present.
249
+ *
250
+ * Otherwise, (e.g. we use symbolic result if concrete fails),
251
+ * minimization will take just 'UtSettings.maxUnknownCoverageExecutionsPerMethodPerResultType' executions.
252
+ */
253
+ private fun getTrace (executionResult : UTestResultWrapper ): List <JcInst >? = when (executionResult) {
254
+ is UTestConcreteExecutionResult -> when (val res = executionResult.uTestExecutionResult) {
255
+ is UTestExecutionExceptionResult -> res.trace
256
+ is UTestExecutionInitFailedResult -> res.trace
257
+ is UTestExecutionSuccessResult -> res.trace
258
+ is UTestExecutionFailedResult -> emptyList()
259
+ is UTestExecutionTimedOutResult -> emptyList()
260
+ }
261
+ is UTestSymbolicExceptionResult -> emptyList()
262
+ is UTestSymbolicSuccessResult -> emptyList()
215
263
}
216
264
217
265
private fun convertState (
0 commit comments