XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFESystem.Browser.Tests;

public sealed class TransportCapabilitiesTests
{
    [Fact]
    public void OfflineBackendDeclaresNoNetworkAndStillRunsBuiltInScripts()
    {
        var browser = new BrowserService();
        Assert.False(browser.Capabilities.NativeNetworkTransport);
        Assert.False(browser.Capabilities.SupportsHttp);
        Assert.False(browser.Capabilities.SupportsHttps);
        Assert.Contains("JavaScript ready: 12", browser.Navigate("about:Start").Text, StringComparison.Ordinal);
    }

    [Fact]
    public void HostHttpBackendDoesNotClaimNativeGuestNetworking()
    {
        using var transport = new HttpWebTransport();
        var browser = new BrowserService(transport);
        Assert.False(browser.Capabilities.NativeNetworkTransport);
        Assert.True(browser.Capabilities.SupportsHttp);
        Assert.True(browser.Capabilities.SupportsHttps);
    }

    [Fact]
    public void NativeBackendDeclarationDoesNotClaimConnectivityAndIsSnapshotted()
    {
        var transport = new DeclaredTransport { IsNative = true, SupportsHttp = true };
        var browser = new BrowserService(transport);
        transport.IsNative = false;
        transport.SupportsHttp = false;
        transport.SupportsHttps = true;
        Assert.True(browser.Capabilities.NativeNetworkTransport);
        Assert.True(browser.Capabilities.SupportsHttp);
        Assert.False(browser.Capabilities.SupportsHttps);
        Assert.Contains("No configured adapter", browser.Navigate("http://example.test/").Text, StringComparison.Ordinal);
    }

    [Fact]
    public void TransportDeclarationNeverSubstitutesForCertificateValidation()
    {
        var transport = new DeclaredTransport { IsNative = true, SupportsHttp = true, SupportsHttps = true, ReturnUnvalidatedHttps = true };
        var browser = new BrowserService(transport);
        var page = browser.Navigate("https://example.test/");
        Assert.Equal("Navigation failed", page.Title);
        Assert.Contains("certificate validation", page.Text, StringComparison.Ordinal);
        Assert.DoesNotContain("Unvalidated content", page.Text, StringComparison.Ordinal);
    }

    [Fact]
    public void UndeclaredLegacyTransportStillWorksWithoutInferredCapabilities()
    {
        var browser = new BrowserService(new LegacyTransport());
        Assert.False(browser.Capabilities.NativeNetworkTransport);
        Assert.False(browser.Capabilities.SupportsHttp);
        Assert.False(browser.Capabilities.SupportsHttps);
        Assert.Contains("Legacy HTTP content", browser.Navigate("http://example.test/").Text, StringComparison.Ordinal);
    }

    private sealed class DeclaredTransport : IWebTransport, IWebTransportCapabilities
    {
        public bool IsNative { get; set; }
        public bool SupportsHttp { get; set; }
        public bool SupportsHttps { get; set; }
        public bool ReturnUnvalidatedHttps { get; init; }
        public WebResponse Get(Uri address, BrowserLimits limits) => ReturnUnvalidatedHttps
            ? new(address, 200, "text/html", "<p>Unvalidated content</p>")
            : throw new InvalidOperationException("No configured adapter is available.");
    }

    private sealed class LegacyTransport : IWebTransport
    {
        public WebResponse Get(Uri address, BrowserLimits limits) =>
            new(address, 200, "text/html", "<p>Legacy HTTP content</p>");
    }
}