Skip to content

Commit 7b58a17

Browse files
committed
Add a copy of #2627 into competitions branch
1 parent 7f1c3a8 commit 7b58a17

File tree

3 files changed

+25
-3
lines changed
  • utbot-framework/src/main/kotlin/org/utbot/framework/minimization
  • utbot-framework-api/src/main/kotlin/org/utbot/framework
  • utbot-junit-contest/src/main/kotlin/org/utbot/contest

3 files changed

+25
-3
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,12 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
393393
*/
394394
var minimizeCrashExecutions by getBooleanProperty(true)
395395

396+
/**
397+
* Determines maximum number of executions with unknown coverage per method per result type.
398+
* In [ContestUsvm] it is useful if concrete fails, so we use symbolic execution result without trace.
399+
*/
400+
var maxUnknownCoverageExecutionsPerMethodPerResultType by getIntProperty(10)
401+
396402
/**
397403
* Enable it to calculate unsat cores for hard constraints as well.
398404
* It may be usefull during debug.

utbot-framework/src/main/kotlin/org/utbot/framework/minimization/Minimization.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.utbot.framework.plugin.api.UtConcreteExecutionFailure
55
import org.utbot.framework.plugin.api.UtExecution
66
import org.utbot.framework.plugin.api.UtExecutionFailure
77
import org.utbot.framework.plugin.api.UtExecutionResult
8+
import org.utbot.framework.plugin.api.UtExecutionSuccess
89
import org.utbot.framework.plugin.api.UtSymbolicExecution
910
import org.utbot.framework.util.calculateSize
1011
import org.utbot.fuzzer.UtFuzzedExecution
@@ -41,9 +42,23 @@ fun <T : Any> minimizeTestCase(
4142

4243
fun minimizeExecutions(executions: List<UtExecution>): List<UtExecution> {
4344
val unknownCoverageExecutions =
44-
executions.filter { it.coverage?.coveredInstructions.isNullOrEmpty() }.toSet()
45-
// ^^^ here we add executions with empty or null coverage, because it happens only if a concrete execution failed,
46-
// so we don't know the actual coverage for such executions
45+
executions
46+
.filter { it.coverage?.coveredInstructions.isNullOrEmpty() }
47+
.groupBy {
48+
it.result.javaClass to (
49+
(it.result as? UtExecutionSuccess)?.model ?: (it.result as? UtExecutionFailure)?.exception
50+
)?.javaClass
51+
}
52+
.values
53+
.flatMap { executionsGroup ->
54+
val executionToSize = executionsGroup.associateWith { it.stateBefore.calculateSize() }
55+
executionsGroup
56+
.sortedBy { executionToSize[it] }
57+
.take(UtSettings.maxUnknownCoverageExecutionsPerMethodPerResultType)
58+
}
59+
.toSet()
60+
// Here we add executions with empty or null coverage, because if concrete execution failed, we don't know actual coverage.
61+
// The amount of such executions is limited with [UtSettings.maxUnknownCoverageExecutionsPerMethodPerResultType].
4762

4863
val filteredExecutions = filterOutDuplicateCoverages(executions - unknownCoverageExecutions)
4964
val (mapping, executionToPriorityMapping) = buildMapping(filteredExecutions)

utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ fun setOptions() {
177177
UtSettings.preferredCexOption = false
178178
UtSettings.warmupConcreteExecution = true
179179
UtSettings.testMinimizationStrategyType = TestSelectionStrategyType.COVERAGE_STRATEGY
180+
UtSettings.maxUnknownCoverageExecutionsPerMethodPerResultType = 10
180181
UtSettings.ignoreStringLiterals = true
181182
UtSettings.maximizeCoverageUsingReflection = true
182183
UtSettings.useSandbox = false

0 commit comments

Comments
 (0)