Exemplo n.º 1
0
 public void CanCallEndBatchWithoutStartBatch()
 {
     BatchLogger.EndBatch();
     UT.Assert.AreEqual(0, _loggedRecords);
     UT.Assert.AreEqual(0, _callsToFallback);
     _mockLogger.Verify();
 }
Exemplo n.º 2
0
        public void LogAllThenLogSome()
        {
            FulcrumApplication.Setup.LogSeverityLevelThreshold = LogSeverityLevel.Warning;
            BatchLogger.StartBatch(LogSeverityLevel.Error, false);
            Log.LogVerbose("Verbose");
            Log.LogInformation("Information");
            Log.LogWarning("Warning");
            UT.Assert.AreEqual(0, _loggedRecords);
            Log.LogError("Error");
            UT.Assert.AreEqual(4, _loggedRecords);
            Log.LogVerbose("Verbose");
            UT.Assert.AreEqual(5, _loggedRecords);
            BatchLogger.EndBatch();

            _loggedRecords = 0;
            BatchLogger.StartBatch(LogSeverityLevel.Error, false);
            Log.LogVerbose("Verbose");
            Log.LogInformation("Information");
            Log.LogWarning("Warning");
            UT.Assert.AreEqual(0, _loggedRecords);
            BatchLogger.EndBatch();
            UT.Assert.AreEqual(1, _loggedRecords);
            UT.Assert.AreEqual(0, _callsToFallback);

            _mockLogger.Verify();
        }
Exemplo n.º 3
0
        private static void LogProperties(BatchLogger logger, string heading, IVsProjectProperties projectProperties)
        {
            IEnumerable <string> properties = projectProperties.Cast <ProjectProperty>()
                                              .Select(prop => $"{prop.Name}:{prop.Value}");

            logger.WriteLine($"{heading} -- ({string.Join(" | ", properties)})");
        }
Exemplo n.º 4
0
        public void HandlesUnderlyingCollectionProperly()
        {
            FulcrumApplication.Setup.LogSeverityLevelThreshold = LogSeverityLevel.Warning;
            BatchLogger.StartBatch(LogSeverityLevel.Warning, true);

            for (var i = 1; i <= 10; i++)
            {
                Log.LogWarning($"Warning A {i}");
            }

            var allDone = new ManualResetEvent(false);

            // Try to provoke "System.InvalidOperationException: Collection was modified; enumeration operation may not execute."
            // Prior to version 4.15.3 this would trigger the exception:
            ThreadHelper.FireAndForget(() =>
            {
                for (var i = 1; i <= 100000; i++)
                {
                    Log.LogWarning($"Warning B {i}");
                }
                allDone.Set();
            });
            BatchLogger.EndBatch();

            UT.Assert.IsTrue(allDone.WaitOne(TimeSpan.FromSeconds(10)));
            UT.Assert.AreEqual(0, _callsToFallback, $"{nameof(_loggedRecords)}: {_loggedRecords}");
            UT.Assert.IsTrue(_loggedRecords >= 100, _loggedRecords.ToString());
        }
        public void BeginBatch_SetIndentLevelToLessThanZero_ThrowsArgumentOutOfRange(int indentLevel)
        {
            var logger = new MockOutputService();
            var batch  = new BatchLogger(logger);

            Assert.Throws <ArgumentOutOfRangeException>("value", () =>
            {
                batch.IndentLevel = indentLevel;
            });
        }
Exemplo n.º 6
0
 public static void EndNominateRestore(IProjectDiagnosticOutputService logger, string fullPath)
 {
     if (logger.IsEnabled)
     {
         using var batch = new BatchLogger(logger);
         batch.WriteLine();
         batch.WriteLine("------------------------------------------");
         batch.WriteLine($"COMPLETED Nominate Restore for {fullPath}");
         batch.WriteLine();
     }
 }
        public void BeginBatch_IsEnabled_ReturnsLoggerIsEnabled(bool isEnabled)
        {
            var logger = new MockOutputService()
            {
                IsEnabled = isEnabled
            };

            var batch = new BatchLogger(logger);

            Assert.Equal(batch.IsEnabled, logger.IsEnabled);
        }
Exemplo n.º 8
0
        private static void LogTargetFrameworks(BatchLogger logger, IVsTargetFrameworks2 targetFrameworks)
        {
            logger.WriteLine($"Target Frameworks ({targetFrameworks.Count})");
            logger.IndentLevel++;

            foreach (IVsTargetFrameworkInfo2 tf in targetFrameworks)
            {
                LogTargetFramework(logger, tf);
            }

            logger.IndentLevel--;
        }
        public void BeginBatch_IndentLevel_AppendsIndentToWriteLine(int indentLevel, string expected)
        {
            var logger = new MockOutputService();

            using (var batch = new BatchLogger(logger))
            {
                batch.IndentLevel = indentLevel;
                batch.WriteLine(string.Empty);
            }

            Assert.Equal(expected, logger.Text);
        }
Exemplo n.º 10
0
        private static void LogTargetFramework(BatchLogger logger, IVsTargetFrameworkInfo2 targetFrameworkInfo)
        {
            logger.WriteLine(targetFrameworkInfo.TargetFrameworkMoniker);
            logger.IndentLevel++;

            LogReferenceItems(logger, "Framework References", targetFrameworkInfo.FrameworkReferences);
            LogReferenceItems(logger, "Package Downloads", targetFrameworkInfo.PackageDownloads);
            LogReferenceItems(logger, "Project References", targetFrameworkInfo.ProjectReferences);
            LogReferenceItems(logger, "Package References", targetFrameworkInfo.PackageReferences);
            LogProperties(logger, "Target Framework Properties", targetFrameworkInfo.Properties);

            logger.IndentLevel--;
        }
        public void BeginBatch_WhenUnderlyingLoggerIsNotEnabled_DoesNotLog()
        {
            var logger = new MockOutputService()
            {
                IsEnabled = false
            };

            using (var batch = new BatchLogger(logger))
            {
                batch.WriteLine("Hello World!");
            }

            Assert.Null(logger.Text);
        }
        public void BeginBatch_WhenUnderlyingLoggerIsEnabled_Logs()
        {
            var logger = new MockOutputService()
            {
                IsEnabled = true
            };

            using (var batch = new BatchLogger(logger))
            {
                batch.WriteLine("Hello World!");
            }

            Assert.Equal("Hello World!", logger.Text);
        }
Exemplo n.º 13
0
        private static void LogReferenceItems(BatchLogger logger, string heading, IVsReferenceItems references)
        {
            logger.WriteLine(heading);
            logger.IndentLevel++;

            foreach (IVsReferenceItem reference in references)
            {
                IEnumerable <string> properties = reference.Properties.Cast <IVsReferenceProperty>()
                                                  .Select(prop => $"{prop.Name}:{prop.Value}");

                logger.WriteLine($"{reference.Name} -- ({string.Join(" | ", properties)})");
            }

            logger.IndentLevel--;
        }
Exemplo n.º 14
0
 public void LogOnlyOverThreshold()
 {
     FulcrumApplication.Setup.LogSeverityLevelThreshold = LogSeverityLevel.Warning;
     BatchLogger.StartBatch(LogSeverityLevel.None, true);
     Log.LogVerbose("Verbose");
     Log.LogInformation("Information");
     Log.LogWarning("Warning");
     Log.LogError("Error");
     Log.LogCritical("Critical");
     UT.Assert.AreEqual(0, _loggedRecords);
     BatchLogger.EndBatch();
     UT.Assert.AreEqual(3, _loggedRecords);
     UT.Assert.AreEqual(0, _callsToFallback);
     _mockLogger.Verify();
 }
Exemplo n.º 15
0
        public static void BeginNominateRestore(IProjectDiagnosticOutputService logger, string fullPath, IVsProjectRestoreInfo2 projectRestoreInfo)
        {
            if (logger.IsEnabled)
            {
                using var batch = new BatchLogger(logger);
                batch.WriteLine();
                batch.WriteLine("------------------------------------------");
                batch.WriteLine($"BEGIN Nominate Restore for {fullPath}");
                batch.IndentLevel++;

                batch.WriteLine($"MSBuildProjectExtensionsPath:     {projectRestoreInfo.BaseIntermediatePath}");
                batch.WriteLine($"OriginalTargetFrameworks:         {projectRestoreInfo.OriginalTargetFrameworks}");
                LogTargetFrameworks(batch, projectRestoreInfo.TargetFrameworks);
                LogReferenceItems(batch, "Tool References", projectRestoreInfo.ToolReferences);

                batch.IndentLevel--;
                batch.WriteLine();
            }
        }
        public void BeginBatch_CanLogMultipleWriteLines()
        {
            var logger = new MockOutputService()
            {
                IsEnabled = true
            };

            using (var batch = new BatchLogger(logger))
            {
                batch.WriteLine("Line1");
                batch.IndentLevel = 1;
                batch.WriteLine("Line2");
                batch.IndentLevel = 0;
                batch.WriteLine("Line3");
            }

            // NOTE: No trailing new line, as the logger itself should be adding it
            Assert.Equal("Line1\r\n    Line2\r\nLine3", logger.Text, ignoreLineEndingDifferences: true);
        }
