diff --git a/Src/PerformanceCollector/Perf.Shared.Tests/QuickPulse/QuickPulseServiceClientTests.cs b/Src/PerformanceCollector/Perf.Shared.Tests/QuickPulse/QuickPulseServiceClientTests.cs index cd1976334..ceb4bbea5 100644 --- a/Src/PerformanceCollector/Perf.Shared.Tests/QuickPulse/QuickPulseServiceClientTests.cs +++ b/Src/PerformanceCollector/Perf.Shared.Tests/QuickPulse/QuickPulseServiceClientTests.cs @@ -8,6 +8,7 @@ using System.Net; using System.Net.Http; using System.Runtime.Serialization.Json; + using System.Threading; using System.Threading.Tasks; using Microsoft.ApplicationInsights.Extensibility.Filtering; @@ -58,6 +59,8 @@ public sealed class QuickPulseServiceClientTests : IDisposable private Random rand = new Random(); + private SemaphoreSlim assertionSync; + public QuickPulseServiceClientTests() { CollectionConfigurationError[] errors; @@ -120,6 +123,7 @@ public void TestInitialize() this.listener.Start(); + this.assertionSync = new SemaphoreSlim(0); Task.Factory.StartNew(() => this.ProcessRequest(this.listener)); } @@ -133,6 +137,10 @@ public void TestCleanup() catch { } + finally + { + Interlocked.Exchange(ref this.assertionSync, null)?.Dispose(); + } } [TestMethod] @@ -150,6 +158,9 @@ public void QuickPulseServiceClientPingsTheService() serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, out configurationInfo); serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 3); + // ASSERT Assert.AreEqual(3, this.pingCount); Assert.AreEqual(timestamp.DateTime.ToFileTimeUtc() / 10000, this.lastPingTimestamp.Value.DateTime.ToFileTimeUtc() / 10000); @@ -216,6 +227,9 @@ public void QuickPulseServiceClientSubmitsSamplesToService() out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(true, sendMore); Assert.AreEqual(3, this.samples.Count); @@ -287,6 +301,9 @@ public void QuickPulseServiceClientSetsTransmissionTimeCorrectly() out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(3, this.samples.Count); Assert.IsTrue((timeProvider.UtcNow - this.samples[0].Item1).Duration() < TimeSpan.FromMilliseconds(1)); @@ -325,6 +342,9 @@ public void QuickPulseServiceClientRoundsSampleValuesWhenSubmittingToService() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample1 }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(0.3333, this.samples[0].Item3.Metrics.Single(m => m.Name == @"\ApplicationInsights\Requests Succeeded/Sec").Value); } @@ -371,6 +391,9 @@ public void QuickPulseServiceClientFillsInSampleWeightWhenSubmittingToService() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample1, sample2 }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(3, this.samples[0].Item3.Metrics.Single(m => m.Name == @"\ApplicationInsights\Request Duration").Weight); Assert.AreEqual(4, this.samples[1].Item3.Metrics.Single(m => m.Name == @"\ApplicationInsights\Dependency Call Duration").Weight); @@ -441,6 +464,9 @@ public void QuickPulseServiceClientFillsInTelemetryDocumentsWhenSubmittingToServ CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual("Request1", ((RequestTelemetryDocument)this.samples[0].Item3.Documents[0]).Name); Assert.AreEqual("Prop1", ((RequestTelemetryDocument)this.samples[0].Item3.Documents[0]).Properties.First().Key); @@ -504,6 +530,9 @@ public void QuickPulseServiceClientFillsInGlobalDocumentQuotaReachedWhenSubmitti CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample1, sample2 }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsTrue(this.samples[0].Item3.GlobalDocumentQuotaReached); Assert.IsFalse(this.samples[1].Item3.GlobalDocumentQuotaReached); @@ -528,6 +557,9 @@ public void QuickPulseServiceClientInterpretsPingResponseCorrectlyWhenHeaderTrue CollectionConfigurationInfo configurationInfo; bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsTrue(response.Value); } @@ -551,6 +583,9 @@ public void QuickPulseServiceClientInterpretsPingResponseCorrectlyWhenHeaderFals CollectionConfigurationInfo configurationInfo; bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsFalse(response.Value); } @@ -574,6 +609,9 @@ public void QuickPulseServiceClientInterpretsPingResponseCorrectlyWhenHeaderInva CollectionConfigurationInfo configurationInfo; bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(response); } @@ -597,6 +635,9 @@ public void QuickPulseServiceClientInterpretsPingResponseCorrectlyWhenHeaderMiss CollectionConfigurationInfo configurationInfo; bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(response); } @@ -626,6 +667,9 @@ public void QuickPulseServiceClientInterpretsSubmitSamplesResponseCorrectlyWhenH out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsTrue(response.Value); } @@ -655,6 +699,9 @@ public void QuickPulseServiceClientInterpretsSubmitSamplesResponseCorrectlyWhenH out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsFalse(response.Value); } @@ -684,6 +731,9 @@ public void QuickPulseServiceClientInterpretsSubmitSamplesResponseCorrectlyWhenH out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(response); } @@ -713,6 +763,9 @@ public void QuickPulseServiceClientInterpretsSubmitSamplesResponseCorrectlyWhenH out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(response); } @@ -738,6 +791,9 @@ public void QuickPulseServiceClientDoesNotRetryPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pingCount); } @@ -769,6 +825,9 @@ public void QuickPulseServiceClientDoesNotRetrySubmitSamples() out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.submitCount); } @@ -807,6 +866,9 @@ public void QuickPulseServiceClientDoesNotReadCollectionConfigurationFromPingWhe CollectionConfigurationInfo configurationInfo; serviceClient.Ping("ikey", now, "ETag1", string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(configurationInfo); } @@ -852,6 +914,9 @@ public void QuickPulseServiceClientDoesNotReadCollectionConfigurationFromPostWhe CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(configurationInfo); } @@ -890,6 +955,9 @@ public void QuickPulseServiceClientReadsCollectionConfigurationFromPingWhenETagI CollectionConfigurationInfo configurationInfo; serviceClient.Ping("ikey", now, "ETag1", string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNotNull(configurationInfo, "configurationInfo should not be null."); Assert.AreEqual("ETag2", configurationInfo.ETag); @@ -899,8 +967,6 @@ public void QuickPulseServiceClientReadsCollectionConfigurationFromPingWhenETagI [TestMethod] public void QuickPulseServiceClientReadsCollectionConfigurationFromPostWhenETagIsDifferent() { - // TODO: Stabilize test for NetCore -#if !NETCORE // ARRANGE var now = DateTimeOffset.UtcNow; var serviceClient = new QuickPulseServiceClient( @@ -939,11 +1005,13 @@ public void QuickPulseServiceClientReadsCollectionConfigurationFromPostWhenETagI CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNotNull(configurationInfo, "configurationInfo should not be null."); Assert.AreEqual("ETag2", configurationInfo.ETag); Assert.AreEqual("Id1", configurationInfo.Metrics.Single().Id); -#endif } [TestMethod] @@ -976,6 +1044,9 @@ public void QuickPulseServiceClientDoesNotReadCollectionConfigurationFromPingWhe CollectionConfigurationInfo configurationInfo; serviceClient.Ping("ikey", now, "ETag2", string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(configurationInfo); } @@ -1017,6 +1088,9 @@ public void QuickPulseServiceClientDoesNotReadCollectionConfigurationFromPostWhe CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag2", string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.IsNull(configurationInfo); } @@ -1081,6 +1155,9 @@ public void QuickPulseServiceClientProducesCalculatedMetricsCorrectly() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT MetricPoint metric1 = this.samples.Single().Item3.Metrics.Single(m => m.Name == "Metric1"); MetricPoint metric2 = this.samples.Single().Item3.Metrics.Single(m => m.Name == "Metric2"); @@ -1110,6 +1187,9 @@ public void QuickPulseServiceClientSubmitsInstanceNameToServiceWithPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pings.Count); Assert.AreEqual(instanceName, this.pings[0].Item1.InstanceName); @@ -1142,6 +1222,9 @@ public void QuickPulseServiceClientSubmitsInstanceNameToServiceWithSubmitSamples CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(instanceName, this.samples[0].Item3.Instance); @@ -1166,6 +1249,9 @@ public void QuickPulseServiceClientSubmitsStreamIdToServiceWithPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pings.Count); Assert.AreEqual(streamId, this.pings[0].Item1.StreamId); @@ -1198,6 +1284,9 @@ public void QuickPulseServiceClientSubmitsStreamIdToServiceWithSubmitSamples() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(streamId, this.samples[0].Item3.StreamId); @@ -1222,6 +1311,9 @@ public void QuickPulseServiceClientSubmitsMachineNameToServiceWithPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pings.Count); Assert.AreEqual(machineName, this.pings[0].Item1.MachineName); @@ -1254,6 +1346,9 @@ public void QuickPulseServiceClientSubmitsMachineNameToServiceWithSubmitSamples( CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(machineName, this.samples[0].Item3.MachineName); @@ -1277,6 +1372,9 @@ public void QuickPulseServiceClientSubmitsInvariantVersionToServiceWithPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pings.Count); Assert.AreEqual(4, this.pings[0].Item1.InvariantVersion); @@ -1308,6 +1406,9 @@ public void QuickPulseServiceClientSubmitsInvariantVersionToServiceWithSubmitSam CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(4, this.samples[0].Item3.InvariantVersion); @@ -1332,6 +1433,9 @@ public void QuickPulseServiceClientSubmitsTransmissionTimeToServiceWithPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping(Guid.NewGuid().ToString(), timeProvider.UtcNow, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pings.Count); Assert.AreEqual(timeProvider.UtcNow.Ticks, this.pings[0].Item1.TransmissionTime.Ticks); @@ -1366,6 +1470,9 @@ public void QuickPulseServiceClientSubmitsTransmissionTimeToServiceWithSubmitSam CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(timeProvider.UtcNow.Ticks, this.samples[0].Item1.Ticks); @@ -1391,6 +1498,9 @@ public void QuickPulseServiceClientSubmitsVersionToServiceWithPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping("some ikey", now, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pingCount); Assert.AreEqual(version, this.lastVersion); @@ -1422,6 +1532,9 @@ public void QuickPulseServiceClientSubmitsVersionToServiceWithSubmitSamples() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(version, this.samples[0].Item3.Version); @@ -1448,6 +1561,9 @@ public void QuickPulseServiceClientSubmitsAuthApiKeyToServiceWithPing() CollectionConfigurationInfo configurationInfo; serviceClient.Ping("some ikey", now, string.Empty, authApiKey, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.pingCount); Assert.AreEqual(authApiKey, this.lastAuthApiKey); @@ -1479,6 +1595,9 @@ public void QuickPulseServiceClientSubmitsAuthApiKeyToServiceWithSubmitSamples() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, authApiKey, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(authApiKey, this.lastAuthApiKey); @@ -1511,6 +1630,9 @@ public void QuickPulseServiceClientResubmitsAuthOpaqueHeadersToServiceWithPing() // received the proper headers, now re-submit them serviceClient.Ping("some ikey", now, string.Empty, string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 2); + // ASSERT Assert.AreEqual(2, this.pingCount); Assert.AreEqual("x-ms-qps-auth-app-id1", this.lastOpaqueAuthHeaderValues["x-ms-qps-auth-app-id"]); @@ -1554,6 +1676,9 @@ public void QuickPulseServiceClientResubmitsAuthOpaqueHeadersToServiceWithSubmit // received the proper headers, now re-submit them serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 2); + // ASSERT Assert.AreEqual(2, this.samples.Count); Assert.AreEqual("x-ms-qps-auth-app-id1", this.lastOpaqueAuthHeaderValues["x-ms-qps-auth-app-id"]); @@ -1589,6 +1714,9 @@ public void QuickPulseServiceClientSubmitsCollectionConfigurationETagToService() serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]); serviceClient.Ping(string.Empty, now, "ETag1", string.Empty, out configurationInfo); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual("ETag1", this.samples.Single().Item2); Assert.AreEqual("ETag1", this.pings.Single().Item2); @@ -1638,6 +1766,9 @@ public void QuickPulseServiceClientSubmitsCollectionConfigurationErrorsToService out configurationInfo, collectionConfigurationErrors); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(2, this.samples.Single().Item3.CollectionConfigurationErrors.Length); @@ -1680,6 +1811,9 @@ public void QuickPulseServiceClientSubmitsInstrumentationKeyToService() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(ikey, this.samples[0].Item3.InstrumentationKey); @@ -1711,6 +1845,9 @@ public void QuickPulseServiceClientSubmitsIsWebAppToService() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.IsTrue(this.samples[0].Item3.IsWebApp); @@ -1742,6 +1879,9 @@ public void QuickPulseServiceClientSubmitsProcessorCountToService() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(7, this.samples[0].Item3.ProcessorCount); @@ -1775,6 +1915,9 @@ public void QuickPulseServiceClientSubmitsTopCpuProcessesToService() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(2, this.samples[0].Item3.TopCpuProcesses.Count()); @@ -1811,6 +1954,9 @@ public void QuickPulseServiceClientSubmitsTopCpuProcessesAccessDeniedToService() CollectionConfigurationInfo configurationInfo; serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]); + // SYNC + this.WaitForProcessing(requestCount: 1); + // ASSERT Assert.AreEqual(1, this.samples.Count); Assert.IsTrue(this.samples[0].Item3.TopCpuDataAccessDenied); @@ -1821,6 +1967,11 @@ public void Dispose() try { ((IDisposable)this.listener).Dispose(); + if (this.assertionSync != null) + { + this.assertionSync.Dispose(); + this.assertionSync = null; + } } catch (Exception) { @@ -1836,19 +1987,21 @@ private void ProcessRequest(HttpListener listener) while (listener.IsListening) { - HttpListenerContext context = listener.GetContextAsync().GetAwaiter().GetResult(); + try + { + HttpListenerContext context = listener.GetContextAsync().GetAwaiter().GetResult(); - var request = context.Request; + var request = context.Request; - this.lastAuthApiKey = context.Request.Headers[QuickPulseConstants.XMsQpsAuthApiKeyHeaderName]; - foreach (var headerName in QuickPulseConstants.XMsQpsAuthOpaqueHeaderNames) - { - this.lastOpaqueAuthHeaderValues[headerName] = context.Request.Headers[headerName]; - } + this.lastAuthApiKey = context.Request.Headers[QuickPulseConstants.XMsQpsAuthApiKeyHeaderName]; + foreach (var headerName in QuickPulseConstants.XMsQpsAuthOpaqueHeaderNames) + { + this.lastOpaqueAuthHeaderValues[headerName] = context.Request.Headers[headerName]; + } - switch (request.Url.LocalPath) - { - case "/ping": + switch (request.Url.LocalPath) + { + case "/ping": { this.pingCount++; @@ -1883,8 +2036,8 @@ private void ProcessRequest(HttpListener listener) this.lastVersion = dataPoint.Version; } - break; - case "/post": + break; + case "/post": { this.submitCount++; @@ -1901,18 +2054,35 @@ private void ProcessRequest(HttpListener listener) dp => Tuple.Create(new DateTimeOffset(transmissionTime, TimeSpan.Zero), collectionConfigurationETag, dp))); } - break; - default: - throw new ArgumentOutOfRangeException("Unknown request: " + request.Url.LocalPath); - } + break; + default: + throw new ArgumentOutOfRangeException("Unknown request: " + request.Url.LocalPath); + } - if (!this.emulateTimeout) + if (!this.emulateTimeout) + { + context.Response.Close(); + } + } + finally { - context.Response.Close(); + this.assertionSync.Release(); } } } + private void WaitForProcessing(int requestCount) + { + TimeSpan timeout = TimeSpan.FromSeconds(5.0); + + Task[] waitTasks = Enumerable.Range(0, requestCount).Select(_ => Task.Run(() => this.assertionSync.Wait(timeout))).ToArray(); + Task.WhenAll(waitTasks); + + Assert.IsTrue( + condition: waitTasks.All(task => task.Result), + message: string.Format(CultureInfo.InvariantCulture, "Not all requests finished processing: expected {0}, actual: {1}", requestCount, waitTasks.Count(task => task.Result))); + } + #endregion private class PingHeaders