public async Task ServerRunning_CancelCompilation_CancelsSuccessfully() { // Arrange const int requestCount = 5; var count = 0; var completionSource = new TaskCompletionSource <bool>(); var host = CreateCompilerHost(c => c.ExecuteFunc = (req, ct) => { if (Interlocked.Increment(ref count) == requestCount) { completionSource.SetResult(true); } ct.WaitHandle.WaitOne(); return(new RejectedServerResponse()); }); var semaphore = new SemaphoreSlim(1); Action <object, EventArgs> onListening = (s, e) => { semaphore.Release(); }; using (var serverData = ServerUtilities.CreateServer(compilerHost: host, onListening: onListening)) { // Send all the requests. var clients = new List <Client>(); for (var i = 0; i < requestCount; i++) { // Wait for the server to start listening. await semaphore.WaitAsync(TimeSpan.FromMinutes(1)); var client = await Client.ConnectAsync(serverData.PipeName, timeout : null, cancellationToken : default); await EmptyServerRequest.WriteAsync(client.Stream); clients.Add(client); } // Act // Wait until all of the connections are being processed by the server. await completionSource.Task; // Now cancel var stats = await serverData.CancelAndCompleteAsync(); // Assert Assert.Equal(requestCount, stats.Connections); Assert.Equal(requestCount, count); // Read the server response to each client. foreach (var client in clients) { var task = ServerResponse.ReadAsync(client.Stream); // We expect this to throw because the stream is already closed. await Assert.ThrowsAnyAsync <IOException>(() => task); client.Dispose(); } } }