From e034256da0c22bceaa021f81e189bf1a47f42920 Mon Sep 17 00:00:00 2001 From: "Vassiliy.Kudryashov" Date: Mon, 5 Dec 2022 19:46:12 +0300 Subject: [PATCH 1/2] If utBotGenerationTimeoutInMillis value is out of allowed scope, IllegalArgumentException is thrown down to IDEA #1438 Implement API for ranges for settings properties --- .../org/utbot/common/AbstractSettings.kt | 35 +++++++++++++++---- .../kotlin/org/utbot/framework/UtSettings.kt | 14 ++++---- .../org/utbot/rd/RdSettingsContainer.kt | 15 +++++++- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt b/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt index d40ae54134..21c4e147a3 100644 --- a/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt +++ b/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt @@ -3,6 +3,7 @@ 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 @@ -10,7 +11,11 @@ import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty interface SettingsContainer { - fun settingFor(defaultValue: T, converter: (String) -> T): PropertyDelegateProvider> + fun settingFor( + defaultValue: T, + range : Triple>? = null, + converter: (String) -> T + ): PropertyDelegateProvider> // Returns true iff some properties have non-default values fun isCustomized() = false @@ -73,19 +78,25 @@ class PropertiesSettingsContainer( override fun settingFor( defaultValue: T, + range : Triple>?, converter: (String) -> T ): PropertyDelegateProvider> { 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 valu[$defaultValue] will be used instead") { e } defaultValue } } @@ -130,16 +141,26 @@ abstract class AbstractSettings( fun areCustomized(): Boolean = container.isCustomized() + protected fun getProperty( + defaultValue: T, + range : Triple>?, + converter: (String) -> T + ): PropertyDelegateProvider> where T: Comparable { + return container.settingFor(defaultValue, range, converter) + } + protected fun getProperty( defaultValue: T, converter: (String) -> T ): PropertyDelegateProvider> { - 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 > getEnumProperty(defaultValue: T) = getProperty(defaultValue) { enumValueOf(it) } diff --git a/utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt b/utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt index b83f71ac56..90fc6fa818 100644 --- a/utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt +++ b/utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt @@ -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. @@ -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. @@ -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 @@ -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. @@ -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 diff --git a/utbot-rd/src/main/kotlin/org/utbot/rd/RdSettingsContainer.kt b/utbot-rd/src/main/kotlin/org/utbot/rd/RdSettingsContainer.kt index 34bac248b1..420a24374a 100644 --- a/utbot-rd/src/main/kotlin/org/utbot/rd/RdSettingsContainer.kt +++ b/utbot-rd/src/main/kotlin/org/utbot/rd/RdSettingsContainer.kt @@ -23,6 +23,7 @@ class RdSettingsContainer(val logger: KLogger, val key: String, val settingsMode override fun settingFor( defaultValue: T, + range : Triple>?, converter: (String) -> T ): PropertyDelegateProvider> { return PropertyDelegateProvider { _, _ -> @@ -30,7 +31,19 @@ class RdSettingsContainer(val logger: KLogger, val key: String, val settingsMode 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 } From 6de02d7004e7ca5996e4544adeb646644dd3c7c9 Mon Sep 17 00:00:00 2001 From: "Vassiliy.Kudryashov" Date: Tue, 6 Dec 2022 12:06:34 +0300 Subject: [PATCH 2/2] Fix for misprint --- utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt b/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt index 21c4e147a3..33a91e5d4a 100644 --- a/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt +++ b/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt @@ -96,7 +96,7 @@ class PropertiesSettingsContainer( } defaultValue } catch (e: Throwable) { - logger.warn("Cannot parse value for ${property.name}, default valu[$defaultValue] will be used instead") { e } + logger.warn("Cannot parse value for ${property.name}, default value [$defaultValue] will be used instead") { e } defaultValue } }