public void AddContextProviderMethodHappyPath()
        {
            var builder = new TestLoggerBuilder();

            IDependency dependency = new ConcreteDependency();
            int         setting    = 123;

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton(dependency)
                                  .BuildServiceProvider();

            builder.AddContextProvider <TestContextProvider>(setting);

            var registration =
                builder.ContextProviderRegistrations.Should().ContainSingle()
                .Subject;

            var contextProvider = registration.Invoke(serviceProvider);

            var testContextProvider =
                contextProvider.Should().BeOfType <TestContextProvider>()
                .Subject;

            testContextProvider.Setting.Should().Be(setting);
            testContextProvider.Dependency.Should().BeSameAs(dependency);
        }
        public void AddFileLogProviderMethod3HappyPath()
        {
            var builder = new TestLoggerBuilder();

            IDependency dependency = new ConcreteDependency();
            int         setting    = 123;
            var         file       = "c:\\foobar";

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton(dependency)
                                  .BuildServiceProvider();

            builder.AddFileLogProvider <TestLogFormatter>(file, LogLevel.Info, logFormatterParameters: setting);

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(serviceProvider);

            var fileLogProvider =
                logProvider.Should().BeOfType <FileLogProvider>()
                .Subject;

            fileLogProvider.Level.Should().Be(LogLevel.Info);
            fileLogProvider.File.Should().Be(file);

            var formatter =
                fileLogProvider.Formatter.Should().BeOfType <TestLogFormatter>()
                .Subject;

            formatter.Dependency.Should().BeSameAs(dependency);
            formatter.Setting.Should().Be(setting);
        }
        public void AddRollingFileLogProviderMethod4HappyPath()
        {
            var builder = new TestLoggerBuilder();

            var formatter = new Mock <ILogFormatter>().Object;

            ILogFormatter FormatterRegistration(IServiceProvider sp) => formatter;

            var file = "c:\\foobar";

            builder.AddRollingFileLogProvider(FormatterRegistration, file, LogLevel.Info,
                                              maxFileSizeKilobytes: 123, maxArchiveCount: 456, rolloverPeriod: RolloverPeriod.Hourly);

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(_emptyServiceProvider);

            var rollingFileLogProvider =
                logProvider.Should().BeOfType <RollingFileLogProvider>()
                .Subject;

            rollingFileLogProvider.Level.Should().Be(LogLevel.Info);
            rollingFileLogProvider.File.Should().Be(file);
            rollingFileLogProvider.MaxFileSizeBytes.Should().Be(123 * 1024);
            rollingFileLogProvider.MaxArchiveCount.Should().Be(456);
            rollingFileLogProvider.RolloverPeriod.Should().Be(RolloverPeriod.Hourly);
            rollingFileLogProvider.Formatter.Should().BeSameAs(formatter);
        }
        public void AddFileLogProviderMethod5HappyPath()
        {
            var builder = new TestLoggerBuilder();

            var formatter = new Mock <ILogFormatter>().Object;
            var file      = "c:\\foobar";

            var serviceCollection = new ServiceCollection();

            serviceCollection.Configure <FileLogProviderOptions>(options => options.Level = LogLevel.Info);

            builder.AddFileLogProvider(options =>
            {
                options.File = file;
                options.SetFormatter(formatter);
            });

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(serviceCollection.BuildServiceProvider());

            var fileLogProvider =
                logProvider.Should().BeOfType <FileLogProvider>()
                .Subject;

            fileLogProvider.Level.Should().Be(LogLevel.Info);
            fileLogProvider.File.Should().Be(file);
            fileLogProvider.Formatter.Should().BeSameAs(formatter);
        }
        public void AddFileLogProviderMethod4HappyPath()
        {
            var builder = new TestLoggerBuilder();

            var formatter = new Mock <ILogFormatter>().Object;

            ILogFormatter FormatterRegistration(IServiceProvider sp) => formatter;

            var file = "c:\\foobar";

            builder.AddFileLogProvider(FormatterRegistration, file, LogLevel.Info);

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(_emptyServiceProvider);

            var fileLogProvider =
                logProvider.Should().BeOfType <FileLogProvider>()
                .Subject;

            fileLogProvider.Level.Should().Be(LogLevel.Info);
            fileLogProvider.File.Should().Be(file);
            fileLogProvider.Formatter.Should().BeSameAs(formatter);
        }
        public async Task SocketHealthPublisher_Should_Start_TcpListener()
        {
#pragma warning disable CA2000 // Dispose objects before losing scope
            var logFactory = TestLoggerBuilder.Create(builder =>
            {
                builder.AddConsole();
                builder.AddDebug();
                builder.AddXunit(_output, LogLevel.Debug);
            });
#pragma warning restore CA2000 // Dispose objects before losing scope

            var port = 8181;

            var publishers = new List <IHealthCheckPublisher>
            {
                new SocketHealthCheckPublisher(port, logFactory.CreateLogger <SocketHealthCheckPublisher>())
            };

            var services = CreateService(publishers.ToArray(), _output);

            var healthService = services.GetRequiredService <HealthCheckService>();

            var report = await healthService.CheckHealthAsync();

            var publisher = services.GetServices <IHealthCheckPublisher>().OfType <SocketHealthCheckPublisher>().Single();

            var response = string.Empty;

            var clientThread = new Thread(() =>
            {
                _output.WriteLine("client-started");

                response = TcpClientResponse(port, "ping");

                _output.WriteLine("client-stopped");
            });

            try
            {
                clientThread.Start();

                _output.WriteLine("server-started");
                using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
                await Task.Factory.StartNew(async() => await publisher.PublishAsync(report, cts.Token), cts.Token);

                Thread.Sleep(TimeSpan.FromSeconds(4));

                Assert.Equal("ping", response);
                Assert.Equal(HealthStatus.Healthy, report.Status);
            }
            finally
            {
                _output.WriteLine("server-stopped");
            }
        }
        public void Add_Job_Successfully_1()
        {
            var dic = new Dictionary <string, string>
            {
                { "SchedulerJobs:TestJobException:CronSchedule", "*/10 * * * * *" },
                { "SchedulerJobs:TestJobException:CronTimeZone", string.Empty },
                { "SchedulerJobs:TestJobException:RunImmediately", "true" },
            };

            var configuration = new ConfigurationBuilder().AddInMemoryCollection(dic).Build();

            var service = new ServiceCollection();

            service.AddSingleton <IConfiguration>(configuration);

            service.AddOptions();

            var name = typeof(TestJob).Name;

            service.AddChangeTokenOptions <SchedulerOptions>("SchedulerJobs:TestJobException", name, _ => { });

            service.AddLogging(builder =>
            {
                builder.AddConsole();
                builder.AddDebug();
                builder.AddXunit(_output, LogLevel.Debug);
            });

            service.AddSingleton <SchedulerRegistration>();

            var sp = service.BuildServiceProvider();

            var instance = sp.GetService <SchedulerRegistration>();

            using var logFactory = TestLoggerBuilder.Create(builder =>
            {
                builder.AddConsole();
                builder.AddDebug();
                builder.AddXunit(_output, LogLevel.Debug);
            });

            var job     = new TestJob(logFactory.CreateLogger <TestJob>());
            var options = sp.GetRequiredService <IOptionsMonitor <SchedulerOptions> >().Get(name);

            instance.AddOrUpdate(job, options);

            Assert.Equal(1, instance.Jobs.Count);

            configuration.Providers.ToList()[0].Set("SchedulerJobs:TestJobException:CronSchedule", "*/1 * * * * *");
            configuration.Reload();

            _output.WriteLine(instance.Jobs.ToArray()[0].Value.Schedule.ToString());
        }
        public void Add_Job_Successfully()
        {
            var dic = new Dictionary <string, string>
            {
                { "SchedulerJobs:TestJobException:CronSchedule", "*/10 * * * * *" },
                { "SchedulerJobs:TestJobException:CronTimeZone", string.Empty },
                { "SchedulerJobs:TestJobException:RunImmediately", "true" },
            };

            var configuration = new ConfigurationBuilder().AddInMemoryCollection(dic).Build();

            var service = new ServiceCollection();

            service.AddSingleton <IConfiguration>(configuration);

            service.AddOptions();

            var name = typeof(TestJob).Name;

            service.AddOptions <SchedulerOptions>(name)
            .Configure <IConfiguration>((options, configuration) =>
            {
                configuration.Bind("SchedulerJobs:TestJobException", options);
            });

            service.AddLogging(builder =>
            {
                builder.AddConsole();
                builder.AddDebug();
                builder.AddXunit(_output, LogLevel.Debug);
            });

            service.AddSingleton <SchedulerRegistration>();

            var sp = service.BuildServiceProvider();

            var instance = sp.GetService <SchedulerRegistration>();

            using var logFactory = TestLoggerBuilder.Create(builder =>
            {
                builder.AddConsole();
                builder.AddDebug();
                builder.AddXunit(_output, LogLevel.Debug);
            });

            var job     = new TestJob(logFactory.CreateLogger <TestJob>());
            var options = sp.GetRequiredService <IOptionsMonitor <SchedulerOptions> >().Get(name);

            instance.AddOrUpdate(job, options);

            Assert.Single(instance.Jobs);
        }
        public void LoggerProviderDoesNotWriteLogMessagesBelowMinimumLevel()
        {
            var testTestOutputHelper = new TestTestOutputHelper();
            var loggerFactory        = TestLoggerBuilder.Create(builder => builder
                                                                .AddXunit(testTestOutputHelper, LogLevel.Warning));

            var logger = loggerFactory.CreateLogger("TestCategory");

            logger.LogInformation("This is some great information");
            logger.LogError("This is a bad error");

            Assert.Equal("| TestCategory Error: This is a bad error" + Environment.NewLine, testTestOutputHelper.Output);
        }
