Skip to content

Commit ab4836a

Browse files
committed
Introduce EngineProcessTask
1 parent d0b898c commit ab4836a

File tree

5 files changed

+102
-4
lines changed

5 files changed

+102
-4
lines changed

utbot-framework/src/main/kotlin/org/utbot/framework/process/EngineProcessMain.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch
273273
}
274274
GenerateTestReportResult(notifyMessage, statistics, hasWarnings)
275275
}
276+
watchdog.measureTimeForActiveCall(perform, "Performing dynamic task") { params ->
277+
val task = kryoHelper.readObject<EngineProcessTask<Any?>>(params.engineProcessTask)
278+
val result = task.perform(kryoHelper)
279+
kryoHelper.writeObject(result)
280+
}
276281
}
277282

278283
private fun processInitialWarnings(report: TestsGenerationReport, params: GenerateTestReportArgs) {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.utbot.framework.process
2+
3+
import org.utbot.framework.process.kryo.KryoHelper
4+
5+
/**
6+
* Implementations of this interface can be passed to engine process for execution and should
7+
* be used for adding feature-specific (e.g. Spring-specific) tasks without inflating core UtBot codebase.
8+
*
9+
* Such tasks are serialised with kryo when passed between processes, meaning that for successful execution same
10+
* implementation of [EngineProcessTask] should be present on the classpath of both parent process and engine process.
11+
*
12+
* @param R result type of the task (should be present on the classpath of both processes).
13+
*/
14+
interface EngineProcessTask<R> {
15+
fun perform(kryoHelper: KryoHelper): R
16+
}

utbot-framework/src/main/kotlin/org/utbot/framework/process/generated/EngineProcessModel.Generated.kt

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class EngineProcessModel private constructor(
3030
private val _findMethodsInClassMatchingSelected: RdCall<FindMethodsInClassMatchingSelectedArguments, FindMethodsInClassMatchingSelectedResult>,
3131
private val _findMethodParamNames: RdCall<FindMethodParamNamesArguments, FindMethodParamNamesResult>,
3232
private val _writeSarifReport: RdCall<WriteSarifReportArguments, String>,
33-
private val _generateTestReport: RdCall<GenerateTestReportArgs, GenerateTestReportResult>
33+
private val _generateTestReport: RdCall<GenerateTestReportArgs, GenerateTestReportResult>,
34+
private val _perform: RdCall<PerformParams, ByteArray>
3435
) : RdExtBase() {
3536
//companion
3637

@@ -58,6 +59,7 @@ class EngineProcessModel private constructor(
5859
serializers.register(BeanAdditionalData)
5960
serializers.register(BeanDefinitionData)
6061
serializers.register(SpringAnalyzerResult)
62+
serializers.register(PerformParams)
6163
}
6264

6365

@@ -78,7 +80,7 @@ class EngineProcessModel private constructor(
7880
}
7981

8082

81-
const val serializationHash = -271702162812013897L
83+
const val serializationHash = 1643215834533745881L
8284

8385
}
8486
override val serializersOwner: ISerializersOwner get() = EngineProcessModel
@@ -97,6 +99,7 @@ class EngineProcessModel private constructor(
9799
val findMethodParamNames: RdCall<FindMethodParamNamesArguments, FindMethodParamNamesResult> get() = _findMethodParamNames
98100
val writeSarifReport: RdCall<WriteSarifReportArguments, String> get() = _writeSarifReport
99101
val generateTestReport: RdCall<GenerateTestReportArgs, GenerateTestReportResult> get() = _generateTestReport
102+
val perform: RdCall<PerformParams, ByteArray> get() = _perform
100103
//methods
101104
//initializer
102105
init {
@@ -112,6 +115,7 @@ class EngineProcessModel private constructor(
112115
_findMethodParamNames.async = true
113116
_writeSarifReport.async = true
114117
_generateTestReport.async = true
118+
_perform.async = true
115119
}
116120

117121
init {
@@ -127,6 +131,7 @@ class EngineProcessModel private constructor(
127131
bindableChildren.add("findMethodParamNames" to _findMethodParamNames)
128132
bindableChildren.add("writeSarifReport" to _writeSarifReport)
129133
bindableChildren.add("generateTestReport" to _generateTestReport)
134+
bindableChildren.add("perform" to _perform)
130135
}
131136

132137
//secondary constructor
@@ -143,7 +148,8 @@ class EngineProcessModel private constructor(
143148
RdCall<FindMethodsInClassMatchingSelectedArguments, FindMethodsInClassMatchingSelectedResult>(FindMethodsInClassMatchingSelectedArguments, FindMethodsInClassMatchingSelectedResult),
144149
RdCall<FindMethodParamNamesArguments, FindMethodParamNamesResult>(FindMethodParamNamesArguments, FindMethodParamNamesResult),
145150
RdCall<WriteSarifReportArguments, String>(WriteSarifReportArguments, FrameworkMarshallers.String),
146-
RdCall<GenerateTestReportArgs, GenerateTestReportResult>(GenerateTestReportArgs, GenerateTestReportResult)
151+
RdCall<GenerateTestReportArgs, GenerateTestReportResult>(GenerateTestReportArgs, GenerateTestReportResult),
152+
RdCall<PerformParams, ByteArray>(PerformParams, FrameworkMarshallers.ByteArray)
147153
)
148154

149155
//equals trait
@@ -164,6 +170,7 @@ class EngineProcessModel private constructor(
164170
print("findMethodParamNames = "); _findMethodParamNames.print(printer); println()
165171
print("writeSarifReport = "); _writeSarifReport.print(printer); println()
166172
print("generateTestReport = "); _generateTestReport.print(printer); println()
173+
print("perform = "); _perform.print(printer); println()
167174
}
168175
printer.print(")")
169176
}
@@ -181,7 +188,8 @@ class EngineProcessModel private constructor(
181188
_findMethodsInClassMatchingSelected.deepClonePolymorphic(),
182189
_findMethodParamNames.deepClonePolymorphic(),
183190
_writeSarifReport.deepClonePolymorphic(),
184-
_generateTestReport.deepClonePolymorphic()
191+
_generateTestReport.deepClonePolymorphic(),
192+
_perform.deepClonePolymorphic()
185193
)
186194
}
187195
//contexts
@@ -1099,6 +1107,63 @@ data class MethodDescription (
10991107
}
11001108

11011109

1110+
/**
1111+
* #### Generated from [EngineProcessModel.kt:149]
1112+
*/
1113+
data class PerformParams (
1114+
val engineProcessTask: ByteArray
1115+
) : IPrintable {
1116+
//companion
1117+
1118+
companion object : IMarshaller<PerformParams> {
1119+
override val _type: KClass<PerformParams> = PerformParams::class
1120+
1121+
@Suppress("UNCHECKED_CAST")
1122+
override fun read(ctx: SerializationCtx, buffer: AbstractBuffer): PerformParams {
1123+
val engineProcessTask = buffer.readByteArray()
1124+
return PerformParams(engineProcessTask)
1125+
}
1126+
1127+
override fun write(ctx: SerializationCtx, buffer: AbstractBuffer, value: PerformParams) {
1128+
buffer.writeByteArray(value.engineProcessTask)
1129+
}
1130+
1131+
1132+
}
1133+
//fields
1134+
//methods
1135+
//initializer
1136+
//secondary constructor
1137+
//equals trait
1138+
override fun equals(other: Any?): Boolean {
1139+
if (this === other) return true
1140+
if (other == null || other::class != this::class) return false
1141+
1142+
other as PerformParams
1143+
1144+
if (!(engineProcessTask contentEquals other.engineProcessTask)) return false
1145+
1146+
return true
1147+
}
1148+
//hash code trait
1149+
override fun hashCode(): Int {
1150+
var __r = 0
1151+
__r = __r*31 + engineProcessTask.contentHashCode()
1152+
return __r
1153+
}
1154+
//pretty print
1155+
override fun print(printer: PrettyPrinter) {
1156+
printer.println("PerformParams (")
1157+
printer.indent {
1158+
print("engineProcessTask = "); engineProcessTask.print(printer); println()
1159+
}
1160+
printer.print(")")
1161+
}
1162+
//deepClone
1163+
//contexts
1164+
}
1165+
1166+
11021167
/**
11031168
* #### Generated from [EngineProcessModel.kt:69]
11041169
*/

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/process/EngineProcess.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.utbot.framework.plugin.api.BeanDefinitionData
2424
import org.utbot.framework.plugin.services.JdkInfo
2525
import org.utbot.framework.plugin.services.WorkingDirService
2626
import org.utbot.framework.process.AbstractRDProcessCompanion
27+
import org.utbot.framework.process.EngineProcessTask
2728
import org.utbot.framework.process.generated.*
2829
import org.utbot.framework.process.generated.MethodDescription
2930
import org.utbot.framework.process.kryo.KryoHelper
@@ -416,6 +417,13 @@ class EngineProcess private constructor(val project: Project, private val classN
416417
return Triple(result.notifyMessage, result.statistics, result.hasWarnings)
417418
}
418419

420+
fun <R> perform(engineProcessTask: EngineProcessTask<R>): R {
421+
assertReadAccessNotAllowed()
422+
return kryoHelper.readObject(
423+
engineModel.perform.startBlocking(PerformParams(kryoHelper.writeObject(engineProcessTask)))
424+
)
425+
}
426+
419427
init {
420428
lifetime.onTermination {
421429
protocol.synchronizationModel.stopProcess.fire(Unit)

utbot-rd/src/main/rdgen/org/utbot/rd/models/EngineProcessModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ object EngineProcessModel : Ext(EngineProcessRoot) {
146146
val springAnalyzerResult = structdef {
147147
field("beanDefinitions", array(beanDefinitionData))
148148
}
149+
val performParams = structdef {
150+
field("engineProcessTask", array(PredefinedType.byte))
151+
}
149152

150153
init {
151154
call("setupUtContext", setupContextParams, PredefinedType.void).async
@@ -160,5 +163,6 @@ object EngineProcessModel : Ext(EngineProcessRoot) {
160163
call("findMethodParamNames", findMethodParamNamesArguments, findMethodParamNamesResult).async
161164
call("writeSarifReport", writeSarifReportArguments, PredefinedType.string).async
162165
call("generateTestReport", generateTestReportArgs, generateTestReportResult).async
166+
call("perform", performParams, array(PredefinedType.byte)).async
163167
}
164168
}

0 commit comments

Comments
 (0)