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 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 ForwardedErrorOrWarningTest() { const string ErrorName = "MyTestErrorEvent"; const string ErrorText = "Error Event logged from worker"; const string WarningName = "MyTestWarningEvent"; const string WarningText = "Warning Event logged from worker"; var console = new MockConsole(); BuildViewModel viewModel = new BuildViewModel(); using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, console, DateTime.Now, viewModel, false, null)) { listener.RegisterEventSource(global::BuildXL.Engine.ETWLogger.Log); global::BuildXL.Engine.Tracing.Logger.Log.DistributionWorkerForwardedError(LoggingContext, new WorkerForwardedEvent() { EventId = 100, EventName = ErrorName, EventKeywords = (int)global::BuildXL.Utilities.Instrumentation.Common.Keywords.UserError, Text = ErrorText, }); console.ValidateCall(MessageLevel.Info, ErrorText); global::BuildXL.Engine.Tracing.Logger.Log.DistributionWorkerForwardedWarning(LoggingContext, new WorkerForwardedEvent() { EventId = 200, EventName = WarningName, EventKeywords = (int)global::BuildXL.Utilities.Instrumentation.Common.Keywords.UserError, Text = WarningText, }); console.ValidateCall(MessageLevel.Info, WarningText); } }
public void LogAzureDevOpsIssueTest() { m_eventListener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); m_eventListener.NestedLoggerHandler += eventData => { m_eventFields = new PipProcessErrorEventFields(eventData.Payload, false); }; var testElements = CreatePipProcessErrorTestElement(); using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, testElements.console, DateTime.Now, testElements.viewModel, false, null)) { listener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); global::BuildXL.Processes.Tracing.Logger.Log.PipProcessError(LoggingContext, testElements.pipProcessError.PipSemiStableHash, testElements.pipProcessError.PipDescription, testElements.pipProcessError.PipSpecPath, testElements.pipProcessError.PipWorkingDirectory, testElements.pipProcessError.PipExe, testElements.pipProcessError.OutputToLog, testElements.pipProcessError.MessageAboutPathsToLog, testElements.pipProcessError.PathsToLog, testElements.pipProcessError.ExitCode, testElements.pipProcessError.OptionalMessage, testElements.pipProcessError.ShortPipDescription); 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); } }
public void BuildProgressTest() { var console = new MockConsole(); BuildViewModel viewModel = new BuildViewModel(); using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, console, DateTime.Now, viewModel, false, null)) { listener.RegisterEventSource(global::BuildXL.Scheduler.ETWLogger.Log); listener.RegisterEventSource(global::BuildXL.Pips.ETWLogger.Log); var procsExecuting = 10; var procsSucceeded = 10; var procsFailed = 10; var procsSkipped = 10; var procsPending = 10; var procsWaiting = 10; var done = procsSucceeded + procsFailed + procsSkipped; var total = done + procsExecuting + procsWaiting + procsPending; var processPercent = (100.0 * done) / (total * 1.0); var currentProgress = Convert.ToInt32(Math.Floor(processPercent)); global::BuildXL.Scheduler.Scheduler.LogPipStatus(LoggingContext, pipsSucceeded: 10, pipsFailed: 10, pipsSkippedDueToFailedDependencies: 10, pipsRunning: 10, pipsReady: 10, pipsWaiting: 10, pipsWaitingOnSemaphore: 10, servicePipsRunning: 10, perfInfoForConsole: "", pipsWaitingOnResources: 10, procsExecuting: procsExecuting, procsSucceeded: procsSucceeded, procsFailed: procsFailed, procsSkippedDueToFailedDependencies: procsSkipped, procsPending: procsPending, procsWaiting: procsWaiting, procsCacheHit: 10, procsNotIgnored: 10, limitingResource: "", perfInfoForLog: "", overwriteable: true, copyFileDone: 100, copyFileNotDone: 100, writeFileDone: 10, writeFileNotDone: 10, procsRemoted: 0); console.ValidateCall(MessageLevel.Info, $"##vso[task.setprogress value={currentProgress};]Pip Execution phase"); } }
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); } }
public void EnsurePayloadParsableWithoutCrash() { StandardConsole console = new StandardConsole(colorize: false, animateTaskbar: false, supportsOverwriting: false); BuildViewModel viewModel = new BuildViewModel(); viewModel.BuildSummary = new BuildSummary(Path.Combine(TestOutputDirectory, "test.md")); using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, console, DateTime.Now, viewModel, false, null)) { listener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); global::BuildXL.Processes.Tracing.Logger.Log.PipProcessError(LoggingContext, pipSemiStableHash: 24, pipDescription: "my cool pip", pipSpecPath: @"specs\mypip.dsc", pipWorkingDirectory: @"specs\workingDir", pipExe: "coolpip.exe", outputToLog: "Failure message", extraOutputMessage: null, pathsToLog: null, exitCode: -1, optionalMessage: "what does this do?"); } }
public void LogAzureDevOpsIssueTest() { var console = new MockConsole(); BuildViewModel viewModel = new BuildViewModel(); viewModel.BuildSummary = new BuildSummary(Path.Combine(TestOutputDirectory, "test.md")); var pipDescription = "my cool pip"; var shortPipDescription = "my pip"; var pipSpecPath = @"specs\mypip.dsc"; var pipWorkingDirectory = @"specs\workingDir"; var pipExe = "coolpip.exe"; var outputToLog = "Failure message Line1\r\nFailure message Line2\rFailure message Line3\n"; var processedOutputToLog = "Failure message Line1%0D%0A##[error]Failure message Line2%0D##[error]Failure message Line3%0A##[error]"; var messageAboutPathsToLog = "Find output file in following path:"; var pathsToLog = @"specs\workingDir\out.txt"; var exitCode = -1; var optionalMessage = "what does this do?"; var expectingConsoleLog = @$ "##vso[task.logIssue type=error;][Pip0000000000000018, {shortPipDescription}, {pipSpecPath}] - failed with exit code {exitCode}, {optionalMessage}%0D%0A##[error]{processedOutputToLog}%0D%0A##[error]{messageAboutPathsToLog}%0D%0A##[error]{pathsToLog}"; using (AzureDevOpsListener listener = new AzureDevOpsListener(Events.Log, console, DateTime.Now, viewModel, false, null)) { listener.RegisterEventSource(global::BuildXL.Processes.ETWLogger.Log); global::BuildXL.Processes.Tracing.Logger.Log.PipProcessError(LoggingContext, pipSemiStableHash: 24, pipDescription: pipDescription, pipSpecPath: pipSpecPath, pipWorkingDirectory: pipWorkingDirectory, pipExe: pipExe, outputToLog: outputToLog, messageAboutPathsToLog: messageAboutPathsToLog, pathsToLog: pathsToLog, exitCode: exitCode, optionalMessage: optionalMessage, shortPipDescription: shortPipDescription); console.ValidateCall(MessageLevel.Info, expectingConsoleLog); } }