[rdct-tests]: make sure that unexpected modal state on shutdown causes a separate exception and is noticeable

GitOrigin-RevId: 5712491980da2cac2c0e80ded2606389640f5d39
This commit is contained in:
Anastasia Katsman
2024-06-14 13:47:55 +02:00
committed by intellij-monorepo-bot
parent 836f7dfb3b
commit 833da8d490
3 changed files with 21 additions and 11 deletions

View File

@@ -56,7 +56,7 @@ class DistributedTestModel private constructor(
private val __RdTestSessionNullableSerializer = RdTestSession.nullable()
const val serializationHash = 2117502848923156654L
const val serializationHash = 1373418669341890532L
}
override val serializersOwner: ISerializersOwner get() = DistributedTestModel
@@ -307,7 +307,7 @@ class RdTestSession private constructor(
private val _exitApp: RdSignal<Unit>,
private val _showNotification: RdSignal<String>,
private val _closeProject: RdCall<Unit, Boolean>,
private val _forceLeaveAllModals: RdCall<Unit, Unit>,
private val _forceLeaveAllModals: RdCall<Boolean, Unit>,
private val _closeProjectIfOpened: RdCall<Unit, Boolean>,
private val _runNextAction: RdCall<RdTestActionParameters, String?>,
private val _requestFocus: RdCall<String, Boolean>,
@@ -336,7 +336,7 @@ class RdTestSession private constructor(
val _exitApp = RdSignal.read(ctx, buffer, FrameworkMarshallers.Void)
val _showNotification = RdSignal.read(ctx, buffer, FrameworkMarshallers.String)
val _closeProject = RdCall.read(ctx, buffer, FrameworkMarshallers.Void, FrameworkMarshallers.Bool)
val _forceLeaveAllModals = RdCall.read(ctx, buffer, FrameworkMarshallers.Void, FrameworkMarshallers.Void)
val _forceLeaveAllModals = RdCall.read(ctx, buffer, FrameworkMarshallers.Bool, FrameworkMarshallers.Void)
val _closeProjectIfOpened = RdCall.read(ctx, buffer, FrameworkMarshallers.Void, FrameworkMarshallers.Bool)
val _runNextAction = RdCall.read(ctx, buffer, RdTestActionParameters, __StringNullableSerializer)
val _requestFocus = RdCall.read(ctx, buffer, FrameworkMarshallers.String, FrameworkMarshallers.Bool)
@@ -382,7 +382,7 @@ class RdTestSession private constructor(
val exitApp: IAsyncSignal<Unit> get() = _exitApp
val showNotification: ISignal<String> get() = _showNotification
val closeProject: RdCall<Unit, Boolean> get() = _closeProject
val forceLeaveAllModals: RdCall<Unit, Unit> get() = _forceLeaveAllModals
val forceLeaveAllModals: RdCall<Boolean, Unit> get() = _forceLeaveAllModals
val closeProjectIfOpened: RdCall<Unit, Boolean> get() = _closeProjectIfOpened
val runNextAction: RdCall<RdTestActionParameters, String?> get() = _runNextAction
val requestFocus: RdCall<String, Boolean> get() = _requestFocus
@@ -447,7 +447,7 @@ class RdTestSession private constructor(
RdSignal<Unit>(FrameworkMarshallers.Void),
RdSignal<String>(FrameworkMarshallers.String),
RdCall<Unit, Boolean>(FrameworkMarshallers.Void, FrameworkMarshallers.Bool),
RdCall<Unit, Unit>(FrameworkMarshallers.Void, FrameworkMarshallers.Void),
RdCall<Boolean, Unit>(FrameworkMarshallers.Bool, FrameworkMarshallers.Void),
RdCall<Unit, Boolean>(FrameworkMarshallers.Void, FrameworkMarshallers.Bool),
RdCall<RdTestActionParameters, String?>(RdTestActionParameters, __StringNullableSerializer),
RdCall<String, Boolean>(FrameworkMarshallers.String, FrameworkMarshallers.Bool),

View File

@@ -67,7 +67,7 @@ object DistributedTestModel : Ext(TestRoot) {
signal("exitApp", void).async
signal("showNotification", string)
call("closeProject", void, bool).async
call("forceLeaveAllModals", void, void).async
call("forceLeaveAllModals", bool, void).async
call("closeProjectIfOpened", void, bool).async
call("runNextAction", RdTestActionParameters, string.nullable).async
call("requestFocus", string, bool).async

View File

@@ -62,7 +62,8 @@ import kotlin.time.Duration.Companion.seconds
open class DistributedTestHost(coroutineScope: CoroutineScope) {
companion object {
// it is easier to sort out logs from just testFramework
private val LOG = Logger.getInstance(RdctTestFrameworkLoggerCategory.category + "Host")
private val LOG
get() = Logger.getInstance(RdctTestFrameworkLoggerCategory.category + "Host")
fun getDistributedTestPort(): Int? =
System.getProperty(AgentConstants.protocolPortPropertyName)?.toIntOrNull()
@@ -236,19 +237,28 @@ open class DistributedTestHost(coroutineScope: CoroutineScope) {
}
}
suspend fun leaveAllModals() {
suspend fun leaveAllModals(throwErrorIfModal: Boolean) {
withContext(Dispatchers.EDT + ModalityState.any().asContextElement() + NonCancellable) {
repeat(10) {
if (ModalityState.current() == ModalityState.nonModal()) {
return@withContext
}
delay(1.seconds)
}
if (throwErrorIfModal) {
LOG.error("Unexpected modality: " + ModalityState.current())
}
LaterInvocator.forceLeaveAllModals()
IdeEventQueue.getInstance().flushQueue()
}
}
session.forceLeaveAllModals.setSuspendPreserveClientId(handlerScheduler = Dispatchers.Default.asRdScheduler) { _, _ ->
leaveAllModals()
session.forceLeaveAllModals.setSuspendPreserveClientId(handlerScheduler = Dispatchers.Default.asRdScheduler) { _, throwErrorIfModal ->
leaveAllModals(throwErrorIfModal)
}
session.closeProjectIfOpened.setSuspendPreserveClientId(handlerScheduler = Dispatchers.Default.asRdScheduler) { _, _ ->
leaveAllModals()
leaveAllModals(throwErrorIfModal = true)
ProjectManagerEx.getOpenProjects().forEach { waitProjectInitialisedOrDisposed(it) }
withContext(Dispatchers.EDT + NonCancellable) {
ProjectManagerEx.getInstanceEx().closeAndDisposeAllProjects(checkCanClose = false)