diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/InProcServerTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/InProcServerTests.cs new file mode 100644 index 0000000000..20b3ef3c60 --- /dev/null +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/InProcServerTests.cs @@ -0,0 +1,88 @@ +// +// 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; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using OpenTelemetry.Trace; +using Xunit; + +namespace OpenTelemetry.Instrumentation.AspNetCore.Tests +{ + public sealed class InProcServerTests : IDisposable + { + private TracerProvider tracerProvider; + private WebApplication app; + private HttpClient client; + private List exportedItems; + + public InProcServerTests() + { + this.exportedItems = new List(); + var builder = WebApplication.CreateBuilder(); + var app = builder.Build(); + + this.tracerProvider = Sdk.CreateTracerProviderBuilder() + .AddAspNetCoreInstrumentation() + .AddInMemoryExporter(this.exportedItems).Build(); + app.MapGet("/", () => "Hello World!"); + app.RunAsync(); + + this.app = app; + this.client = new HttpClient(); + } + + [Fact] + public async void ExampleTest() + { + var res = await this.client.GetStringAsync("http://localhost:5000"); + Assert.NotNull(res); + + this.tracerProvider.ForceFlush(); + for (var i = 0; i < 10; i++) + { + if (this.exportedItems.Count > 0) + { + break; + } + + // 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 + await Task.Delay(TimeSpan.FromSeconds(1)); + } + + var activity = this.exportedItems[0]; + Assert.Equal(ActivityKind.Server, activity.Kind); + Assert.Equal("localhost:5000", activity.GetTagValue(SemanticConventions.AttributeHttpHost)); + Assert.Equal("GET", activity.GetTagValue(SemanticConventions.AttributeHttpMethod)); + Assert.Equal("1.1", activity.GetTagValue(SemanticConventions.AttributeHttpFlavor)); + Assert.Equal(200, activity.GetTagValue(SemanticConventions.AttributeHttpStatusCode)); + } + + public async void Dispose() + { + this.tracerProvider.Dispose(); + this.client.Dispose(); + await this.app.DisposeAsync(); + } + } +} +#endif