Esempio n. 10
0
        public void LoggerProviderDoesNotThrowIfOutputHelperThrows()
        {
            var testTestOutputHelper = new TestTestOutputHelper();
            var loggerFactory        = TestLoggerBuilder.Create(builder => builder
                                                                .AddXunit(testTestOutputHelper));

            testTestOutputHelper.Throw = true;

            var logger = loggerFactory.CreateLogger("TestCategory");

            logger.LogInformation("This is a" + Environment.NewLine + "multi-line" + Environment.NewLine + "message");

            Assert.Equal(0, testTestOutputHelper.Output.Length);
        }
        private ServiceProvider CreateService(
            IHealthCheckPublisher[] publishers,
            ITestOutputHelper outputHelper,
            Action <HealthCheckPublisherOptions> configure = null)
        {
            var serviceCollection = new ServiceCollection();

            serviceCollection.AddOptions();

            serviceCollection.AddLogging();

            serviceCollection.AddHealthChecks()
            .AddCheck("one", () => HealthCheckResult.Healthy())
            .AddCheck("two", () => HealthCheckResult.Healthy());

            serviceCollection.Configure <HealthCheckPublisherOptions>(options =>
            {
                options.Delay   = TimeSpan.FromMilliseconds(1);
                options.Period  = TimeSpan.FromMilliseconds(1);
                options.Timeout = TimeSpan.FromMilliseconds(1);
            });

            if (publishers != null)
            {
                for (var i = 0; i < publishers.Length; i++)
                {
                    serviceCollection.AddSingleton <IHealthCheckPublisher>(publishers[i]);
                }
            }

            if (configure != null)
            {
                serviceCollection.Configure(configure);
            }

#pragma warning disable CA2000 // Dispose objects before losing scope
            var logFactory = TestLoggerBuilder.Create(builder =>
            {
                builder.AddConsole();
                builder.AddDebug();
                builder.AddXunit(outputHelper, LogLevel.Debug);
            });
#pragma warning restore CA2000 // Dispose objects before losing scope

            serviceCollection.AddSingleton <ILoggerFactory>(logFactory);

            return(serviceCollection.BuildServiceProvider());
        }
