@@ -6,10 +6,7 @@ import com.jetbrains.rd.util.lifetime.Lifetime
6
6
import kotlinx.coroutines.runBlocking
7
7
import mu.KotlinLogging
8
8
import org.utbot.analytics.AnalyticsConfigureUtil
9
- import org.utbot.common.AbstractSettings
10
- import org.utbot.common.allNestedClasses
11
- import org.utbot.common.appendHtmlLine
12
- import org.utbot.common.nameOfPackage
9
+ import org.utbot.common.*
13
10
import org.utbot.engine.util.mockListeners.ForceMockListener
14
11
import org.utbot.engine.util.mockListeners.ForceStaticMockListener
15
12
import org.utbot.framework.codegen.*
@@ -50,8 +47,14 @@ import kotlin.time.Duration.Companion.seconds
50
47
private val messageFromMainTimeoutMillis = 120 .seconds
51
48
private val logger = KotlinLogging .logger {}
52
49
50
+ @Suppress(" unused" )
51
+ object EngineProcessMain
52
+
53
53
// use log4j2.configurationFile property to set log4j configuration
54
54
suspend fun main (args : Array <String >) = runBlocking {
55
+ logger.info(" -----------------------------------------------------------------------" )
56
+ logger.info(" -------------------NEW ENGINE PROCESS STARTED--------------------------" )
57
+ logger.info(" -----------------------------------------------------------------------" )
55
58
// 0 - auto port for server, should not be used here
56
59
val port = findRdPort(args)
57
60
@@ -62,9 +65,6 @@ suspend fun main(args: Array<String>) = runBlocking {
62
65
val kryoHelper = KryoHelper (lifetime)
63
66
engineProcessModel.setup(kryoHelper, it, protocol)
64
67
}
65
- logger.info { " runBlocking ending" }
66
- }.also {
67
- logger.info { " runBlocking ended" }
68
68
}
69
69
70
70
private lateinit var testGenerator: TestCaseGenerator
@@ -74,12 +74,12 @@ private var idCounter: Long = 0
74
74
75
75
private fun EngineProcessModel.setup (kryoHelper : KryoHelper , watchdog : IdleWatchdog , realProtocol : IProtocol ) {
76
76
val model = this
77
- watchdog.wrapActiveCall (setupUtContext) { params ->
77
+ watchdog.bracketActiveCall (setupUtContext, " UtContext setup " ) { params ->
78
78
UtContext .setUtContext(UtContext (URLClassLoader (params.classpathForUrlsClassloader.map {
79
79
File (it).toURI().toURL()
80
80
}.toTypedArray())))
81
81
}
82
- watchdog.wrapActiveCall (createTestGenerator) { params ->
82
+ watchdog.bracketActiveCall (createTestGenerator, " Creating Test Generator " ) { params ->
83
83
AnalyticsConfigureUtil .configureML()
84
84
Instrumenter .adapter = RdInstrumenter (realProtocol.rdInstrumenterAdapter)
85
85
testGenerator = TestCaseGenerator (buildDirs = params.buildDir.map { Paths .get(it) },
@@ -92,37 +92,39 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch
92
92
}
93
93
})
94
94
}
95
- watchdog.wrapActiveCall(generate) { params ->
96
- val mockFrameworkInstalled = params.mockInstalled
97
- val conflictTriggers = ConflictTriggers (kryoHelper.readObject(params.conflictTriggers))
98
- if (! mockFrameworkInstalled) {
99
- ForceMockListener .create(testGenerator, conflictTriggers, cancelJob = true )
100
- }
101
- val staticsMockingConfigured = params.staticsMockingIsConfigureda
102
- if (! staticsMockingConfigured) {
103
- ForceStaticMockListener .create(testGenerator, conflictTriggers, cancelJob = true )
104
- }
105
- val result = testGenerator.generate(kryoHelper.readObject(params.methods),
106
- MockStrategyApi .valueOf(params.mockStrategy),
107
- kryoHelper.readObject(params.chosenClassesToMockAlways),
108
- params.timeout,
109
- generate = testFlow {
110
- generationTimeout = params.generationTimeout
111
- isSymbolicEngineEnabled = params.isSymbolicEngineEnabled
112
- isFuzzingEnabled = params.isFuzzingEnabled
113
- fuzzingValue = params.fuzzingValue
114
- })
115
- .apply { logger.info(" generation ended, starting summarization, result size: ${this .size} " ) }
116
- .map { it.summarize(Paths .get(params.searchDirectory), sourceFile = null ) }
117
- .apply { logger.info(" summarization ended" ) }
118
- .filterNot { it.executions.isEmpty() && it.errors.isEmpty() }
95
+ watchdog.bracketActiveCall(generate, " Generating tests" ) { params ->
96
+ val methods: List <ExecutableId > = kryoHelper.readObject(params.methods)
97
+ logger.debug().bracket(" starting generation for ${methods.size} methods, starting with ${methods.first()} " ) {
98
+ val mockFrameworkInstalled = params.mockInstalled
99
+ val conflictTriggers = ConflictTriggers (kryoHelper.readObject(params.conflictTriggers))
100
+ if (! mockFrameworkInstalled) {
101
+ ForceMockListener .create(testGenerator, conflictTriggers, cancelJob = true )
102
+ }
103
+ val staticsMockingConfigured = params.staticsMockingIsConfigureda
104
+ if (! staticsMockingConfigured) {
105
+ ForceStaticMockListener .create(testGenerator, conflictTriggers, cancelJob = true )
106
+ }
107
+ val result = testGenerator.generate(methods,
108
+ MockStrategyApi .valueOf(params.mockStrategy),
109
+ kryoHelper.readObject(params.chosenClassesToMockAlways),
110
+ params.timeout,
111
+ generate = testFlow {
112
+ generationTimeout = params.generationTimeout
113
+ isSymbolicEngineEnabled = params.isSymbolicEngineEnabled
114
+ isFuzzingEnabled = params.isFuzzingEnabled
115
+ fuzzingValue = params.fuzzingValue
116
+ }).apply { logger.info(" generation ended, starting summarization, result size: ${this .size} " ) }
117
+ .map { it.summarize(Paths .get(params.searchDirectory), null ) }
118
+ .apply { logger.info(" summarization ended" ) }
119
+ .filterNot { it.executions.isEmpty() && it.errors.isEmpty() }
119
120
120
- val id = ++ idCounter
121
+ val id = ++ idCounter
121
122
122
- testSets[id] = result
123
- GenerateResult (result.size, id)
123
+ testSets[id] = result
124
+ GenerateResult (result.size, id)
125
+ }
124
126
}
125
- watchdog.wrapActiveCall (render) { params ->
127
+ watchdog.bracketActiveCall (render, " Rendering tests " ) { params ->
126
128
val testFramework = testFrameworkByName(params.testFramework)
127
129
val staticMocking = if (params.staticsMocking.startsWith(" No" )) {
128
130
NoStaticMocking
@@ -147,37 +149,32 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch
147
149
enableTestsTimeout = params.enableTestsTimeout,
148
150
testClassPackageName = params.testClassPackageName
149
151
)
150
- codeGenerator.generateAsStringWithTestReport(testSets[testSetsId]!! )
151
- .let {
152
- testGenerationReports.add(it.testsGenerationReport)
153
- RenderResult (it.generatedCode, it.utilClassKind?.javaClass?.simpleName)
154
- }
152
+ codeGenerator.generateAsStringWithTestReport(testSets[testSetsId]!! ).let {
153
+ testGenerationReports.add(it.testsGenerationReport)
154
+ RenderResult (it.generatedCode, it.utilClassKind?.javaClass?.simpleName)
155
+ }
155
156
}
156
- watchdog.wrapActiveCall(stopProcess) { watchdog.stopProtocol() }
157
- watchdog.wrapActiveCall(obtainClassId) { canonicalName ->
157
+ watchdog.bracketActiveCall(obtainClassId, " Obtain class id in UtContext" ) { canonicalName ->
158
158
kryoHelper.writeObject(UtContext .currentContext()!! .classLoader.loadClass(canonicalName).id)
159
159
}
160
- watchdog.wrapActiveCall (findMethodsInClassMatchingSelected) { params ->
160
+ watchdog.bracketActiveCall (findMethodsInClassMatchingSelected, " Find methods in Class " ) { params ->
161
161
val classId = kryoHelper.readObject<ClassId >(params.classId)
162
162
val selectedMethodDescriptions =
163
163
params.methodDescriptions.map { MethodDescription (it.name, it.containingClass, it.parametersTypes) }
164
164
FindMethodsInClassMatchingSelectedResult (kryoHelper.writeObject(classId.jClass.allNestedClasses.flatMap { clazz ->
165
165
clazz.id.allMethods.mapNotNull { it.method.kotlinFunction }
166
166
.sortedWith(compareBy { selectedMethodDescriptions.indexOf(it.methodDescription()) })
167
- .filter { it.methodDescription().normalized() in selectedMethodDescriptions }
168
- .map { it.executableId }
167
+ .filter { it.methodDescription().normalized() in selectedMethodDescriptions }.map { it.executableId }
169
168
}))
170
169
}
171
- watchdog.wrapActiveCall (findMethodParamNames) { params ->
170
+ watchdog.bracketActiveCall (findMethodParamNames, " Find method parameters names " ) { params ->
172
171
val classId = kryoHelper.readObject<ClassId >(params.classId)
173
172
val byMethodDescription = kryoHelper.readObject<Map <MethodDescription , List <String >>>(params.bySignature)
174
- FindMethodParamNamesResult (kryoHelper.writeObject(
175
- classId.jClass.allNestedClasses.flatMap { clazz -> clazz.id.allMethods.mapNotNull { it.method.kotlinFunction } }
176
- .mapNotNull { method -> byMethodDescription[method.methodDescription()]?.let { params -> method.executableId to params } }
177
- .toMap()
178
- ))
173
+ FindMethodParamNamesResult (kryoHelper.writeObject(classId.jClass.allNestedClasses.flatMap { clazz -> clazz.id.allMethods.mapNotNull { it.method.kotlinFunction } }
174
+ .mapNotNull { method -> byMethodDescription[method.methodDescription()]?.let { params -> method.executableId to params } }
175
+ .toMap()))
179
176
}
180
- watchdog.wrapActiveCall (writeSarifReport) { params ->
177
+ watchdog.bracketActiveCall (writeSarifReport, " Writing Sarif report " ) { params ->
181
178
val reportFilePath = Paths .get(params.reportFilePath)
182
179
reportFilePath.parent.toFile().mkdirs()
183
180
val sarifReport = SarifReport (
@@ -188,12 +185,12 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch
188
185
reportFilePath.toFile().writeText(sarifReport)
189
186
sarifReport
190
187
}
191
- watchdog.wrapActiveCall (generateTestReport) { params ->
188
+ watchdog.bracketActiveCall (generateTestReport, " Generating test report " ) { params ->
192
189
val eventLogMessage = params.eventLogMessage
193
190
val testPackageName: String? = params.testPackageName
194
191
var hasWarnings = false
195
192
val reports = testGenerationReports
196
- if (reports.isEmpty()) return @wrapActiveCall GenerateTestReportResult (" No tests were generated" , null , true )
193
+ if (reports.isEmpty()) return @bracketActiveCall GenerateTestReportResult (" No tests were generated" , null , true )
197
194
val isMultiPackage = params.isMultiPackage
198
195
val (notifyMessage, statistics) = if (reports.size == 1 ) {
199
196
val report = reports.first()
@@ -202,15 +199,13 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch
202
199
val message = buildString {
203
200
appendHtmlLine(report.toString(isShort = true ))
204
201
205
- val classUnderTestPackageName =
206
- report.classUnderTest.java.nameOfPackage
202
+ val classUnderTestPackageName = report.classUnderTest.java.nameOfPackage
207
203
208
- destinationWarningMessage(testPackageName, classUnderTestPackageName)
209
- ?.let {
210
- hasWarnings = true
211
- appendHtmlLine(it)
212
- appendHtmlLine()
213
- }
204
+ destinationWarningMessage(testPackageName, classUnderTestPackageName)?.let {
205
+ hasWarnings = true
206
+ appendHtmlLine(it)
207
+ appendHtmlLine()
208
+ }
214
209
eventLogMessage?.let {
215
210
appendHtmlLine(it)
216
211
}
@@ -232,13 +227,11 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch
232
227
// TODO maybe add statistics info here
233
228
234
229
for (report in reports) {
235
- val classUnderTestPackageName =
236
- report.classUnderTest.java.nameOfPackage
230
+ val classUnderTestPackageName = report.classUnderTest.java.nameOfPackage
237
231
238
232
hasWarnings = hasWarnings || report.hasWarnings
239
233
if (! isMultiPackage) {
240
- val destinationWarning =
241
- destinationWarningMessage(testPackageName, classUnderTestPackageName)
234
+ val destinationWarning = destinationWarningMessage(testPackageName, classUnderTestPackageName)
242
235
if (destinationWarning != null ) {
243
236
hasWarnings = true
244
237
appendHtmlLine(destinationWarning)
0 commit comments