public async Task <Connection> ActivateAsync(CancellationToken token) { var(clientStream, serverStream) = FullDuplexStream.CreatePair(); // Need an auto-flushing stream for the server because O# doesn't currently flush after writing responses. Without this // performing the Initialize handshake with the LanguageServer hangs. var autoFlushingStream = new AutoFlushingNerdbankStream(serverStream); var server = await RazorLanguageServer.CreateAsync(autoFlushingStream, autoFlushingStream, Trace.Verbose).ConfigureAwait(false); // Fire and forget for Initialized. Need to allow the LSP infrastructure to run in order to actually Initialize. _ = server.InitializedAsync(token); var connection = new Connection(clientStream, clientStream); return(connection); }
public async void Simultaneous_ReadWrite_ClientServer_SingleThreads() { // Arrange var(clientStream, serverStream) = FullDuplexStream.CreatePair(); var autoFlushingStream = new AutoFlushingNerdbankStream(serverStream); const int INIT_BYTES = 10000; var fileContents = new byte[INIT_BYTES]; var randomGenerator = new Random(); randomGenerator.NextBytes(fileContents); await clientStream.WriteAsync(fileContents, 0, INIT_BYTES); await clientStream.FlushAsync(); await serverStream.WriteAsync(fileContents, 0, INIT_BYTES); await serverStream.FlushAsync(); // Act var serverReads = Task.Factory.StartNew(() => { for (var i = 0; i < 100000; i++) { try { var tmpBuffer = new byte[10]; var result = autoFlushingStream.Read(tmpBuffer, 0, 10); Assert.Equal(10, result); } catch { // Force throw assertion failure when exception is raised // Test should fail on exception, however this doesn't actually // happen here. Likely due to running on a seperate thread. Assert.True(false); break; } } }); var serverWrites = Task.Factory.StartNew(() => { for (var i = 0; i < 100000; i++) { try { var tmpBuffer = new byte[10]; randomGenerator.NextBytes(tmpBuffer); autoFlushingStream.Write(tmpBuffer, 0, 10); } catch { // Force throw assertion failure when exception is raised // Test should fail on exception, however this doesn't actually // happen here. Likely due to running on a seperate thread. Assert.True(false); break; } } }); var clientReads = Task.Run(async() => { for (var i = 0; i < 100000; i++) { var tmpBuffer = new byte[10]; var result = await clientStream.ReadAsync(tmpBuffer, 0, 10); Assert.Equal(10, result); } }); var clientWrites = Task.Run(async() => { for (var i = 0; i < 100000; i++) { var tmpBuffer = new byte[10]; randomGenerator.NextBytes(tmpBuffer); await clientStream.WriteAsync(tmpBuffer, 0, 10); await clientStream.FlushAsync(); } }); var clientReadsException = await Record.ExceptionAsync(async() => await clientReads); var clientWritesException = await Record.ExceptionAsync(async() => await clientWrites); // Assert Assert.Null(clientReadsException); Assert.Null(clientWritesException); Task.WaitAll(new[] { serverReads, serverWrites }); }