Esempio n. 12
0
        public void LoggerProviderPrependsPrefixToEachLine()
        {
            var testTestOutputHelper = new TestTestOutputHelper();
            var loggerFactory        = TestLoggerBuilder.Create(builder => builder
                                                                .AddXunit(testTestOutputHelper));

            var logger = loggerFactory.CreateLogger("TestCategory");

            logger.LogInformation("This is a" + Environment.NewLine + "multi-line" + Environment.NewLine + "message");

            var expectedOutput =
                "| TestCategory Information: This is a" + Environment.NewLine +
                "|                           multi-line" + Environment.NewLine +
                "|                           message" + Environment.NewLine;

            Assert.Equal(expectedOutput, testTestOutputHelper.Output);
        }
Esempio n. 13
0
        public void AddHttpContextProviderExtension()
        {
            var contextMock   = new Mock <IHttpContextAccessor>();
            var loggerBuilder = new TestLoggerBuilder();

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton(contextMock.Object)
                                  .BuildServiceProvider();

            loggerBuilder.AddHttpContextProvider();

            var registration = loggerBuilder.ContextProviderRegistrations.Should().ContainSingle().Subject;

            var contextProvider = registration.Invoke(serviceProvider);

            contextProvider.Should().BeOfType <HttpContextProvider>();
        }
        public void LoggerProviderPrependsPrefixToEachLine()
        {
            var testTestOutputHelper = new TestTestOutputHelper();
            var loggerFactory        = TestLoggerBuilder.Create(builder => builder
                                                                .AddXunit(testTestOutputHelper));

            var logger = loggerFactory.CreateLogger("TestCategory");

            logger.LogInformation("This is a" + Environment.NewLine + "multi-line" + Environment.NewLine + "message");

            // The lines after the first one are indented more because the indentation was calculated based on the timestamp's actual length.
            var expectedOutput =
                "| [TIMESTAMP] TestCategory Information: This is a" + Environment.NewLine +
                "|                                                 multi-line" + Environment.NewLine +
                "|                                                 message" + Environment.NewLine;

            Assert.Equal(expectedOutput, MakeConsistent(testTestOutputHelper.Output));
        }
