src/TestLogger.cs

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using NuGet.Common;
 
 
    public class TestLogger : ILogger
    {
        private readonly string _output;
 
        public TestLogger()
        {
        }
 
        public TestLogger(String output)
        {
            _output = output;
        }
 
        /// <summary>
        /// Logged messages
        /// </summary>
        public ConcurrentQueue<string> Messages { get; } = new ConcurrentQueue<string>();
        public ConcurrentQueue<string> DebugMessages { get; } = new ConcurrentQueue<string>();
        public ConcurrentQueue<string> VerboseMessages { get; } = new ConcurrentQueue<string>();
        public ConcurrentQueue<string> MinimalMessages { get; } = new ConcurrentQueue<string>();
        public ConcurrentQueue<string> ErrorMessages { get; } = new ConcurrentQueue<string>();
        public ConcurrentQueue<string> WarningMessages { get; } = new ConcurrentQueue<string>();
 
        public ConcurrentQueue<ILogMessage> LogMessages { get; } = new ConcurrentQueue<ILogMessage>();
 
        public int Errors { get; set; }
 
        public int Warnings { get; set; }
 
        public void LogDebug(string data)
        {
            Messages.Enqueue(data);
            DebugMessages.Enqueue(data);
            DumpMessage("DEBUG", data);
        }
 
        public void LogError(string data)
        {
            Errors++;
            Messages.Enqueue(data);
            ErrorMessages.Enqueue(data);
            DumpMessage("ERROR", data);
        }
 
        public void LogInformation(string data)
        {
            Messages.Enqueue(data);
            DumpMessage("INFO ", data);
        }
 
        public void LogMinimal(string data)
        {
            Messages.Enqueue(data);
            MinimalMessages.Enqueue(data);
            DumpMessage("LOG ", data);
        }
 
        public void LogVerbose(string data)
        {
            Messages.Enqueue(data);
            VerboseMessages.Enqueue(data);
            DumpMessage("TRACE", data);
        }
 
        public void LogWarning(string data)
        {
            Warnings++;
            Messages.Enqueue(data);
            WarningMessages.Enqueue(data);
            DumpMessage("WARN ", data);
        }
 
        public void LogInformationSummary(string data)
        {
            Messages.Enqueue(data);
            DumpMessage("ISMRY", data);
        }
 
        private void DumpMessage(string level, string data)
        {
            // NOTE(anurse): Uncomment this to help when debugging tests
            //Console.WriteLine($"{level}: {data}");
           // _output?.WriteLine($"{level}: {data}");
        }
 
        public void Clear()
        {
            string msg;
            while (Messages.TryDequeue(out msg))
            {
                // do nothing
            }
        }
 
        public string ShowErrors()
        {
            return string.Join(Environment.NewLine, ErrorMessages);
        }
 
        public string ShowWarnings()
        {
            return string.Join(Environment.NewLine, WarningMessages);
        }
 
        public string ShowMessages()
        {
            return string.Join(Environment.NewLine, Messages);
        }
 
        public void Log(LogLevel level, string data)
        {
            switch (level)
            {
                case LogLevel.Debug:
                    {
                        LogDebug(data);
                        break;
                    }
 
                case LogLevel.Error:
                    {
                        LogError(data);
                        break;
                    }
 
                case LogLevel.Information:
                    {
                        LogInformation(data);
                        break;
                    }
 
                case LogLevel.Minimal:
                    {
                        LogMinimal(data);
                        break;
                    }
 
                case LogLevel.Verbose:
                    {
                        LogVerbose(data);
                        break;
                    }
 
                case LogLevel.Warning:
                    {
                        LogWarning(data);
                        break;
                    }
            }
        }
 
        public Task LogAsync(LogLevel level, string data)
        {
            Log(level, data);
 
            return Task.FromResult(0);
        }
 
        public void Log(ILogMessage message)
        {
            LogMessages.Enqueue(message);
 
            Log(message.Level, message.Message);
        }
 
        public async Task LogAsync(ILogMessage message)
        {
            LogMessages.Enqueue(message);
 
            await LogAsync(message.Level, message.Message);
        }
    }