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

namespace XUnitTest.Net;

/// <summary>IPv6 回环测试:TCP 大报文回显与 UDP 回显</summary>
[Collection("Net.C")]
public class NetIPv6Tests
{
    /// <summary>::1 上 1MB TCP 回显,逐字节一致</summary>
    [Fact(DisplayName = "IPv6_TCP回环_1MB逐字节回显")]
    public async Task IPv6_TcpEcho_1MB()
    {
        const Int32 size = 1 * 1024 * 1024;

        using var server = new NetServer
        {
            Port = 0,
            ProtocolType = NetType.Tcp,
            AddressFamily = AddressFamily.InterNetworkV6,
            UseSession = true,
            Log = XTrace.Log,
        };
        server.NewSession += (s, e) =>
        {
            var session = e.Session;
            session.Session.Received += (s2, e2) =>
            {
                var pk = e2.Packet;
                if (pk != null && pk.Length > 0) session.Send(pk);
            };
        };
        server.Start();

        using var client = new NetClient($"tcp://[::1]:{server.Port}") { AutoReconnect = false, Log = XTrace.Log };

        var payload = new Byte[size];
        Random.Shared.NextBytes(payload);

        var buf = new Byte[size];
        var off = 0;
        var done = new TaskCompletionSource<Byte[]>(TaskCreationOptions.RunContinuationsAsynchronously);
        client.Received += (s2, e2) =>
        {
            var data = e2.GetBytes();
            lock (buf)
            {
                var n = Math.Min(data.Length, size - off);
                System.Buffer.BlockCopy(data, 0, buf, off, n);
                off += n;
                if (off >= size) done.TrySetResult(buf);
            }
        };
        Assert.True(client.Open(), "IPv6 客户端应成功连接 ::1");
        client.Send(payload);

        var got = await done.Task.WaitAsync(TimeSpan.FromSeconds(15));
        Assert.Equal(payload, got);

        client.Close("done");
    }

    /// <summary>::1 上 UDP 小包回显</summary>
    [Fact(DisplayName = "IPv6_UDP回环_小包回显")]
    public async Task IPv6_UdpEcho()
    {
        using var server = new NetServer
        {
            Port = 0,
            ProtocolType = NetType.Udp,
            AddressFamily = AddressFamily.InterNetworkV6,
            UseSession = true,
            Log = XTrace.Log,
        };
        server.NewSession += (s, e) =>
        {
            var session = e.Session;
            session.Session.Received += (s2, e2) =>
            {
                var pk = e2.Packet;
                if (pk != null && pk.Length > 0) session.Send(pk);
            };
        };
        server.Start();

        using var client = new NetClient($"udp://[::1]:{server.Port}") { AutoReconnect = false, Log = XTrace.Log };
        var done = new TaskCompletionSource<Byte[]>(TaskCreationOptions.RunContinuationsAsynchronously);
        client.Received += (s2, e2) => done.TrySetResult(e2.GetBytes());
        Assert.True(client.Open());
        client.Send("ipv6-udp-ping");

        var got = await done.Task.WaitAsync(TimeSpan.FromSeconds(5));
        Assert.Equal("ipv6-udp-ping", got.ToStr());

        client.Close("done");
    }
}