Example #1
0
        public bool HandleMessage(MessageBase message)
        {
            bool          state         = false;
            RmtGenMessage rmtGenMessage = (RmtGenMessage)message;

            if (rmtGenMessage.Params["MsgType"].Equals("Success"))
            {
                state = true;
                TestGenEventInfo genEventInfo = new TestGenEventInfo(rmtGenMessage.Id, TestGenState.GenerationOver,
                                                                     rmtGenMessage.Time);
                _globalInfo.EventQueue.Enqueue(genEventInfo);
                _runtimeContainers[rmtGenMessage.Id].HostReady = true;
            }
            else if (rmtGenMessage.Params["MsgType"].Equals("Failed"))
            {
                state = false;
                TestGenEventInfo genEventInfo = new TestGenEventInfo(rmtGenMessage.Id, TestGenState.Error,
                                                                     rmtGenMessage.Time)
                {
                    ErrorInfo = rmtGenMessage.Params["FailedInfo"]
                };
                _globalInfo.EventQueue.Enqueue(genEventInfo);
                FreeHost(rmtGenMessage.Id);
            }
            // 如果所有的host都已经ready,则释放主线程等待生成结束的锁
            if (_runtimeContainers.Values.All(item => item.HostReady))
            {
                _blockHandle.Free(Constants.RmtGenState);
            }
            return(state);
        }
Example #2
0
        public void StartListen()
        {
            // 打印状态日志
            _context.LogSession.Print(LogLevel.Debug, _context.SessionId,
                                      $"Downlink message processer started, thread:{Thread.CurrentThread.ManagedThreadId}.");

            // 首先接收RmtGenMessage
            _messageQueue = _context.MessageTransceiver.MessageQueue;
            MessageBase   message       = _messageQueue.WaitUntilMessageCome();
            RmtGenMessage rmtGenMessage = (RmtGenMessage)message;

            if (null == rmtGenMessage)
            {
                throw new TestflowRuntimeException(ModuleErrorCode.InvalidMessageReceived,
                                                   _context.I18N.GetFStr("InvalidMessageReceived", message.GetType().Name));
            }
            _context.RmtGenMessage = rmtGenMessage;

            while (!_context.Cancellation.IsCancellationRequested)
            {
                message = _messageQueue.WaitUntilMessageCome();
                if (null == message)
                {
                    continue;
                }
                switch (message.Type)
                {
                case MessageType.Ctrl:
                    ProcessControlMessage((ControlMessage)message);
                    break;

                case MessageType.Debug:
                    ProcessDebugMessage((DebugMessage)message);
                    break;

                case MessageType.Sync:
                    ProcessSyncMessage((ResourceSyncMessage)message);
                    break;

                case MessageType.CallBack:
                    ProcessCallBackMessage((CallBackMessage)message);
                    break;

                // 暂未在Master端实现发送RuntimeError消息的错误
                case MessageType.RmtGen:
                case MessageType.RuntimeError:
                case MessageType.Status:
                case MessageType.TestGen:
                default:
                    throw new TestflowRuntimeException(ModuleErrorCode.InvalidMessageReceived,
                                                       _context.I18N.GetFStr("InvalidMessageReceived", message.GetType().Name));
                }
            }
            _context.LogSession.Print(LogLevel.Debug, _context.SessionId,
                                      $"Downlink message processor stopped, Thread:{Thread.CurrentThread.ManagedThreadId}");
        }
Example #3
0
        public void SendTestGenMessage(int session, string sequenceData)
        {
            // TODO 暂时不配置Host信息
            RunnerType runnerType = (session == Constants.TestProjectSessionId)
                ? RunnerType.TestProject
                : RunnerType.SequenceGroup;
            RmtGenMessage rmtGenMessage = new RmtGenMessage(MessageNames.DownRmtGenMsgName, session, runnerType,
                                                            sequenceData);

            rmtGenMessage.Params.Add("MsgType", "Generation");
            _globalInfo.MessageTransceiver.Send(rmtGenMessage);
            // 发送生成事件
            TestGenEventInfo testGenEventInfo = new TestGenEventInfo(rmtGenMessage, TestGenState.StartGeneration);

            _globalInfo.EventQueue.Enqueue(testGenEventInfo);
        }
        protected override void TaskErrorAction(Exception ex)
        {
            Context.LogSession.Print(LogLevel.Error, CommonConst.PlatformLogSession, "Test Generation failed.");
            TestGenMessage testGenFailMessage = new TestGenMessage(MessageNames.TestGenName, Context.SessionId,
                                                                   CommonConst.PlatformSession, GenerationStatus.Failed)
            {
                Index = Context.MsgIndex
            };

            Context.UplinkMsgProcessor.SendMessage(testGenFailMessage, true);

            // 发送远程运行器生成失败的消息
            RmtGenMessage rmtGenMessage = new RmtGenMessage(MessageNames.UpRmtGenMsgName, Context.SessionId,
                                                            RunnerType.SequenceGroup);

            rmtGenMessage.Params.Add("MsgType", "Failed");
            FailedInfo failedInfo = new FailedInfo(ex, FailedType.TestGenFailed);

            rmtGenMessage.Params.Add("FailedInfo", failedInfo.ToString());
            Context.UplinkMsgProcessor.SendMessage(rmtGenMessage, true);
        }
        public override void TaskAbortAction()
        {
            TestGenMessage testGenMessage = new TestGenMessage(MessageNames.TestGenName, Context.SessionId,
                                                               CommonConst.PlatformLogSession, GenerationStatus.Failed)
            {
                Index = Context.MsgIndex
            };

            Context.UplinkMsgProcessor.SendMessage(testGenMessage, true);

            // 发送远程运行器生成失败的消息
            RmtGenMessage rmtGenMessage = new RmtGenMessage(MessageNames.UpRmtGenMsgName, Context.SessionId,
                                                            RunnerType.SequenceGroup);

            rmtGenMessage.Params.Add("MsgType", "Failed");
            FailedInfo failedInfo = new FailedInfo(Context.I18N.GetStr("OperationAborted"), FailedType.Abort);

            rmtGenMessage.Params.Add("FailedInfo", failedInfo.ToString());
            Context.UplinkMsgProcessor.SendMessage(rmtGenMessage, true);

            base.TaskAbortAction();
        }
