Skip to content

Commit a2c9b5a

Browse files
committed
[rd-refactoring]
Enabling suspend and port choosing by utsettings Run configurations for debugging Instant process death detection Orphan processes termination system Some text loading optimization ChildProcess -> InstrumentedProcess Rd-based UtSettings for InstrumentedProcess
1 parent 1e34350 commit a2c9b5a

File tree

59 files changed

+450
-247
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+450
-247
lines changed

.github/workflows/build-and-run-tests-from-branch.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ jobs:
131131
name: utbot_temp ${{ matrix.project.PART_NAME }}
132132
path: |
133133
/tmp/UTBot/generated*/*
134-
/tmp/UTBot/utbot-childprocess-errors/*
134+
/tmp/UTBot/utbot-instrumentedprocess-errors/*
135135
- name: Upload test report if tests have failed
136136
if: ${{ failure() }}
137137
uses: actions/upload-artifact@v3

.github/workflows/run-chosen-tests-from-branch.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ jobs:
6767
name: generated-tests
6868
path: |
6969
/tmp/UTBot/generated*/*
70-
/tmp/UTBot/utbot-childprocess-errors/*
70+
/tmp/UTBot/utbot-instrumentedprocess-errors/*
7171
- name: Upload utbot-framework logs
7272
if: ${{ always() && github.event.inputs.project-name == 'utbot-framework' }}
7373
uses: actions/upload-artifact@v3

.run/Debug All.run.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Debug All" type="CompoundRunConfigurationType">
3+
<toRun name="Run IDE" type="GradleRunConfiguration" />
4+
<toRun name="Listen for Concrete Executor Process" type="Remote" />
5+
<toRun name="Listen for Engine Process" type="Remote" />
6+
<method v="2" />
7+
</configuration>
8+
</component>

.run/Debug Engine Process.run.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Debug Engine Process" type="CompoundRunConfigurationType">
3+
<toRun name="Run IDE" type="GradleRunConfiguration" />
4+
<toRun name="Listen for Engine Process" type="Remote" />
5+
<method v="2" />
6+
</configuration>
7+
</component>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Debug Instrumented Process" type="CompoundRunConfigurationType">
3+
<toRun name="Run IDE" type="GradleRunConfiguration" />
4+
<toRun name="Listen for Instrumented Process" type="Remote" />
5+
<method v="2" />
6+
</configuration>
7+
</component>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Listen for Engine Process" type="Remote" folderName="Utility Configurations">
3+
<option name="USE_SOCKET_TRANSPORT" value="true" />
4+
<option name="SERVER_MODE" value="true" />
5+
<option name="SHMEM_ADDRESS" />
6+
<option name="HOST" value="localhost" />
7+
<option name="PORT" value="5005" />
8+
<option name="AUTO_RESTART" value="true" />
9+
<RunnerSettings RunnerId="Debug">
10+
<option name="DEBUG_PORT" value="5005" />
11+
<option name="LOCAL" value="false" />
12+
</RunnerSettings>
13+
<method v="2" />
14+
</configuration>
15+
</component>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Listen for Instrumented Process" type="Remote" folderName="Utility Configurations">
3+
<option name="USE_SOCKET_TRANSPORT" value="true" />
4+
<option name="SERVER_MODE" value="true" />
5+
<option name="SHMEM_ADDRESS" />
6+
<option name="HOST" value="localhost" />
7+
<option name="PORT" value="5006" />
8+
<option name="AUTO_RESTART" value="true" />
9+
<RunnerSettings RunnerId="Debug">
10+
<option name="DEBUG_PORT" value="5006" />
11+
<option name="LOCAL" value="false" />
12+
</RunnerSettings>
13+
<method v="2" />
14+
</configuration>
15+
</component>

.run/Run IDE.run.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Run IDE" type="GradleRunConfiguration" factoryName="Gradle">
3+
<ExternalSystemSettings>
4+
<option name="executionName" />
5+
<option name="externalProjectPath" value="$PROJECT_DIR$/utbot-intellij" />
6+
<option name="externalSystemIdString" value="GRADLE" />
7+
<option name="scriptParameters" value="" />
8+
<option name="taskDescriptions">
9+
<list />
10+
</option>
11+
<option name="taskNames">
12+
<list>
13+
<option value="runIde" />
14+
</list>
15+
</option>
16+
<option name="vmOptions" />
17+
</ExternalSystemSettings>
18+
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
19+
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
20+
<DebugAllEnabled>false</DebugAllEnabled>
21+
<method v="2" />
22+
</configuration>
23+
</component>

docs/RD for UnitTestBot.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,21 +112,21 @@ Usefull:
112112
2. There are some usefull classes to work with processes & rd:
113113
- ```LifetimedProcess``` - binds ```Lifetime``` to process. If process dies - lifetime terminates and vice versa. You can terminate lifetime manually - this will destroy process.
114114
- ```ProcessWithRdServer``` - also starts Rd server and waits for connection.
115-
- ```UtInstrumentationProcess``` - encapsulates logic for preparing child process for executing arbitary commands. Exposes ```protocolModel``` for communicating with child process.
115+
- ```UtInstrumentationProcess``` - encapsulates logic for preparing instrumented process for executing arbitary commands. Exposes ```protocolModel``` for communicating with instrumented process.
116116
- ```ConcreteExecutor``` is convenient wrapper for executing commands and managing resources.
117117
3. How child communication works:
118118
- Choosing free port
119-
- Creating child process, passing port as argument
119+
- Creating instrumented process, passing port as argument
120120
- Both processes create protocols and bind model
121-
- Child process setups all callbacks
121+
- Instrumented process setups all callbacks
122122
- Parent process cannot send messages before child creates protocol, otherwise messages will be lost. So child process needs to signal that he is ready.
123-
- Child proces creates special file in temp dir, that is observed by parent process.
123+
- Instrumented proces creates special file in temp dir, that is observed by parent process.
124124
- When parent process spots file - he deletes it, and then sends special message for preparing child proccess instrumentation
125125
- Only then process is ready for executing commands
126126
4. How to write custom commands for child process
127127
- Add new ```call``` in ```ProtocolModel```
128128
- Regenerate models
129-
- Add callback for new ```call``` in ```ChildProcess.kt```
129+
- Add callback for new ```call``` in ```InstrumentedProcess.kt```
130130
- Use ```ConcreteExecutor.withProcess``` method
131131
- ___Important___ - do not add `Rdgen` as implementation dependency, it breaks some `.jar`s as it contains `kotlin-compiler-embeddable`.
132132
5. Logs

docs/contributing/InterProcessDebugging.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ The most straightforward way to debug the Engine process is the following.
1818

1919
1. Open `org/utbot/framework/UtSettings.kt`.
2020
2. Set `runIdeaProcessWithDebug` property to _true_. This enables `EngineProcess.debugArgument`.
21-
3. Find `EngineProcess.debugArgument` at `org/utbot/intellij/plugin/process/EngineProcess` and check the parameters of the debug run:
21+
* Alternatively you can create `~/.utbot/settings.properties` file and write following:
22+
```
23+
runIdeaProcessWithDebug=true
24+
```
25+
4. Find `EngineProcess.debugArgument` at `org/utbot/intellij/plugin/process/EngineProcess` and check the parameters of the debug run:
2226

2327
`"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,quiet=y,address=5005"`
2428

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,4 @@ private val javaSpecificationVersion = System.getProperty("java.specification.ve
44
val isJvm8 = javaSpecificationVersion.equals("1.8")
55
val isJvm9Plus = !javaSpecificationVersion.contains(".") && javaSpecificationVersion.toInt() >= 9
66

7-
fun osSpecificJavaExecutable() = if (isWindows) "javaw" else "java"
8-
9-
const val engineProcessDebugPort = 5005
10-
const val childProcessDebugPort = 5006
7+
fun osSpecificJavaExecutable() = if (isWindows) "javaw" else "java"

utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ private const val defaultKeyForSettingsPath = "utbot.settings.path"
2020
/**
2121
* Default concrete execution timeout (in milliseconds).
2222
*/
23-
const val DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_CHILD_PROCESS_MS = 1000L
23+
const val DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_INSTRUMENTED_PROCESS_MS = 1000L
2424

