public void Close_CanBeCalledWithoutConnectAsync() { using (var receiver = new StandardInputReceiver(TextReader.Null)) { receiver.Close(); } }
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); } }
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); } }
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); } }
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(); } }
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(); } }
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)); } }
public void Dispose_IsIdempotent() { using (var receiver = new StandardInputReceiver(TextReader.Null)) { receiver.Dispose(); receiver.Dispose(); } }
public void Connect_ThrowsIfAlreadyConnected() { using (var receiver = new StandardInputReceiver(TextReader.Null)) { receiver.Connect(); Assert.Throws <InvalidOperationException>(() => receiver.Connect()); } }
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); }
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); }
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))); } }
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); } }
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)); } }
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); } }