public void GetLoggerConfigurationTest_FileOutput()
        {
            // arrange
            const LogLevel logLevel = LogLevel.Information;

            var propertyRetriever = Mock.Of <IPropertyRetriever>();

            Mock.Get(propertyRetriever).Setup(x => x.CheckFromCommandLine("withFileLog")).Returns(true);
            Mock.Get(propertyRetriever).Setup(x => x.RetrieveFromCommandLineOrEnvironment("fileMinimumLogEventLevel", "fileMinimumLogEventLevel", LogLevel.None)).Returns(logLevel);
            Mock.Get(propertyRetriever).Setup(x => x.RetrieveFromCommandLineOrEnvironment("fileMessageTemplate", "fileMessageTemplate", It.IsAny <string>())).Returns((string s1, string s2, string s3) => s3);

            var fileControlLevelSwitch = new LoggingLevelSwitch(LogEventLevel.Verbose);
            var manager = new NanoLoggerManager(null, fileControlLevelSwitch, null);

            // act
            var logger = NanoLoggerExtensions.GetLoggerConfiguration(manager, propertyRetriever);

            // assert
            var sinksField       = typeof(LoggerConfiguration).GetField("_logEventSinks", BindingFlags.NonPublic | BindingFlags.Instance);
            var sinksValue       = (List <ILogEventSink>)sinksField.GetValue(logger);
            var sinkFile         = sinksValue[0];
            var sinkFileAssembly = Assembly.Load("Serilog");
            var sinkFileType     = sinkFileAssembly.GetType("Serilog.Core.Sinks.RestrictedSink");

            var fileControlledSwitchField = sinkFileType.GetField("_levelSwitch", BindingFlags.NonPublic | BindingFlags.Instance);
            var fileControlledSwitchValue = fileControlledSwitchField.GetValue(sinkFile);

            Assert.Equal(manager.FileLoggingLevelSwitch, (LoggingLevelSwitch)fileControlledSwitchValue);
        }
        public void GetLoggerConfigurationTest_BasicConfiguration()
        {
            // arrange
            var propertyRetriever         = Mock.Of <IPropertyRetriever>();
            var seqControlLevelSwitch     = new LoggingLevelSwitch(LogEventLevel.Verbose);
            var fileControlLevelSwitch    = new LoggingLevelSwitch(LogEventLevel.Verbose);
            var consoleControlLevelSwitch = new LoggingLevelSwitch(LogEventLevel.Verbose);
            var manager = new NanoLoggerManager(seqControlLevelSwitch, fileControlLevelSwitch, consoleControlLevelSwitch);

            // act
            var logger = NanoLoggerExtensions.GetLoggerConfiguration(manager, propertyRetriever);

            // assert
            var enrichersField = typeof(LoggerConfiguration).GetField("_enrichers", BindingFlags.NonPublic | BindingFlags.Instance);
            var enrichersValue = (List <ILogEventEnricher>)enrichersField.GetValue(logger);

            Assert.Equal(6, enrichersValue.Count);
            Assert.IsType <ExceptionEnricher>(enrichersValue[0]);
            Assert.IsType <MachineNameEnricher>(enrichersValue[1]);
            Assert.IsType <EnvironmentUserNameEnricher>(enrichersValue[2]);
            Assert.IsType <ProcessIdEnricher>(enrichersValue[3]);
            Assert.IsType <ThreadIdEnricher>(enrichersValue[4]);
            Assert.IsType <NanoLoggerLevelEnricher>(enrichersValue[5]);

            var minimumLevelField = typeof(LoggerConfiguration).GetField("_minimumLevel", BindingFlags.NonPublic | BindingFlags.Instance);
            var minimumLevelValue = (LogEventLevel)minimumLevelField.GetValue(logger);

            Assert.Equal(LogEventLevel.Verbose, minimumLevelValue);
        }
        public void GetLoggerConfigurationTest_SeqOutput()
        {
            // arrange
            const string   seqAddress = "http://seq-address/";
            const string   seqApiKey  = "seq-api-key";
            const LogLevel logLevel   = LogLevel.Critical;

            var propertyRetriever = Mock.Of <IPropertyRetriever>();

            Mock.Get(propertyRetriever).Setup(x => x.CheckFromCommandLine("withSeqLog")).Returns(true);
            Mock.Get(propertyRetriever).Setup(x => x.RetrieveFromCommandLineOrEnvironment("seqLogAddress", "seqLogAddress", null)).Returns(seqAddress);
            Mock.Get(propertyRetriever).Setup(x => x.RetrieveFromCommandLineOrEnvironment("seqApiKey", "seqApiKey", null)).Returns(seqApiKey);
            Mock.Get(propertyRetriever).Setup(x => x.RetrieveFromCommandLineOrEnvironment("seqMinimumLogEventLevel", "seqMinimumLogEventLevel", LogLevel.None)).Returns(logLevel);

            var seqControlLevelSwitch = new LoggingLevelSwitch(LogEventLevel.Verbose);
            var manager = new NanoLoggerManager(seqControlLevelSwitch, null, null);

            // act
            var logger = NanoLoggerExtensions.GetLoggerConfiguration(manager, propertyRetriever);

            // assert
            var sinksField      = typeof(LoggerConfiguration).GetField("_logEventSinks", BindingFlags.NonPublic | BindingFlags.Instance);
            var sinksValue      = (List <ILogEventSink>)sinksField.GetValue(logger);
            var sinkSeq         = sinksValue[0];
            var sinkSeqAssembly = Assembly.Load("Serilog.Sinks.Seq");
            var sinkSeqType     = sinkSeqAssembly.GetType("Serilog.Sinks.Seq.SeqSink");

            var seqApiField = sinkSeqType.GetField("_apiKey", BindingFlags.NonPublic | BindingFlags.Instance);
            var seqApiValue = (string)seqApiField.GetValue(sinkSeq);

            Assert.Equal(seqApiKey, seqApiValue);

            var seqHttpClientField = sinkSeqType.GetField("_httpClient", BindingFlags.NonPublic | BindingFlags.Instance);
            var seqhttpClientValue = (HttpClient)seqHttpClientField.GetValue(sinkSeq);

            Assert.Equal(seqAddress, seqhttpClientValue.BaseAddress.AbsoluteUri);

            var seqControlledSwitchField   = sinkSeqType.GetField("_controlledSwitch", BindingFlags.NonPublic | BindingFlags.Instance);
            var seqControlledSwitchValue   = seqControlledSwitchField.GetValue(sinkSeq);
            var seqLoggingLevelSwitchField = seqControlledSwitchValue.GetType().GetField("_controlledSwitch", BindingFlags.NonPublic | BindingFlags.Instance);
            var seqLoggingLevelSwitchValue = seqLoggingLevelSwitchField.GetValue(seqControlledSwitchValue);

            Assert.Equal(manager.SeqLoggingLevelSwitch, seqLoggingLevelSwitchValue);
        }
        public void GetLoggerConfigurationTest_DefaultConsoleOutput()
        {
            // arrange
            var propertyRetriever         = Mock.Of <IPropertyRetriever>();
            var consoleControlLevelSwitch = new LoggingLevelSwitch();
            var manager = new NanoLoggerManager(null, null, consoleControlLevelSwitch);

            // act
            var logger = NanoLoggerExtensions.GetLoggerConfiguration(manager, propertyRetriever, true);

            // assert
            var sinksField          = typeof(LoggerConfiguration).GetField("_logEventSinks", BindingFlags.NonPublic | BindingFlags.Instance);
            var sinksValue          = (List <ILogEventSink>)sinksField.GetValue(logger);
            var sinkConsole         = sinksValue[0];
            var sinkConsoleAssembly = Assembly.Load("Serilog");
            var sinkConsoleType     = sinkConsoleAssembly.GetType("Serilog.Core.Sinks.RestrictedSink");

            var consoleControlledSwitchField = sinkConsoleType.GetField("_levelSwitch", BindingFlags.NonPublic | BindingFlags.Instance);
            var consoleControlledSwitchValue = consoleControlledSwitchField.GetValue(sinkConsole);

            Assert.Equal(manager.ConsoleLoggingLevelSwitch.MinimumLevel, ((LoggingLevelSwitch)consoleControlledSwitchValue).MinimumLevel);
        }