@@ -9,7 +9,6 @@ import org.jacodb.api.ext.jcdbSignature
99import org.usvm.instrumentation.testcase.api.UTestExecutionExceptionResult
1010import org.usvm.instrumentation.testcase.api.UTestExecutionFailedResult
1111import org.usvm.instrumentation.testcase.api.UTestExecutionInitFailedResult
12- import org.usvm.instrumentation.testcase.api.UTestExecutionResult
1312import org.usvm.instrumentation.testcase.api.UTestExecutionState
1413import org.usvm.instrumentation.testcase.api.UTestExecutionSuccessResult
1514import org.usvm.instrumentation.testcase.api.UTestExecutionTimedOutResult
@@ -20,6 +19,10 @@ import org.usvm.instrumentation.util.enclosingClass
2019import org.usvm.instrumentation.util.enclosingMethod
2120import org.utbot.common.isPublic
2221import 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
2326import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
2427import org.utbot.framework.plugin.api.ClassId
2528import org.utbot.framework.plugin.api.Coverage
@@ -65,56 +68,91 @@ class JcToUtExecutionConverter(
6568 private var uTestProcessResult = instToModelConverter.processUTest()
6669
6770 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)
6972
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 -> {
8275 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 ,
8578 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,
8886 ),
8987 coverage = coverage,
9088 instrumentation = uTestProcessResult.instrumentation,
9189 )
9290 }
9391
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)
10096
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)
10798
108- is UTestExecutionTimedOutResult -> {
109- logger.warn { " Timeout on ${jcExecution.method.method} " }
11099 UtUsvmExecution (
111100 stateBefore = constructStateBeforeFromUTest(),
112101 stateAfter = MissingState ,
113- result = UtTimeoutException ( TimeoutException ( " Concrete execution timed out " ) ),
102+ result = UtExecutionSuccess (resultUtModel ),
114103 coverage = coverage,
115104 instrumentation = uTestProcessResult.instrumentation,
116105 )
117106 }
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+ }
118156 } ? : return null
119157
120158 return utUsvmExecution
@@ -206,12 +244,22 @@ class JcToUtExecutionConverter(
206244 cache = mutableMapOf ()
207245 )) as Throwable
208246
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()
215263 }
216264
217265 private fun convertState (
0 commit comments