示例#1
0
 public void Close_CanBeCalledWithoutConnectAsync()
 {
     using (var receiver = new StandardInputReceiver(TextReader.Null))
     {
         receiver.Close();
     }
 }
示例#2
0
        public void MessageReceived_RaisedForSingleMessageWithNonBlockingStream()
        {
            var json      = "{\"RequestId\":\"a\",\"Type\":\"Response\",\"Method\":\"None\"}";
            var requestId = "a";
            var type      = MessageType.Response;
            var method    = MessageMethod.None;

            using (var receivedEvent = new ManualResetEventSlim(initialState: false))
                using (var reader = new StringReader(json))
                    using (var receiver = new StandardInputReceiver(reader))
                    {
                        Message message = null;

                        receiver.MessageReceived += (object sender, MessageEventArgs e) =>
                        {
                            message = e.Message;

                            receivedEvent.Set();
                        };

                        receiver.Connect();

                        receivedEvent.Wait();

                        Assert.Equal(requestId, message.RequestId);
                        Assert.Equal(type, message.Type);
                        Assert.Equal(method, message.Method);
                        Assert.Null(message.Payload);
                    }
        }
示例#3
0
        public void Faulted_RaisedForDeserializationError()
        {
            var json = "{\"RequestId\":\"a\",\"Type\":\"Response\",\"Method\":\"None\",\"Payload\":\"{\\\"d\\\":\\\"e\\\"}\"}\r\n";

            using (var faultedEvent = new ManualResetEventSlim(initialState: false))
                using (var reader = new StringReader(json))
                    using (var receiver = new StandardInputReceiver(reader))
                    {
                        ProtocolErrorEventArgs args = null;

                        receiver.Faulted += (object sender, ProtocolErrorEventArgs e) =>
                        {
                            args = e;

                            faultedEvent.Set();
                        };

                        receiver.Connect();

                        faultedEvent.Wait();

                        Assert.NotNull(args);
                        Assert.IsType <ProtocolException>(args.Exception);
                    }
        }
示例#4
0
        public void Faulted_RaisedForParseError()
        {
            var invalidJson = "text\r\n";

            using (var faultedEvent = new ManualResetEventSlim(initialState: false))
                using (var reader = new StringReader(invalidJson))
                    using (var receiver = new StandardInputReceiver(reader))
                    {
                        ProtocolErrorEventArgs args = null;

                        receiver.Faulted += (object sender, ProtocolErrorEventArgs e) =>
                        {
                            args = e;

                            faultedEvent.Set();
                        };

                        receiver.Connect();

                        faultedEvent.Wait();

                        Assert.NotNull(args);
                        Assert.IsType <ProtocolException>(args.Exception);
                    }
        }
示例#5
0
        public void MessageReceived_RaisedForMultipleMessagesWithBlockingStream()
        {
            var json = "{\"RequestId\":\"de08f561-50c1-4816-adc3-73d2c283d8cf\",\"Type\":\"Request\",\"Method\":\"Handshake\",\"Payload\":{\"ProtocolVersion\":\"3.0.0\",\"MinimumProtocolVersion\":\"1.0.0\"}}\r\n{\"RequestId\":\"e2db1e2d-0282-45c4-9004-b096e221230d\",\"Type\":\"Response\",\"Method\":\"Handshake\",\"Payload\":{\"ResponseCode\":0,\"ProtocolVersion\":\"2.0.0\"}}\r\n";

            using (var receivedEvent = new ManualResetEventSlim(initialState: false))
                using (var cancellationTokenSource = new CancellationTokenSource())
                    using (var stream = new MemoryStream())
                        using (var readWriteSemaphore = new SemaphoreSlim(initialCount: 1, maxCount: 1))
                            using (var dataWrittenEvent = new ManualResetEventSlim(initialState: false))
                                using (var outboundStream = new SimulatedWriteOnlyFileStream(stream, readWriteSemaphore, dataWrittenEvent, cancellationTokenSource.Token))
                                    using (var inboundStream = new SimulatedReadOnlyFileStream(stream, readWriteSemaphore, dataWrittenEvent, cancellationTokenSource.Token))
                                        using (var reader = new SimulatedStreamReader(inboundStream))
                                            using (var receiver = new StandardInputReceiver(reader))
                                            {
                                                var messages = new List <Message>();

                                                receiver.MessageReceived += (object sender, MessageEventArgs e) =>
                                                {
                                                    messages.Add(e.Message);

                                                    if (messages.Count == 2)
                                                    {
                                                        receivedEvent.Set();
                                                    }
                                                };

                                                var bytes = Encoding.UTF8.GetBytes(json);

                                                outboundStream.Write(bytes, offset: 0, count: bytes.Length);

                                                receiver.Connect();

                                                receivedEvent.Wait();
                                            }
        }
