/// <summary> /// Renames a previously initialized temporary log file. /// </summary> static void rename(string path, bool newFile = false) { var sw = System.Diagnostics.Stopwatch.StartNew(); List <string> recentFiles = recentSystemlogs.GetRecent().Where(File.Exists).ToList(); long getTotalSize() { return(recentFiles.Select(x => new FileInfo(x).Length).Sum()); } bool checkCondition() { bool tooManyFiles = (recentFiles.Count + 1) > maxNumberOfTraceFiles; if (tooManyFiles) { return(true); } if (recentFiles.Count <= 2) { return(false); // Do not remove the last couple of log files, event though they might exceed limits. } var totalSize = getTotalSize(); bool filesTooBig = totalSize > maxTotalSizeOfTraceFiles; if (filesTooBig) { return(true); } return(false); } int ridx = 0; while (checkCondition() && ridx < recentFiles.Count) { try { if (File.Exists(recentFiles[ridx])) { File.Delete(recentFiles[ridx]); } recentFiles.RemoveAt(ridx); } catch (Exception) { ridx++; } } string name = Path.GetFileNameWithoutExtension(path); string dir = Path.GetDirectoryName(path); string ext = Path.GetExtension(path); bool fileNameChanged = false; for (int idx = 0; idx < maxNumberOfConcurrentSessions; idx++) { try { path = Path.Combine(dir, name + (idx == 0 ? "" : idx.ToString()) + ext); if (traceListener == null || newFile) { if (string.IsNullOrWhiteSpace(dir) == false) { Directory.CreateDirectory(Path.GetDirectoryName(path)); } traceListener = new FileTraceListener(path) { FileSizeLimit = 100000000 }; // max size for log files is 100MB. traceListener.FileSizeLimitReached += TraceListener_FileSizeLimitReached; Log.AddListener(traceListener); } else { traceListener.ChangeFileName(path); } fileNameChanged = true; break; } catch { // File was probably locked by another process. } } if (!fileNameChanged) { log.Debug("Unable to rename log file. Continuing with log '{0}'.", currentLogFile); } else { currentLogFile = path; log.Debug(sw, "Session log loaded as '{0}'.", currentLogFile); recentSystemlogs.AddRecent(Path.GetFullPath(path)); } }
private TestPlanRun DoExecute(IEnumerable <IResultListener> resultListeners, IEnumerable <ResultParameter> metaDataParameters, HashSet <ITestStep> stepsOverride) { if (resultListeners == null) { throw new ArgumentNullException("resultListeners"); } if (PrintTestPlanRunSummary && !resultListeners.Contains(summaryListener)) { resultListeners = resultListeners.Concat(new IResultListener[] { summaryListener }); } resultListeners = resultListeners.Where(r => r is IEnabledResource ? ((IEnabledResource)r).IsEnabled : true); IList <ITestStep> steps; if (stepsOverride == null) { steps = Steps; } else { // Remove steps that are already included via their parent steps. foreach (var step in stepsOverride) { if (step == null) { throw new ArgumentException("stepsOverride may not contain null", "stepsOverride"); } var p = step.GetParent <ITestStep>(); while (p != null) { if (stepsOverride.Contains(p)) { throw new ArgumentException("stepsOverride may not contain steps and their parents.", "stepsOverride"); } p = p.GetParent <ITestStep>(); } } steps = Utils.FlattenHeirarchy(Steps, step => step.ChildTestSteps).Where(stepsOverride.Contains).ToList(); } long initTimeStamp = Stopwatch.GetTimestamp(); var initTime = DateTime.Now; Log.Info("-----------------------------------------------------------------"); var fileStreamFile = FileSystemHelper.CreateTempFile(); var logStream = new HybridStream(fileStreamFile, 1024 * 1024); var planRunLog = new FileTraceListener(logStream) { IsRelative = true }; OpenTap.Log.AddListener(planRunLog); var allSteps = Utils.FlattenHeirarchy(steps, step => step.ChildTestSteps); var allEnabledSteps = Utils.FlattenHeirarchy(steps.Where(x => x.Enabled), step => step.GetEnabledChildSteps()); var enabledSinks = new HashSet <IResultSink>(); TestStepExtensions.GetObjectSettings <IResultSink, ITestStep, IResultSink>(allEnabledSteps, true, null, enabledSinks); if (enabledSinks.Count > 0) { var sinkListener = new ResultSinkListener(enabledSinks); resultListeners = resultListeners.Append(sinkListener); } Log.Info("Starting TestPlan '{0}' on {1}, {2} of {3} TestSteps enabled.", Name, initTime, allEnabledSteps.Count, allSteps.Count); // Reset step verdict. foreach (var step in allSteps) { if (step.Verdict != Verdict.NotSet) { step.Verdict = Verdict.NotSet; step.OnPropertyChanged("Verdict"); } } if (currentExecutionState != null) { // load result listeners that are _not_ used in the previous runs. // otherwise they wont get opened later. foreach (var rl in resultListeners) { if (!currentExecutionState.ResultListeners.Contains(rl)) { currentExecutionState.ResultListeners.Add(rl); } } } var currentListeners = currentExecutionState != null ? currentExecutionState.ResultListeners : resultListeners; TestPlanRun execStage; bool continuedExecutionState = false; if (currentExecutionState != null) { execStage = new TestPlanRun(currentExecutionState, initTime, initTimeStamp); continuedExecutionState = true; } else { execStage = new TestPlanRun(this, resultListeners.ToList(), initTime, initTimeStamp); execStage.Parameters.AddRange(PluginManager.GetPluginVersions(allEnabledSteps)); execStage.ResourceManager.ResourceOpened += r => { execStage.Parameters.AddRange(PluginManager.GetPluginVersions(new List <object> { r })); }; } if (metaDataParameters != null) { execStage.Parameters.AddRange(metaDataParameters); } var prevExecutingPlanRun = executingPlanRun.LocalValue; executingPlanRun.LocalValue = execStage; CurrentRun = execStage; failState runWentOk = failState.StartFail; // ReSharper disable once InconsistentNaming var preRun_Run_PostRunTimer = Stopwatch.StartNew(); try { execStage.FailedToStart = true; // Set it here in case OpenInternal throws an exception. Could happen if a step is missing an instrument OpenInternal(execStage, continuedExecutionState, currentListeners.Cast <IResource>().ToList(), allEnabledSteps); execStage.WaitForSerialization(); execStage.ResourceManager.BeginStep(execStage, this, TestPlanExecutionStage.Execute, TapThread.Current.AbortToken); if (continuedExecutionState) { // Since resources are not opened, getting metadata cannot be done in the wait for resources continuation // like shown in TestPlanRun. Instead we do it here. foreach (var res in execStage.ResourceManager.Resources) { execStage.Parameters.AddRange(ResultParameters.GetMetadataFromObject(res)); } } runWentOk = failState.ExecFail; //important if test plan is aborted and runWentOk is never returned. runWentOk = execTestPlan(execStage, steps); } catch (Exception e) { if (e is OperationCanceledException && execStage.MainThread.AbortToken.IsCancellationRequested) { Log.Warning(String.Format("TestPlan aborted. ({0})", e.Message)); execStage.UpgradeVerdict(Verdict.Aborted); } else if (e is ThreadAbortException) { // It seems this actually never happens. Log.Warning("TestPlan aborted."); execStage.UpgradeVerdict(Verdict.Aborted); //Avoid entering the finally clause. Thread.Sleep(500); } else if (e is System.ComponentModel.LicenseException) { Log.Error(e.Message); execStage.UpgradeVerdict(Verdict.Error); } else { Log.Warning("TestPlan aborted."); Log.Error(e.Message); Log.Debug(e); execStage.UpgradeVerdict(Verdict.Error); } } finally { execStage.FailedToStart = (runWentOk == failState.StartFail); try { finishTestPlanRun(execStage, preRun_Run_PostRunTimer, runWentOk, planRunLog, logStream); } catch (Exception ex) { Log.Error("Error while finishing TestPlan."); Log.Debug(ex); } OpenTap.Log.RemoveListener(planRunLog); planRunLog.Dispose(); logStream.Dispose(); File.Delete(fileStreamFile); // Clean all test steps StepRun, otherwise the next test plan execution will be stuck at TestStep.DoRun at steps that does not have a cleared StepRun. foreach (var step in allSteps) { step.StepRun = null; } executingPlanRun.LocalValue = prevExecutingPlanRun; CurrentRun = prevExecutingPlanRun; } return(execStage); }