From a494d22a26ca36c77c39d6b0f8c86f07c53b14ed Mon Sep 17 00:00:00 2001 From: Rustam Sadykov Date: Mon, 24 Oct 2022 11:22:52 +0300 Subject: [PATCH 01/18] provide fuzzing ratio property reformat serialization --- .../org/utbot/common/AbstractSettings.kt | 5 +- utbot-junit-contest/build.gradle | 4 + .../main/kotlin/org/utbot/contest/Contest.kt | 16 +- .../org/utbot/contest/ContestEstimator.kt | 22 ++- .../kotlin/org/utbot/contest/Statistics.kt | 16 +- .../org/utbot/monitoring/MonitoringReport.kt | 118 +++++++++++++ .../utbot/monitoring/MonitoringSettings.kt | 14 +- .../utbot/monitoring/StatisticsMonitoring.kt | 157 +++++------------- 8 files changed, 205 insertions(+), 147 deletions(-) create mode 100644 utbot-junit-contest/src/main/kotlin/org/utbot/monitoring/MonitoringReport.kt 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 f564d98a20..d3db9a002e 100644 --- a/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt +++ b/utbot-core/src/main/kotlin/org/utbot/common/AbstractSettings.kt @@ -128,6 +128,9 @@ abstract class AbstractSettings( protected fun getStringProperty(defaultValue: String) = getProperty(defaultValue) { it } protected inline fun > getEnumProperty(defaultValue: T) = getProperty(defaultValue) { enumValueOf(it) } - + protected fun getListProperty(defaultValue: List) = + getProperty(defaultValue) { it.split(';') } + protected inline fun getListProperty(defaultValue: List, crossinline elementTransform: (String) -> T) = + getProperty(defaultValue) { it.split(';').map(elementTransform) } override fun toString(): String = container.toString() } \ No newline at end of file diff --git a/utbot-junit-contest/build.gradle b/utbot-junit-contest/build.gradle index 720494e9b8..dd40d660f7 100644 --- a/utbot-junit-contest/build.gradle +++ b/utbot-junit-contest/build.gradle @@ -1,3 +1,6 @@ +plugins { + id 'org.jetbrains.kotlin.plugin.serialization' version '1.7.20' +} apply plugin: 'jacoco' configurations { @@ -58,6 +61,7 @@ dependencies { implementation group: 'org.apache.commons', name: 'commons-exec', version: '1.2' implementation group: 'io.github.microutils', name: 'kotlin-logging', version: kotlinLoggingVersion implementation group: 'org.jsoup', name: 'jsoup', version: '1.6.2' + implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1' // need for tests implementation group: 'org.mockito', name: 'mockito-core', version: '4.2.0' implementation group: 'org.mockito', name: 'mockito-inline', version: '4.2.0' diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt index 2bd9389f7f..4f208cd0e3 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt @@ -138,7 +138,15 @@ fun main(args: Array) { val timeBudgetSec = cmd[2].toLong() val cut = ClassUnderTest(classLoader.loadClass(classUnderTestName).id, outputDir, classfileDir.toFile()) - runGeneration(cut, timeBudgetSec, classpathString, runFromEstimator = false, methodNameFilter = null) + runGeneration( + project = "Contest", + cut, + timeBudgetSec, + fuzzingRatio = 0.1, + classpathString, + runFromEstimator = false, + methodNameFilter = null + ) println("${ContestMessage.READY}") } } @@ -162,8 +170,10 @@ fun setOptions() { @ObsoleteCoroutinesApi @SuppressWarnings fun runGeneration( + project: String, cut: ClassUnderTest, timeLimitSec: Long, + fuzzingRatio: Double, classpathString: String, runFromEstimator: Boolean, methodNameFilter: String? = null // For debug purposes you can specify method name @@ -205,7 +215,7 @@ fun runGeneration( logger.error("Seems like classloader for cut not valid (maybe it was backported to system): ${cut.classLoader}") } - val statsForClass = StatsForClass() + val statsForClass = StatsForClass(project, cut.fqn) val codeGenerator = CodeGenerator( cut.classId, @@ -276,6 +286,8 @@ fun runGeneration( val budgetForSymbolicExecution = max(0, budgetForMethod - budgetForLastSolverRequestAndConcreteExecutionRemainingStates) + UtSettings.utBotGenerationTimeoutInMillis = budgetForMethod + UtSettings.fuzzingTimeoutInMillis = (budgetForMethod * fuzzingRatio).toLong() //start controller that will activate symbolic execution GlobalScope.launch { diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/ContestEstimator.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/ContestEstimator.kt index 3cd74bb432..e3af1ccb40 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/ContestEstimator.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/ContestEstimator.kt @@ -83,6 +83,7 @@ enum class Tool { project: ProjectToEstimate, cut: ClassUnderTest, timeLimit: Long, + fuzzingRatio: Double, methodNameFilter: String?, globalStats: GlobalStats, compiledTestDir: File, @@ -91,8 +92,10 @@ enum class Tool { val classStats: StatsForClass = try { withUtContext(UtContext(project.classloader)) { runGeneration( + project.name, cut, timeLimit, + fuzzingRatio, project.sootClasspathString, runFromEstimator = true, methodNameFilter @@ -167,6 +170,7 @@ enum class Tool { project: ProjectToEstimate, cut: ClassUnderTest, timeLimit: Long, + fuzzingRatio: Double, methodNameFilter: String?, globalStats: GlobalStats, compiledTestDir: File, @@ -237,6 +241,7 @@ enum class Tool { project: ProjectToEstimate, cut: ClassUnderTest, timeLimit: Long, + fuzzingRatio: Double, // maybe create some specific settings methodNameFilter: String?, globalStats: GlobalStats, compiledTestDir: File, @@ -257,6 +262,7 @@ fun main(args: Array) { if (args.isEmpty() && System.getProperty("os.name")?.run { contains("win", ignoreCase = true) } == true) { processedClassesThreshold = 9999 //change to change number of classes to run val timeLimit = 20 // increase if you want to debug something + val fuzzingRatio = 0.1 // sets fuzzing ratio to total test generation // Uncomment it for debug purposes: // you can specify method for test generation in format `classFqn.methodName` @@ -283,12 +289,13 @@ fun main(args: Array) { classesLists, jarsDir, "$timeLimit", + "$fuzzingRatio", outputDir, moduleTestDir ) } else { - require(args.size == 6) { - "Wrong arguments: