/// <summary> /// Executes all assets and tests found in CompilationPath asynchronously /// </summary> /// <param name="compilationPath">Directory to read data from. Must contain the required subfolders ASSETS, TESTS and MODULES.</param> /// <param name="progress">An IProgress implementation to report status to</param> public async Task<Report> RunAsync(string compilationPath, IProgress<RunnerProgressDetail> progress = null) { if (string.IsNullOrWhiteSpace(compilationPath)) throw new ArgumentException("Compilation path is not set"); //Check if all folders are present string rootfolder = PathExtension.FullPath(compilationPath); if (PathExtension.DirectoryExists(rootfolder) == false) throw new CompilationFolderException(rootfolder); //Check subfolders string assetScriptsPath = PathExtension.Combine(rootfolder, Xteq5EngineConstant.DirectoryNameAssets); CheckCompilationSubfolder(assetScriptsPath); string testScriptsPath = PathExtension.Combine(rootfolder, Xteq5EngineConstant.DirectoryNameTests); CheckCompilationSubfolder(testScriptsPath); string modulePath = PathExtension.Combine(rootfolder, Xteq5EngineConstant.DirectoryNameModules); CheckCompilationSubfolder(modulePath); //Perform a WMI test to make sure the script are able to access WMI data WMITest wmiTest = new WMITest(); wmiTest.Test(); //Create the result object Report report = new Report(); //Set source folder report.CompilationFolder = compilationPath; //Everything looks fine so far. Let's go. PSScriptRunnerPreferences prefs = new PSScriptRunnerPreferences(); //We require at least version 4 of PowerShell prefs.RequiredPSVersion = 4; //Load modules from this path prefs.ModulePath = modulePath; //Add Xteq5EngineVersion read-only variable prefs.Variables.Add(new VariablePlain(Xteq5EngineConstant.VariableNameEngineVersion, Xteq5EngineConstant.Version, true)); //Add Xteq5Running read-only variable prefs.Variables.Add(new VariablePlain(Xteq5EngineConstant.VariableNameIsActive, true, true)); //Execute all assets List<AssetRecord> assets; using (PSScriptRunner psScriptRunnerAssets = new PSScriptRunner(prefs)) { //Check that the PowerShell environment is ready. If not, we'll error out from here. psScriptRunnerAssets.TestPowerShellEnvironment(); //Now execute all assets AssetScriptRunner assetRunner = new AssetScriptRunner(); assets = await assetRunner.Run(psScriptRunnerAssets, assetScriptsPath, progress); } //Add Xteq5Assets read-only variable Hashtable hashtableAssets = CreateHashtableFromAssetRecords(assets); prefs.Variables.Add(new VariablePlain(Xteq5EngineConstant.VariableNameAssets, hashtableAssets, true)); //Execute all tests List<TestRecord> tests; using (PSScriptRunner psScriptRunnerTests = new PSScriptRunner(prefs)) { //No TestPowerShellEnvironment() here, we should be OK if the first test worked TestScriptRunner testsRunner = new TestScriptRunner(); tests = await testsRunner.RunAsync(psScriptRunnerTests, testScriptsPath, progress); } //Contstruct the final result report.UserName = Environment.UserName; report.ComputerName = Environment.MachineName; report.EngineVersion = Xteq5EngineConstant.Version; report.Assets = assets; report.Tests = tests; CalculateRecordStatistics(report, assets, tests); //Set IssuesFound report.IssuesFound = false; report.TestIssuesFound = false; report.AssetIssuesFound = false; if ((report.AssetStatiscs.FatalCount + report.AssetStatiscs.MajorCount + report.AssetStatiscs.MinorCount) > 0) report.AssetIssuesFound = true; if ((report.TestStatiscs.FatalCount + report.TestStatiscs.MajorCount + report.TestStatiscs.MinorCount) > 0) report.TestIssuesFound = true; if (report.AssetIssuesFound || report.TestIssuesFound) report.IssuesFound = true; report.Finish(); return report; }
/// <summary> /// Executes all assets and tests found in CompilationPath asynchronously /// </summary> /// <param name="compilationPath">Directory to read data from. Must contain the required subfolders ASSETS, TESTS and MODULES.</param> /// <param name="progress">An IProgress implementation to report status to</param> public async Task <Report> RunAsync(string compilationPath, IProgress <RunnerProgressDetail> progress = null) { if (string.IsNullOrWhiteSpace(compilationPath)) { throw new ArgumentException("Compilation path is not set"); } //Check if all folders are present string rootfolder = PathExtension.FullPath(compilationPath); if (PathExtension.DirectoryExists(rootfolder) == false) { throw new CompilationFolderException(rootfolder); } //Check subfolders string assetScriptsPath = PathExtension.Combine(rootfolder, Xteq5EngineConstant.DirectoryNameAssets); CheckCompilationSubfolder(assetScriptsPath); string testScriptsPath = PathExtension.Combine(rootfolder, Xteq5EngineConstant.DirectoryNameTests); CheckCompilationSubfolder(testScriptsPath); string modulePath = PathExtension.Combine(rootfolder, Xteq5EngineConstant.DirectoryNameModules); CheckCompilationSubfolder(modulePath); //Perform a WMI test to make sure the script are able to access WMI data WMITest wmiTest = new WMITest(); wmiTest.Test(); //Create the result object Report report = new Report(); //Set source folder report.CompilationFolder = compilationPath; //Everything looks fine so far. Let's go. PSScriptRunnerPreferences prefs = new PSScriptRunnerPreferences(); //We require at least version 4 of PowerShell prefs.RequiredPSVersion = 4; //Load modules from this path prefs.ModulePath = modulePath; //Add Xteq5EngineVersion read-only variable prefs.Variables.Add(new VariablePlain(Xteq5EngineConstant.VariableNameEngineVersion, Xteq5EngineConstant.Version, true)); //Add Xteq5Running read-only variable prefs.Variables.Add(new VariablePlain(Xteq5EngineConstant.VariableNameIsActive, true, true)); //Execute all assets List <AssetRecord> assets; using (PSScriptRunner psScriptRunnerAssets = new PSScriptRunner(prefs)) { //Check that the PowerShell environment is ready. If not, we'll error out from here. psScriptRunnerAssets.TestPowerShellEnvironment(); //Now execute all assets AssetScriptRunner assetRunner = new AssetScriptRunner(); assets = await assetRunner.Run(psScriptRunnerAssets, assetScriptsPath, progress); } //Add Xteq5Assets read-only variable Hashtable hashtableAssets = CreateHashtableFromAssetRecords(assets); prefs.Variables.Add(new VariablePlain(Xteq5EngineConstant.VariableNameAssets, hashtableAssets, true)); //Execute all tests List <TestRecord> tests; using (PSScriptRunner psScriptRunnerTests = new PSScriptRunner(prefs)) { //No TestPowerShellEnvironment() here, we should be OK if the first test worked TestScriptRunner testsRunner = new TestScriptRunner(); tests = await testsRunner.RunAsync(psScriptRunnerTests, testScriptsPath, progress); } //Contstruct the final result report.UserName = Environment.UserName; report.ComputerName = Environment.MachineName; report.EngineVersion = Xteq5EngineConstant.Version; report.Assets = assets; report.Tests = tests; CalculateRecordStatistics(report, assets, tests); //Set IssuesFound report.IssuesFound = false; report.TestIssuesFound = false; report.AssetIssuesFound = false; if ((report.AssetStatiscs.FatalCount + report.AssetStatiscs.MajorCount + report.AssetStatiscs.MinorCount) > 0) { report.AssetIssuesFound = true; } if ((report.TestStatiscs.FatalCount + report.TestStatiscs.MajorCount + report.TestStatiscs.MinorCount) > 0) { report.TestIssuesFound = true; } if (report.AssetIssuesFound || report.TestIssuesFound) { report.IssuesFound = true; } report.Finish(); return(report); }