Example #1
0
        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 });
        }