public static bool DoChore(string name, Action action, bool continueOnFail = false) { WriteFormat(ChoreOptions.StartedFormat, new[] { name, "started" }, ChoreOptions.StartedColors, ChoreOptions.StartedColors.Count); PushGroup("job"); ++layer; ConsoleOutWrapper.Capture(); ConsoleErrWrapper.Capture(); ConsoleErrWrapper.ResetWrittenTo(); var success = false; var stopWatch = new Stopwatch(); try { stopWatch.Start(); action?.Invoke(); stopWatch.Stop(); success = !ConsoleErrWrapper.WasWrittenTo; } catch (Exception x) { stopWatch.Stop(); Write(x, "Error while running job:"); } // TODO: This is not correct, move this logic PopGroup(ConsoleErrWrapper.WasWrittenTo || ConsoleOutWrapper.WasWrittenTo); if (--layer == 0) { ConsoleOutWrapper.Release(); ConsoleErrWrapper.Release(); } if (success) { WriteFormat(ChoreOptions.EndedFormat, new object[] { name, "succeeded" }, ChoreOptions.SucceededColors, ChoreOptions.SucceededColors.Count); } else { WriteFormat(ChoreOptions.EndedFormat, new object[] { name, "failed" }, ChoreOptions.FailedColors, ChoreOptions.FailedColors.Count); } Write(stopWatch.Elapsed); WriteLine($".\n"); if (!success && !continueOnFail) { throw new Exception($"Task {name} failed! Aborting."); } return(success); }
public void CaptureStandardError() { var logger = new LocalLambdaLogger(); using (var captiure = new ConsoleOutWrapper(logger)) { Console.Error.WriteLine("CAPTURED"); } Console.Error.WriteLine("NOT_CAPTURED"); Assert.Contains("CAPTURED", logger.Buffer); Assert.DoesNotContain("NOT_CAPTURED", logger.Buffer); }