コード例 #1
0
ファイル: ReceiveTests.cs プロジェクト: vnvizitiu/leak
        public async Task CanReceiveDataUsingTasksToHostedEchoServer()
        {
            string request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n";

            byte[] input  = Encoding.ASCII.GetBytes(request);
            byte[] output = new byte[input.Length];

            using (CompletionThread worker = new CompletionThread())
            {
                SocketFactory factory = new SocketFactory(worker);
                TcpSocket     socket  = factory.Tcp();

                using (EchoServer server = new EchoServer(factory))
                {
                    socket.Bind();
                    worker.Start();
                    server.Start();

                    await socket.Connect(server.Endpoint);

                    await socket.Send(input);

                    await socket.Receive(output);

                    Assert.That(input, Is.EqualTo(output));
                }
            }
        }
コード例 #2
0
ファイル: SendTests.cs プロジェクト: vnvizitiu/leak
        public async Task CanHandleTerminatedStream()
        {
            IPAddress  localhost = IPAddress.Loopback;
            IPEndPoint endpoint  = new IPEndPoint(localhost, 1234);

            using (CompletionThread worker = new CompletionThread())
            {
                SocketFactory factory = new SocketFactory(worker);

                using (TcpSocket server = factory.Tcp())
                    using (TcpSocket socket = factory.Tcp())
                    {
                        socket.Bind();
                        worker.Start();

                        server.Bind(endpoint.Port);
                        server.Listen(1);

                        Task <TcpSocketAccept> acceptable = server.Accept();
                        await socket.Connect(endpoint);

                        TcpSocketAccept accepted = await acceptable;
                        accepted.Connection.Dispose();

                        byte[]        buffer = new byte[10];
                        TcpSocketSend sent   = await socket.Send(buffer);

                        Assert.That(sent.Status, Is.EqualTo(SocketStatus.OK));
                    }
            }
        }
コード例 #3
0
        public void CanConnectUsingCallbackToExampleSite()
        {
            TimeSpan         timeout = TimeSpan.FromSeconds(2);
            ManualResetEvent check   = new ManualResetEvent(false);

            IPAddress[] addresses = Dns.GetHostAddresses("www.example.com");
            IPEndPoint  endpoint  = new IPEndPoint(addresses[0], 80);

            using (CompletionThread worker = new CompletionThread())
            {
                SocketFactory factory = new SocketFactory(worker);
                TcpSocket     socket  = factory.Tcp();

                socket.Bind();
                worker.Start();

                TcpSocketConnectCallback onConnected = result =>
                {
                    check.Set();
                };

                socket.Connect(endpoint, onConnected);
                bool completed = check.WaitOne(timeout);

                Assert.That(completed, Is.True);
            }
        }
コード例 #4
0
 public void CanStart()
 {
     using (CompletionThread worker = new CompletionThread())
     {
         worker.Start();
     }
 }
コード例 #5
0
        public void CanWriteData()
        {
            byte[]           buffer    = new byte[20];
            ManualResetEvent completed = new ManualResetEvent(false);

            using (CompletionThread worker = new CompletionThread())
            {
                string      path    = Path.Combine(sandbox.Directory, "abc.txt");
                FileFactory factory = new FileFactory(worker);

                worker.Start();

                using (File file = factory.OpenOrCreate(path))
                {
                    file.Write(0, buffer, data =>
                    {
                        completed.Set();
                    });
                }

                using (FileStream stream = System.IO.File.OpenRead(path))
                {
                    stream.Read(new byte[10], 0, 10);
                }
            }

            Assert.That(completed.WaitOne(TimeSpan.FromSeconds(5)), Is.True);
        }
コード例 #6
0
ファイル: ReadTests.cs プロジェクト: vnvizitiu/leak
        public void CanReadDataAtTheEndOfFile()
        {
            byte[]           buffer    = new byte[20];
            ManualResetEvent completed = new ManualResetEvent(false);

            using (CompletionThread worker = new CompletionThread())
            {
                string      path    = Path.Combine(sandbox.Directory, "abc.txt");
                FileFactory factory = new FileFactory(worker);

                using (FileStream stream = System.IO.File.Create(path))
                {
                    stream.Write(new byte[10], 0, 10);
                    stream.Flush(true);

                    worker.Start();
                }

                using (File file = factory.OpenOrCreate(path))
                {
                    file.Read(10, buffer, data =>
                    {
                        Assert.That(data.Count, Is.EqualTo(0));

                        completed.Set();
                    });

                    Assert.That(completed.WaitOne(TimeSpan.FromSeconds(5)), Is.True);
                }
            }
        }
