Skip to content

Make JcMachine's budget distributing strategy and refactor #2695

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import org.utbot.contest.Paths.evosuiteReportFile
import org.utbot.contest.Paths.jarsDir
import org.utbot.contest.Paths.moduleTestDir
import org.utbot.contest.Paths.outputDir
import org.utbot.contest.usvm.executor.UTestRunner
import org.utbot.contest.usvm.jc.JcContainer
import org.utbot.contest.usvm.runUsvmGeneration
import org.utbot.features.FeatureExtractorFactoryImpl
import org.utbot.features.FeatureProcessorWithStatesRepetitionFactory
Expand Down Expand Up @@ -266,8 +266,7 @@ interface Tool {
)

override fun close() {
if (UTestRunner.isInitialized())
UTestRunner.runner.close()
JcContainer.close()
}
}

Expand Down
267 changes: 129 additions & 138 deletions utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/ContestUsvm.kt

Large diffs are not rendered by default.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.utbot.contest.usvm
package org.utbot.contest.usvm.converter

import org.jacodb.analysis.library.analyzers.thisInstance
import org.jacodb.api.JcArrayType
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.utbot.contest.usvm.converter

fun interface InstructionIdProvider {
fun provideInstructionId(methodSignature: String, instIndex: Int): Long
}

