public void ForwardedPipProcessErrorTest() { var eventName = "PipProcessError"; var text = "Pip process error message"; var pipSemiStableHash = (long)24; m_eventListener.RegisterEventSource(global::BuildXL.Engine.ETWLogger.Log); m_eventListener.NestedLoggerHandler += eventData => { m_eventFields = new PipProcessErrorEventFields(eventData.Payload, true); }; using (var testElements = PipProcessErrorTestElement.Create(this)) using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, testElements.Console, DateTime.Now, testElements.ViewModel, false, null)) { listener.RegisterEventSource(global::BuildXL.Engine.ETWLogger.Log); global::BuildXL.Engine.Tracing.Logger.Log.DistributionWorkerForwardedError(LoggingContext, new WorkerForwardedEvent() { EventId = (int)LogEventId.PipProcessError, EventName = eventName, EventKeywords = 0, Text = text, PipProcessErrorEvent = testElements.PipProcessError, }); testElements.Console.ValidateCall(MessageLevel.Info, testElements.ExpectingConsoleLog); XAssert.IsTrue(testElements.ViewModel.BuildSummary.PipErrors.Any(e => e.SemiStablePipId == $"Pip{(pipSemiStableHash):X16}")); XAssert.AreEqual(m_eventFields, testElements.PipProcessError, "You may edit the PipProcessError and/or WorkerForwardedEvent fields, and/or struct PipProcessErrorEventFields."); AssertErrorEventLogged(SharedLogEventId.DistributionWorkerForwardedError); } }
public void ValidateErrorCap() { m_eventListener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); m_eventListener.NestedLoggerHandler += eventData => { m_eventFields = new PipProcessErrorEventFields(eventData.Payload, false); }; using (var testElements = PipProcessErrorTestElement.Create(this)) using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, testElements.Console, DateTime.Now, testElements.ViewModel, false, null, maxIssuesToLog: 1)) { listener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); // First log should go through as normal testElements.LogPipProcessError(); testElements.Console.ValidateCall(MessageLevel.Info, testElements.ExpectingConsoleLog); // Second will log the message about being truncated testElements.LogPipProcessError(); testElements.Console.ValidateCall(MessageLevel.Info, "truncated"); // Third should result in no more messages logged testElements.LogPipProcessError(); testElements.Console.ValidateNoCall(); } // The TestEventListener is watching all errors, not the AzureDevOpsListener processed ones. Make sure it's cool with seeing 3 errors AssertErrorEventLogged(LogEventId.PipProcessError, 3); }
public static PipProcessErrorTestElement Create(BuildXLTestBase testBase) { var result = new PipProcessErrorTestElement(); var pipProcessError = new PipProcessErrorEventFields( (long)24, "my cool pip", @"specs\mypip.dsc", @"specs\workingDir", "coolpip.exe", "Failure message Line1\r\nFailure message Line2\rFailure message Line3\n", "Find output file in following path:", @"specs\workingDir\out.txt", -1, "what does this do?", "my pip"); var processedOutputToLog = "Failure message Line1%0D%0A##[error]Failure message Line2%0D##[error]Failure message Line3%0A##[error]"; result.ExpectingConsoleLog = @$ "##vso[task.logIssue type=error;]DX0064 [Pip0000000000000018, {pipProcessError.ShortPipDescription}, {pipProcessError.PipSpecPath}] - failed with exit code {pipProcessError.ExitCode}, {pipProcessError.OptionalMessage}%0D%0A##[error]{processedOutputToLog}%0D%0A##[error]{pipProcessError.MessageAboutPathsToLog}%0D%0A##[error]{pipProcessError.PathsToLog}"; result.PipProcessError = pipProcessError; result.Console = new MockConsole(); result.ViewModel = new BuildViewModel(); var buildSummaryFilePath = Path.Combine(testBase.TestOutputDirectory, "test.md"); result.ViewModel.BuildSummary = new BuildSummary(buildSummaryFilePath); result.m_loggingContext = testBase.LoggingContext; return(result); }
public void LogAzureDevOpsIssueTest() { m_eventListener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); m_eventListener.NestedLoggerHandler += eventData => { m_eventFields = new PipProcessErrorEventFields(eventData.Payload, false); }; using (var testElements = PipProcessErrorTestElement.Create(this)) using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, testElements.Console, DateTime.Now, testElements.ViewModel, false, null)) { listener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); testElements.LogPipProcessError(); testElements.Console.ValidateCall(MessageLevel.Info, testElements.ExpectingConsoleLog); XAssert.AreEqual(m_eventFields, testElements.PipProcessError, "You may edit the PipProcessError event fields, update the test and/or struct PipProcessErrorEventFields."); AssertErrorEventLogged(LogEventId.PipProcessError); } }