解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
3.08 KiB
X
using NewLife.Log;
using Xunit;

namespace XUnitTest.Log;

/// <summary>文本文件日志测试</summary>
public class TextFileLogTests : IDisposable
{
    private readonly String _logDir;

    public TextFileLogTests()
    {
        _logDir = Path.Combine(Path.GetTempPath(), "NewLife_TextFileLogTests_" + Guid.NewGuid().ToString("N")[..8]);
        Directory.CreateDirectory(_logDir);
    }

    public void Dispose()
    {
        try
        {
            if (Directory.Exists(_logDir))
                Directory.Delete(_logDir, true);
        }
        catch { }
    }

    [Fact(DisplayName = "Create创建日志实例")]
    public void CreateReturnsInstance()
    {
        var log = TextFileLog.Create(_logDir);
        Assert.NotNull(log);
        Assert.Equal(_logDir, log.LogPath);
    }

    [Fact(DisplayName = "默认FileFormat不为空")]
    public void DefaultFileFormat()
    {
        var log = TextFileLog.Create(_logDir);
        Assert.False(String.IsNullOrEmpty(log.FileFormat));
    }

    [Fact(DisplayName = "MaxBytes默认值")]
    public void MaxBytesDefault()
    {
        var log = new TextFileLog();
        Assert.True(log.MaxBytes >= 0);
    }

    [Fact(DisplayName = "Backups默认值")]
    public void BackupsDefault()
    {
        var log = new TextFileLog();
        Assert.True(log.Backups >= 0);
    }

    [Fact(DisplayName = "写日志到文件")]
    public void WriteLogToFile()
    {
        var log = TextFileLog.Create(_logDir);
        log.Info("TextFileLogTests: 测试写入消息");

        // 日志通过线程池异步写入,通常毫秒级完成;轮询等待(兜底 5s 定时器刷盘路径)
        var content = String.Empty;
        var deadline = DateTime.Now.AddSeconds(6);
        while (DateTime.Now < deadline)
        {
            var files = Directory.GetFiles(_logDir, "*.log");
            if (files.Length > 0)
            {
                // 日志文件可能被TextFileLog持有锁,使用FileShare.ReadWrite读取
                try
                {
                    using var fs = new FileStream(files[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                    using var sr = new StreamReader(fs);
                    content = sr.ReadToEnd();
                    if (content.Contains("测试写入消息")) break;
                }
                catch (IOException) { }
            }

            Thread.Sleep(50);
        }

        var files2 = Directory.GetFiles(_logDir, "*.log");
        Assert.True(files2.Length > 0, "应生成日志文件");

        // 日志文件可能被TextFileLog持有锁,使用FileShare.ReadWrite读取
        using var fs2 = new FileStream(files2[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        using var sr2 = new StreamReader(fs2);
        content = sr2.ReadToEnd();
        Assert.Contains("测试写入消息", content);
    }

    [Fact(DisplayName = "CreateFile创建文件日志")]
    public void CreateFileReturnsInstance()
    {
        var filePath = Path.Combine(_logDir, "test.log");
        var log = TextFileLog.CreateFile(filePath);
        Assert.NotNull(log);
    }
}