コード例 #1
0
        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.");
            }
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        // 处理事件和消息。完成的工作有:
        // 更新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);
            }
        }
コード例 #7
0
        // 处理事件和消息。完成的工作有:
        // 更新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));
            }
        }