From ff6e65fba2f57ae74be7b27323420038c76878c2 Mon Sep 17 00:00:00 2001 From: MihaZupan Date: Tue, 10 Nov 2020 19:39:13 +0100 Subject: [PATCH] Add ActivityPropagationHandler test --- .../Telemetry/ActivityPropagationHandler.cs | 5 +- .../Common/MockHttpHandler.cs | 31 +++++++++ .../ConfigurationConfigProviderTests.cs | 1 + .../Service/Proxy/HttpProxyTests.cs | 21 ------ .../ActivityPropagationHandlerTests.cs | 68 +++++++++++++++++++ 5 files changed, 102 insertions(+), 24 deletions(-) create mode 100644 test/ReverseProxy.Tests/Common/MockHttpHandler.cs create mode 100644 test/ReverseProxy.Tests/Service/Proxy/Infrastructure/ActivityPropagationHandlerTests.cs diff --git a/src/ReverseProxy/Telemetry/ActivityPropagationHandler.cs b/src/ReverseProxy/Telemetry/ActivityPropagationHandler.cs index 7a04f3402..ac395c402 100644 --- a/src/ReverseProxy/Telemetry/ActivityPropagationHandler.cs +++ b/src/ReverseProxy/Telemetry/ActivityPropagationHandler.cs @@ -1,6 +1,5 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. using System; using System.Collections.Generic; diff --git a/test/ReverseProxy.Tests/Common/MockHttpHandler.cs b/test/ReverseProxy.Tests/Common/MockHttpHandler.cs new file mode 100644 index 000000000..a00040c5a --- /dev/null +++ b/test/ReverseProxy.Tests/Common/MockHttpHandler.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.ReverseProxy.Common.Tests +{ + internal class MockHttpHandler : HttpMessageHandler + { + private readonly Func> _func; + + public MockHttpHandler(Func> func) + { + _func = func ?? throw new ArgumentNullException(nameof(func)); + } + + public static HttpMessageInvoker CreateClient(Func> func) + { + var handler = new MockHttpHandler(func); + return new HttpMessageInvoker(handler); + } + + protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + return _func(request, cancellationToken); + } + } +} diff --git a/test/ReverseProxy.Tests/Configuration/ConfigurationConfigProviderTests.cs b/test/ReverseProxy.Tests/Configuration/ConfigurationConfigProviderTests.cs index e88f40ac4..9c7826794 100644 --- a/test/ReverseProxy.Tests/Configuration/ConfigurationConfigProviderTests.cs +++ b/test/ReverseProxy.Tests/Configuration/ConfigurationConfigProviderTests.cs @@ -599,6 +599,7 @@ private void VerifyValidAbstractConfig(ConfigurationData validConfig, X509Certif Assert.Equal(validConfig.Clusters["cluster1"].SessionAffinity.Settings, abstractCluster1.SessionAffinity.Settings); Assert.Same(certificate, abstractCluster1.HttpClient.ClientCertificate); Assert.Equal(validConfig.Clusters["cluster1"].HttpClient.MaxConnectionsPerServer, abstractCluster1.HttpClient.MaxConnectionsPerServer); + Assert.Equal(validConfig.Clusters["cluster1"].HttpClient.PropagateActivityContext, abstractCluster1.HttpClient.PropagateActivityContext); Assert.Equal(SslProtocols.Tls11 | SslProtocols.Tls12, abstractCluster1.HttpClient.SslProtocols); Assert.Equal(validConfig.Clusters["cluster1"].HttpClient.DangerousAcceptAnyServerCertificate, abstractCluster1.HttpClient.DangerousAcceptAnyServerCertificate); Assert.Equal(validConfig.Clusters["cluster1"].HttpRequest.RequestTimeout, abstractCluster1.HttpRequest.RequestTimeout); diff --git a/test/ReverseProxy.Tests/Service/Proxy/HttpProxyTests.cs b/test/ReverseProxy.Tests/Service/Proxy/HttpProxyTests.cs index 1eeb25cda..ae85a64db 100644 --- a/test/ReverseProxy.Tests/Service/Proxy/HttpProxyTests.cs +++ b/test/ReverseProxy.Tests/Service/Proxy/HttpProxyTests.cs @@ -1606,27 +1606,6 @@ private static string StreamToString(Stream stream) return reader.ReadToEnd(); } - private class MockHttpHandler : HttpMessageHandler - { - private readonly Func> func; - - private MockHttpHandler(Func> func) - { - this.func = func ?? throw new ArgumentNullException(nameof(func)); - } - - public static HttpMessageInvoker CreateClient(Func> func) - { - var handler = new MockHttpHandler(func); - return new HttpMessageInvoker(handler); - } - - protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - return func(request, cancellationToken); - } - } - private class DuplexStream : Stream { public DuplexStream(Stream readStream, Stream writeStream) diff --git a/test/ReverseProxy.Tests/Service/Proxy/Infrastructure/ActivityPropagationHandlerTests.cs b/test/ReverseProxy.Tests/Service/Proxy/Infrastructure/ActivityPropagationHandlerTests.cs new file mode 100644 index 000000000..246623827 --- /dev/null +++ b/test/ReverseProxy.Tests/Service/Proxy/Infrastructure/ActivityPropagationHandlerTests.cs @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Diagnostics; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.ReverseProxy.Common.Tests; +using Microsoft.ReverseProxy.Telemetry; +using Xunit; + +namespace Microsoft.ReverseProxy.Service.Proxy.Tests +{ + public class ActivityPropagationHandlerTests + { + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SendAsync_CurrentActivitySet_RequestHeadersSet(bool useW3CFormat) + { + const string TraceStateString = "CustomTraceStateString"; + string expectedId = null; + + var invoker = new HttpMessageInvoker(new ActivityPropagationHandler(new MockHttpHandler( + (HttpRequestMessage request, CancellationToken cancellationToken) => + { + var headers = request.Headers; + + Assert.True(headers.TryGetValues(useW3CFormat ? "traceparent" : "Request-Id", out var values)); + Assert.Equal(expectedId, Assert.Single(values)); + + if (useW3CFormat) + { + Assert.True(headers.TryGetValues("tracestate", out values)); + Assert.Equal(TraceStateString, Assert.Single(values)); + } + + Assert.True(headers.TryGetValues("Correlation-Context", out values)); + Assert.Equal("foo=bar", Assert.Single(values)); + + return Task.FromResult(null); + }))); + + var activity = new Activity("CustomOperation"); + + if (useW3CFormat) + { + activity.SetIdFormat(ActivityIdFormat.W3C); + activity.TraceStateString = TraceStateString; + activity.SetParentId("00-01234567890123456789012345678901-0123456789012345-01"); + } + else + { + activity.SetIdFormat(ActivityIdFormat.Hierarchical); + activity.SetParentId("|root"); + } + + activity.AddBaggage("foo", "bar"); + + activity.Start(); + expectedId = activity.Id; + + await invoker.SendAsync(new HttpRequestMessage(), CancellationToken.None); + + activity.Stop(); + } + } +}