2525
object UtSettings : AbstractSettings(
2626
logger, defaultKeyForSettingsPath, defaultSettingsPath
@@ -260,44 +260,64 @@ object UtSettings : AbstractSettings(
260260
/**
261261
* Timeout for specific concrete execution (in milliseconds).
262262
*/
263-
var concreteExecutionTimeoutInChildProcess: Long by getLongProperty(
264-
DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_CHILD_PROCESS_MS
263+
var concreteExecutionTimeoutInInstrumentedProcess: Long by getLongProperty(
264+
DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_INSTRUMENTED_PROCESS_MS
265265
)
266266

267267
/**
268-
* Log level for concrete executor process.
268+
* Log level for instrumented process.
269269
*/
270-
var childProcessLogLevel by getEnumProperty(LogLevel.Info)
270+
var instrumentedProcessLogLevel by getEnumProperty(LogLevel.Info)
271271

272272
/**
273273
* Path to custom log4j2 configuration file for EngineProcess.
274274
* By default utbot-intellij/src/main/resources/log4j2.xml is used.
275275
* Also default value is used if provided value is not a file.
276276
*/
277-
var ideaProcessLogConfigFile by getStringProperty("")
277+
var engineProcessLogConfigFile by getStringProperty("")
278278

279279
/**
280280
* Property useful only for idea
281281
* If true - runs engine process with the ability to attach a debugger
282-
* @see runChildProcessWithDebug
282+
* @see runInstrumentedProcessWithDebug
283283
* @see org.utbot.intellij.plugin.process.EngineProcess
284284
*/
285-
var runIdeaProcessWithDebug by getBooleanProperty(false)
285+
var runEngineProcessWithDebug by getBooleanProperty(false)
286286

287287
/**
288-
* If true, runs the child process with the ability to attach a debugger.
288+
* Port which will be used for debugging engine process
289+
*/
290+
var engineProcessDebugPort by getIntProperty(5005)
291+
292+
/**
293+
* Whether engine process should suspend until debugger attached
294+
*/
295+
var engineProcessDebugSuspendPolicy by getBooleanProperty(true)
296+
297+
/**
298+
* Port which will be used for debugging instrumented process
299+
*/
300+
var instrumentedProcessDebugPort by getIntProperty(5006)
301+
302+
/**
303+
* Whether instrumented process should suspend until debugger attached
304+
*/
305+
var instrumentedProcessSuspendPolicy by getBooleanProperty(true)
306+
307+
/**
308+
* If true, runs the instrumented process with the ability to attach a debugger.
289309
*
290-
* To debug the child process, set the breakpoint in the childProcessRunner.start() line
291-
* and in the child process's main function and run the main process.
310+
* To debug the instrumented process, set the breakpoint in the instrumentedProcessRunner.start() line
311+
* and in the instrumented process's main function and run the main process.
292312
* Then run the remote JVM debug configuration in IDEA.
293313
* If you see the message in console about successful connection, then
294314
* the debugger is attached successfully.
295-
* Now you can put the breakpoints in the child process and debug
315+
* Now you can put the breakpoints in the instrumented process and debug
296316
* both processes simultaneously.
297317
*
298-
* @see [org.utbot.instrumentation.process.ChildProcessRunner.cmds]
318+
* @see [org.utbot.instrumentation.process.InstrumentedProcessRunner.cmds]
299319
*/
300-
var runChildProcessWithDebug by getBooleanProperty(false)
320+
var runInstrumentedProcessWithDebug by getBooleanProperty(false)
301321

302322
/**
303323
* Number of branch instructions using for clustering executions in the test minimization phase.
@@ -391,7 +411,7 @@ object UtSettings : AbstractSettings(
391411
var ignoreStaticsFromTrustedLibraries by getBooleanProperty(true)
392412

393413
/**
394-
* Use the sandbox in the concrete executor.
414+
* Use the sandbox in the instrumented process.
395415
*
396416
* If true (default), the sandbox will prevent potentially dangerous calls, e.g., file access, reading
397417
* or modifying the environment, calls to `Unsafe` methods etc.

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/UtExecutionResult.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,14 @@ data class UtTimeoutException(override val exception: TimeoutException) : UtExec
5858

5959
/**
6060
* Indicates failure in concrete execution.
61-
* For now it is explicitly throwing by ConcreteExecutor in case child process death.
61+
* For now it is explicitly throwing by ConcreteExecutor in case instrumented process death.
6262
*/
6363
class ConcreteExecutionFailureException(cause: Throwable, errorFile: File, val processStdout: List<String>) :
6464
Exception(
6565
buildString {
6666
appendLine()
6767
appendLine("----------------------------------------")
68-
appendLine("The child process is dead")
68+
appendLine("The instrumented process is dead")
6969
appendLine("Cause:\n${cause.message}")
7070
appendLine("Last 1000 lines of the error log ${errorFile.absolutePath}:")
7171
appendLine("----------------------------------------")

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/services/JdkInfoService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ data class JdkInfo(
1111
/**
1212
* Singleton to enable abstract access to path to JDK.
1313
14-
* Used in [org.utbot.instrumentation.process.ChildProcessRunner].
14+
* Used in [org.utbot.instrumentation.process.InstrumentedProcessRunner].
1515
* The purpose is to use the same JDK in [org.utbot.instrumentation.ConcreteExecutor] and in the test runs.
1616
* This is necessary because the engine can be run from the various starting points, like IDEA plugin, CLI, etc.
1717
*/

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/services/WorkingDirService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import java.nio.file.Paths
66
/**
77
* Singleton to enable abstract access to the working directory.
88
*
9-
* Used in [org.utbot.instrumentation.process.ChildProcessRunner].
9+
* Used in [org.utbot.instrumentation.process.InstrumentedProcessRunner].
1010
* The purpose is to use the same working directory in [org.utbot.instrumentation.ConcreteExecutor]
1111
* and in the test runs.
1212
*/

utbot-framework-test/src/test/kotlin/org/utbot/examples/strings/StringExamplesTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ internal class StringExamplesTest : UtValueTestCaseChecker(
382382
{ _, i, r -> i <= 0 && r.isException<IllegalArgumentException>() },
383383
{ cs, i, r -> i > 0 && cs == null && !r.getOrThrow() },
384384
{ cs, i, r -> i > 0 && cs != null && cs.length > i && r.getOrThrow() },
385-
coverage = DoNotCalculate // TODO: Coverage calculation fails in the child process with Illegal Argument Exception
385+
coverage = DoNotCalculate // TODO: Coverage calculation fails in the instrumented process with Illegal Argument Exception
386386
)
387387
}
388388

utbot-framework/src/main/kotlin/org/utbot/engine/UtBotSymbolicEngine.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ class UtBotSymbolicEngine(
391391
*/
392392
fun fuzzing(until: Long = Long.MAX_VALUE, modelProvider: (ModelProvider) -> ModelProvider = { it }) = flow {
393393
val isFuzzable = methodUnderTest.parameters.all { classId ->
394-
classId != Method::class.java.id && // causes the child process crash at invocation
394+
classId != Method::class.java.id && // causes the instrumented process crash at invocation
395395
classId != Class::class.java.id // causes java.lang.IllegalAccessException: java.lang.Class at sun.misc.Unsafe.allocateInstance(Native Method)
396396
}
397397
if (!isFuzzable) {

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/Domain.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.utbot.framework.codegen.domain
22

3-
import org.utbot.framework.DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_CHILD_PROCESS_MS
3+
import org.utbot.framework.DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_INSTRUMENTED_PROCESS_MS
44
import org.utbot.framework.codegen.domain.builtin.mockitoClassId
55
import org.utbot.framework.codegen.domain.builtin.ongoingStubbingClassId
66
import org.utbot.framework.codegen.domain.models.CgClassId
@@ -581,7 +581,7 @@ data class HangingTestsTimeout(val timeoutMs: Long) {
581581
constructor() : this(DEFAULT_TIMEOUT_MS)
582582

583583
companion object {
584-
const val DEFAULT_TIMEOUT_MS = DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_CHILD_PROCESS_MS
584+
const val DEFAULT_TIMEOUT_MS = DEFAULT_CONCRETE_EXECUTION_TIMEOUT_IN_INSTRUMENTED_PROCESS_MS
585585
const val MIN_TIMEOUT_MS = 100L
586586
const val MAX_TIMEOUT_MS = 1_000_000L
587587
}

utbot-framework/src/main/kotlin/org/utbot/framework/concrete/UtExecutionInstrumentation.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ import kotlin.reflect.jvm.javaMethod
5252
* @property [stateBefore] is necessary for construction of parameters of a concrete call.
5353
* @property [instrumentation] is necessary for mocking static methods and new instances.
5454
* @property [timeout] is timeout for specific concrete execution (in milliseconds).
55-
* By default is initialized from [UtSettings.concreteExecutionTimeoutInChildProcess]
55+
* By default is initialized from [UtSettings.concreteExecutionTimeoutInInstrumentedProcess]
5656
*/
5757
data class UtConcreteExecutionData(
5858
val stateBefore: EnvironmentModels,
5959
val instrumentation: List<UtInstrumentation>,
60-
val timeout: Long = UtSettings.concreteExecutionTimeoutInChildProcess
60+
val timeout: Long = UtSettings.concreteExecutionTimeoutInInstrumentedProcess
6161
)
6262

6363
class UtConcreteExecutionResult(

utbot-framework/src/main/kotlin/org/utbot/framework/minimization/Minimization.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import org.utbot.framework.plugin.api.UtVoidModel
2727
* We have 4 different test suites:
2828
* * Regression suite
2929
* * Error suite (invocations in which implicitly thrown unchecked exceptions reached to the top)
30-
* * Crash suite (invocations in which the child process crashed or unexpected exception in our code occurred)
30+
* * Crash suite (invocations in which the instrumented process crashed or unexpected exception in our code occurred)
3131
* * Timeout suite
3232
*
3333
* We want to minimize tests independently in each of these suites.

utbot-framework/src/main/kotlin/org/utbot/framework/plugin/api/TestCaseGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ open class TestCaseGenerator(
224224
}
225225
}
226226
}
227-
ConcreteExecutor.defaultPool.close() // TODO: think on appropriate way to close child processes
227+
ConcreteExecutor.defaultPool.close() // TODO: think on appropriate way to close instrumented processes
228228

229229

230230
return methods.map { method ->

utbot-framework/src/main/kotlin/org/utbot/framework/plugin/api/utils/DependencyUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private val logger = KotlinLogging.logger {}
1313
* and their versions correspond to our requirements.
1414
*
1515
* Note: [UtExecutionInstrumentation] must be in dependency path too
16-
* as it is used by Engine in the child process in Concrete Executor.
16+
* as it is used by Engine in the instrumented process in Concrete Executor.
1717
*/
1818
fun checkFrameworkDependencies(dependencyPaths: String?) {
1919
if (dependencyPaths.isNullOrEmpty()) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ import org.utbot.instrumentation.instrumentation.instrumenter.Instrumenter
3434
import org.utbot.instrumentation.util.KryoHelper
3535
import org.utbot.rd.IdleWatchdog
3636
import org.utbot.rd.ClientProtocolBuilder
37+
import org.utbot.rd.RdSettingsContainerFactory
3738
import org.utbot.rd.findRdPort
39+
import org.utbot.rd.generated.settingsModel
3840
import org.utbot.rd.loggers.UtRdKLoggerFactory
3941
import org.utbot.sarif.RdSourceFindingStrategyFacade
4042
import org.utbot.sarif.SarifReport

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class EngineProcessModel private constructor(
6464
@JvmStatic
6565
@Deprecated("Use protocol.engineProcessModel or revise the extension scope instead", ReplaceWith("protocol.engineProcessModel"))
6666
fun create(lifetime: Lifetime, protocol: IProtocol): EngineProcessModel {
67-
EngineProcessProtocolRoot.register(protocol.serializers)
67+
EngineProcessRoot.register(protocol.serializers)
6868

6969
return EngineProcessModel().apply {
7070
identify(protocol.identity, RdId.Null.mix("EngineProcessModel"))

0 commit comments

Comments
 (0)