Esempio n. 15
0
        public void LoggerProviderWritesToTestOutputHelper()
        {
            var testTestOutputHelper = new TestTestOutputHelper();

            var loggerFactory = TestLoggerBuilder.Create(builder => builder
                                                         .SetMinimumLevel(LogLevel.Trace)
                                                         .AddXunit(testTestOutputHelper));

            var logger = loggerFactory.CreateLogger("TestCategory");

            logger.LogInformation("This is some great information");
            logger.LogTrace("This is some unimportant information");

            var expectedOutput =
                "| TestCategory Information: This is some great information" + Environment.NewLine +
                "| TestCategory Trace: This is some unimportant information" + Environment.NewLine;

            Assert.Equal(expectedOutput, testTestOutputHelper.Output);
        }
        public void AddConsoleLogProviderMethod2HappyPath()
        {
            var builder = new TestLoggerBuilder();

            var formatter = new Mock <ILogFormatter>().Object;

            builder.AddConsoleLogProvider(formatter, LogLevel.Info);

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(_emptyServiceProvider);

            var consoleLogProvider =
                logProvider.Should().BeOfType <ConsoleLogProvider>()
                .Subject;

            consoleLogProvider.Level.Should().Be(LogLevel.Info);
            consoleLogProvider.Formatter.Should().BeSameAs(formatter);
        }
        public void AddRollingFileLogProviderMethod3HappyPath()
        {
            var builder = new TestLoggerBuilder();

            IDependency dependency = new ConcreteDependency();
            int         setting    = 123;
            var         file       = "c:\\foobar";

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton(dependency)
                                  .BuildServiceProvider();

            builder.AddRollingFileLogProvider <TestLogFormatter>(file, LogLevel.Info,
                                                                 maxFileSizeKilobytes: 123, maxArchiveCount: 456, rolloverPeriod: RolloverPeriod.Hourly,
                                                                 logFormatterParameters: setting);

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(serviceProvider);

            var rollingFileLogProvider =
                logProvider.Should().BeOfType <RollingFileLogProvider>()
                .Subject;

            rollingFileLogProvider.Level.Should().Be(LogLevel.Info);
            rollingFileLogProvider.File.Should().Be(file);
            rollingFileLogProvider.MaxFileSizeBytes.Should().Be(123 * 1024);
            rollingFileLogProvider.MaxArchiveCount.Should().Be(456);
            rollingFileLogProvider.RolloverPeriod.Should().Be(RolloverPeriod.Hourly);

            var formatter =
                rollingFileLogProvider.Formatter.Should().BeOfType <TestLogFormatter>()
                .Subject;

            formatter.Dependency.Should().BeSameAs(dependency);
            formatter.Setting.Should().Be(setting);
        }
        public void AddConsoleLogProviderMethod1HappyPath()
        {
            var builder = new TestLoggerBuilder();

            var template = "foobar";

            builder.AddConsoleLogProvider(template, LogLevel.Info);

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(_emptyServiceProvider);

            var consoleLogProvider =
                logProvider.Should().BeOfType <ConsoleLogProvider>()
                .Subject;

            consoleLogProvider.Level.Should().Be(LogLevel.Info);
            consoleLogProvider.Formatter.Should().BeOfType <TemplateLogFormatter>()
            .Which.Template.Should().Be(template);
        }
        public void AddRollingFileLogProviderMethod5HappyPath()
        {
            var builder = new TestLoggerBuilder();

            var formatter = new Mock <ILogFormatter>().Object;
            var file      = "c:\\foobar";

            var serviceCollection = new ServiceCollection();

            serviceCollection.Configure <RollingFileLogProviderOptions>(options => options.Level = LogLevel.Info);

            builder.AddRollingFileLogProvider(options =>
            {
                options.File = file;
                options.MaxFileSizeKilobytes = 123;
                options.MaxArchiveCount      = 456;
                options.RolloverPeriod       = RolloverPeriod.Hourly;
                options.SetFormatter(formatter);
            });

            var registration =
                builder.LogProviderRegistrations.Should().ContainSingle()
                .Subject;

            var logProvider = registration.Invoke(serviceCollection.BuildServiceProvider());

            var rollingFileLogProvider =
                logProvider.Should().BeOfType <RollingFileLogProvider>()
                .Subject;

            rollingFileLogProvider.Level.Should().Be(LogLevel.Info);
            rollingFileLogProvider.File.Should().Be(file);
            rollingFileLogProvider.MaxFileSizeBytes.Should().Be(123 * 1024);
            rollingFileLogProvider.MaxArchiveCount.Should().Be(456);
            rollingFileLogProvider.RolloverPeriod.Should().Be(RolloverPeriod.Hourly);
            rollingFileLogProvider.Formatter.Should().BeSameAs(formatter);
        }
