public async Task DisposeSocketDirectly_ReadWriteThrowIOException()
        {
            using (Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    listener.Bind(new IPEndPoint(IPAddress.Loopback, 0));
                    listener.Listen(1);

                    Task <Socket> acceptTask = listener.AcceptAsync();
                    await Task.WhenAll(acceptTask, client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndPoint).Port)));

                    using (Socket serverSocket = await acceptTask)
                        using (DerivedNetworkStream server = new DerivedNetworkStream(serverSocket))
                        {
                            serverSocket.Dispose();

                            Assert.Throws <IOException>(() => server.Read(new byte[1], 0, 1));
                            Assert.Throws <IOException>(() => server.Write(new byte[1], 0, 1));

                            Assert.Throws <IOException>(() => server.BeginRead(new byte[1], 0, 1, null, null));
                            Assert.Throws <IOException>(() => server.BeginWrite(new byte[1], 0, 1, null, null));

                            Assert.Throws <IOException>(() => { server.ReadAsync(new byte[1], 0, 1); });
                            Assert.Throws <IOException>(() => { server.WriteAsync(new byte[1], 0, 1); });
                        }
                }
        }
        public async Task SocketProperty_SameAsProvidedSocket()
        {
            using (Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    listener.Bind(new IPEndPoint(IPAddress.Loopback, 0));
                    listener.Listen(1);

                    Task <Socket> acceptTask = listener.AcceptAsync();
                    await Task.WhenAll(acceptTask, client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndPoint).Port)));

                    using (Socket server = await acceptTask)
                        using (DerivedNetworkStream serverStream = new DerivedNetworkStream(server))
                        {
                            Assert.Same(server, serverStream.Socket);
                        }
                }
        }
        public async Task ReadableWriteableProperties_Roundtrip()
        {
            using (Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    listener.Bind(new IPEndPoint(IPAddress.Loopback, 0));
                    listener.Listen(1);

                    Task <Socket> acceptTask = listener.AcceptAsync();
                    await Task.WhenAll(acceptTask, client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndPoint).Port)));

                    using (Socket server = await acceptTask)
                        using (DerivedNetworkStream serverStream = new DerivedNetworkStream(server))
                        {
                            Assert.True(serverStream.Readable && serverStream.Writeable);

                            serverStream.Readable = false;
                            Assert.False(serverStream.Readable);
                            Assert.False(serverStream.CanRead);
                            Assert.Throws <InvalidOperationException>(() => serverStream.Read(new byte[1], 0, 1));

                            serverStream.Readable = true;
                            Assert.True(serverStream.Readable);
                            Assert.True(serverStream.CanRead);
                            await client.SendAsync(new ArraySegment <byte>(new byte[1], 0, 1), SocketFlags.None);

                            Assert.Equal(1, await serverStream.ReadAsync(new byte[1], 0, 1));

                            serverStream.Writeable = false;
                            Assert.False(serverStream.Writeable);
                            Assert.False(serverStream.CanWrite);
                            Assert.Throws <InvalidOperationException>(() => serverStream.Write(new byte[1], 0, 1));

                            serverStream.Writeable = true;
                            Assert.True(serverStream.Writeable);
                            Assert.True(serverStream.CanWrite);
                            await serverStream.WriteAsync(new byte[1], 0, 1);

                            Assert.Equal(1, await client.ReceiveAsync(new ArraySegment <byte>(new byte[1], 0, 1), SocketFlags.None));
                        }
                }
        }