コード例 #7
0
ファイル: TrackerFactory.cs プロジェクト: vnvizitiu/leak
        public void Start(TrackerGetHooks hooks)
        {
            lock (this)
            {
                if (pipeline == null)
                {
                    pipeline = new LeakPipeline();
                    pipeline.Start();
                }

                if (worker == null)
                {
                    worker = new CompletionThread();
                    worker.Start();
                }

                if (service == null)
                {
                    service =
                        new TrackerGetBuilder()
                        .WithPipeline(pipeline)
                        .WithWorker(worker)
                        .Build(hooks);

                    service.Start();
                }
            }
        }
コード例 #8
0
ファイル: AcceptTests.cs プロジェクト: vnvizitiu/leak
        public async Task CanObtainAcceptedRemoteEndpointUsingTasks()
        {
            using (CompletionThread worker = new CompletionThread())
            {
                IPEndPoint    endpoint;
                SocketFactory factory = new SocketFactory(worker);

                using (TcpSocket server = factory.Tcp())
                    using (TcpSocket client = factory.Tcp())
                    {
                        worker.Start();
                        client.Bind();

                        server.Bind(IPAddress.Loopback);
                        server.Listen(1);

                        endpoint = server.Info().Endpoint;

                        Task <TcpSocketAccept> accepting = server.Accept();
                        await client.Connect(endpoint);

                        TcpSocketAccept accepted = await accepting;
                        IPEndPoint      remote   = accepted.GetRemote();

                        Assert.That(remote.Address, Is.EqualTo(endpoint.Address));
                        Assert.That(remote.Port, Is.Not.EqualTo(endpoint.Port));
                        Assert.That(remote.Port, Is.Not.Zero);
                    }
            }
        }
コード例 #9
0
ファイル: SendTests.cs プロジェクト: vnvizitiu/leak
        public void CanSendDataUsingCallbackToExampleSite()
        {
            TimeSpan         timeout = TimeSpan.FromSeconds(2);
            ManualResetEvent check   = new ManualResetEvent(false);

            IPAddress[] addresses = Dns.GetHostAddresses("www.example.com");
            IPEndPoint  endpoint  = new IPEndPoint(addresses[0], 80);

            using (CompletionThread worker = new CompletionThread())
            {
                SocketFactory factory = new SocketFactory(worker);
                TcpSocket     socket  = factory.Tcp();

                socket.Bind();
                worker.Start();

                TcpSocketSendCallback onSent = result =>
                {
                    check.Set();
                };

                TcpSocketConnectCallback onConnected = result =>
                {
                    string request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n";
                    byte[] data    = Encoding.ASCII.GetBytes(request);

                    socket.Send(data, onSent);
                };

                socket.Connect(endpoint, onConnected);
                bool completed = check.WaitOne(timeout);

                Assert.That(completed, Is.True);
            }
        }
コード例 #10
0
        public MetashareFixture()
        {
            pipeline = new PipelineSimulator();

            completion = new CompletionThread();
            completion.Start();

            files = new FileFactory(completion);
        }
コード例 #11
0
        public RepositoryFixture()
        {
            pipeline = new LeakPipeline();
            pipeline.Start();

            completion = new CompletionThread();
            completion.Start();

            files = new FileFactory(completion);
        }
コード例 #12
0
ファイル: ConnectorFixture.cs プロジェクト: vnvizitiu/leak
        public ConnectorFixture()
        {
            pipeline = new LeakPipeline();
            pipeline.Start();

            worker = new CompletionThread();
            worker.Start();

            pool =
                new NetworkPoolBuilder()
                .WithPipeline(pipeline)
                .WithWorker(worker)
                .WithMemory(new ConnectorMemory())
                .Build();

            pool.Start();

            hooks = new PeerConnectorHooks();
        }
コード例 #13
0
        public async Task CanHandleRequest()
        {
            using (CompletionThread worker = new CompletionThread())
            {
                SocketFactory factory = new SocketFactory(worker);
                EchoClient    client  = new EchoClient(factory);

                using (EchoServer server = new EchoServer(factory))
                {
                    worker.Start();
                    server.Start();

                    string payload  = "abc";
                    string response = await client.Send(server.Endpoint, payload);

                    Assert.That(response, Is.EqualTo(payload));
                }
            }
        }
