diff --git a/src/Microsoft.TestPlatform.Client/DesignMode/DesignModeClient.cs b/src/Microsoft.TestPlatform.Client/DesignMode/DesignModeClient.cs index f64f20374e..ce5a628af8 100644 --- a/src/Microsoft.TestPlatform.Client/DesignMode/DesignModeClient.cs +++ b/src/Microsoft.TestPlatform.Client/DesignMode/DesignModeClient.cs @@ -291,6 +291,18 @@ private void ProcessRequests(ITestRequestManager testRequestManager) catch (Exception ex) { EqtTrace.Error("DesignModeClient: Error processing request: {0}", ex); + + // Notify the caller (IDE) about the error so it does not hang + // waiting for a response that will never come. + try + { + _communicationManager.SendMessage(MessageType.ProtocolError, ex.Message); + } + catch (Exception sendEx) + { + EqtTrace.Error("DesignModeClient: Failed to send ProtocolError to client: {0}", sendEx); + } + Stop(); } } diff --git a/src/Microsoft.TestPlatform.CrossPlatEngine/EventHandlers/TestRequestHandler.cs b/src/Microsoft.TestPlatform.CrossPlatEngine/EventHandlers/TestRequestHandler.cs index 0c9fb56ed2..4982e7d9c6 100644 --- a/src/Microsoft.TestPlatform.CrossPlatEngine/EventHandlers/TestRequestHandler.cs +++ b/src/Microsoft.TestPlatform.CrossPlatEngine/EventHandlers/TestRequestHandler.cs @@ -323,6 +323,32 @@ public bool AttachDebuggerToProcess(AttachDebuggerInfo attachDebuggerInfo) } public void OnMessageReceived(object? sender, MessageReceivedEventArgs messageReceivedArgs) + { + try + { + OnMessageReceivedCore(messageReceivedArgs); + } + catch (Exception ex) + { + EqtTrace.Error("TestRequestHandler.OnMessageReceived: Failed to process message, sending ProtocolError and closing session: {0}", ex); + + // Notify the caller about the error so it does not hang + // waiting for a response that will never come. + try + { + SendData(_dataSerializer.SerializePayload(MessageType.ProtocolError, ex.Message)); + } + catch (Exception sendEx) + { + EqtTrace.Error("TestRequestHandler.OnMessageReceived: Failed to send ProtocolError: {0}", sendEx); + } + + _sessionCompleted.Set(); + Close(); + } + } + + private void OnMessageReceivedCore(MessageReceivedEventArgs messageReceivedArgs) { var message = _dataSerializer.DeserializeMessage(messageReceivedArgs.Data!); EqtTrace.Info("TestRequestHandler.OnMessageReceived: received message: {0}", message);