示例#6
0
        public void MessageReceived_RaisedForMultipleMessagesWithNonBlockingStream()
        {
            var json = "{\"RequestId\":\"de08f561-50c1-4816-adc3-73d2c283d8cf\",\"Type\":\"Request\",\"Method\":\"Handshake\",\"Payload\":{\"ProtocolVersion\":\"3.0.0\",\"MinimumProtocolVersion\":\"1.0.0\"}}\r\n{\"RequestId\":\"e2db1e2d-0282-45c4-9004-b096e221230d\",\"Type\":\"Response\",\"Method\":\"Handshake\",\"Payload\":{\"ResponseCode\":0,\"ProtocolVersion\":\"2.0.0\"}}\r\n";

            using (var receivedEvent = new ManualResetEventSlim(initialState: false))
                using (var reader = new StringReader(json))
                    using (var receiver = new StandardInputReceiver(reader))
                    {
                        var messages = new List <Message>();

                        receiver.MessageReceived += (object sender, MessageEventArgs e) =>
                        {
                            messages.Add(e.Message);

                            if (messages.Count == 2)
                            {
                                receivedEvent.Set();
                            }
                        };

                        receiver.Connect();

                        receivedEvent.Wait();
                    }
        }
示例#7
0
        public void MessageReceived_RaisedForSingleMessageWithBlockingStream(string json, string requestId, MessageType type, MessageMethod method, string payload)
        {
            using (var receivedEvent = new ManualResetEventSlim(initialState: false))
                using (var cancellationTokenSource = new CancellationTokenSource())
                    using (var stream = new MemoryStream())
                        using (var readWriteSemaphore = new SemaphoreSlim(initialCount: 1, maxCount: 1))
                            using (var dataWrittenEvent = new ManualResetEventSlim(initialState: false))
                                using (var outboundStream = new SimulatedWriteOnlyFileStream(stream, readWriteSemaphore, dataWrittenEvent, cancellationTokenSource.Token))
                                    using (var inboundStream = new SimulatedReadOnlyFileStream(stream, readWriteSemaphore, dataWrittenEvent, cancellationTokenSource.Token))
                                        using (var reader = new SimulatedStreamReader(inboundStream))
                                            using (var receiver = new StandardInputReceiver(reader))
                                            {
                                                Message message = null;

                                                receiver.MessageReceived += (object sender, MessageEventArgs e) =>
                                                {
                                                    message = e.Message;

                                                    receivedEvent.Set();
                                                };

                                                var bytes = Encoding.UTF8.GetBytes(json);

                                                outboundStream.Write(bytes, offset: 0, count: bytes.Length);

                                                receiver.Connect();

                                                receivedEvent.Wait();

                                                Assert.Equal(requestId, message.RequestId);
                                                Assert.Equal(type, message.Type);
                                                Assert.Equal(method, message.Method);
                                                Assert.Equal(payload, message.Payload?.ToString(Formatting.None));
                                            }
        }
示例#8
0
 public void Dispose_IsIdempotent()
 {
     using (var receiver = new StandardInputReceiver(TextReader.Null))
     {
         receiver.Dispose();
         receiver.Dispose();
     }
 }
示例#9
0
        public void Connect_ThrowsIfAlreadyConnected()
        {
            using (var receiver = new StandardInputReceiver(TextReader.Null))
            {
                receiver.Connect();

                Assert.Throws <InvalidOperationException>(() => receiver.Connect());
            }
        }
示例#10
0
        public void Connect_ThrowsIfDisposed()
        {
            var receiver = new StandardInputReceiver(TextReader.Null);

            receiver.Dispose();

            var exception = Assert.Throws <ObjectDisposedException>(() => receiver.Connect());

            Assert.Equal(nameof(StandardInputReceiver), exception.ObjectName);
        }