Example #6
0
 public TestGenEventInfo(RmtGenMessage message, TestGenState genState) : base(message.Id, EventType.TestGen, message.Time)
 {
     this.GenState = genState;
 }
        /// <summary>
        /// <localize>
        ///<zh-CHS>中文</zh-CHS>
        ///<en>English</en>
        ///</localize>
        /// </summary>
        protected override void FlowTaskAction()
        {
            Context.State = RuntimeState.TestGen;

            // 发送测试开始消息
            TestGenMessage testGenStartMessage = new TestGenMessage(MessageNames.TestGenName, Context.SessionId,
                                                                    CommonConst.PlatformSession, GenerationStatus.InProgress)
            {
                Index = Context.MsgIndex
            };

            Context.UplinkMsgProcessor.SendMessage(testGenStartMessage, false);

            // 打印状态日志
            Context.LogSession.Print(LogLevel.Info, Context.SessionId, "Test generation started.");

            // 打印状态日志
            Context.LogSession.Print(LogLevel.Debug, Context.SessionId, "Construct variable mapper start.");

            // 打印状态日志
            Context.LogSession.Print(LogLevel.Debug, Context.SessionId, "Construct AssemblyInvoker start.");

            switch (Context.SequenceType)
            {
            case RunnerType.TestProject:
                ITestProject testProject = (ITestProject)Context.Sequence;
                Context.TypeInvoker = new AssemblyInvoker(Context, testProject.Assemblies,
                                                          testProject.TypeDatas);
                break;

            case RunnerType.SequenceGroup:
                ISequenceGroup sequenceGroup = (ISequenceGroup)Context.Sequence;
                Context.TypeInvoker = new AssemblyInvoker(Context, sequenceGroup.Assemblies,
                                                          sequenceGroup.TypeDatas);
                break;

            default:
                throw new InvalidOperationException();
            }

            // 打印状态日志
            Context.LogSession.Print(LogLevel.Debug, Context.SessionId, "Load assemblies.");

            // 加载用到的程序集
            Context.TypeInvoker.LoadAssemblyAndType();

            // 构造变量映射器
            Context.VariableMapper = new VariableMapper(Context);

            // 打印状态日志
            Context.LogSession.Print(LogLevel.Debug, Context.SessionId, "Create session task entity start.");

            // 创建序列执行实体
            Context.SessionTaskEntity = new SessionTaskEntity(Context);
            // 生成执行实体的调用对象
            Context.SessionTaskEntity.Generate(Context.ExecutionModel);

            // 发送生成结束的消息
            TestGenMessage testGenOverMessage = new TestGenMessage(MessageNames.TestGenName, Context.SessionId,
                                                                   CommonConst.PlatformSession, GenerationStatus.Success)
            {
                Index = Context.MsgIndex
            };

            Context.UplinkMsgProcessor.SendMessage(testGenOverMessage, true);

            // 发送远程运行器生成结束的消息
            RmtGenMessage rmtGenMessage = new RmtGenMessage(MessageNames.UpRmtGenMsgName, Context.SessionId,
                                                            RunnerType.SequenceGroup);

            rmtGenMessage.Params.Add("MsgType", "Success");
            Context.UplinkMsgProcessor.SendMessage(rmtGenMessage, true);

            // 打印状态日志
            Context.LogSession.Print(LogLevel.Info, Context.SessionId, "Test generation over.");

            this.Next = new CtrlStartProcessFlowTask(Context);
        }