From fc3287f529b22a73a3d00dace5201fa93703c52b Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Thu, 30 Nov 2023 21:25:13 +0100 Subject: [PATCH 01/10] Removed Moq dependency --- .../CustomTextMapPropagator.cs | 50 +++++++++++ .../HttpClientTests.Basic.cs | 86 +++++++------------ .../HttpWebRequestTests.Basic.cs | 30 ++----- ...elemetry.Instrumentation.Http.Tests.csproj | 1 - .../PropagationContextEventArgs.cs | 24 ++++++ 5 files changed, 116 insertions(+), 75 deletions(-) create mode 100644 test/OpenTelemetry.Instrumentation.Http.Tests/CustomTextMapPropagator.cs create mode 100644 test/OpenTelemetry.Instrumentation.Http.Tests/PropagationContextEventArgs.cs diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/CustomTextMapPropagator.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/CustomTextMapPropagator.cs new file mode 100644 index 00000000000..3421081909a --- /dev/null +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/CustomTextMapPropagator.cs @@ -0,0 +1,50 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using OpenTelemetry.Context.Propagation; + +namespace OpenTelemetry.Instrumentation.Http.Tests; + +internal sealed class CustomTextMapPropagator : TextMapPropagator +{ + private static readonly PropagationContext DefaultPropagationContext = default; +#pragma warning disable SA1010 + private readonly Dictionary> values = []; + + public event EventHandler Injected; + + public override ISet Fields => null; + + public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + { + return DefaultPropagationContext; + } + + public override void Inject(PropagationContext context, T carrier, Action setter) + { + foreach (var kv in this.values) + { + setter(carrier, kv.Key, kv.Value.Invoke(context)); + } + + this.Injected?.Invoke(this, new PropagationContextEventArgs(context)); + } + + internal void Add(string key, Func func) + { + this.values.Add(key, func); + } +} diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs index 1fe6ccee839..cac09435efb 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs @@ -15,12 +15,12 @@ // using System.Diagnostics; + #if NETFRAMEWORK using System.Net; using System.Net.Http; #endif using Microsoft.Extensions.DependencyInjection; -using Moq; using OpenTelemetry.Context.Propagation; using OpenTelemetry.Instrumentation.Http.Implementation; using OpenTelemetry.Metrics; @@ -224,14 +224,6 @@ public async Task InjectsHeadersAsync(bool shouldEnrich) [Fact] public async Task InjectsHeadersAsync_CustomFormat() { - var propagator = new Mock(); - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, message, action) => - { - action(message, "custom_traceparent", $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); - action(message, "custom_tracestate", Activity.Current.TraceStateString); - }); - var exportedItems = new List(); using var request = new HttpRequestMessage @@ -246,7 +238,11 @@ public async Task InjectsHeadersAsync_CustomFormat() parent.TraceStateString = "k1=v1,k2=v2"; parent.ActivityTraceFlags = ActivityTraceFlags.Recorded; - Sdk.SetDefaultTextMapPropagator(propagator.Object); + var propagator = new CustomTextMapPropagator(); + propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); + + Sdk.SetDefaultTextMapPropagator(propagator); using (Sdk.CreateTracerProviderBuilder() .AddHttpClientInstrumentation() @@ -271,13 +267,13 @@ public async Task InjectsHeadersAsync_CustomFormat() // not the HttpRequestMessage passed to HttpClient. Assert.Empty(request.Headers); #else - Assert.True(request.Headers.TryGetValues("custom_traceparent", out var traceparents)); - Assert.True(request.Headers.TryGetValues("custom_tracestate", out var tracestates)); - Assert.Single(traceparents); - Assert.Single(tracestates); + Assert.True(request.Headers.TryGetValues("custom_traceParent", out var traceParents)); + Assert.True(request.Headers.TryGetValues("custom_traceState", out var traceStates)); + Assert.Single(traceParents); + Assert.Single(traceStates); - Assert.Equal($"00/{activity.Context.TraceId}/{activity.Context.SpanId}/01", traceparents.Single()); - Assert.Equal("k1=v1,k2=v2", tracestates.Single()); + Assert.Equal($"00/{activity.Context.TraceId}/{activity.Context.SpanId}/01", traceParents.Single()); + Assert.Equal("k1=v1,k2=v2", traceStates.Single()); #endif Sdk.SetDefaultTextMapPropagator(new CompositeTextMapPropagator(new TextMapPropagator[] @@ -292,13 +288,9 @@ public async Task RespectsSuppress() { try { - var propagator = new Mock(); - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, message, action) => - { - action(message, "custom_traceparent", $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); - action(message, "custom_tracestate", Activity.Current.TraceStateString); - }); + var propagator = new CustomTextMapPropagator(); + propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); var exportedItems = new List(); @@ -314,7 +306,7 @@ public async Task RespectsSuppress() parent.TraceStateString = "k1=v1,k2=v2"; parent.ActivityTraceFlags = ActivityTraceFlags.Recorded; - Sdk.SetDefaultTextMapPropagator(propagator.Object); + Sdk.SetDefaultTextMapPropagator(propagator); using (Sdk.CreateTracerProviderBuilder() .AddHttpClientInstrumentation() @@ -331,8 +323,8 @@ public async Task RespectsSuppress() // If suppressed, activity is not emitted and // propagation is also not performed. Assert.Empty(exportedItems); - Assert.False(request.Headers.Contains("custom_traceparent")); - Assert.False(request.Headers.Contains("custom_tracestate")); + Assert.False(request.Headers.Contains("custom_traceParent")); + Assert.False(request.Headers.Contains("custom_traceState")); } finally { @@ -368,14 +360,14 @@ public async Task ExportsSpansCreatedForRetries() // number of exported spans should be 3(maxRetries) Assert.Equal(maxRetries, exportedItems.Count); - var spanid1 = exportedItems[0].SpanId; - var spanid2 = exportedItems[1].SpanId; - var spanid3 = exportedItems[2].SpanId; + var spanId1 = exportedItems[0].SpanId; + var spanId2 = exportedItems[1].SpanId; + var spanId3 = exportedItems[2].SpanId; // Validate span ids are different - Assert.NotEqual(spanid1, spanid2); - Assert.NotEqual(spanid3, spanid1); - Assert.NotEqual(spanid2, spanid3); + Assert.NotEqual(spanId1, spanId2); + Assert.NotEqual(spanId3, spanId1); + Assert.NotEqual(spanId2, spanId3); } [Theory] @@ -685,27 +677,15 @@ public async Task CustomPropagatorCalled(bool sample, bool createParentActivity) ActivityContext parentContext = default; ActivityContext contextFromPropagator = default; - var propagator = new Mock(); - -#if NETFRAMEWORK - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, carrier, setter) => - { - contextFromPropagator = context.ActivityContext; - - setter(carrier, "custom_traceparent", $"00/{contextFromPropagator.TraceId}/{contextFromPropagator.SpanId}/01"); - setter(carrier, "custom_tracestate", contextFromPropagator.TraceState); - }); -#else - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, carrier, setter) => - { - contextFromPropagator = context.ActivityContext; + void Propagator_Injected(object sender, PropagationContextEventArgs e) + { + contextFromPropagator = e.Context.ActivityContext; + } - setter(carrier, "custom_traceparent", $"00/{contextFromPropagator.TraceId}/{contextFromPropagator.SpanId}/01"); - setter(carrier, "custom_tracestate", contextFromPropagator.TraceState); - }); -#endif + var propagator = new CustomTextMapPropagator(); + propagator.Injected += Propagator_Injected; + propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); var exportedItems = new List(); @@ -716,7 +696,7 @@ public async Task CustomPropagatorCalled(bool sample, bool createParentActivity) .Build()) { var previousDefaultTextMapPropagator = Propagators.DefaultTextMapPropagator; - Sdk.SetDefaultTextMapPropagator(propagator.Object); + Sdk.SetDefaultTextMapPropagator(propagator); Activity parent = null; if (createParentActivity) diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs index be35cedaee4..803e997e743 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs @@ -18,7 +18,6 @@ using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Moq; using OpenTelemetry.Context.Propagation; using OpenTelemetry.Instrumentation.Http.Implementation; using OpenTelemetry.Tests; @@ -220,26 +219,15 @@ public async Task CustomPropagatorCalled(bool sample, bool createParentActivity) ActivityContext parentContext = default; ActivityContext contextFromPropagator = default; - var propagator = new Mock(); -#if NETFRAMEWORK - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, carrier, setter) => - { - contextFromPropagator = context.ActivityContext; - - setter(carrier, "traceparent", $"00/{contextFromPropagator.TraceId}/{contextFromPropagator.SpanId}/01"); - setter(carrier, "tracestate", contextFromPropagator.TraceState); - }); -#else - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, carrier, setter) => - { - contextFromPropagator = context.ActivityContext; + void Propagator_Injected(object sender, PropagationContextEventArgs e) + { + contextFromPropagator = e.Context.ActivityContext; + } - setter(carrier, "traceparent", $"00/{contextFromPropagator.TraceId}/{contextFromPropagator.SpanId}/01"); - setter(carrier, "tracestate", contextFromPropagator.TraceState); - }); -#endif + var propagator = new CustomTextMapPropagator(); + propagator.Injected += Propagator_Injected; + propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); var exportedItems = new List(); @@ -250,7 +238,7 @@ public async Task CustomPropagatorCalled(bool sample, bool createParentActivity) .Build()) { var previousDefaultTextMapPropagator = Propagators.DefaultTextMapPropagator; - Sdk.SetDefaultTextMapPropagator(propagator.Object); + Sdk.SetDefaultTextMapPropagator(propagator); Activity parent = null; if (createParentActivity) diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj b/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj index 75e4f2f2959..ea8d53253c7 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj @@ -16,7 +16,6 @@ - diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/PropagationContextEventArgs.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/PropagationContextEventArgs.cs new file mode 100644 index 00000000000..e38ffbc90bb --- /dev/null +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/PropagationContextEventArgs.cs @@ -0,0 +1,24 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using OpenTelemetry.Context.Propagation; + +namespace OpenTelemetry.Instrumentation.Http.Tests; + +internal class PropagationContextEventArgs(PropagationContext context) : EventArgs +{ + public PropagationContext Context { get; private set; } = context; +} From f0538efde17150d78dbb558d50315bb311d2d561 Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Thu, 30 Nov 2023 21:43:04 +0100 Subject: [PATCH 02/10] Removed unnecessary using statement --- .../HttpClientTests.Basic.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs index cac09435efb..51a236333a3 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs @@ -17,7 +17,6 @@ using System.Diagnostics; #if NETFRAMEWORK -using System.Net; using System.Net.Http; #endif using Microsoft.Extensions.DependencyInjection; From 1a927adb06fb27c819ff455131912e1da910289a Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:10:52 +0100 Subject: [PATCH 03/10] Removed Moq, added NSubstitute --- Directory.Packages.props | 1 - .../AssemblyInfo.cs | 2 - src/OpenTelemetry.Api/AssemblyInfo.cs | 3 - .../AssemblyInfo.cs | 4 +- .../AssemblyInfo.cs | 3 - src/OpenTelemetry/AssemblyInfo.cs | 7 +- test/Benchmarks/Benchmarks.csproj | 2 +- .../Exporter/OtlpGrpcExporterBenchmarks.cs | 19 +- test/Directory.Packages.props | 3 +- .../OpenTelemetry.Api.Tests.csproj | 1 - .../OtlpHttpTraceExportClientTests.cs | 46 ++--- .../MockHttpMessageHandler.cs | 41 ++++ ...xporter.OpenTelemetryProtocol.Tests.csproj | 2 +- .../OtlpLogExporterTests.cs | 24 +-- .../OtlpTraceExporterTests.cs | 10 +- ...xporter.Prometheus.AspNetCore.Tests.csproj | 1 - ...orter.Prometheus.HttpListener.Tests.csproj | 1 - ...OpenTelemetry.Exporter.Zipkin.Tests.csproj | 1 - ...nTelemetry.Extensions.Hosting.Tests.csproj | 1 - .../BasicTests.cs | 16 +- ...ry.Instrumentation.AspNetCore.Tests.csproj | 3 +- .../GrpcTests.client.cs | 180 ++++++++---------- .../GrpcTests.server.cs | 27 +-- ...elemetry.Instrumentation.Grpc.Tests.csproj | 4 +- .../HttpClientTests.Basic.cs | 12 +- .../HttpWebRequestTests.Basic.cs | 4 +- ...elemetry.Instrumentation.Http.Tests.csproj | 5 + ...try.Instrumentation.SqlClient.Tests.csproj | 1 - .../SqlEventSourceTests.netfx.cs | 38 ++-- ...enTelemetry.Shims.OpenTracing.Tests.csproj | 2 +- .../ScopeManagerShimTests.cs | 4 +- .../TracerShimTests.cs | 41 ++-- .../SelfDiagnosticsEventListenerTest.cs | 84 +++++--- .../OpenTelemetry.Tests.csproj | 2 +- .../Shared}/CustomTextMapPropagator.cs | 23 ++- .../Shared}/PropagationContextEventArgs.cs | 2 +- .../Trace/ParentBasedSamplerTests.cs | 33 ++-- 37 files changed, 322 insertions(+), 331 deletions(-) create mode 100644 test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockHttpMessageHandler.cs rename test/{OpenTelemetry.Instrumentation.Http.Tests => OpenTelemetry.Tests/Shared}/CustomTextMapPropagator.cs (70%) rename test/{OpenTelemetry.Instrumentation.Http.Tests => OpenTelemetry.Tests/Shared}/PropagationContextEventArgs.cs (94%) diff --git a/Directory.Packages.props b/Directory.Packages.props index 42cf425cee9..a53d8cf7207 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -85,7 +85,6 @@ - diff --git a/src/OpenTelemetry.Api.ProviderBuilderExtensions/AssemblyInfo.cs b/src/OpenTelemetry.Api.ProviderBuilderExtensions/AssemblyInfo.cs index 678ad1e5c91..ac99c40c8e3 100644 --- a/src/OpenTelemetry.Api.ProviderBuilderExtensions/AssemblyInfo.cs +++ b/src/OpenTelemetry.Api.ProviderBuilderExtensions/AssemblyInfo.cs @@ -29,12 +29,10 @@ file static class AssemblyInfo { public const string PublicKey = ", PublicKey=002400000480000094000000060200000024000052534131000400000100010051C1562A090FB0C9F391012A32198B5E5D9A60E9B80FA2D7B434C9E5CCB7259BD606E66F9660676AFC6692B8CDC6793D190904551D2103B7B22FA636DCBB8208839785BA402EA08FC00C8F1500CCEF28BBF599AA64FFB1E1D5DC1BF3420A3777BADFE697856E9D52070A50C3EA5821C80BEF17CA3ACFFA28F89DD413F096F898"; - public const string MoqPublicKey = ", PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7"; } #else file static class AssemblyInfo { public const string PublicKey = ""; - public const string MoqPublicKey = ""; } #endif diff --git a/src/OpenTelemetry.Api/AssemblyInfo.cs b/src/OpenTelemetry.Api/AssemblyInfo.cs index 3709e7402a8..353b015fab5 100644 --- a/src/OpenTelemetry.Api/AssemblyInfo.cs +++ b/src/OpenTelemetry.Api/AssemblyInfo.cs @@ -21,7 +21,6 @@ [assembly: InternalsVisibleTo("OpenTelemetry.Api.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Shims.OpenTracing.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Tests" + AssemblyInfo.PublicKey)] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2" + AssemblyInfo.MoqPublicKey)] #if !EXPOSE_EXPERIMENTAL_FEATURES [assembly: InternalsVisibleTo("OpenTelemetry.Api.ProviderBuilderExtensions.Tests" + AssemblyInfo.PublicKey)] @@ -37,12 +36,10 @@ file static class AssemblyInfo { public const string PublicKey = ", PublicKey=002400000480000094000000060200000024000052534131000400000100010051C1562A090FB0C9F391012A32198B5E5D9A60E9B80FA2D7B434C9E5CCB7259BD606E66F9660676AFC6692B8CDC6793D190904551D2103B7B22FA636DCBB8208839785BA402EA08FC00C8F1500CCEF28BBF599AA64FFB1E1D5DC1BF3420A3777BADFE697856E9D52070A50C3EA5821C80BEF17CA3ACFFA28F89DD413F096F898"; - public const string MoqPublicKey = ", PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7"; } #else file static class AssemblyInfo { public const string PublicKey = ""; - public const string MoqPublicKey = ""; } #endif diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/AssemblyInfo.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/AssemblyInfo.cs index 2bc348cad9a..c4e462217a7 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/AssemblyInfo.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/AssemblyInfo.cs @@ -21,13 +21,13 @@ [assembly: InternalsVisibleTo("Benchmarks, PublicKey=002400000480000094000000060200000024000052534131000400000100010051c1562a090fb0c9f391012a32198b5e5d9a60e9b80fa2d7b434c9e5ccb7259bd606e66f9660676afc6692b8cdc6793d190904551d2103b7b22fa636dcbb8208839785ba402ea08fc00c8f1500ccef28bbf599aa64ffb1e1d5dc1bf3420a3777badfe697856e9d52070a50c3ea5821c80bef17ca3acffa28f89dd413f096f898")] [assembly: InternalsVisibleTo("MockOpenTelemetryCollector, PublicKey=002400000480000094000000060200000024000052534131000400000100010051c1562a090fb0c9f391012a32198b5e5d9a60e9b80fa2d7b434c9e5ccb7259bd606e66f9660676afc6692b8cdc6793d190904551d2103b7b22fa636dcbb8208839785ba402ea08fc00c8f1500ccef28bbf599aa64ffb1e1d5dc1bf3420a3777badfe697856e9d52070a50c3ea5821c80bef17ca3acffa28f89dd413f096f898")] -// Used by Moq. +// Used by NSubstitute. [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] #else [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests")] [assembly: InternalsVisibleTo("Benchmarks")] [assembly: InternalsVisibleTo("MockOpenTelemetryCollector")] -// Used by Moq. +// Used by NSubstitute. [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] #endif diff --git a/src/OpenTelemetry.Extensions.Hosting/AssemblyInfo.cs b/src/OpenTelemetry.Extensions.Hosting/AssemblyInfo.cs index 9c25df52d83..22263c1bb29 100644 --- a/src/OpenTelemetry.Extensions.Hosting/AssemblyInfo.cs +++ b/src/OpenTelemetry.Extensions.Hosting/AssemblyInfo.cs @@ -17,18 +17,15 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("OpenTelemetry.Extensions.Hosting.Tests" + AssemblyInfo.PublicKey)] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2" + AssemblyInfo.MoqPublicKey)] #if SIGNED file static class AssemblyInfo { public const string PublicKey = ", PublicKey=002400000480000094000000060200000024000052534131000400000100010051C1562A090FB0C9F391012A32198B5E5D9A60E9B80FA2D7B434C9E5CCB7259BD606E66F9660676AFC6692B8CDC6793D190904551D2103B7B22FA636DCBB8208839785BA402EA08FC00C8F1500CCEF28BBF599AA64FFB1E1D5DC1BF3420A3777BADFE697856E9D52070A50C3EA5821C80BEF17CA3ACFFA28F89DD413F096F898"; - public const string MoqPublicKey = ", PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7"; } #else file static class AssemblyInfo { public const string PublicKey = ""; - public const string MoqPublicKey = ""; } #endif diff --git a/src/OpenTelemetry/AssemblyInfo.cs b/src/OpenTelemetry/AssemblyInfo.cs index ddcbfd91a8e..3d37bfeecb1 100644 --- a/src/OpenTelemetry/AssemblyInfo.cs +++ b/src/OpenTelemetry/AssemblyInfo.cs @@ -23,7 +23,6 @@ [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.HttpListener.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Extensions.Hosting" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Extensions.Hosting.Tests" + AssemblyInfo.PublicKey)] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2" + AssemblyInfo.MoqPublicKey)] [assembly: InternalsVisibleTo("Benchmarks" + AssemblyInfo.PublicKey)] #if !EXPOSE_EXPERIMENTAL_FEATURES @@ -33,15 +32,17 @@ #endif #if SIGNED +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] + file static class AssemblyInfo { public const string PublicKey = ", PublicKey=002400000480000094000000060200000024000052534131000400000100010051C1562A090FB0C9F391012A32198B5E5D9A60E9B80FA2D7B434C9E5CCB7259BD606E66F9660676AFC6692B8CDC6793D190904551D2103B7B22FA636DCBB8208839785BA402EA08FC00C8F1500CCEF28BBF599AA64FFB1E1D5DC1BF3420A3777BADFE697856E9D52070A50C3EA5821C80BEF17CA3ACFFA28F89DD413F096F898"; - public const string MoqPublicKey = ", PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7"; } #else +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2)] + file static class AssemblyInfo { public const string PublicKey = ""; - public const string MoqPublicKey = ""; } #endif diff --git a/test/Benchmarks/Benchmarks.csproj b/test/Benchmarks/Benchmarks.csproj index cb9be4d43ff..67bc30063f5 100644 --- a/test/Benchmarks/Benchmarks.csproj +++ b/test/Benchmarks/Benchmarks.csproj @@ -15,7 +15,7 @@ - + diff --git a/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs b/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs index f7ed007fc56..b53cafadc93 100644 --- a/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs +++ b/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs @@ -20,7 +20,7 @@ using BenchmarkDotNet.Attributes; using Benchmarks.Helper; using Grpc.Core; -using Moq; +using NSubstitute; using OpenTelemetry; using OpenTelemetry.Internal; using OpenTelemetryProtocol::OpenTelemetry.Exporter; @@ -45,20 +45,19 @@ public class OtlpGrpcExporterBenchmarks [GlobalSetup] public void GlobalSetup() { - var mockClient = new Mock(); - mockClient - .Setup(m => m.Export( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(new OtlpCollector.ExportTraceServiceResponse()); + var mockClient = Substitute.For(); + mockClient.Export( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .Returns(new OtlpCollector.ExportTraceServiceResponse()); var options = new OtlpExporterOptions(); this.exporter = new OtlpTraceExporter( options, new SdkLimitOptions(), - new OtlpGrpcTraceExportClient(options, mockClient.Object)); + new OtlpGrpcTraceExportClient(options, mockClient)); this.activity = ActivityHelper.CreateTestActivity(); this.activityBatch = new CircularBuffer(this.NumberOfSpans); diff --git a/test/Directory.Packages.props b/test/Directory.Packages.props index 575224321a8..60885f6f6e1 100644 --- a/test/Directory.Packages.props +++ b/test/Directory.Packages.props @@ -2,7 +2,8 @@ + - + \ No newline at end of file diff --git a/test/OpenTelemetry.Api.Tests/OpenTelemetry.Api.Tests.csproj b/test/OpenTelemetry.Api.Tests/OpenTelemetry.Api.Tests.csproj index 31c6c8eb3db..b2e0fa8b6db 100644 --- a/test/OpenTelemetry.Api.Tests/OpenTelemetry.Api.Tests.csproj +++ b/test/OpenTelemetry.Api.Tests/OpenTelemetry.Api.Tests.csproj @@ -21,7 +21,6 @@ - runtime; build; native; contentfiles; analyzers diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs index 240c8ad88c1..3ba233545fd 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs @@ -18,8 +18,7 @@ #if !NET6_0_OR_GREATER using System.Net.Http; #endif -using Moq; -using Moq.Protected; +using NSubstitute; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient; using OpenTelemetry.Resources; @@ -94,42 +93,23 @@ public void SendExportRequest_ExportTraceServiceRequest_SendsCorrectHttpRequest( Headers = $"{header1.Name}={header1.Value}, {header2.Name} = {header2.Value}", }; - var httpHandlerMock = new Mock(); + var httpHandlerMock = Substitute.ForPartsOf(); HttpRequestMessage httpRequest = null; var httpRequestContent = Array.Empty(); - httpHandlerMock.Protected() -#if NET6_0_OR_GREATER - .Setup("Send", ItExpr.IsAny(), ItExpr.IsAny()) - .Returns((HttpRequestMessage request, CancellationToken token) => + httpHandlerMock + .MockSend(Arg.Any(), Arg.Any()) + .Returns(new HttpResponseMessage()) + .AndDoes(async call => { - return new HttpResponseMessage(); - }) - .Callback(async (r, ct) => - { - httpRequest = r; - - // We have to capture content as it can't be accessed after request is disposed inside of SendExportRequest method - httpRequestContent = await r.Content.ReadAsByteArrayAsync(ct); - }) -#else - .Setup>("SendAsync", ItExpr.IsAny(), ItExpr.IsAny()) - .ReturnsAsync((HttpRequestMessage request, CancellationToken token) => - { - return new HttpResponseMessage(); - }) - .Callback(async (r, ct) => - { - httpRequest = r; + httpRequest = call.Arg(); // We have to capture content as it can't be accessed after request is disposed inside of SendExportRequest method - httpRequestContent = await r.Content.ReadAsByteArrayAsync(); - }) -#endif - .Verifiable(); + httpRequestContent = await httpRequest.Content.ReadAsByteArrayAsync(); + }); - var exportClient = new OtlpHttpTraceExportClient(options, new HttpClient(httpHandlerMock.Object)); + var exportClient = new OtlpHttpTraceExportClient(options, new HttpClient(httpHandlerMock)); var resourceBuilder = ResourceBuilder.CreateEmpty(); if (includeServiceNameInResource) @@ -137,8 +117,8 @@ public void SendExportRequest_ExportTraceServiceRequest_SendsCorrectHttpRequest( resourceBuilder.AddAttributes( new List> { - new KeyValuePair(ResourceSemanticConventions.AttributeServiceName, "service_name"), - new KeyValuePair(ResourceSemanticConventions.AttributeServiceNamespace, "ns_1"), + new(ResourceSemanticConventions.AttributeServiceName, "service_name"), + new(ResourceSemanticConventions.AttributeServiceNamespace, "ns_1"), }); } @@ -166,7 +146,7 @@ public void SendExportRequest_ExportTraceServiceRequest_SendsCorrectHttpRequest( processor.Shutdown(); - var batch = new Batch(exportedItems.ToArray(), exportedItems.Count); + var batch = new Batch([.. exportedItems], exportedItems.Count); RunTest(batch); void RunTest(Batch batch) diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockHttpMessageHandler.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockHttpMessageHandler.cs new file mode 100644 index 00000000000..642bb1c304f --- /dev/null +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockHttpMessageHandler.cs @@ -0,0 +1,41 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#if !NET6_0_OR_GREATER +using System.Net.Http; +#endif + +namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests; + +public class MockHttpMessageHandler : HttpMessageHandler +{ + public virtual HttpResponseMessage MockSend(HttpRequestMessage request, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } + +#if NET6_0_OR_GREATER + protected override HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken) + { + return this.MockSend(request, cancellationToken); + } +#endif + + protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + return Task.FromResult(this.MockSend(request, cancellationToken)); + } +} diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj index 2e9775519da..56f5d638e9a 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj @@ -12,7 +12,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 090a950b75c..a5296ff2302 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -22,7 +22,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Moq; +using NSubstitute; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient; using OpenTelemetry.Internal; @@ -589,37 +589,37 @@ public void CheckToOtlpLogRecordRespectsAttributeLimits() public void Export_WhenExportClientIsProvidedInCtor_UsesProvidedExportClient() { // Arrange. - var fakeExportClient = new Mock>(); + var fakeExportClient = Substitute.For>(); var emptyLogRecords = Array.Empty(); var emptyBatch = new Batch(emptyLogRecords, emptyLogRecords.Length); var sut = new OtlpLogExporter( new OtlpExporterOptions(), new SdkLimitOptions(), new ExperimentalOptions(), - fakeExportClient.Object); + fakeExportClient); // Act. - var result = sut.Export(emptyBatch); + sut.Export(emptyBatch); // Assert. - fakeExportClient.Verify(x => x.SendExportRequest(It.IsAny(), default), Times.Once()); + fakeExportClient.Received(1).SendExportRequest(Arg.Any(), default); } [Fact] public void Export_WhenExportClientThrowsException_ReturnsExportResultFailure() { // Arrange. - var fakeExportClient = new Mock>(); + var fakeExportClient = Substitute.For>(); var emptyLogRecords = Array.Empty(); var emptyBatch = new Batch(emptyLogRecords, emptyLogRecords.Length); fakeExportClient - .Setup(_ => _.SendExportRequest(It.IsAny(), default)) - .Throws(new Exception("Test Exception")); + .SendExportRequest(Arg.Any(), default) + .Returns(_ => throw new Exception("Test Exception")); var sut = new OtlpLogExporter( new OtlpExporterOptions(), new SdkLimitOptions(), new ExperimentalOptions(), - fakeExportClient.Object); + fakeExportClient); // Act. var result = sut.Export(emptyBatch); @@ -632,17 +632,17 @@ public void Export_WhenExportClientThrowsException_ReturnsExportResultFailure() public void Export_WhenExportIsSuccessful_ReturnsExportResultSuccess() { // Arrange. - var fakeExportClient = new Mock>(); + var fakeExportClient = Substitute.For>(); var emptyLogRecords = Array.Empty(); var emptyBatch = new Batch(emptyLogRecords, emptyLogRecords.Length); fakeExportClient - .Setup(_ => _.SendExportRequest(It.IsAny(), default)) + .SendExportRequest(Arg.Any(), default) .Returns(true); var sut = new OtlpLogExporter( new OtlpExporterOptions(), new SdkLimitOptions(), new ExperimentalOptions(), - fakeExportClient.Object); + fakeExportClient); // Act. var result = sut.Export(emptyBatch); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs index 03fd86bdebe..25e5ad8567d 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs @@ -17,7 +17,7 @@ using System.Diagnostics; using Google.Protobuf.Collections; using Microsoft.Extensions.DependencyInjection; -using Moq; +using NSubstitute; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient; using OpenTelemetry.Metrics; @@ -642,13 +642,13 @@ public void UseOpenTelemetryProtocolActivityExporterWithCustomActivityProcessor( [Fact] public void Shutdown_ClientShutdownIsCalled() { - var exportClientMock = new Mock>(); + var exportClientMock = Substitute.For>(); - var exporter = new OtlpTraceExporter(new OtlpExporterOptions(), DefaultSdkLimitOptions, exportClientMock.Object); + var exporter = new OtlpTraceExporter(new OtlpExporterOptions(), DefaultSdkLimitOptions, exportClientMock); - var result = exporter.Shutdown(); + exporter.Shutdown(); - exportClientMock.Verify(m => m.Shutdown(It.IsAny()), Times.Once()); + exportClientMock.Received(1); } [Fact] diff --git a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests.csproj b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests.csproj index 4d01b88f6bc..e3603d4bc50 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests.csproj +++ b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests.csproj @@ -11,7 +11,6 @@ - runtime; build; native; contentfiles; analyzers diff --git a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests.csproj b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests.csproj index 148f6c843c7..7ab05160d72 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests.csproj +++ b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests.csproj @@ -10,7 +10,6 @@ - runtime; build; native; contentfiles; analyzers diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/OpenTelemetry.Exporter.Zipkin.Tests.csproj b/test/OpenTelemetry.Exporter.Zipkin.Tests/OpenTelemetry.Exporter.Zipkin.Tests.csproj index 8c429974359..d277eb4d15e 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/OpenTelemetry.Exporter.Zipkin.Tests.csproj +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/OpenTelemetry.Exporter.Zipkin.Tests.csproj @@ -17,7 +17,6 @@ - runtime; build; native; contentfiles; analyzers diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj index e1d6d4fb496..8ae85542eba 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj @@ -36,7 +36,6 @@ - runtime; build; native; contentfiles; analyzers diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs index 30d829f4382..3315b38e3b9 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs @@ -24,7 +24,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Moq; using OpenTelemetry.Context.Propagation; using OpenTelemetry.Instrumentation.AspNetCore.Implementation; using OpenTelemetry.Tests; @@ -205,14 +204,9 @@ public async Task CustomPropagator(bool addSampler) var expectedTraceId = ActivityTraceId.CreateRandom(); var expectedSpanId = ActivitySpanId.CreateRandom(); - var propagator = new Mock(); - propagator.Setup(m => m.Extract(It.IsAny(), It.IsAny(), It.IsAny>>())).Returns( - new PropagationContext( - new ActivityContext( - expectedTraceId, - expectedSpanId, - ActivityTraceFlags.Recorded), - default)); + var propagator = new CustomTextMapPropagator(); + propagator.ExtractValues.Add(expectedTraceId.ToString()); + propagator.ExtractValues.Add(expectedSpanId.ToString()); // Arrange using (var testFactory = this.factory @@ -220,7 +214,7 @@ public async Task CustomPropagator(bool addSampler) { builder.ConfigureTestServices(services => { - Sdk.SetDefaultTextMapPropagator(propagator.Object); + Sdk.SetDefaultTextMapPropagator(propagator); var tracerProviderBuilder = Sdk.CreateTracerProviderBuilder(); if (addSampler) @@ -1048,7 +1042,7 @@ private static void WaitForActivityExport(List exportedItems, int coun { // We need to let End callback execute as it is executed AFTER response was returned. // In unit tests environment there may be a lot of parallel unit tests executed, so - // giving some breezing room for the End callback to complete + // giving some breathing room for the End callback to complete Assert.True(SpinWait.SpinUntil( () => { diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj index 186b33a8f7f..b463601ad2d 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/OpenTelemetry.Instrumentation.AspNetCore.Tests.csproj @@ -10,7 +10,6 @@ - runtime; build; native; contentfiles; analyzers @@ -33,8 +32,10 @@ + + diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs index 53328008bfb..6459fd3309f 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs @@ -23,13 +23,13 @@ using Grpc.Net.Client; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Moq; #if !NETFRAMEWORK using OpenTelemetry.Context.Propagation; #endif using OpenTelemetry.Instrumentation.Grpc.Tests.GrpcTestHelpers; using OpenTelemetry.Instrumentation.GrpcNetClient; using OpenTelemetry.Instrumentation.GrpcNetClient.Implementation; +using OpenTelemetry.Tests; using OpenTelemetry.Trace; using Xunit; using Status = OpenTelemetry.Trace.Status; @@ -61,7 +61,7 @@ public void GrpcClientCallsAreCollectedSuccessfully(string baseAddress, bool sho return response; }); - var processor = new Mock>(); + var exportedItems = new List(); using var parent = new Activity("parent") .SetIdFormat(ActivityIdFormat.W3C) @@ -77,7 +77,7 @@ public void GrpcClientCallsAreCollectedSuccessfully(string baseAddress, bool sho options.EnrichWithHttpResponseMessage = (activity, httpResponseMessage) => { enrichWithHttpResponseMessageCalled = true; }; } }) - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { var channel = GrpcChannel.ForAddress(uri, new GrpcChannelOptions @@ -88,8 +88,8 @@ public void GrpcClientCallsAreCollectedSuccessfully(string baseAddress, bool sho var rs = client.SayHello(new HelloRequest()); } - Assert.Equal(5, processor.Invocations.Count); // SetParentProvider/OnStart/OnEnd/OnShutdown/Dispose called. - var activity = (Activity)processor.Invocations[2].Arguments[0]; + Assert.Single(exportedItems); + var activity = exportedItems[0]; ValidateGrpcActivity(activity); Assert.Equal(parent.TraceId, activity.Context.TraceId); @@ -137,7 +137,7 @@ public void GrpcClientCallsAreCollectedSuccessfully(string baseAddress, bool sho [InlineData("http://[::1]", false)] public void GrpcClientCallsAreCollectedSuccessfully_New(string baseAddress, bool shouldEnrich = true) { - KeyValuePair[] config = new KeyValuePair[] { new KeyValuePair("OTEL_SEMCONV_STABILITY_OPT_IN", "http") }; + var config = new KeyValuePair[] { new("OTEL_SEMCONV_STABILITY_OPT_IN", "http") }; var configuration = new ConfigurationBuilder() .AddInMemoryCollection(config) .Build(); @@ -156,7 +156,7 @@ public void GrpcClientCallsAreCollectedSuccessfully_New(string baseAddress, bool return response; }); - var processor = new Mock>(); + var exportedItems = new List(); using var parent = new Activity("parent") .SetIdFormat(ActivityIdFormat.W3C) @@ -173,7 +173,7 @@ public void GrpcClientCallsAreCollectedSuccessfully_New(string baseAddress, bool options.EnrichWithHttpResponseMessage = (activity, httpResponseMessage) => { enrichWithHttpResponseMessageCalled = true; }; } }) - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { var channel = GrpcChannel.ForAddress(uri, new GrpcChannelOptions @@ -184,8 +184,8 @@ public void GrpcClientCallsAreCollectedSuccessfully_New(string baseAddress, bool var rs = client.SayHello(new HelloRequest()); } - Assert.Equal(5, processor.Invocations.Count); // SetParentProvider/OnStart/OnEnd/OnShutdown/Dispose called. - var activity = (Activity)processor.Invocations[2].Arguments[0]; + Assert.Single(exportedItems); + var activity = exportedItems[0]; ValidateGrpcActivity(activity); Assert.Equal(parent.TraceId, activity.Context.TraceId); @@ -252,7 +252,7 @@ public void GrpcClientCallsAreCollectedSuccessfully_Dupe(string baseAddress, boo return response; }); - var processor = new Mock>(); + var exportedItems = new List(); using var parent = new Activity("parent") .SetIdFormat(ActivityIdFormat.W3C) @@ -269,7 +269,7 @@ public void GrpcClientCallsAreCollectedSuccessfully_Dupe(string baseAddress, boo options.EnrichWithHttpResponseMessage = (activity, httpResponseMessage) => { enrichWithHttpResponseMessageCalled = true; }; } }) - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { var channel = GrpcChannel.ForAddress(uri, new GrpcChannelOptions @@ -280,8 +280,8 @@ public void GrpcClientCallsAreCollectedSuccessfully_Dupe(string baseAddress, boo var rs = client.SayHello(new HelloRequest()); } - Assert.Equal(5, processor.Invocations.Count); // SetParentProvider/OnStart/OnEnd/OnShutdown/Dispose called. - var activity = (Activity)processor.Invocations[2].Arguments[0]; + Assert.Single(exportedItems); + var activity = exportedItems[0]; ValidateGrpcActivity(activity); Assert.Equal(parent.TraceId, activity.Context.TraceId); @@ -332,12 +332,8 @@ public void GrpcClientCallsAreCollectedSuccessfully_Dupe(string baseAddress, boo public void GrpcAndHttpClientInstrumentationIsInvoked(bool shouldEnrich) { var uri = new Uri($"http://localhost:{this.server.Port}"); - var processor = new Mock>(); - processor.Setup(x => x.OnStart(It.IsAny())).Callback(c => - { - c.SetTag("enrichedWithHttpRequestMessage", "no"); - c.SetTag("enrichedWithHttpResponseMessage", "no"); - }); + + var exportedItems = new List(); using var parent = new Activity("parent") .Start(); @@ -360,7 +356,7 @@ public void GrpcAndHttpClientInstrumentationIsInvoked(bool shouldEnrich) } }) .AddHttpClientInstrumentation() - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { // With net5, based on the grpc changes, the quantity of default activities changed. @@ -374,9 +370,9 @@ public void GrpcAndHttpClientInstrumentationIsInvoked(bool shouldEnrich) var rs = client.SayHello(new HelloRequest()); } - Assert.Equal(7, processor.Invocations.Count); // SetParentProvider + OnStart/OnEnd (gRPC) + OnStart/OnEnd (HTTP) + OnShutdown/Dispose called. - var httpSpan = (Activity)processor.Invocations[3].Arguments[0]; - var grpcSpan = (Activity)processor.Invocations[4].Arguments[0]; + Assert.Equal(2, exportedItems.Count); + var httpSpan = exportedItems.Single(activity => activity.OperationName == OperationNameHttpOut); + var grpcSpan = exportedItems.Single(activity => activity.OperationName == OperationNameGrpcOut); ValidateGrpcActivity(grpcSpan); Assert.Equal($"greet.Greeter/SayHello", grpcSpan.DisplayName); @@ -384,17 +380,23 @@ public void GrpcAndHttpClientInstrumentationIsInvoked(bool shouldEnrich) Assert.Equal("POST", httpSpan.DisplayName); Assert.Equal(grpcSpan.SpanId, httpSpan.ParentSpanId); - Assert.NotEmpty(grpcSpan.Tags.Where(tag => tag.Key == "enrichedWithHttpRequestMessage")); - Assert.NotEmpty(grpcSpan.Tags.Where(tag => tag.Key == "enrichedWithHttpResponseMessage")); - Assert.Equal(shouldEnrich ? "yes" : "no", grpcSpan.Tags.Where(tag => tag.Key == "enrichedWithHttpRequestMessage").FirstOrDefault().Value); - Assert.Equal(shouldEnrich ? "yes" : "no", grpcSpan.Tags.Where(tag => tag.Key == "enrichedWithHttpResponseMessage").FirstOrDefault().Value); + if (shouldEnrich) + { + Assert.Single(grpcSpan.Tags, tag => tag.Key == "enrichedWithHttpRequestMessage" && tag.Value == "yes"); + Assert.Single(grpcSpan.Tags, tag => tag.Key == "enrichedWithHttpResponseMessage" && tag.Value == "yes"); + } + else + { + Assert.Empty(grpcSpan.Tags.Where(tag => tag.Key == "enrichedWithHttpRequestMessage")); + Assert.Empty(grpcSpan.Tags.Where(tag => tag.Key == "enrichedWithHttpResponseMessage")); + } } [Fact(Skip = "https://github.com/open-telemetry/opentelemetry-dotnet/issues/5092")] public void GrpcAndHttpClientInstrumentationWithSuppressInstrumentation() { var uri = new Uri($"http://localhost:{this.server.Port}"); - var processor = new Mock>(); + var exportedItems = new List(); using var parent = new Activity("parent") .Start(); @@ -403,7 +405,7 @@ public void GrpcAndHttpClientInstrumentationWithSuppressInstrumentation() .SetSampler(new AlwaysOnSampler()) .AddGrpcClientInstrumentation(o => o.SuppressDownstreamInstrumentation = true) .AddHttpClientInstrumentation() - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { Parallel.ForEach( @@ -420,11 +422,11 @@ public void GrpcAndHttpClientInstrumentationWithSuppressInstrumentation() }); } - Assert.Equal(11, processor.Invocations.Count); // SetParentProvider + OnStart/OnEnd (gRPC) * 4 + OnShutdown/Dispose called. - var grpcSpan1 = (Activity)processor.Invocations[2].Arguments[0]; - var grpcSpan2 = (Activity)processor.Invocations[4].Arguments[0]; - var grpcSpan3 = (Activity)processor.Invocations[6].Arguments[0]; - var grpcSpan4 = (Activity)processor.Invocations[8].Arguments[0]; + Assert.Equal(4, exportedItems.Count); + var grpcSpan1 = exportedItems[0]; + var grpcSpan2 = exportedItems[1]; + var grpcSpan3 = exportedItems[2]; + var grpcSpan4 = exportedItems[3]; ValidateGrpcActivity(grpcSpan1); Assert.Equal($"greet.Greeter/SayHello", grpcSpan1.DisplayName); @@ -449,21 +451,18 @@ public void GrpcPropagatesContextWithSuppressInstrumentationOptionSetToTrue() try { var uri = new Uri($"http://localhost:{this.server.Port}"); - var processor = new Mock>(); using var source = new ActivitySource("test-source"); - var propagator = new Mock(); - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, message, action) => - { - action(message, "customField", "customValue"); - }); + var propagator = new CustomTextMapPropagator(); + propagator.InjectValues.Add("customField", context => "customValue"); + + var exportedItems = new List(); Sdk.SetDefaultTextMapPropagator(new CompositeTextMapPropagator(new TextMapPropagator[] { new TraceContextPropagator(), - propagator.Object, + propagator, })); using (Sdk.CreateTracerProviderBuilder() @@ -480,37 +479,21 @@ public void GrpcPropagatesContextWithSuppressInstrumentationOptionSetToTrue() activity.SetCustomProperty("customField", request.Headers["customField"].ToString()); }; }) // Instrumenting the server side as well - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { - using (var activity = source.StartActivity("parent")) - { - Assert.NotNull(activity); - var channel = GrpcChannel.ForAddress(uri); - var client = new Greeter.GreeterClient(channel); - var rs = client.SayHello(new HelloRequest()); - } - - WaitForProcessorInvocations(processor, 7); + using var activity = source.StartActivity("parent"); + Assert.NotNull(activity); + var channel = GrpcChannel.ForAddress(uri); + var client = new Greeter.GreeterClient(channel); + var rs = client.SayHello(new HelloRequest()); } - Assert.Equal(9, processor.Invocations.Count); // SetParentProvider + (OnStart + OnEnd) * 3 (parent, gRPC client, and server) + Shutdown + Dispose called. - - Assert.Single(processor.Invocations, invo => invo.Method.Name == "SetParentProvider"); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnStart), "parent")); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnStart), OperationNameGrpcOut)); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnStart), OperationNameHttpRequestIn)); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnEnd), OperationNameHttpRequestIn)); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnEnd), OperationNameGrpcOut)); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnEnd), "parent")); - Assert.Single(processor.Invocations, invo => invo.Method.Name == "OnShutdown"); - Assert.Single(processor.Invocations, invo => invo.Method.Name == nameof(processor.Object.Dispose)); - - var serverActivity = GetActivityFromProcessorInvocation(processor, nameof(processor.Object.OnEnd), OperationNameHttpRequestIn); - var clientActivity = GetActivityFromProcessorInvocation(processor, nameof(processor.Object.OnEnd), OperationNameGrpcOut); + var serverActivity = exportedItems.Single(activity => activity.OperationName == OperationNameHttpRequestIn); + var clientActivity = exportedItems.Single(activity => activity.OperationName == OperationNameGrpcOut); Assert.Equal($"greet.Greeter/SayHello", clientActivity.DisplayName); - Assert.Equal($"greet.Greeter/SayHello", serverActivity.DisplayName); + Assert.Equal($"POST /greet.Greeter/SayHello", serverActivity.DisplayName); Assert.Equal(clientActivity.TraceId, serverActivity.TraceId); Assert.Equal(clientActivity.SpanId, serverActivity.ParentSpanId); Assert.Equal(0, clientActivity.GetTagValue(SemanticConventions.AttributeRpcGrpcStatusCode)); @@ -532,29 +515,31 @@ public void GrpcDoesNotPropagateContextWithSuppressInstrumentationOptionSetToFal try { var uri = new Uri($"http://localhost:{this.server.Port}"); - var processor = new Mock>(); using var source = new ActivitySource("test-source"); bool isPropagatorCalled = false; - var propagator = new Mock(); - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, message, action) => - { - isPropagatorCalled = true; - }); + var propagator = new CustomTextMapPropagator(); + propagator.Injected += Propagator_Injected; + + void Propagator_Injected(object sender, PropagationContextEventArgs e) + { + isPropagatorCalled = true; + } - Sdk.SetDefaultTextMapPropagator(propagator.Object); + Sdk.SetDefaultTextMapPropagator(propagator); var headers = new Metadata(); + var exportedItems = new List(); + using (Sdk.CreateTracerProviderBuilder() .AddSource("test-source") .AddGrpcClientInstrumentation(o => { o.SuppressDownstreamInstrumentation = false; }) - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { using var activity = source.StartActivity("parent"); @@ -563,15 +548,12 @@ public void GrpcDoesNotPropagateContextWithSuppressInstrumentationOptionSetToFal var rs = client.SayHello(new HelloRequest(), headers); } - Assert.Equal(7, processor.Invocations.Count); // SetParentProvider/OnShutdown/Dispose called. + Assert.Equal(2, exportedItems.Count); + + var parentActivity = exportedItems.Single(activity => activity.OperationName == "parent"); + var clientActivity = exportedItems.Single(activity => activity.OperationName == OperationNameGrpcOut); - Assert.Single(processor.Invocations, invo => invo.Method.Name == "SetParentProvider"); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnStart), "parent")); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnStart), OperationNameGrpcOut)); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnEnd), OperationNameGrpcOut)); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnEnd), "parent")); - Assert.Single(processor.Invocations, invo => invo.Method.Name == "OnShutdown"); - Assert.Single(processor.Invocations, invo => invo.Method.Name == nameof(processor.Object.Dispose)); + Assert.Equal(clientActivity.ParentSpanId, parentActivity.SpanId); // Propagator is not called Assert.False(isPropagatorCalled); @@ -592,22 +574,23 @@ public void GrpcClientInstrumentationRespectsSdkSuppressInstrumentation() try { var uri = new Uri($"http://localhost:{this.server.Port}"); - var processor = new Mock>(); + var exportedItems = new List(); using var source = new ActivitySource("test-source"); bool isPropagatorCalled = false; - var propagator = new Mock(); - propagator.Setup(m => m.Inject(It.IsAny(), It.IsAny(), It.IsAny>())) - .Callback>((context, message, action) => - { - isPropagatorCalled = true; - }); + var propagator = new CustomTextMapPropagator(); + propagator.Injected += Propagator_Injected; + + void Propagator_Injected(object sender, PropagationContextEventArgs e) + { + isPropagatorCalled = true; + } Sdk.SetDefaultTextMapPropagator(new CompositeTextMapPropagator(new TextMapPropagator[] { new TraceContextPropagator(), - propagator.Object, + propagator, })); using (Sdk.CreateTracerProviderBuilder() @@ -616,7 +599,7 @@ public void GrpcClientInstrumentationRespectsSdkSuppressInstrumentation() { o.SuppressDownstreamInstrumentation = true; }) - .AddProcessor(processor.Object) + .AddInMemoryExporter(exportedItems) .Build()) { using var activity = source.StartActivity("parent"); @@ -630,9 +613,7 @@ public void GrpcClientInstrumentationRespectsSdkSuppressInstrumentation() // If suppressed, activity is not emitted and // propagation is also not performed. - Assert.Equal(5, processor.Invocations.Count); // SetParentProvider + (OnStart + OnEnd) * 3 for parent + OnShutdown + Dispose called. - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnStart), "parent")); - Assert.Single(processor.Invocations, GeneratePredicateForMoqProcessorActivity(nameof(processor.Object.OnEnd), "parent")); + Assert.Single(exportedItems); Assert.False(isPropagatorCalled); } finally @@ -680,9 +661,4 @@ private static void ValidateGrpcActivity(Activity activityToValidate) Assert.Equal(GrpcClientDiagnosticListener.Version.ToString(), activityToValidate.Source.Version); Assert.Equal(ActivityKind.Client, activityToValidate.Kind); } - - private static Predicate GeneratePredicateForMoqProcessorActivity(string methodName, string activityOperationName) - { - return invo => invo.Method.Name == methodName && (invo.Arguments[0] as Activity)?.OperationName == activityOperationName; - } } diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs index 73ce23b4c0c..0c24df58e8a 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs @@ -16,7 +16,6 @@ #if NET6_0_OR_GREATER using System.Diagnostics; -using Moq; using OpenTelemetry.Instrumentation.Grpc.Services.Tests; using Xunit; @@ -216,30 +215,6 @@ private static void WaitForExporterToReceiveItems(List itemsReceived, return itemsReceived.Count >= itemCount; }, TimeSpan.FromSeconds(1))); - } - - private static void WaitForProcessorInvocations(Mock> spanProcessor, int invocationCount) - { - // We need to let End callback execute as it is executed AFTER response was returned. - // In unit tests environment there may be a lot of parallel unit tests executed, so - // giving some breezing room for the End callback to complete - Assert.True(SpinWait.SpinUntil( - () => - { - Thread.Sleep(10); - return spanProcessor.Invocations.Count >= invocationCount; - }, - TimeSpan.FromSeconds(1))); - } - - private static Activity GetActivityFromProcessorInvocation(Mock> processor, string methodName, string activityOperationName) - { - return processor.Invocations - .FirstOrDefault(invo => - { - return invo.Method.Name == methodName - && (invo.Arguments[0] as Activity)?.OperationName == activityOperationName; - })?.Arguments[0] as Activity; - } + } } #endif diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/OpenTelemetry.Instrumentation.Grpc.Tests.csproj b/test/OpenTelemetry.Instrumentation.Grpc.Tests/OpenTelemetry.Instrumentation.Grpc.Tests.csproj index 9c393cac718..2e692e2f55b 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/OpenTelemetry.Instrumentation.Grpc.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/OpenTelemetry.Instrumentation.Grpc.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers @@ -46,7 +46,9 @@ + + diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs index 51a236333a3..7fc4dc86dc3 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.Basic.cs @@ -238,8 +238,8 @@ public async Task InjectsHeadersAsync_CustomFormat() parent.ActivityTraceFlags = ActivityTraceFlags.Recorded; var propagator = new CustomTextMapPropagator(); - propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); - propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); + propagator.InjectValues.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.InjectValues.Add("custom_traceState", context => Activity.Current.TraceStateString); Sdk.SetDefaultTextMapPropagator(propagator); @@ -288,8 +288,8 @@ public async Task RespectsSuppress() try { var propagator = new CustomTextMapPropagator(); - propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); - propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); + propagator.InjectValues.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.InjectValues.Add("custom_traceState", context => Activity.Current.TraceStateString); var exportedItems = new List(); @@ -683,8 +683,8 @@ void Propagator_Injected(object sender, PropagationContextEventArgs e) var propagator = new CustomTextMapPropagator(); propagator.Injected += Propagator_Injected; - propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); - propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); + propagator.InjectValues.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.InjectValues.Add("custom_traceState", context => Activity.Current.TraceStateString); var exportedItems = new List(); diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs index 803e997e743..11af39c05dd 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpWebRequestTests.Basic.cs @@ -226,8 +226,8 @@ void Propagator_Injected(object sender, PropagationContextEventArgs e) var propagator = new CustomTextMapPropagator(); propagator.Injected += Propagator_Injected; - propagator.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); - propagator.Add("custom_traceState", context => Activity.Current.TraceStateString); + propagator.InjectValues.Add("custom_traceParent", context => $"00/{context.ActivityContext.TraceId}/{context.ActivityContext.SpanId}/01"); + propagator.InjectValues.Add("custom_traceState", context => Activity.Current.TraceStateString); var exportedItems = new List(); diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj b/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj index ea8d53253c7..ebcac687724 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj @@ -45,4 +45,9 @@ + + + + + diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/OpenTelemetry.Instrumentation.SqlClient.Tests.csproj b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/OpenTelemetry.Instrumentation.SqlClient.Tests.csproj index b6d4f7670eb..2075d0eba89 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/OpenTelemetry.Instrumentation.SqlClient.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/OpenTelemetry.Instrumentation.SqlClient.Tests.csproj @@ -17,7 +17,6 @@ - diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs index 2df68ac8d31..f64dc359b92 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs @@ -19,7 +19,6 @@ using System.Data.SqlClient; using System.Diagnostics; using System.Diagnostics.Tracing; -using Moq; using OpenTelemetry.Instrumentation.SqlClient.Implementation; using OpenTelemetry.Tests; using OpenTelemetry.Trace; @@ -48,9 +47,9 @@ To use Docker... [InlineData(CommandType.StoredProcedure, "sp_who", true)] public async Task SuccessfulCommandTest(CommandType commandType, string commandText, bool captureText, bool isFailure = false) { - var activityProcessor = new Mock>(); + var exportedItems = new List(); using var shutdownSignal = Sdk.CreateTracerProviderBuilder() - .AddProcessor(activityProcessor.Object) + .AddInMemoryExporter(exportedItems) .AddSqlClientInstrumentation(options => { options.SetDbStatementForText = captureText; @@ -78,9 +77,8 @@ public async Task SuccessfulCommandTest(CommandType commandType, string commandT { } - Assert.Equal(3, activityProcessor.Invocations.Count); - - var activity = (Activity)activityProcessor.Invocations[1].Arguments[0]; + Assert.Single(exportedItems); + var activity = exportedItems[0]; VerifyActivityData(commandText, captureText, isFailure, dataSource, activity); } @@ -105,9 +103,9 @@ public void EventSourceFakeTests( { using IFakeBehavingSqlEventSource fakeSqlEventSource = (IFakeBehavingSqlEventSource)Activator.CreateInstance(eventSourceType); - var activityProcessor = new Mock>(); + var exportedItems = new List(); using var shutdownSignal = Sdk.CreateTracerProviderBuilder() - .AddProcessor(activityProcessor.Object) + .AddInMemoryExporter(exportedItems) .AddSqlClientInstrumentation(options => { options.SetDbStatementForText = captureText; @@ -132,9 +130,9 @@ public void EventSourceFakeTests( fakeSqlEventSource.WriteEndExecuteEvent(objectId, compositeState, sqlExceptionNumber); shutdownSignal.Dispose(); - Assert.Equal(5, activityProcessor.Invocations.Count); // SetTracerProvider/OnStart/OnEnd/OnShutdown/Dispose called. + Assert.Single(exportedItems); - var activity = (Activity)activityProcessor.Invocations[2].Arguments[0]; + var activity = exportedItems[0]; VerifyActivityData(commandText, captureText, isFailure, "127.0.0.1", activity, enableConnectionLevelAttributes); } @@ -146,9 +144,9 @@ public void EventSourceFakeUnknownEventWithNullPayloadTest(Type eventSourceType) { using IFakeMisbehavingSqlEventSource fakeSqlEventSource = (IFakeMisbehavingSqlEventSource)Activator.CreateInstance(eventSourceType); - var activityProcessor = new Mock>(); + var exportedItems = new List(); using var shutdownSignal = Sdk.CreateTracerProviderBuilder() - .AddProcessor(activityProcessor.Object) + .AddInMemoryExporter(exportedItems) .AddSqlClientInstrumentation() .Build(); @@ -156,7 +154,7 @@ public void EventSourceFakeUnknownEventWithNullPayloadTest(Type eventSourceType) shutdownSignal.Dispose(); - Assert.Equal(3, activityProcessor.Invocations.Count); // SetTracerProvider/OnShutdown/Dispose called. + Assert.Empty(exportedItems); } [Theory] @@ -166,9 +164,9 @@ public void EventSourceFakeInvalidPayloadTest(Type eventSourceType) { using IFakeMisbehavingSqlEventSource fakeSqlEventSource = (IFakeMisbehavingSqlEventSource)Activator.CreateInstance(eventSourceType); - var activityProcessor = new Mock>(); + var exportedItems = new List(); using var shutdownSignal = Sdk.CreateTracerProviderBuilder() - .AddProcessor(activityProcessor.Object) + .AddInMemoryExporter(exportedItems) .AddSqlClientInstrumentation() .Build(); @@ -177,7 +175,7 @@ public void EventSourceFakeInvalidPayloadTest(Type eventSourceType) fakeSqlEventSource.WriteEndExecuteEvent("arg1", "arg2", "arg3", "arg4"); shutdownSignal.Dispose(); - Assert.Equal(3, activityProcessor.Invocations.Count); // SetTracerProvider/OnShutdown/Dispose called. + Assert.Empty(exportedItems); } [Theory] @@ -187,9 +185,9 @@ public void DefaultCaptureTextFalse(Type eventSourceType) { using IFakeBehavingSqlEventSource fakeSqlEventSource = (IFakeBehavingSqlEventSource)Activator.CreateInstance(eventSourceType); - var activityProcessor = new Mock>(); + var exportedItems = new List(); using var shutdownSignal = Sdk.CreateTracerProviderBuilder() - .AddProcessor(activityProcessor.Object) + .AddInMemoryExporter(exportedItems) .AddSqlClientInstrumentation() .Build(); @@ -211,9 +209,9 @@ public void DefaultCaptureTextFalse(Type eventSourceType) fakeSqlEventSource.WriteEndExecuteEvent(objectId, compositeState, 0); shutdownSignal.Dispose(); - Assert.Equal(5, activityProcessor.Invocations.Count); // SetTracerProvider/OnStart/OnEnd/OnShutdown/Dispose called. + Assert.Single(exportedItems); - var activity = (Activity)activityProcessor.Invocations[2].Arguments[0]; + var activity = exportedItems[0]; const bool captureText = false; VerifyActivityData(commandText, captureText, false, "127.0.0.1", activity, false); diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/OpenTelemetry.Shims.OpenTracing.Tests.csproj b/test/OpenTelemetry.Shims.OpenTracing.Tests/OpenTelemetry.Shims.OpenTracing.Tests.csproj index fb6948c69e8..074ef663c25 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/OpenTelemetry.Shims.OpenTracing.Tests.csproj +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/OpenTelemetry.Shims.OpenTracing.Tests.csproj @@ -8,7 +8,7 @@ - + runtime; build; native; contentfiles; analyzers diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/ScopeManagerShimTests.cs b/test/OpenTelemetry.Shims.OpenTracing.Tests/ScopeManagerShimTests.cs index 4d0b4641525..f12dad34901 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/ScopeManagerShimTests.cs +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/ScopeManagerShimTests.cs @@ -15,7 +15,7 @@ // using System.Diagnostics; -using Moq; +using NSubstitute; using OpenTelemetry.Trace; using Xunit; @@ -56,7 +56,7 @@ public void Activate_SpanMustBeShim() { var shim = new ScopeManagerShim(); - Assert.Throws(() => shim.Activate(new Mock().Object, true)); + Assert.Throws(() => shim.Activate(Substitute.For(), true)); } [Fact] diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs b/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs index 08f2147c7cb..0af53e26e98 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs @@ -16,7 +16,7 @@ using System.Collections; using System.Diagnostics; -using Moq; +using NSubstitute; using OpenTelemetry.Context.Propagation; using OpenTelemetry.Trace; using OpenTracing; @@ -61,13 +61,13 @@ public void Inject_ArgumentValidation() var shim = new TracerShim(TracerProvider.Default, new TraceContextPropagator()); var spanContextShim = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None)); - var mockFormat = new Mock>(); - var mockCarrier = new Mock(); + var mockFormat = Substitute.For>(); + var mockCarrier = Substitute.For(); - Assert.Throws(() => shim.Inject(null, mockFormat.Object, mockCarrier.Object)); - Assert.Throws(() => shim.Inject(new Mock().Object, mockFormat.Object, mockCarrier.Object)); - Assert.Throws(() => shim.Inject(spanContextShim, null, mockCarrier.Object)); - Assert.Throws(() => shim.Inject(spanContextShim, mockFormat.Object, null)); + Assert.Throws(() => shim.Inject(null, mockFormat, mockCarrier)); + Assert.Throws(() => shim.Inject(Substitute.For(), mockFormat, mockCarrier)); + Assert.Throws(() => shim.Inject(spanContextShim, null, mockCarrier)); + Assert.Throws(() => shim.Inject(spanContextShim, mockFormat, null)); } [Fact] @@ -78,11 +78,11 @@ public void Inject_UnknownFormatIgnored() var spanContextShim = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded)); // Only two specific types of ITextMap are supported, and neither is a Mock. - var mockCarrier = new Mock(); - shim.Inject(spanContextShim, new Mock>().Object, mockCarrier.Object); + var mockCarrier = Substitute.For(); + shim.Inject(spanContextShim, Substitute.For>(), mockCarrier); // Verify that the carrier mock was never called. - mockCarrier.Verify(x => x.Set(It.IsAny(), It.IsAny()), Times.Never); + mockCarrier.Received(0).Set(Arg.Any(), Arg.Any()); } [Fact] @@ -90,23 +90,22 @@ public void Extract_ArgumentValidation() { var shim = new TracerShim(TracerProvider.Default, new TraceContextPropagator()); - Assert.Throws(() => shim.Extract(null, new Mock().Object)); - Assert.Throws(() => shim.Extract(new Mock>().Object, null)); + Assert.Throws(() => shim.Extract(null, Substitute.For())); + Assert.Throws(() => shim.Extract(Substitute.For>(), null)); } [Fact] public void Extract_UnknownFormatIgnored() { var shim = new TracerShim(TracerProvider.Default, new TraceContextPropagator()); - - var spanContextShim = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None)); + _ = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None)); // Only two specific types of ITextMap are supported, and neither is a Mock. - var mockCarrier = new Mock(); - var context = shim.Extract(new Mock>().Object, mockCarrier.Object); + var mockCarrier = Substitute.For(); + shim.Extract(Substitute.For>(), mockCarrier); // Verify that the carrier mock was never called. - mockCarrier.Verify(x => x.GetEnumerator(), Times.Never); + mockCarrier.Received(0).GetEnumerator(); } [Fact] @@ -114,7 +113,7 @@ public void Extract_InvalidTraceParent() { var shim = new TracerShim(TracerProvider.Default, new TraceContextPropagator()); - var mockCarrier = new Mock(); + var mockCarrier = Substitute.For(); // The ProxyTracer uses OpenTelemetry.Context.Propagation.TraceContextPropagator, so we need to satisfy the traceparent key at the least var carrierMap = new Dictionary @@ -123,11 +122,11 @@ public void Extract_InvalidTraceParent() { "traceparent", "unused" }, }; - mockCarrier.Setup(x => x.GetEnumerator()).Returns(carrierMap.GetEnumerator()); - var spanContextShim = shim.Extract(BuiltinFormats.TextMap, mockCarrier.Object) as SpanContextShim; + mockCarrier.GetEnumerator().Returns(carrierMap.GetEnumerator()); + var spanContextShim = shim.Extract(BuiltinFormats.TextMap, mockCarrier) as SpanContextShim; // Verify that the carrier was called - mockCarrier.Verify(x => x.GetEnumerator(), Times.Once); + mockCarrier.Received(1).GetEnumerator(); Assert.Null(spanContextShim); } diff --git a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTest.cs b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTest.cs index f85ffb7a1f7..d447971bf75 100644 --- a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTest.cs +++ b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTest.cs @@ -17,7 +17,8 @@ using System.Diagnostics.Tracing; using System.IO.MemoryMappedFiles; using System.Text; -using Moq; +using NSubstitute; +using NSubstitute.ReceivedExtensions; using Xunit; namespace OpenTelemetry.Internal.Tests; @@ -41,47 +42,60 @@ public void SelfDiagnosticsEventListener_constructor_Invalid_Input() [Fact] public void SelfDiagnosticsEventListener_EventSourceSetup_LowerSeverity() { - var configRefresherMock = new Mock(); - var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock.Object); + var configRefresherMock = Substitute.For(); + _ = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock); // Emitting a Verbose event. Or any EventSource event with lower severity than Error. OpenTelemetrySdkEventSource.Log.ActivityStarted("Activity started", "1"); - configRefresherMock.Verify(refresher => refresher.TryGetLogStream(It.IsAny(), out It.Ref.IsAny, out It.Ref.IsAny), Times.Never()); + + configRefresherMock + .Received(0) + .TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()); } [Fact] public void SelfDiagnosticsEventListener_EventSourceSetup_HigherSeverity() { - var configRefresherMock = new Mock(); - configRefresherMock.Setup(configRefresher => configRefresher.TryGetLogStream(It.IsAny(), out It.Ref.IsAny, out It.Ref.IsAny)) - .Returns(true); - var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock.Object); + var configRefresherMock = Substitute.For(); + configRefresherMock.TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()) + .Returns(true); + + var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock); // Emitting an Error event. Or any EventSource event with higher than or equal to to Error severity. OpenTelemetrySdkEventSource.Log.TracerProviderException("TestEvent", "Exception Details"); - configRefresherMock.Verify(refresher => refresher.TryGetLogStream(It.IsAny(), out It.Ref.IsAny, out It.Ref.IsAny)); + configRefresherMock + .Received(1) + .TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()); } [Fact] public void SelfDiagnosticsEventListener_WriteEvent() { // Arrange - var configRefresherMock = new Mock(); + var configRefresherMock = Substitute.For(); var memoryMappedFile = MemoryMappedFile.CreateFromFile(LOGFILEPATH, FileMode.Create, null, 1024); - Stream stream = memoryMappedFile.CreateViewStream(); + var stream = memoryMappedFile.CreateViewStream(); string eventMessage = "Event Message"; int timestampPrefixLength = "2020-08-14T20:33:24.4788109Z:".Length; byte[] bytes = Encoding.UTF8.GetBytes(eventMessage); - int availableByteCount = 100; - configRefresherMock.Setup(configRefresher => configRefresher.TryGetLogStream(timestampPrefixLength + bytes.Length + 1, out stream, out availableByteCount)) - .Returns(true); - var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock.Object); + configRefresherMock.TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()) + .Returns(x => + { + x[1] = stream; + return true; + }); + + var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock); // Act: call WriteEvent method directly listener.WriteEvent(eventMessage, null); // Assert - configRefresherMock.Verify(refresher => refresher.TryGetLogStream(timestampPrefixLength + bytes.Length + 1, out stream, out availableByteCount)); + configRefresherMock + .Received(1) + .TryGetLogStream(timestampPrefixLength + bytes.Length + 1, out Arg.Any(), out Arg.Any()); + stream.Dispose(); memoryMappedFile.Dispose(); AssertFileOutput(LOGFILEPATH, eventMessage); @@ -90,18 +104,18 @@ public void SelfDiagnosticsEventListener_WriteEvent() [Fact] public void SelfDiagnosticsEventListener_DateTimeGetBytes() { - var configRefresherMock = new Mock(); - var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock.Object); + var configRefresherMock = Substitute.For(); + var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock); // Check DateTimeKind of Utc, Local, and Unspecified - DateTime[] datetimes = new DateTime[] - { + DateTime[] datetimes = + [ DateTime.SpecifyKind(DateTime.Parse("1996-12-01T14:02:31.1234567-08:00"), DateTimeKind.Utc), DateTime.SpecifyKind(DateTime.Parse("1996-12-01T14:02:31.1234567-08:00"), DateTimeKind.Local), DateTime.SpecifyKind(DateTime.Parse("1996-12-01T14:02:31.1234567-08:00"), DateTimeKind.Unspecified), DateTime.UtcNow, DateTime.Now, - }; + ]; // Expect to match output string from DateTime.ToString("O") string[] expected = new string[datetimes.Length]; @@ -129,18 +143,20 @@ public void SelfDiagnosticsEventListener_DateTimeGetBytes() public void SelfDiagnosticsEventListener_EmitEvent_OmitAsConfigured() { // Arrange - var configRefresherMock = new Mock(); + var configRefresherMock = Substitute.For(); var memoryMappedFile = MemoryMappedFile.CreateFromFile(LOGFILEPATH, FileMode.Create, null, 1024); Stream stream = memoryMappedFile.CreateViewStream(); - configRefresherMock.Setup(configRefresher => configRefresher.TryGetLogStream(It.IsAny(), out stream, out It.Ref.IsAny)) + configRefresherMock.TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()) .Returns(true); - var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock.Object); + _ = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock); // Act: emit an event with severity lower than configured OpenTelemetrySdkEventSource.Log.ActivityStarted("ActivityStart", "123"); // Assert - configRefresherMock.Verify(refresher => refresher.TryGetLogStream(It.IsAny(), out stream, out It.Ref.IsAny), Times.Never()); + configRefresherMock + .Received(0) + .TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()); stream.Dispose(); memoryMappedFile.Dispose(); @@ -154,18 +170,26 @@ public void SelfDiagnosticsEventListener_EmitEvent_OmitAsConfigured() public void SelfDiagnosticsEventListener_EmitEvent_CaptureAsConfigured() { // Arrange - var configRefresherMock = new Mock(); + var configRefresherMock = Substitute.For(); var memoryMappedFile = MemoryMappedFile.CreateFromFile(LOGFILEPATH, FileMode.Create, null, 1024); Stream stream = memoryMappedFile.CreateViewStream(); - configRefresherMock.Setup(configRefresher => configRefresher.TryGetLogStream(It.IsAny(), out stream, out It.Ref.IsAny)) - .Returns(true); - var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock.Object); + configRefresherMock.TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()) + .Returns(x => + { + x[1] = stream; + return true; + }); + + _ = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresherMock); // Act: emit an event with severity equal to configured OpenTelemetrySdkEventSource.Log.TracerProviderException("TestEvent", "Exception Details"); // Assert - configRefresherMock.Verify(refresher => refresher.TryGetLogStream(It.IsAny(), out stream, out It.Ref.IsAny)); + configRefresherMock + .Received(1) + .TryGetLogStream(Arg.Any(), out Arg.Any(), out Arg.Any()); + stream.Dispose(); memoryMappedFile.Dispose(); diff --git a/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj b/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj index e7b5c8a03e7..d8bfe5ebcde 100644 --- a/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj +++ b/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj @@ -31,7 +31,7 @@ - + runtime; build; native; contentfiles; analyzers diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/CustomTextMapPropagator.cs b/test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs similarity index 70% rename from test/OpenTelemetry.Instrumentation.Http.Tests/CustomTextMapPropagator.cs rename to test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs index 3421081909a..a6164767d15 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/CustomTextMapPropagator.cs +++ b/test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs @@ -14,15 +14,17 @@ // limitations under the License. // +using System.Diagnostics; using OpenTelemetry.Context.Propagation; -namespace OpenTelemetry.Instrumentation.Http.Tests; +namespace OpenTelemetry.Tests; internal sealed class CustomTextMapPropagator : TextMapPropagator { private static readonly PropagationContext DefaultPropagationContext = default; #pragma warning disable SA1010 - private readonly Dictionary> values = []; + public List ExtractValues = []; + public Dictionary> InjectValues = []; public event EventHandler Injected; @@ -30,21 +32,26 @@ internal sealed class CustomTextMapPropagator : TextMapPropagator public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) { + if (this.ExtractValues.Count == 2) + { + return new PropagationContext( + new ActivityContext( + ActivityTraceId.CreateFromString(this.ExtractValues[0].ToCharArray()), + ActivitySpanId.CreateFromString(this.ExtractValues[1].ToCharArray()), + ActivityTraceFlags.Recorded), + default); + } + return DefaultPropagationContext; } public override void Inject(PropagationContext context, T carrier, Action setter) { - foreach (var kv in this.values) + foreach (var kv in this.InjectValues) { setter(carrier, kv.Key, kv.Value.Invoke(context)); } this.Injected?.Invoke(this, new PropagationContextEventArgs(context)); } - - internal void Add(string key, Func func) - { - this.values.Add(key, func); - } } diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/PropagationContextEventArgs.cs b/test/OpenTelemetry.Tests/Shared/PropagationContextEventArgs.cs similarity index 94% rename from test/OpenTelemetry.Instrumentation.Http.Tests/PropagationContextEventArgs.cs rename to test/OpenTelemetry.Tests/Shared/PropagationContextEventArgs.cs index e38ffbc90bb..97c8e622b1f 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/PropagationContextEventArgs.cs +++ b/test/OpenTelemetry.Tests/Shared/PropagationContextEventArgs.cs @@ -16,7 +16,7 @@ using OpenTelemetry.Context.Propagation; -namespace OpenTelemetry.Instrumentation.Http.Tests; +namespace OpenTelemetry.Tests; internal class PropagationContextEventArgs(PropagationContext context) : EventArgs { diff --git a/test/OpenTelemetry.Tests/Trace/ParentBasedSamplerTests.cs b/test/OpenTelemetry.Tests/Trace/ParentBasedSamplerTests.cs index f6a7d9b7dfb..a1eeb58aba8 100644 --- a/test/OpenTelemetry.Tests/Trace/ParentBasedSamplerTests.cs +++ b/test/OpenTelemetry.Tests/Trace/ParentBasedSamplerTests.cs @@ -15,7 +15,8 @@ // using System.Diagnostics; -using Moq; +using NSubstitute; +using NSubstitute.ReceivedExtensions; using Xunit; namespace OpenTelemetry.Trace.Tests; @@ -73,7 +74,7 @@ public void DoNotExamineLinks() { var sampledLink = new ActivityLink[] { - new ActivityLink( + new( new ActivityContext( ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), @@ -105,22 +106,21 @@ public void DoNotExamineLinks() [InlineData(false, false)] public void CustomSamplers(bool parentIsRemote, bool parentIsSampled) { - var mockRepository = new MockRepository(MockBehavior.Strict); - var remoteParentSampled = mockRepository.Create(); - var remoteParentNotSampled = mockRepository.Create(); - var localParentSampled = mockRepository.Create(); - var localParentNotSampled = mockRepository.Create(); + var remoteParentSampled = Substitute.For(); + var remoteParentNotSampled = Substitute.For(); + var localParentSampled = Substitute.For(); + var localParentNotSampled = Substitute.For(); var samplerUnderTest = new ParentBasedSampler( new AlwaysOnSampler(), // root - remoteParentSampled.Object, - remoteParentNotSampled.Object, - localParentSampled.Object, - localParentNotSampled.Object); + remoteParentSampled, + remoteParentNotSampled, + localParentSampled, + localParentNotSampled); var samplingParams = MakeTestParameters(parentIsRemote, parentIsSampled); - Mock invokedSampler; + Sampler invokedSampler; if (parentIsRemote && parentIsSampled) { invokedSampler = remoteParentSampled; @@ -139,13 +139,16 @@ public void CustomSamplers(bool parentIsRemote, bool parentIsSampled) } var expectedResult = new SamplingResult(SamplingDecision.RecordAndSample); - invokedSampler.Setup(sampler => sampler.ShouldSample(samplingParams)).Returns(expectedResult); + invokedSampler.ShouldSample(Arg.Any()).Returns(expectedResult); var actualResult = samplerUnderTest.ShouldSample(samplingParams); - mockRepository.VerifyAll(); + remoteParentSampled.Received(parentIsRemote && parentIsSampled ? 1 : 0).ShouldSample(samplingParams); + remoteParentNotSampled.Received(parentIsRemote && !parentIsSampled ? 1 : 0).ShouldSample(samplingParams); + localParentSampled.Received(!parentIsRemote && parentIsSampled ? 1 : 0).ShouldSample(samplingParams); + localParentNotSampled.Received(!parentIsRemote && !parentIsSampled ? 1 : 0).ShouldSample(samplingParams); + Assert.Equal(expectedResult, actualResult); - mockRepository.VerifyNoOtherCalls(); } [Fact] From 0c9c29e39389cbfc876e23fde279774394f60283 Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:18:43 +0100 Subject: [PATCH 04/10] Fixed code style error --- test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs b/test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs index a6164767d15..8fcf9013c4b 100644 --- a/test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs +++ b/test/OpenTelemetry.Tests/Shared/CustomTextMapPropagator.cs @@ -21,10 +21,10 @@ namespace OpenTelemetry.Tests; internal sealed class CustomTextMapPropagator : TextMapPropagator { - private static readonly PropagationContext DefaultPropagationContext = default; #pragma warning disable SA1010 public List ExtractValues = []; public Dictionary> InjectValues = []; + private static readonly PropagationContext DefaultPropagationContext = default; public event EventHandler Injected; From 7c83eece66906f7bfe57d2290b5fc5135537865d Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:22:30 +0100 Subject: [PATCH 05/10] Missing a blank line before EOF --- test/Directory.Packages.props | 2 +- .../GrpcTests.server.cs | 14 -------------- ...OpenTelemetry.Instrumentation.Http.Tests.csproj | 1 - 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/test/Directory.Packages.props b/test/Directory.Packages.props index 60885f6f6e1..f7319cde9b5 100644 --- a/test/Directory.Packages.props +++ b/test/Directory.Packages.props @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs index 0c24df58e8a..1c987b39879 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs @@ -201,20 +201,6 @@ public void Dispose() { this.server.Dispose(); GC.SuppressFinalize(this); - } - - private static void WaitForExporterToReceiveItems(List itemsReceived, int itemCount) - { - // We need to let End callback execute as it is executed AFTER response was returned. - // In unit tests environment there may be a lot of parallel unit tests executed, so - // giving some breezing room for the End callback to complete - Assert.True(SpinWait.SpinUntil( - () => - { - Thread.Sleep(10); - return itemsReceived.Count >= itemCount; - }, - TimeSpan.FromSeconds(1))); } } #endif diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj b/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj index ebcac687724..97acf17c6aa 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/OpenTelemetry.Instrumentation.Http.Tests.csproj @@ -49,5 +49,4 @@ - From b65456509ab72a0f6ad860a30e206f9fd65a253a Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:24:07 +0100 Subject: [PATCH 06/10] Removed trailing space --- .../GrpcTests.server.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs index 1c987b39879..5aae35b167d 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs @@ -197,10 +197,11 @@ public void GrpcAspNetCoreInstrumentationAddsCorrectAttributesWhenItCreatesNewAc } } */ + public void Dispose() { this.server.Dispose(); GC.SuppressFinalize(this); - } + } } #endif From c5f89c47d3289591066d8674e455ca3fa42cea68 Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:30:23 +0100 Subject: [PATCH 07/10] Using directive is unnecessary --- .../GrpcTests.server.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs index 5aae35b167d..6a376c17125 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.server.cs @@ -15,9 +15,7 @@ // #if NET6_0_OR_GREATER -using System.Diagnostics; using OpenTelemetry.Instrumentation.Grpc.Services.Tests; -using Xunit; namespace OpenTelemetry.Instrumentation.Grpc.Tests; From 86ec17aa5e66d08cb39f9bc912ebad5a45a7abf0 Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:37:41 +0100 Subject: [PATCH 08/10] More unused using statements --- .../OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs index 6459fd3309f..c81a17ac4dc 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs @@ -29,7 +29,6 @@ using OpenTelemetry.Instrumentation.Grpc.Tests.GrpcTestHelpers; using OpenTelemetry.Instrumentation.GrpcNetClient; using OpenTelemetry.Instrumentation.GrpcNetClient.Implementation; -using OpenTelemetry.Tests; using OpenTelemetry.Trace; using Xunit; using Status = OpenTelemetry.Trace.Status; From 0dd250b25748e79029cb96fc6957dd89d0f26ca9 Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:42:24 +0100 Subject: [PATCH 09/10] Fixed build error --- .../OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs index c81a17ac4dc..6459fd3309f 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs @@ -29,6 +29,7 @@ using OpenTelemetry.Instrumentation.Grpc.Tests.GrpcTestHelpers; using OpenTelemetry.Instrumentation.GrpcNetClient; using OpenTelemetry.Instrumentation.GrpcNetClient.Implementation; +using OpenTelemetry.Tests; using OpenTelemetry.Trace; using Xunit; using Status = OpenTelemetry.Trace.Status; From d1cdc67ab19d3a1db8c25b723dfb86194bd15578 Mon Sep 17 00:00:00 2001 From: Nils Gruson Date: Fri, 1 Dec 2023 15:49:11 +0100 Subject: [PATCH 10/10] Conditional using statement --- .../GrpcTests.client.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs index 6459fd3309f..2750474dc27 100644 --- a/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs +++ b/test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs @@ -25,11 +25,11 @@ using Microsoft.Extensions.DependencyInjection; #if !NETFRAMEWORK using OpenTelemetry.Context.Propagation; +using OpenTelemetry.Tests; #endif using OpenTelemetry.Instrumentation.Grpc.Tests.GrpcTestHelpers; using OpenTelemetry.Instrumentation.GrpcNetClient; using OpenTelemetry.Instrumentation.GrpcNetClient.Implementation; -using OpenTelemetry.Tests; using OpenTelemetry.Trace; using Xunit; using Status = OpenTelemetry.Trace.Status;