Skip to content
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
35 changes: 28 additions & 7 deletions utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ package org.utbot.common
import java.io.FileInputStream
import java.io.IOException
import java.util.*
import kotlin.Comparator
import mu.KLogger
import org.utbot.common.PathUtil.toPath
import kotlin.properties.PropertyDelegateProvider
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

interface SettingsContainer {
fun <T> settingFor(defaultValue: T, converter: (String) -> T): PropertyDelegateProvider<Any?, ReadWriteProperty<Any?, T>>
fun <T> settingFor(
defaultValue: T,
range : Triple<T, T, Comparator<T>>? = null,
converter: (String) -> T
): PropertyDelegateProvider<Any?, ReadWriteProperty<Any?, T>>

// Returns true iff some properties have non-default values
fun isCustomized() = false
Expand Down Expand Up @@ -73,19 +78,25 @@ class PropertiesSettingsContainer(

override fun <T> settingFor(
defaultValue: T,
range : Triple<T, T, Comparator<T>>?,
converter: (String) -> T
): PropertyDelegateProvider<Any?, ReadWriteProperty<Any?, T>> {
return PropertyDelegateProvider { _, property ->
SettingDelegate(property) {
try {
properties.getProperty(property.name)?.let {
val parsedValue = converter.invoke(it)
var parsedValue = converter.invoke(it)
range?.let {
// Coerce parsed value into the specified range
parsedValue = maxOf(parsedValue, range.first, range.third)
parsedValue = minOf(parsedValue, range.second, range.third)
}
customized = customized or (parsedValue != defaultValue)
return@SettingDelegate parsedValue
}
defaultValue
} catch (e: Throwable) {
logger.info(e) { e.message }
logger.warn("Cannot parse value for ${property.name}, default value [$defaultValue] will be used instead") { e }
defaultValue
}
}
Expand Down Expand Up @@ -130,16 +141,26 @@ abstract class AbstractSettings(

fun areCustomized(): Boolean = container.isCustomized()

protected fun <T> getProperty(
defaultValue: T,
range : Triple<T, T, Comparator<T>>?,
converter: (String) -> T
): PropertyDelegateProvider<Any?, ReadWriteProperty<Any?, T>> where T: Comparable<T> {
return container.settingFor(defaultValue, range, converter)
}

protected fun <T> getProperty(
defaultValue: T,
converter: (String) -> T
): PropertyDelegateProvider<Any?, ReadWriteProperty<Any?, T>> {
return container.settingFor(defaultValue, converter)
return container.settingFor(defaultValue, null, converter)
}

protected fun getBooleanProperty(defaultValue: Boolean) = getProperty(defaultValue, String::toBoolean)
protected fun getIntProperty(defaultValue: Int) = getProperty(defaultValue, String::toInt)
protected fun getLongProperty(defaultValue: Long) = getProperty(defaultValue, String::toLong)
protected fun getBooleanProperty(defaultValue: Boolean) = getProperty(defaultValue, converter = String::toBoolean)
protected fun getIntProperty(defaultValue: Int) = getProperty(defaultValue, converter = String::toInt)
protected fun getIntProperty(defaultValue: Int, minValue: Int, maxValue: Int) = getProperty(defaultValue, Triple(minValue, maxValue, Comparator(Integer::compare)), String::toInt)
protected fun getLongProperty(defaultValue: Long) = getProperty(defaultValue, converter = String::toLong)
protected fun getLongProperty(defaultValue: Long, minValue: Long, maxValue: Long) = getProperty(defaultValue, Triple(minValue, maxValue, Comparator(Long::compareTo)), String::toLong)
protected fun getStringProperty(defaultValue: String) = getProperty(defaultValue) { it }
protected inline fun <reified T : Enum<T>> getEnumProperty(defaultValue: T) =
getProperty(defaultValue) { enumValueOf(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
*
* Set it to 0 to disable timeout.
*/
var checkSolverTimeoutMillis: Int by getIntProperty(1000)
var checkSolverTimeoutMillis: Int by getIntProperty(1000, 0, Int.MAX_VALUE)

/**
* Timeout for symbolic execution
*
*/
var utBotGenerationTimeoutInMillis by getLongProperty(60000L)
var utBotGenerationTimeoutInMillis by getLongProperty(60000L, 1000L, Long.MAX_VALUE)

/**
* Random seed in path selector.
Expand Down Expand Up @@ -223,7 +223,7 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
* Test related files from the temp directory that are older than [daysLimitForTempFiles]
* will be removed at the beginning of the test run.
*/
var daysLimitForTempFiles by getIntProperty(3)
var daysLimitForTempFiles by getIntProperty(3, 0, 30)

/**
* Enables soft constraints in the engine.
Expand All @@ -244,12 +244,12 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
/**
* Set the total attempts to improve coverage by fuzzer.
*/
var fuzzingMaxAttempts: Int by getIntProperty(Int.MAX_VALUE)
var fuzzingMaxAttempts: Int by getIntProperty(Int.MAX_VALUE, 0, Int.MAX_VALUE)

/**
* Fuzzer tries to generate and run tests during this time.
*/
var fuzzingTimeoutInMillis: Long by getLongProperty(3_000L)
var fuzzingTimeoutInMillis: Long by getLongProperty(3_000L, 0, Long.MAX_VALUE)

/**
* Generate tests that treat possible overflows in arithmetic operations as errors
Expand Down Expand Up @@ -316,7 +316,7 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
* The instrumented process JDWP agent's port of the instrumented process.
* A debugger attaches to the port in order to debug the process.
*/
var instrumentedProcessDebugPort by getIntProperty(5006)
var instrumentedProcessDebugPort by getIntProperty(5006, 0, 65535)

/**
* Value of the suspend mode for the JDWP agent of the instrumented process.
Expand Down Expand Up @@ -436,7 +436,7 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
/**
* Limit for number of generated tests per method (in each region)
*/
var maxTestsPerMethodInRegion by getIntProperty(50)
var maxTestsPerMethodInRegion by getIntProperty(50, 1, Integer.MAX_VALUE)

/**
* Max file length for generated test file
Expand Down
15 changes: 14 additions & 1 deletion utbot-rd/src/main/kotlin/org/utbot/rd/RdSettingsContainer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,27 @@ class RdSettingsContainer(val logger: KLogger, val key: String, val settingsMode

override fun <T> settingFor(
defaultValue: T,
range : Triple<T, T, Comparator<T>>?,
converter: (String) -> T
): PropertyDelegateProvider<Any?, ReadWriteProperty<Any?, T>> {
return PropertyDelegateProvider { _, _ ->
object : ReadWriteProperty<Any?, T> {
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
val params = SettingForArgument(key, property.name)
return settingsModel.settingFor.startBlocking(params).value?.let {
converter(it)
try {
return range?.run {
// Coerce parsed value into the specified range
minOf(
range.second,
maxOf(converter(it), range.first, range.third),
range.third
)
} ?: converter(it)
} catch (e: Exception) {
logger.warn("Cannot parse value for $key, default value [$defaultValue] will be used instead") { e }
defaultValue
}
} ?: defaultValue
}

Expand Down