public void Abort(int sessionId) { ControlMessage abortMessage = new ControlMessage(MessageNames.CtrlAbort, CommonConst.BroadcastSession); abortMessage.AddParam("IsRequest", true.ToString()); abortMessage.Id = sessionId; _globalInfo.MessageTransceiver.Send(abortMessage); AbortEventInfo abortEventInfo = new AbortEventInfo(sessionId, true, false); _globalInfo.EventQueue.Enqueue(abortEventInfo); if (null == _abortBlocker) { _abortBlocker = new BlockHandle(); } // 目前使用同步Abort,每次只能释放一个 _abortBlocker.Timeout = _globalInfo.ConfigData.GetProperty <int>("AbortTimeout"); bool isNotTimeout = _abortBlocker.Wait(Constants.AbortState); if (!isNotTimeout) { _globalInfo.LogService.Print(LogLevel.Warn, CommonConst.PlatformLogSession, $"Session {sessionId} abort timeout."); } }
private void AbortEventProcess(EventInfoBase eventInfo) { AbortEventInfo abortEventInfo = (AbortEventInfo)eventInfo; if (abortEventInfo.IsRequest) { _globalInfo.StateMachine.State = RuntimeState.AbortRequested; _sessionStateHandles[eventInfo.Session].AbortEventProcess(abortEventInfo); } else { _sessionStateHandles[abortEventInfo.Session].AbortEventProcess(abortEventInfo); // 如果都已经Abort结束,则执行结束操作 if (_sessionStateHandles.Values.All(item => ModuleUtils.IsOver(item.State))) { _globalInfo.StateMachine.State = RuntimeState.Abort; SetTestInstanceEndTime(eventInfo.TimeStamp); _stateManageContext.DatabaseProxy.UpdateData(_stateManageContext.TestInstance); _stateManageContext.EventDispatcher.RaiseEvent(Constants.TestInstanceOver, eventInfo.Session, _stateManageContext.TestResults); } } }
public void Abort(int sessionId) { this._globalInfo.StateMachine.State = RuntimeState.AbortRequested; if (sessionId == CommonConst.TestGroupSession || sessionId == CommonConst.BroadcastSession) { foreach (int session in _testsMaintainer.TestContainers.Keys) { Abort(session); } } else { ControlMessage abortMessage = new ControlMessage(MessageNames.CtrlAbort, CommonConst.BroadcastSession); abortMessage.AddParam("IsRequest", true.ToString()); abortMessage.Id = sessionId; _globalInfo.MessageTransceiver.Send(abortMessage); AbortEventInfo abortEventInfo = new AbortEventInfo(sessionId, true, false); _globalInfo.EventQueue.Enqueue(abortEventInfo); // 目前使用同步Abort,每次只能释放一个 _blockHandle.Timeout = _globalInfo.ConfigData.GetProperty <int>("AbortTimeout"); _blockHandle.Wait(Constants.AbortState); } }
private bool HandleControlMessage(ControlMessage message) { int session = message.Id; string name = message.Name; switch (name) { case MessageNames.CtrlAbort: bool abortSuccess = bool.Parse(message.Params["AbortSuccess"]); AbortEventInfo abortEventInfo = new AbortEventInfo(session, false, abortSuccess); if (!abortSuccess && message.Params.ContainsKey("Message")) { abortEventInfo.FailInfo = message.Params["Message"]; } _globalInfo.EventQueue.Enqueue(abortEventInfo); _testsMaintainer.FreeHost(session); // 如果所有的都已经结束,则修改状态机状态 if (0 == _testsMaintainer.TestContainers.Count) { _globalInfo.StateMachine.State = RuntimeState.Abort; } // 同步释放,每个Session的停止都是同步执行的。 _blockHandle.Free(Constants.AbortState); break; default: throw new InvalidOperationException(); } return(true); }
public void AbortEventProcess(AbortEventInfo eventInfo) { foreach (SequenceStateHandle sequenceStateHandle in _sequenceHandles.Values) { sequenceStateHandle.AbortEventProcess(eventInfo); } if (!eventInfo.IsRequest) { this.State = RuntimeState.AbortRequested; } else { foreach (SequenceStateHandle sequenceStateHandle in _sequenceHandles.Values) { sequenceStateHandle.AbortEventProcess(eventInfo); } this.State = RuntimeState.Abort; RefreshTime(eventInfo); SetTestResultStatistics(null); _stateManageContext.EventDispatcher.RaiseEvent(Constants.SessionOver, Session, _testResults); UpdateSessionResultData(string.Empty); } }
// 处理事件和消息。完成的工作有: // 更新SequenceStateHandle的状态、生成RuntimeStatusData并持久化、序列执行结束后生成SequenceResultData并持久化 #region 事件消息处理 public void AbortEventProcess(AbortEventInfo eventInfo) { if (eventInfo.IsRequest) { RefreshCommonStatus(eventInfo, RuntimeState.AbortRequested, StepResult.NotAvailable); } else { RefreshCommonStatus(eventInfo, RuntimeState.Abort, StepResult.Abort); SequenceFailedInfo failedInfo = new SequenceFailedInfo(_stateManageContext.GlobalInfo.I18N.GetStr("UserAbort"), FailedType.Abort); UpdateSequenceTestResult(failedInfo, null); _eventDispatcher.RaiseEvent(CoreConstants.SequenceOver, eventInfo.Session, _sequenceTestResult); WriteRuntimeStatusData(StepResult.Failed, string.Empty); } }
// 处理事件和消息。完成的工作有: // 更新SequenceStateHandle的状态、生成RuntimeStatusData并持久化、序列执行结束后生成SequenceResultData并持久化 #region 事件消息处理 public void AbortEventProcess(AbortEventInfo eventInfo) { // 如果序列已经结束或者当前序列为teardown序列,则不接收abort状态更新 if (ModuleUtils.IsOver(this.State) || this.SequenceIndex == CommonConst.TeardownIndex) { return; } if (eventInfo.IsRequest) { RefreshCommonStatus(eventInfo, RuntimeState.AbortRequested, StepResult.NotAvailable); } else { RefreshCommonStatus(eventInfo, RuntimeState.Abort, StepResult.Abort); RefreshExecutionStatus(null, 0); FailedInfo failedInfo = new FailedInfo(_stateManageContext.GlobalInfo.I18N.GetStr("UserAbort"), FailedType.Abort); UpdateSequenceTestResult(failedInfo, null); _eventDispatcher.RaiseEvent(Constants.SequenceOver, eventInfo.Session, _sequenceTestResult); WriteRuntimeStatusData(StepResult.Abort, string.Empty, new FailedInfo(eventInfo.FailInfo)); } }