class SimpleInstructionIdProvider : InstructionIdProvider {
private val instructionIds = mutableMapOf<Pair<String, Int>, Long>()

override fun provideInstructionId(methodSignature: String, instIndex: Int): Long =
instructionIds.getOrPut(methodSignature to instIndex) { instructionIds.size.toLong() }
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.utbot.contest.usvm
package org.utbot.contest.usvm.converter

import mu.KotlinLogging
import org.jacodb.api.JcClassOrInterface
Expand All @@ -18,7 +18,7 @@ import org.usvm.instrumentation.testcase.descriptor.UTestExceptionDescriptor
import org.usvm.instrumentation.util.enclosingClass
import org.usvm.instrumentation.util.enclosingMethod
import org.utbot.common.isPublic
import org.utbot.contest.usvm.executor.JcExecution
import org.utbot.contest.usvm.jc.JcExecution
import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.Coverage
Expand Down Expand Up @@ -58,7 +58,7 @@ class JcToUtExecutionConverter(
private var jcToUtModelConverter: JcToUtModelConverter

init {
val instToModelConverter = UTestInst2UtModelConverter(idGenerator, jcClasspath, utilMethodProvider)
val instToModelConverter = UTestInstToUtModelConverter(idGenerator, jcClasspath, utilMethodProvider)

instToModelConverter.processUTest(jcExecution.uTest)
jcToUtModelConverter = JcToUtModelConverter(idGenerator, jcClasspath, instToModelConverter)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.utbot.contest.usvm
package org.utbot.contest.usvm.converter

import org.jacodb.api.JcClasspath
import org.usvm.instrumentation.testcase.api.UTestExpression
Expand Down Expand Up @@ -29,10 +29,14 @@ import org.utbot.framework.plugin.api.util.jClass
import org.utbot.framework.plugin.api.util.stringClassId
import org.utbot.fuzzer.IdGenerator

enum class EnvironmentStateKind {
INITIAL, FINAL
}

class JcToUtModelConverter(
private val idGenerator: IdGenerator<Int>,
private val jcClasspath: JcClasspath,
private val instToUtModelConverter: UTestInst2UtModelConverter,
private val instToUtModelConverter: UTestInstToUtModelConverter,
) {
private val descriptorToModelCache = mutableMapOf<UTestValueDescriptor, UtModel>()
private val refIdAndStateKindToDescriptorCache =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.utbot.contest.usvm
package org.utbot.contest.usvm.converter

import org.jacodb.api.JcClasspath
import org.usvm.instrumentation.testcase.UTest
Expand Down Expand Up @@ -49,7 +49,7 @@ import org.utbot.framework.plugin.api.util.classClassId
import org.utbot.framework.plugin.api.util.objectClassId
import org.utbot.fuzzer.IdGenerator

class UTestInst2UtModelConverter(
class UTestInstToUtModelConverter(
private val idGenerator: IdGenerator<Int>,
private val jcClasspath: JcClasspath,
private val utilMethodProvider: UtilMethodProvider,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.utbot.contest.usvm
package org.utbot.contest.usvm.converter

import org.usvm.instrumentation.testcase.descriptor.UTestArrayDescriptor
import org.usvm.instrumentation.testcase.descriptor.UTestClassDescriptor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.utbot.contest.usvm
package org.utbot.contest.usvm.converter

import org.utbot.framework.plugin.api.Coverage
import org.utbot.framework.plugin.api.DocStatement
Expand All @@ -7,6 +7,9 @@ import org.utbot.framework.plugin.api.UtExecution
import org.utbot.framework.plugin.api.UtExecutionResult
import org.utbot.framework.plugin.api.UtExecutionWithInstrumentation
import org.utbot.framework.plugin.api.UtInstrumentation
import org.utbot.framework.plugin.api.mapper.UtModelMapper
import org.utbot.framework.plugin.api.mapper.mapModelIfExists
import org.utbot.framework.plugin.api.mapper.mapModels

class UtUsvmExecution(
stateBefore: EnvironmentModels,
Expand Down Expand Up @@ -64,4 +67,15 @@ class UtUsvmExecution(
displayName,
instrumentation,
)
}
}

fun UtUsvmExecution.mapModels(mapper: UtModelMapper) = copy(
stateBefore = stateBefore.mapModels(mapper),
stateAfter = stateAfter.mapModels(mapper),
result = result.mapModelIfExists(mapper),
coverage = this.coverage,
summary = this.summary,
testMethodName = this.testMethodName,
displayName = this.displayName,
instrumentation = instrumentation.map { it.mapModels(mapper) },
)

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package org.utbot.contest.usvm.jc

import kotlinx.coroutines.runBlocking
import mu.KotlinLogging
import org.jacodb.api.JcClasspath
import org.jacodb.api.JcDatabase
import org.jacodb.impl.JcSettings
import org.jacodb.impl.features.classpaths.UnknownClasses
import org.jacodb.impl.jacodb
import org.usvm.UMachineOptions
import org.usvm.instrumentation.executor.UTestConcreteExecutor
import org.usvm.instrumentation.instrumentation.JcRuntimeTraceInstrumenterFactory
import org.usvm.machine.JcMachine
import java.io.File
import kotlin.time.Duration.Companion.seconds

private val logger = KotlinLogging.logger {}

// TODO usvm-sbft-refactoring: copied from `usvm/usvm-jvm/test`, extract this class back to USVM project
class JcContainer private constructor(
classpath: List<File>,
machineOptions: UMachineOptions,
builder: JcSettings.() -> Unit,
) : AutoCloseable {
val db: JcDatabase
val cp: JcClasspath
val machine: JcMachine
val runner: UTestConcreteExecutor

init {
val (db, cp) = runBlocking {
val db = jacodb(builder)
// TODO usvm-sbft: use classpathWithApproximations here when approximation decoders are finished
val cp = db.classpath(classpath, listOf(UnknownClasses))
db to cp
}
this.db = db
this.cp = cp
this.machine = JcMachine(cp, machineOptions)
this.runner = UTestConcreteExecutor(
JcRuntimeTraceInstrumenterFactory::class,
classpath.map { it.absolutePath },
cp,
CONTEST_TEST_EXECUTION_TIMEOUT
)
runBlocking {
db.awaitBackgroundJobs()
}
}

override fun close() {
cp.close()
db.close()
machine.close()
runner.close()
}

companion object : AutoCloseable {
val CONTEST_TEST_EXECUTION_TIMEOUT = 1.seconds

private val cache = HashMap<Pair<List<File>, UMachineOptions>, JcContainer>()

operator fun invoke(
classpath: List<File>,
machineOptions: UMachineOptions,
builder: JcSettings.() -> Unit,
): JcContainer {
val cacheKey = classpath to machineOptions
return cache[cacheKey] ?: run {
// TODO usvm-sbft: right now max cache size is 1, do we need to increase it?
logger.info { "JcContainer cache miss" }
close()
JcContainer(classpath, machineOptions, builder).also { cache[cacheKey] = it }
}
}

override fun close() {
cache.values.forEach { it.close() }
cache.clear()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.utbot.contest.usvm.executor
package org.utbot.contest.usvm.jc

import org.jacodb.api.JcTypedMethod
import org.usvm.api.JcCoverage
Expand Down
Loading