File: ManagedCodeUpdateRequestTests.cs
Web Access
Project: ..\..\..\test\Microsoft.Extensions.DotNetDeltaApplier.Tests\Microsoft.Extensions.DotNetDeltaApplier.Tests.csproj (Microsoft.Extensions.DotNetDeltaApplier.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.DotNet.HotReload;
 
namespace Microsoft.DotNet.Watch.UnitTests;
 
public class ManagedCodeUpdateRequestTests
{
    [Fact]
    public async Task Roundtrip()
    {
        var initial = new ManagedCodeUpdateRequest(
            [
                new RuntimeManagedCodeUpdate(
                    moduleId: Guid.NewGuid(),
                    ilDelta: [0, 0, 1],
                    metadataDelta: [0, 1, 1],
                    pdbDelta: [],
                    updatedTypes: [60, 74, 22323]),
                new RuntimeManagedCodeUpdate(
                    moduleId: Guid.NewGuid(),
                    ilDelta: [1, 0, 0],
                    metadataDelta: [1, 0, 1],
                    pdbDelta: [],
                    updatedTypes: [-18])
            ],
            responseLoggingLevel: ResponseLoggingLevel.WarningsAndErrors);
 
        using var stream = new MemoryStream();
        await initial.WriteAsync(stream, CancellationToken.None);
 
        stream.Position = 0;
        var read = await ManagedCodeUpdateRequest.ReadAsync(stream, CancellationToken.None);
 
        AssertEqual(initial, read);
    }
 
    [Fact]
    public async Task WithLargeDeltas()
    {
        var initial = new ManagedCodeUpdateRequest(
            [
                new RuntimeManagedCodeUpdate(
                    moduleId: Guid.NewGuid(),
                    ilDelta: Enumerable.Range(0, 68200).Select(c => (byte)(c % 2)).ToArray(),
                    metadataDelta: [0, 1, 1],
                    pdbDelta: [],
                    updatedTypes: Array.Empty<int>())
            ],
            responseLoggingLevel: ResponseLoggingLevel.Verbose);
 
        using var stream = new MemoryStream();
        await initial.WriteAsync(stream, CancellationToken.None);
 
        stream.Position = 0;
        var read = await ManagedCodeUpdateRequest.ReadAsync(stream, CancellationToken.None);
 
        AssertEqual(initial, read);
    }
 
    private static void AssertEqual(ManagedCodeUpdateRequest initial, ManagedCodeUpdateRequest read)
    {
        Assert.Equal(initial.Updates.Count, read.Updates.Count);
 
        for (var i = 0; i < initial.Updates.Count; i++)
        {
            var e = initial.Updates[i];
            var a = read.Updates[i];
 
            Assert.Equal(e.ModuleId, a.ModuleId);
            Assert.Equal(e.ILDelta, a.ILDelta);
            Assert.Equal(e.MetadataDelta, a.MetadataDelta);
            Assert.Equal(e.UpdatedTypes, a.UpdatedTypes);
        }
 
        Assert.Equal(initial.ResponseLoggingLevel, read.ResponseLoggingLevel);
    }
}