refactor: rename NovaDbXxx to NovaXxx across entire project
copilot-swe-agent[bot] authored at 2026-02-18 20:12:17
6.27 KiB
NewLife.NovaDb
using System;
using NewLife.NovaDb.Core;
using NewLife.NovaDb.Storage;
using Xunit;

namespace XUnitTest.Storage;

public class PageHeaderTests
{
    [Fact]
    public void TestSerializeDeserialize()
    {
        var header = new PageHeader
        {
            PageId = 100,
            PageType = PageType.Data,
            Lsn = 12345,
            Checksum = 0xABCDEF,
            DataLength = 2048
        };

        var bytes = header.ToBytes();
        Assert.Equal(PageHeader.HeaderSize, bytes.Length);
        Assert.Equal(32, bytes.Length);

        var deserialized = PageHeader.FromBytes(bytes);

        Assert.Equal(header.PageId, deserialized.PageId);
        Assert.Equal(header.PageType, deserialized.PageType);
        Assert.Equal(header.Lsn, deserialized.Lsn);
        Assert.Equal(header.Checksum, deserialized.Checksum);
        Assert.Equal(header.DataLength, deserialized.DataLength);
    }

    [Fact]
    public void TestNullBuffer()
    {
        Assert.Throws<ArgumentNullException>(() => PageHeader.FromBytes(null!));
    }

    [Fact]
    public void TestBufferTooShort()
    {
        var bytes = new Byte[31]; // 少于 32 字节
        var ex = Assert.Throws<ArgumentException>(() => PageHeader.FromBytes(bytes));
        Assert.Contains("too short", ex.Message);
    }

    [Fact]
    public void TestInvalidPageType()
    {
        var header = new PageHeader
        {
            PageId = 1,
            PageType = PageType.Data,
            DataLength = 100
        };
        var bytes = header.ToBytes();

        // 设置无效的页类型(> 4)
        bytes[8] = 99;

        var ex = Assert.Throws<NovaException>(() => PageHeader.FromBytes(bytes));
        Assert.Equal(ErrorCode.FileCorrupted, ex.Code);
        Assert.Contains("Invalid page type", ex.Message);
    }

    [Fact]
    public void TestAllPageTypes()
    {
        foreach (PageType type in Enum.GetValues(typeof(PageType)))
        {
            var header = new PageHeader
            {
                PageId = 42,
                PageType = type,
                DataLength = 1024
            };

            var bytes = header.ToBytes();
            var deserialized = PageHeader.FromBytes(bytes);

            Assert.Equal(type, deserialized.PageType);
        }
    }

    [Fact]
    public void TestLargePageId()
    {
        var header = new PageHeader
        {
            PageId = UInt64.MaxValue,
            PageType = PageType.Index,
            DataLength = 512
        };

        var bytes = header.ToBytes();
        var deserialized = PageHeader.FromBytes(bytes);

        Assert.Equal(UInt64.MaxValue, deserialized.PageId);
    }

    [Fact]
    public void TestLargeLsn()
    {
        var header = new PageHeader
        {
            PageId = 1,
            PageType = PageType.Data,
            Lsn = UInt64.MaxValue,
            DataLength = 256
        };

        var bytes = header.ToBytes();
        var deserialized = PageHeader.FromBytes(bytes);

        Assert.Equal(UInt64.MaxValue, deserialized.Lsn);
    }

    [Fact]
    public void TestLargeChecksum()
    {
        var header = new PageHeader
        {
            PageId = 1,
            PageType = PageType.Data,
            Checksum = UInt32.MaxValue,
            DataLength = 128
        };

        var bytes = header.ToBytes();
        var deserialized = PageHeader.FromBytes(bytes);

        Assert.Equal(UInt32.MaxValue, deserialized.Checksum);
    }

    [Fact]
    public void TestLargeDataLength()
    {
        var header = new PageHeader
        {
            PageId = 1,
            PageType = PageType.Data,
            DataLength = UInt32.MaxValue
        };

        var bytes = header.ToBytes();
        var deserialized = PageHeader.FromBytes(bytes);

        Assert.Equal(UInt32.MaxValue, deserialized.DataLength);
    }

    [Fact]
    public void TestZeroValues()
    {
        var header = new PageHeader
        {
            PageId = 0,
            PageType = PageType.Empty,
            Lsn = 0,
            Checksum = 0,
            DataLength = 0
        };

        var bytes = header.ToBytes();
        var deserialized = PageHeader.FromBytes(bytes);

        Assert.Equal(0UL, deserialized.PageId);
        Assert.Equal(PageType.Empty, deserialized.PageType);
        Assert.Equal(0UL, deserialized.Lsn);
        Assert.Equal(0u, deserialized.Checksum);
        Assert.Equal(0u, deserialized.DataLength);
    }

    [Fact]
    public void TestReservedBytesAreZero()
    {
        var header = new PageHeader
        {
            PageId = 123,
            PageType = PageType.Directory,
            Lsn = 456,
            Checksum = 789,
            DataLength = 1000
        };

        var bytes = header.ToBytes();

        // Reserved 3 bytes at offset 9-11
        Assert.Equal(0, bytes[9]);
        Assert.Equal(0, bytes[10]);
        Assert.Equal(0, bytes[11]);

        // Reserved 4 bytes at offset 28-31
        for (var i = 28; i < 32; i++)
        {
            Assert.Equal(0, bytes[i]);
        }
    }

    [Fact]
    public void TestRoundTripWithRandomData()
    {
        var random = new Random(42);

        for (var i = 0; i < 100; i++)
        {
            var header = new PageHeader
            {
                PageId = (UInt64)random.Next() * (UInt64)random.Next(),
                PageType = (PageType)(random.Next(0, 5)),
                Lsn = (UInt64)random.Next() * (UInt64)random.Next(),
                Checksum = (UInt32)random.Next(),
                DataLength = (UInt32)random.Next()
            };

            var bytes = header.ToBytes();
            var deserialized = PageHeader.FromBytes(bytes);

            Assert.Equal(header.PageId, deserialized.PageId);
            Assert.Equal(header.PageType, deserialized.PageType);
            Assert.Equal(header.Lsn, deserialized.Lsn);
            Assert.Equal(header.Checksum, deserialized.Checksum);
            Assert.Equal(header.DataLength, deserialized.DataLength);
        }
    }

    [Fact]
    public void TestMetadataPageType()
    {
        var header = new PageHeader
        {
            PageId = 999,
            PageType = PageType.Metadata,
            Lsn = 777,
            DataLength = 333
        };

        var bytes = header.ToBytes();
        var deserialized = PageHeader.FromBytes(bytes);

        Assert.Equal(PageType.Metadata, deserialized.PageType);
    }
}