Esempio n. 20
0
 private static ILogger CreateLogger()
 {
     return(TestLoggerBuilder.Create(builder => builder.AddDebug()).CreateLogger("Test"));
 }
Esempio n. 21
0
        private async Task ExecuteShutdownTest(string testName, string shutdownMechanic)
        {
            var xunitTestLoggerFactory = TestLoggerBuilder.Create(builder =>
            {
                builder.SetMinimumLevel(LogLevel.Trace);
                builder.AddXunit(_output);
            });

            // TODO refactor deployers to not depend on source code
            // see https://github.com/dotnet/extensions/issues/1697 and https://github.com/dotnet/aspnetcore/issues/10268
#pragma warning disable 0618
            var applicationPath = Path.Combine(TestPathUtilities.GetSolutionRootDirectory("Extensions"),
                                               "src", "Hosting", "test", "testassets", "Microsoft.Extensions.Hosting.TestApp");
#pragma warning restore 0618

            var deploymentParameters = new DeploymentParameters(
                applicationPath,
                RuntimeFlavor.CoreClr,
                RuntimeArchitecture.x64)
            {
                TargetFramework = Tfm.NetCoreApp50,
                ApplicationType = ApplicationType.Portable,
                PublishApplicationBeforeDeployment = true,
                StatusMessagesEnabled = false
            };

            deploymentParameters.EnvironmentVariables["DOTNET_STARTMECHANIC"] = shutdownMechanic;

            using (var deployer = new SelfHostDeployer(deploymentParameters, xunitTestLoggerFactory))
            {
                var result = await deployer.DeployAsync();

                var started   = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously);
                var completed = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously);
                var output    = string.Empty;
                deployer.HostProcess.OutputDataReceived += (sender, args) =>
                {
                    if (!string.IsNullOrEmpty(args.Data) && args.Data.StartsWith(StartedMessage))
                    {
                        output += args.Data.Substring(StartedMessage.Length) + '\n';
                        started.TrySetResult(0);
                    }
                    else
                    {
                        output += args.Data + '\n';
                    }

                    if (output.Contains(CompletionMessage))
                    {
                        completed.TrySetResult(0);
                    }
                };

                await started.Task.TimeoutAfter(TimeSpan.FromSeconds(60));

                SendShutdownSignal(deployer.HostProcess);

                await completed.Task.TimeoutAfter(TimeSpan.FromSeconds(60));

                WaitForExitOrKill(deployer.HostProcess);

                output = output.Trim('\n');

                Assert.Equal(CompletionMessage, output);
            }
        }