Exemplo n.º 17
0
        static void Main(string[] args)
        {
            var writer = new ConsoleWriter();
            var logger = new Logger(writer);

            logger.Debug("First debug message");
            logger.Error("First error message");
            logger.Fatal("First fatal message");
            logger.Info("First info message");

            var writers = new WriterPool(new List <IWriter> {
                new ConsoleWriter()
            });
            var batchLogger = new BatchLogger(writers);

            Console.WriteLine();
            batchLogger.Debug("Batch debug");
            batchLogger.Error("Batch error");

            Console.WriteLine("Let's FLUSH ))");
            batchLogger.Flush();

            Console.ReadLine();
        }
Exemplo n.º 18
0
        // TODO: Make code example complete
        // TODO: Make callbacks in options
        // TODO: Move code into one big invoke

        // ReSharper disable once UnusedMember.Global
        /// <summary>
        /// The main method for a middleware.
        /// </summary>
        /// <param name="context">The information about the current HTTP request.</param>
        public virtual async Task InvokeAsync(HttpContext context)
        {
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            var cancellationToken = context.RequestAborted;

            // Enable multiple reads of the content
            context.Request.EnableBuffering();

            try
            {
                if (Options.Features.SaveClientTenant.Enabled)
                {
                    var tenant = GetClientTenantFromUrl(context);
                    FulcrumApplication.Context.ClientTenant = tenant;
                }

                if (Options.Features.SaveCorrelationId.Enabled)
                {
                    var correlationId = GetOrCreateCorrelationId(context);
                    FulcrumApplication.Context.CorrelationId = correlationId;
                }

                if (Options.Features.SaveExecutionId.Enabled)
                {
                    var parentExecutionId = ExtractParentExecutionIdFromHeader(context);
                    FulcrumApplication.Context.ParentExecutionId = parentExecutionId;
                    var executionId = ExtractExecutionIdFromHeader(context);
                    FulcrumApplication.Context.ExecutionId = executionId;
                }

                if (Options.Features.SaveTenantConfiguration.Enabled)
                {
                    var tenantConfiguration = await GetTenantConfigurationAsync(FulcrumApplication.Context.ClientTenant, context, cancellationToken);

                    FulcrumApplication.Context.LeverConfiguration = tenantConfiguration;
                }

                if (Options.Features.SaveNexusTestContext.Enabled)
                {
                    var testContext = GetNexusTestContextFromHeader(context);
                    FulcrumApplication.Context.NexusTestContext = testContext;
                }

                if (Options.Features.BatchLog.Enabled)
                {
                    BatchLogger.StartBatch(Options.Features.BatchLog.Threshold, Options.Features.BatchLog.FlushAsLateAsPossible);
                }

                try
                {
                    await Next(context);

                    if (Options.Features.LogRequestAndResponse.Enabled)
                    {
                        await LogResponseAsync(context, stopwatch.Elapsed, cancellationToken);
                    }
                }
                catch (Exception exception)
                {
                    var shouldThrow = true;
                    if (Options.Features.ConvertExceptionToHttpResponse.Enabled)
                    {
                        await ConvertExceptionToResponseAsync(context, exception, cancellationToken);

                        shouldThrow = false;
                        if (Options.Features.LogRequestAndResponse.Enabled)
                        {
                            await LogResponseAsync(context, stopwatch.Elapsed, cancellationToken);
                        }
                    }
                    if (shouldThrow)
                    {
                        throw;
                    }
                }
            }
            catch (Exception exception)
            {
                if (Options.Features.LogRequestAndResponse.Enabled)
                {
                    LogException(context, exception, stopwatch.Elapsed);
                }
                throw;
            }
            finally
            {
                if (Options.Features.BatchLog.Enabled)
                {
                    BatchLogger.EndBatch();
                }
            }
        }