コード例 #14
0
        public LoopFixture()
        {
            pipeline = new LeakPipeline();
            pipeline.Start();

            worker = new CompletionThread();
            worker.Start();

            pool =
                new NetworkPoolBuilder()
                .WithPipeline(pipeline)
                .WithWorker(worker)
                .WithMemory(new LoopMemory())
                .Build();

            pool.Start();

            hooks   = new ReceiverHooks();
            samples = new LoopSamples();
        }
コード例 #15
0
        public async Task CanConnectUsingTasksToNotAvailableSite()
        {
            IPAddress[] addresses = Dns.GetHostAddresses("www.example.com");
            IPEndPoint  endpoint  = new IPEndPoint(addresses[0], 8123);

            using (CompletionThread worker = new CompletionThread())
            {
                SocketFactory factory = new SocketFactory(worker);
                TcpSocket     socket  = factory.Tcp();

                socket.Bind();
                worker.Start();

                TcpSocketConnect connect = await socket.Connect(endpoint);

                SocketStatus expected = SocketStatus.TimedOut;

                Assert.That(connect.Status, Is.EqualTo(expected));
            }
        }
コード例 #16
0
ファイル: Program.cs プロジェクト: vnvizitiu/leak
        public static void Main(string[] args)
        {
            using (CompletionThread worker = new CompletionThread())
            {
                EchoOptions   options = Argument.Parse <EchoOptions>(args);
                SocketFactory factory = new SocketFactory(worker);

                worker.Start();

                if (options.Server != null)
                {
                    EchoServerStarter.Start(options.Server, factory);
                }

                if (options.Benchmark != null)
                {
                    EchoBenchmarkStarter.Start(options.Benchmark, factory);
                }
            }
        }
コード例 #17
0
ファイル: UdpTests.cs プロジェクト: vnvizitiu/leak
        public void CanTransferDataUsingUdpSockets()
        {
            using (CompletionThread worker = new CompletionThread())
            {
                worker.Start();

                using (ManualResetEvent sync = new ManualResetEvent(false))
                {
                    IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, 44556);
                    byte[]     data     = Encoding.ASCII.GetBytes("abc");

                    SocketBuffer  buffer  = new SocketBuffer(data);
                    SocketFactory factory = new SocketFactory(worker);

                    using (UdpSocket sender = factory.Udp())
                        using (UdpSocket receiver = factory.Udp())
                        {
                            sender.Bind();
                            receiver.Bind(endpoint.Port);

                            receiver.Receive(new SocketBuffer(10), received =>
                            {
                                Assert.That(received.Status, Is.EqualTo(SocketStatus.OK));
                                Assert.That(received.Count, Is.EqualTo(3));
                                Assert.That(received.Buffer.Data.Take(3), Is.EqualTo(data));

                                sync.Set();
                            });

                            sender.Send(endpoint, buffer, sent =>
                            {
                                Assert.That(sent.Status, Is.EqualTo(SocketStatus.OK));
                                Assert.That(sent.Count, Is.EqualTo(3));
                            });
                        }

                    Assert.That(sync.WaitOne(200), Is.True);
                }
            }
        }
コード例 #18
0
        public void Start()
        {
            lock (this)
            {
                if (pipeline == null)
                {
                    pipeline = new LeakPipeline();
                    pipeline.Start();
                }

                if (worker == null)
                {
                    worker = new CompletionThread();
                    worker.Start();
                }

                if (files == null)
                {
                    files = new FileFactory(worker);
                }
            }
        }
コード例 #19
0
ファイル: SendTests.cs プロジェクト: vnvizitiu/leak
        public async Task CanSendDataUsingAsyncToExampleSite()
        {
            IPAddress[] addresses = Dns.GetHostAddresses("www.example.com");
            IPEndPoint  endpoint  = new IPEndPoint(addresses[0], 80);

            string request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n";

            byte[] data = Encoding.ASCII.GetBytes(request);

            using (CompletionThread worker = new CompletionThread())
            {
                SocketFactory factory = new SocketFactory(worker);
                TcpSocket     socket  = factory.Tcp();

                socket.Bind();
                worker.Start();

                await socket.Connect(endpoint);

                await socket.Send(data);
            }
        }
コード例 #20
0
        public NegotiatorFixture()
        {
            pipeline = new LeakPipeline();
            pipeline.Start();

            worker = new CompletionThread();
            worker.Start();

            pool =
                new NetworkPoolBuilder()
                .WithPipeline(pipeline)
                .WithWorker(worker)
                .WithMemory(new NegotiatorMemory())
                .Build();

            pool.Start();

            hooks      = new HandshakeNegotiatorHooks();
            negotiator =
                new HandshakeNegotiatorBuilder()
                .WithNetwork(pool)
                .Build(hooks);
        }