Skip to content

Commit e379980

Browse files
If invalid value is set for a property in settings.properties, defaul… (#1464)
* If invalid value is set for a property in settings.properties, default value should be applied #1437 Add tests
1 parent 90eaeb5 commit e379980

File tree

2 files changed

+74
-13
lines changed

2 files changed

+74
-13
lines changed

utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.utbot.common
22

33
import java.io.FileInputStream
44
import java.io.IOException
5+
import java.io.InputStream
56
import java.util.*
67
import kotlin.Comparator
78
import mu.KLogger
@@ -17,6 +18,8 @@ interface SettingsContainer {
1718
converter: (String) -> T
1819
): PropertyDelegateProvider<Any?, ReadWriteProperty<Any?, T>>
1920

21+
fun getInputStream() : InputStream? = null
22+
2023
// Returns true iff some properties have non-default values
2124
fun isCustomized() = false
2225
}
@@ -28,10 +31,10 @@ interface SettingsContainerFactory {
2831
defaultSettingsPath: String? = null) : SettingsContainer
2932
}
3033

31-
class PropertiesSettingsContainer(
34+
internal open class PropertiesSettingsContainer(
3235
private val logger: KLogger,
33-
defaultKeyForSettingsPath: String,
34-
defaultSettingsPath: String? = null): SettingsContainer {
36+
val defaultKeyForSettingsPath: String,
37+
val defaultSettingsPath: String? = null): SettingsContainer {
3538
companion object: SettingsContainerFactory {
3639
override fun createSettingsContainer(
3740
logger: KLogger,
@@ -41,19 +44,21 @@ class PropertiesSettingsContainer(
4144
}
4245

4346
private val properties = Properties().also { props ->
44-
val settingsPath = System.getProperty(defaultKeyForSettingsPath) ?: defaultSettingsPath
45-
val settingsPathFile = settingsPath?.toPath()?.toFile()
46-
if (settingsPathFile?.exists() == true) {
47-
try {
48-
FileInputStream(settingsPathFile).use { reader ->
49-
props.load(reader)
50-
}
51-
} catch (e: IOException) {
52-
logger.info(e) { e.message }
47+
try {
48+
getInputStream()?.use {
49+
props.load(it)
5350
}
51+
} catch (e: IOException) {
52+
logger.info(e) { e.message }
5453
}
5554
}
5655

56+
override fun getInputStream() : InputStream? {
57+
val settingsPath = System.getProperty(defaultKeyForSettingsPath) ?: defaultSettingsPath
58+
val settingsPathFile = settingsPath?.toPath()?.toFile()
59+
return if (settingsPathFile?.exists() == true) FileInputStream(settingsPathFile) else null
60+
}
61+
5762
private val settingsValues: MutableMap<KProperty<*>, Any?> = mutableMapOf()
5863
private var customized: Boolean = false
5964

@@ -156,7 +161,12 @@ abstract class AbstractSettings(
156161
return container.settingFor(defaultValue, null, converter)
157162
}
158163

159-
protected fun getBooleanProperty(defaultValue: Boolean) = getProperty(defaultValue, converter = String::toBoolean)
164+
protected fun getBooleanProperty(defaultValue: Boolean) = getProperty(defaultValue, converter = {
165+
//Invalid values shouldn't be parsed as "false"
166+
if (it.equals("true", true)) true
167+
else if (it.equals("false", true)) false
168+
else defaultValue
169+
})
160170
protected fun getIntProperty(defaultValue: Int) = getProperty(defaultValue, converter = String::toInt)
161171
protected fun getIntProperty(defaultValue: Int, minValue: Int, maxValue: Int) = getProperty(defaultValue, Triple(minValue, maxValue, Comparator(Integer::compare)), String::toInt)
162172
protected fun getLongProperty(defaultValue: Long) = getProperty(defaultValue, converter = String::toLong)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.utbot.common
2+
3+
import java.io.InputStream
4+
import mu.KLogger
5+
import mu.KotlinLogging
6+
import org.junit.jupiter.api.Assertions
7+
import org.junit.jupiter.api.Test
8+
9+
10+
internal class AbstractSettingsTest {
11+
@Test
12+
fun testParsing() {
13+
var settings = createSettings("testBoolean=false\ntestInt=3\ntestIntRange=2\ntestLong=333\ntestLongRange=222")
14+
Assertions.assertFalse(settings.testBoolean)
15+
Assertions.assertEquals(3, settings.testInt)
16+
Assertions.assertEquals(2, settings.testIntRange)
17+
Assertions.assertEquals(333, settings.testLong)
18+
Assertions.assertEquals(222, settings.testLongRange)
19+
20+
settings = createSettings("testBoolean=invalid\ntestInt=-1\ntestIntRange=-1\ntestLong=-111\ntestLongRange=-111")
21+
Assertions.assertTrue(settings.testBoolean)
22+
Assertions.assertEquals(-1, settings.testInt)
23+
Assertions.assertEquals(1, settings.testIntRange)
24+
Assertions.assertEquals(-111, settings.testLong)
25+
Assertions.assertEquals(111, settings.testLongRange)
26+
27+
settings = createSettings("")
28+
Assertions.assertTrue(settings.testBoolean)
29+
Assertions.assertEquals(3, settings.testInt)
30+
Assertions.assertEquals(333, settings.testLongRange)
31+
}
32+
33+
private fun createSettings(propertiesText: String): TestSettings {
34+
AbstractSettings.setupFactory(object : SettingsContainerFactory {
35+
override fun createSettingsContainer(
36+
logger: KLogger, defaultKeyForSettingsPath: String, defaultSettingsPath: String?
37+
) = object : PropertiesSettingsContainer(logger, defaultKeyForSettingsPath, defaultSettingsPath) {
38+
override fun getInputStream(): InputStream = propertiesText.byteInputStream()
39+
}
40+
})
41+
return TestSettings()
42+
}
43+
44+
internal class TestSettings : AbstractSettings(KotlinLogging.logger {}, "") {
45+
val testBoolean: Boolean by getBooleanProperty(true)
46+
val testInt: Int by getIntProperty(3)
47+
val testIntRange: Int by getIntProperty(3, 1, 5)
48+
val testLong: Long by getLongProperty(333)
49+
val testLongRange: Long by getLongProperty(333, 111, 555)
50+
}
51+
}

0 commit comments

Comments
 (0)