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); }
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}"); }
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(); }
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); }