伪造与TcpClient和Socket的慢速连接

时间:2012-07-16 09:17:15

标签: .net sockets tcp integration-testing

我正在尝试编写集成测试,以证明如果连接到服务器的尝试太慢,TCP客户端将正确超时。我有一个FakeServer类打开Socket并侦听传入的连接:

public sealed class FakeServer : IDisposable
{
    ...

    public TimeSpan ConnectDelay
    {
        get; set;
    }

    public void Start()
    {
        this.CreateSocket();
        this.socket.Listen(int.MaxValue);

        this.socket.BeginAccept(this.OnSocketAccepted, null);
    }

    private void CreateSocket()
    {
        var ip = new IPAddress(new byte[] { 0, 0, 0, 0 });
        var endPoint = new IPEndPoint(ip, Port);
        this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        this.socket.Bind(endPoint);
    }

    private void OnSocketAccepted(IAsyncResult asyncResult)
    {
        Thread.Sleep(this.connectDelay);
        this.clientSocket = this.socket.EndAccept(asyncResult);
    }
}

请注意我尝试通过调用Thread.Sleep()来延迟连接成功。不幸的是,这不起作用:

[Fact]
public void tcp_client_test()
{
    this.fakeServer.ConnectDelay = TimeSpan.FromSeconds(20);
    var tcpClient = new TcpClient();
    tcpClient.Connect("localhost", FakeServer.Port);
}

在上面的测试中,在调用服务器端tcpClient.Connect()方法之前,对OnSocketAccepted的调用立即成功。我已经浏览了API,我看不出任何明显的方法让我注入一些必须在建立客户端连接之前完成的服务器端逻辑。

我有什么方法可以使用TcpClientSocket假冒慢速服务器/连接吗?

1 个答案:

答案 0 :(得分:0)

Visual Studio附带网络模拟器(http://msdn.microsoft.com/en-us/library/dd505008.aspx