示例#11
0
            internal ConnectionTest()
            {
                var cancellationTokenSource = new CancellationTokenSource();

                _simulatedIpc = SimulatedIpc.Create(cancellationTokenSource.Token);
                var sender     = new Sender(_simulatedIpc.RemoteStandardOutputForRemote);
                var receiver   = new StandardInputReceiver(_simulatedIpc.RemoteStandardInputForRemote);
                var dispatcher = new MessageDispatcher(new RequestHandlers(), new RequestIdGenerator());
                var options    = ConnectionOptions.CreateDefault();

                Connection = new Connection(dispatcher, sender, receiver, options);
            }
示例#12
0
 public async Task ConnectAsync_ThrowsIfCancelled()
 {
     using (var cancellationTokenSource = new CancellationTokenSource())
         using (var sender = new Sender(TextWriter.Null))
             using (var receiver = new StandardInputReceiver(TextReader.Null))
                 using (var dispatcher = new MessageDispatcher(new RequestHandlers(), new RequestIdGenerator()))
                     using (var connection = new Connection(dispatcher, sender, receiver, ConnectionOptions.CreateDefault()))
                     {
                         await Assert.ThrowsAsync <OperationCanceledException>(
                             () => connection.ConnectAsync(new CancellationToken(canceled: true)));
                     }
 }
示例#13
0
        public void Close_DoesNotCloseUnderlyingStream()
        {
            using (var stream = new MemoryStream())
                using (var reader = new StreamReader(stream))
                    using (var receiver = new StandardInputReceiver(reader))
                    {
                        receiver.Connect();

                        receiver.Close();

                        Assert.True(stream.CanSeek);
                        Assert.True(stream.CanRead);
                        Assert.True(stream.CanWrite);
                    }
        }
示例#14
0
        public void MessageReceived_RaisedForSingleMessageInChunksWithBlockingStream()
        {
            var json      = "{\"RequestId\":\"a\",\"Type\":\"Progress\",\"Method\":\"None\",\"Payload\":{\"d\":\"e\"}}\r\n";
            var requestId = "a";
            var type      = MessageType.Progress;
            var method    = MessageMethod.None;
            var payload   = "{\"d\":\"e\"}";

            using (var receivedEvent = new ManualResetEventSlim(initialState: false))
                using (var cancellationTokenSource = new CancellationTokenSource())
                    using (var stream = new MemoryStream())
                        using (var readWriteSemaphore = new SemaphoreSlim(initialCount: 1, maxCount: 1))
                            using (var dataWrittenEvent = new ManualResetEventSlim(initialState: false))
                                using (var outboundStream = new SimulatedWriteOnlyFileStream(stream, readWriteSemaphore, dataWrittenEvent, cancellationTokenSource.Token))
                                    using (var inboundStream = new SimulatedReadOnlyFileStream(stream, readWriteSemaphore, dataWrittenEvent, cancellationTokenSource.Token))
                                        using (var reader = new SimulatedStreamReader(inboundStream))
                                            using (var receiver = new StandardInputReceiver(reader))
                                            {
                                                Message message = null;

                                                receiver.MessageReceived += (object sender, MessageEventArgs e) =>
                                                {
                                                    message = e.Message;

                                                    receivedEvent.Set();
                                                };

                                                var bytes = Encoding.UTF8.GetBytes(json);

                                                for (var offset = 0; offset < bytes.Length; offset += 10)
                                                {
                                                    var count = Math.Min(bytes.Length - offset, 10);

                                                    outboundStream.Write(bytes, offset, count);
                                                }

                                                receiver.Connect();

                                                receivedEvent.Wait();

                                                Assert.Equal(requestId, message.RequestId);
                                                Assert.Equal(type, message.Type);
                                                Assert.Equal(method, message.Method);
                                                Assert.Equal(payload, message.Payload.ToString(Formatting.None));
                                            }
        }
示例#15
0
        public void Dispose_ClosesUnderlyingStream()
        {
            using (var stream = new MemoryStream())
                using (var reader = new StreamReader(stream))
                {
                    Assert.True(stream.CanSeek);
                    Assert.True(stream.CanRead);
                    Assert.True(stream.CanWrite);

                    var receiver = new StandardInputReceiver(reader);

                    receiver.Dispose();

                    Assert.False(stream.CanSeek);
                    Assert.False(stream.CanRead);
                    Assert.False(stream.CanWrite);
                }
        }