/// <summary> /// 创建日志服务实例 /// </summary> public LogService() { if (null != _inst) { I18N i18N = I18N.GetInstance(Constants.I18NName); throw new TestflowRuntimeException(CommonErrorCode.InternalError, i18N.GetStr("InstAlreadyExist")); } lock (_instLock) { Thread.MemoryBarrier(); if (null != _inst) { I18N i18N = I18N.GetInstance(Constants.I18NName); throw new TestflowRuntimeException(CommonErrorCode.InternalError, i18N.GetStr("InstAlreadyExist")); } _runtimeLogSessions = new Dictionary <int, LocalLogSession>(Constants.DefaultLogStreamSize); I18NOption i18NOption = new I18NOption(this.GetType().Assembly, "i18n_logger_zh", "i18n_logger_en") { Name = Constants.I18NName }; _i18N = I18N.GetInstance(i18NOption); _testflowInst = TestflowRunner.GetInstance(); _context = _testflowInst.Context; _inst = this; } }
private void RefreshUsedAssemblies(IAssemblyInfoCollection assemblies, HashSet <string> usedAssembly) { for (int i = assemblies.Count - 1; i >= 0; i--) { if (usedAssembly.Contains(assemblies[i].AssemblyName)) { continue; } assemblies.RemoveAt(i); } foreach (string assemblyName in usedAssembly) { IAssemblyInfo assemblyInfo = assemblies.FirstOrDefault(item => item.AssemblyName.Equals(assemblyName)); if (null != assemblyInfo) { continue; } assemblyInfo = _comInterfaceManager.GetAssemblyInfo(assemblyName); if (null == assemblyInfo) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, 0, $"Unloaded assembly '{assemblyName}' used."); I18N i18N = I18N.GetInstance(Constants.I18nName); throw new TestflowDataException(ModuleErrorCode.TypeDataError, i18N.GetFStr("InvalidAssemblyUsed", assemblyName)); } assemblies.Add(assemblyInfo); } }
public IClassInterfaceDescription GetClassDescriptionByType(ITypeData typeData, out IAssemblyInfo assemblyInfo) { string assemblyName = typeData.AssemblyName; ComInterfaceDescription interfaceDescription = _descriptionData.GetComDescription(assemblyName); IClassInterfaceDescription classDescription = null; // 如果该类型描述已存在则直接返回 if (interfaceDescription != null && null != (classDescription = interfaceDescription.Classes.FirstOrDefault(item => item.ClassType.Equals(typeData)))) { assemblyInfo = interfaceDescription.Assembly; return(classDescription); } string path, version; classDescription = _loaderManager.GetClassDescription(typeData, _descriptionData, out path, out version); assemblyInfo = GetAssemblyInfo(assemblyName); TestflowRunner testflowRunner; if (null == assemblyInfo && null != (testflowRunner = TestflowRunner.GetInstance())) { assemblyInfo = testflowRunner.SequenceManager.CreateAssemblyInfo(); assemblyInfo.Path = path; assemblyInfo.Version = version; assemblyInfo.AssemblyName = assemblyName; assemblyInfo.Available = true; _descriptionData.Add(assemblyInfo); } return(classDescription); }
private void StartLauncher(object param) { string configStr = (string)param; Type launcherType = typeof(AppDomainTestLauncher); string launcherFullName = $"{launcherType.Namespace}.{launcherType.Name}"; try { _appDomain.Load(launcherType.Assembly.GetName()); AppDomainTestLauncher launcherInstance = (AppDomainTestLauncher)_appDomain.CreateInstanceFromAndUnwrap( launcherType.Assembly.Location, launcherFullName, false, BindingFlags.Instance | BindingFlags.Public, null, new object[] { configStr }, CultureInfo.CurrentCulture, null); launcherInstance.Start(); } catch (ThreadAbortException ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Warn, CommonConst.PlatformLogSession, "Appdomain thread aborted."); } catch (Exception ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, ex, "Exception raised in appdomain thread."); } }
private void SetAssemblyAbsolutePath(ExpressionTypeData typeData, List <string> availableDirs) { string path = typeData.AssemblyPath; StringBuilder pathCache = new StringBuilder(200); // 如果文件名前面有分隔符则去掉 while (path.StartsWith(Path.DirectorySeparatorChar.ToString())) { path = path.Substring(1, path.Length - 1); } // 转换为绝对路径时反向寻找,先.net库再平台库再用户库 for (int i = availableDirs.Count - 1; i >= 0; i--) { pathCache.Clear(); string availableDir = availableDirs[i]; pathCache.Append(availableDir).Append(path); // 如果库存在则配置为绝对路径,然后返回 if (File.Exists(pathCache.ToString())) { typeData.AssemblyPath = pathCache.ToString(); return; } } TestflowRunner.GetInstance().LogService.Print(LogLevel.Fatal, CommonConst.PlatformLogSession, $"Assembly of type:{typeData.ClassName} cannot be located."); I18N i18N = I18N.GetInstance(Constants.I18nName); throw new TestflowRuntimeException(ModuleErrorCode.ConfigDataError, i18N.GetFStr("InvalidCalculator", typeData.ClassName)); }
public void RuntimeInitialize() { if (_dataMaintainer == null) { _dataMaintainer = TestflowRunner.GetInstance().DataMaintainer; } }
static ValueConvertor() { _convertorHandler = new Dictionary <string, Func <string, object> >(12) { { typeof(string).Name, (valueStr) => valueStr }, { typeof(int).Name, (valueStr) => int.Parse(valueStr) }, { typeof(uint).Name, (valueStr) => uint.Parse(valueStr) }, { typeof(short).Name, (valueStr) => short.Parse(valueStr) }, { typeof(ushort).Name, (valueStr) => ushort.Parse(valueStr) }, { typeof(long).Name, (valueStr) => long.Parse(valueStr) }, { typeof(ulong).Name, (valueStr) => ulong.Parse(valueStr) }, { typeof(double).Name, (valueStr) => double.Parse(valueStr) }, { typeof(byte).Name, (valueStr) => byte.Parse(valueStr) }, { typeof(char).Name, (valueStr) => char.Parse(valueStr) }, { typeof(bool).Name, (valueStr) => bool.Parse(valueStr) }, { typeof(DateTime).Name, (valueStr) => DateTime.Parse(valueStr) } }; #region 记录 IComInterfaceManager _interfaceManager = TestflowRunner.GetInstance().ComInterfaceManager; IComInterfaceDescription comDescription = _interfaceManager.GetComInterfaceByName("mscorlib"); _valueTypes = new HashSet <ITypeData>(); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Boolean"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Double"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Single"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Int64"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("UInt64"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Int32"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Int16"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("UInt16"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Char"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Byte"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("String"))); #endregion }
public void CallBackWithParameters() { ITestProject testProjectData = _sequenceCreator.GetCallBackTestProjectData2(); TestflowRunner runnerInstance = TestflowRunner.GetInstance(); runnerInstance.EngineController.SetSequenceData(testProjectData); runnerInstance.EngineController.Start(); }
public void SequenceGroupSequentialTest() { ITestProject testProjectData = _sequenceCreator.GetSequencialTestProjectData(); TestflowRunner runnerInstance = TestflowRunner.GetInstance(); runnerInstance.EngineController.SetSequenceData(testProjectData.SequenceGroups[0]); runnerInstance.EngineController.Start(); }
private void LogAndThrowExpressionError(string logMessage, int errorCode, string errorLabel, params string[] extraParams) { TestflowRunner runnerInstance = TestflowRunner.GetInstance(); I18N i18N = I18N.GetInstance(Constants.I18nName); runnerInstance.LogService.Print(LogLevel.Error, CommonConst.PlatformLogSession, logMessage); throw new TestflowDataException(errorCode, i18N.GetFStr(errorLabel, extraParams)); }
private void RegisterFailedInfoConvertion() { TestflowRunner.GetInstance().DataMaintainer.RegisterTypeConvertor( typeof(IFailedInfo), value => value?.ToString() ?? string.Empty, valueStr => string.IsNullOrWhiteSpace(valueStr) ? null : new FailedInfo(valueStr) ); }
public ModuleGlobalInfo(IModuleConfigData configData) { TestflowRunner = TestflowRunner.GetInstance(); this.I18N = I18N.GetInstance(Constants.I18nName); this.LogService = TestflowRunner.LogService; this.ConfigData = configData; this.ExceptionManager = new ExceptionManager(LogService); this.RuntimeHash = ModuleUtils.GetRuntimeHash(configData.GetProperty <Encoding>("PlatformEncoding")); }
public void SequenceTest() { TestflowRunner runnerInstance = TestflowRunner.GetInstance(); ISequenceManager sequenceManager = runnerInstance.SequenceManager; ISequenceGroup sequenceGroup = sequenceManager.LoadSequenceGroup(SerializationTarget.File, @"C:\Users\jingtao\Desktop\sequence.tfseq"); runnerInstance.EngineController.SetSequenceData(sequenceGroup); runnerInstance.EngineController.Start(); }
private void ThrowIfVariableNotFound(string variableName, ISequenceFlowContainer parent) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Warn, CommonConst.PlatformLogSession, 0, $"Undeclared variable '{0}' in sequence '{parent.Name}'"); I18N i18N = I18N.GetInstance(Constants.I18nName); throw new TestflowDataException(ModuleErrorCode.VariableError, i18N.GetFStr("UndeclaredVariable", variableName, parent.Name)); }
public DescriptionLoaderManager() { _loaderDomain = AppDomain.CreateDomain(Constants.AppDomainName); // _loaderDomain.Load() Type loaderType = typeof(AssemblyDescriptionLoader); // _loaderName = $"{loaderType.Namespace}.{loaderType.Name}"; _assemblyFullName = loaderType.Assembly.Location; _loaderName = loaderType.FullName; _loader = (AssemblyDescriptionLoader)_loaderDomain.CreateInstanceFromAndUnwrap(_assemblyFullName, _loaderName); _sequenceManager = TestflowRunner.GetInstance().SequenceManager; }
public void Dispose() { TestflowRunner runner = TestflowRunner.GetInstance(); runner.LogService?.Dispose(); runner.ComInterfaceManager?.Dispose(); runner.SequenceManager?.Dispose(); runner.DataMaintainer?.Dispose(); runner.EngineController?.Dispose(); runner.ParameterChecker?.Dispose(); runner.ResultManager?.Dispose(); }
public void RuntimeInitialize() { GlobalConfigData globalConfigData = Initialize(); TestflowRunner testflowRunner = TestflowRunner.GetInstance(); this.ApplyConfig(globalConfigData.GetGlobalConfigData()); testflowRunner.DataMaintainer.ApplyConfig(globalConfigData.GetModuleConfigData(Constants.DataMaintain)); testflowRunner.EngineController.ApplyConfig(globalConfigData.GetModuleConfigData(Constants.EngineConfig)); testflowRunner.SequenceManager.ApplyConfig(globalConfigData.GetModuleConfigData(Constants.SequenceManage)); testflowRunner.ResultManager.ApplyConfig(globalConfigData.GetModuleConfigData(Constants.ResultManage)); globalConfigData.Dispose(); }
public void Initialize() { TestflowRunner runner = TestflowRunner.GetInstance(); runner.LogService.RuntimeInitialize(); //动态启用ComInterfaceManager再说吧 //runner.ComInterfaceManager.RuntimeInitialize(); runner.SequenceManager.RuntimeInitialize(); runner.DataMaintainer.RuntimeInitialize(); runner.EngineController.RuntimeInitialize(); runner.ResultManager?.RuntimeInitialize(); _sequenceManager = TestflowRunner.GetInstance().SequenceManager; _engineController = TestflowRunner.GetInstance().EngineController; }
public void Initialize() { TestflowRunner runner = TestflowRunner.GetInstance(); runner.LogService.DesigntimeInitialize(); runner.ComInterfaceManager.DesigntimeInitialize(); runner.SequenceManager.DesigntimeInitialize(); runner.DataMaintainer.DesigntimeInitialize(); runner.EngineController.DesigntimeInitialize(); runner.ResultManager?.DesigntimeInitialize(); runner.ParameterChecker?.DesigntimeInitialize(); _sequenceManager = TestflowRunner.GetInstance().SequenceManager; _interfaceManager = TestflowRunner.GetInstance().ComInterfaceManager; }
private static void ReleaseXmlWriter(XmlWriter writer) { try { writer?.Flush(); writer?.Close(); } catch (IOException ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, 0, ex, ex.Message); throw new TestflowRuntimeException(ModuleErrorCode.SerializeFailed, ex.Message, ex); } }
public static TestProject LoadTestProject(string filePath, bool forceLoad, IModuleConfigData envInfo) { filePath = ModuleUtils.GetAbsolutePath(filePath, Directory.GetCurrentDirectory()); if (!filePath.EndsWith($".{CommonConst.TestGroupFileExtension}")) { I18N i18N = I18N.GetInstance(Constants.I18nName); throw new TestflowRuntimeException(ModuleErrorCode.InvalidFileType, i18N.GetStr("InvalidFileType")); } TestProject testProject = null; testProject = XmlReaderHelper.ReadTestProject(filePath); // 需要单独配置Setup和TearDown的索引号 testProject.SetUp.Index = CommonConst.SetupIndex; testProject.TearDown.Index = CommonConst.TeardownIndex; CheckModelVersion(testProject.ModelVersion, envInfo); foreach (ISequenceGroup sequenceGroup in testProject.SequenceGroups) { CheckModelVersion(sequenceGroup.Info.Version, envInfo); } foreach (SequenceGroupLocationInfo sequenceGroupLocation in testProject.SequenceGroupLocations) { SequenceGroup sequenceGroup = null; string sequenceGroupFile = ModuleUtils.GetAbsolutePath(sequenceGroupLocation.SequenceFilePath, filePath); if (File.Exists(sequenceGroupFile)) { sequenceGroup = LoadSequenceGroup(sequenceGroupFile, forceLoad, envInfo); sequenceGroup.Parent = testProject; } else { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Warn, CommonConst.PlatformLogSession, 0, "Sequence group file not exist."); sequenceGroup = new SequenceGroup(); sequenceGroup.Initialize(testProject); sequenceGroup.Info.SequenceGroupFile = sequenceGroupFile; sequenceGroup.Available = false; } testProject.SequenceGroups.Add(sequenceGroup); } ValidateTypeDatas(testProject); return(testProject); }
public static SequenceGroup ReadSequenceGroup(string filePath) { if (!filePath.EndsWith($".{CommonConst.SequenceFileExtension}")) { I18N i18N = I18N.GetInstance(Constants.I18nName); throw new TestflowDataException(ModuleErrorCode.InvalidFileType, i18N.GetStr("InvalidFileType")); } XmlReader reader = null; try { reader = CreateXmlReader(filePath); Dictionary <string, Type> typeMapping = GetTypeMapping(); // 找到TestProject节点后跳出 while (reader.Read()) { if (XmlNodeType.Element != reader.NodeType) { continue; } if (typeof(SequenceGroup).Name.Equals(reader.Name)) { break; } } SequenceGroup sequenceGroup = new SequenceGroup(); FillDataToObject(reader, sequenceGroup, typeMapping); return(sequenceGroup); } catch (ArgumentException ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, 0, ex); throw new TestflowDataException(ModuleErrorCode.DeSerializeFailed, ex.Message, ex); } catch (IOException ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, 0, ex); throw new TestflowRuntimeException(ModuleErrorCode.DeSerializeFailed, ex.Message, ex); } finally { reader?.Close(); } }
private static void RollBackFilesIfFailed(IList <string> fileList) { foreach (string file in fileList) { if (File.Exists(file)) { try { File.Delete(file); } catch (IOException ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Warn, CommonConst.PlatformLogSession, 0, ex, "Roll back file failed."); } } } }
static TypeChecker() { IComInterfaceManager _interfaceManager = TestflowRunner.GetInstance().ComInterfaceManager; IComInterfaceDescription comDescription = _interfaceManager.GetComInterfaceByName("mscorlib"); _valueTypes = new HashSet <ITypeData>(); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Boolean"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Double"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Single"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Int64"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("UInt64"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Int32"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Int16"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("UInt16"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Char"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("Byte"))); _valueTypes.Add(comDescription.VariableTypes.FirstOrDefault(item => item.Name.Equals("String"))); }
private static XmlReader CreateXmlReader(string filePath) { try { XmlReaderSettings settings = new XmlReaderSettings(); settings.CloseInput = true; settings.IgnoreComments = true; settings.IgnoreProcessingInstructions = true; settings.IgnoreWhitespace = true; return(XmlReader.Create(filePath, settings)); } catch (IOException ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, 0, ex, ex.Message); throw new TestflowRuntimeException(ModuleErrorCode.SerializeFailed, ex.Message, ex); } }
public string GetAbsolutePath(string path) { if (!IsRelativePath(path)) { return(path); } string abosolutePath = InternalGetAbosolutePath(path); if (null == abosolutePath) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, $"File in relative path '{path}' cannot be found."); I18N i18N = I18N.GetInstance(Constants.I18nName); throw new TestflowDataException(ModuleErrorCode.DeSerializeFailed, i18N.GetFStr("FileCannotFound", path)); } return(abosolutePath); }
private void CheckPropertyDescription(ITypeData typeData, string property) { if (null != _loader.Exception) { return; } I18N i18N = I18N.GetInstance(Constants.I18nName); ILogService logService = TestflowRunner.GetInstance().LogService; switch (_loader.ErrorCode) { case ModuleErrorCode.LibraryLoadError: logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, _loader.Exception, $"Assembly '{typeData.AssemblyName}' load error."); throw new TestflowRuntimeException(ModuleErrorCode.LibraryLoadError, i18N.GetStr("RuntimeError")); break; case ModuleErrorCode.PropertyNotFound: logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, _loader.Exception, $"Property '{property}' of type '{typeData.Name}' does not exist."); throw new TestflowRuntimeException(ModuleErrorCode.PropertyNotFound, i18N.GetFStr("PropertyNotFound", typeData.Name, property)); break; case ModuleErrorCode.TypeCannotLoad: logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, _loader.Exception, $"Type '{typeData.Name}' does not exist."); throw new TestflowRuntimeException(ModuleErrorCode.TypeCannotLoad, i18N.GetFStr("TypeNotFound", typeData.Name)); break; case ModuleErrorCode.AssemblyNotLoad: logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, _loader.Exception, $"Assemly '{typeData.AssemblyName}' does not exist."); throw new TestflowRuntimeException(ModuleErrorCode.AssemblyNotLoad, i18N.GetFStr("AssemblyNotLoad", typeData.AssemblyName)); break; default: break; } }
public IList <IComInterfaceDescription> GetComponentInterfaces(string directory) { if (!Directory.Exists(directory)) { TestflowRunner.GetInstance().LogService.Print(LogLevel.Warn, CommonConst.PlatformLogSession, $"Directory '{directory}' does not exist."); return(new List <IComInterfaceDescription>(0)); } DirectoryInfo directoryInfo = new DirectoryInfo(directory); FileInfo[] fileInfos = directoryInfo.GetFiles(Constants.LibFileFilter); List <IComInterfaceDescription> descriptions = new List <IComInterfaceDescription>(fileInfos.Length); foreach (FileInfo fileInfo in fileInfos) { descriptions.Add(GetComponentInterface(fileInfo.FullName)); } return(descriptions); }
private static void SetParameterToSequenceData(ISequence sequenece, ISequenceParameter parameter) { for (int i = 0; i < sequenece.Variables.Count; i++) { IVariable variable = sequenece.Variables[i]; if (!variable.Name.Equals(parameter.VariableValues[i].Name)) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Warn, CommonConst.PlatformLogSession, 0, $"Variable{variable.Name} {sequenece.Name} value in parameter data is invalid."); I18N i18N = I18N.GetInstance(Constants.I18nName); throw new TestflowDataException(ModuleErrorCode.UnmatchedParameter, i18N.GetStr("UnmatchedData")); } variable.Value = parameter.VariableValues[i].Value; } for (int i = 0; i < sequenece.Steps.Count; i++) { SetParameterToSequenceData(sequenece.Steps[i], parameter.StepParameters[i]); } }
private static XmlWriter CreateXmlWriter(string filePath) { XmlWriterSettings settings = new XmlWriterSettings() { Async = false, Indent = true, IndentChars = " ", NewLineChars = Environment.NewLine }; try { return(XmlWriter.Create(filePath, settings)); } catch (IOException ex) { ILogService logService = TestflowRunner.GetInstance().LogService; logService.Print(LogLevel.Error, CommonConst.PlatformLogSession, 0, ex, ex.Message); throw new TestflowRuntimeException(ModuleErrorCode.SerializeFailed, ex.Message, ex); } }