Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
                }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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");
            }
        }
Ejemplo n.º 6
0
        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);
                }
        }
Ejemplo n.º 7
0
        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?");
            }
        }
Ejemplo n.º 8
0
        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);
            }
        }