Skip to content

Commit b5a86f6

Browse files
committed
Add a bunch of integration tests
1 parent 3bdfa50 commit b5a86f6

11 files changed

+220
-29
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// <copyright file="AspNetCoreFeatureFlags.cs" company="Datadog">
2+
// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
4+
// </copyright>
5+
namespace Datadog.Trace.ClrProfiler.IntegrationTests.AspNetCore;
6+
7+
public enum AspNetCoreFeatureFlags
8+
{
9+
/// <summary>
10+
/// No config features enabled
11+
/// </summary>
12+
None,
13+
14+
/// <summary>
15+
/// Route Template resource names enabled
16+
/// </summary>
17+
RouteTemplateResourceNames,
18+
19+
/// <summary>
20+
/// Single span aspnetcore enabled
21+
/// </summary>
22+
SingleSpan
23+
}

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/AspNetCore/AspNetCoreIisMinimalApisTests.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,36 @@ public AspNetCoreIisMinimalApisTestsOutOfProcessWithFeatureFlag(IisFixture fixtu
5252
}
5353
}
5454

55+
[Collection("IisTests")]
56+
public class AspNetCoreIisMinimalApisTestsInProcessSingleSpan : AspNetCoreIisMinimalApisTests
57+
{
58+
public AspNetCoreIisMinimalApisTestsInProcessSingleSpan(IisFixture fixture, ITestOutputHelper output)
59+
: base(fixture, output, inProcess: true, flags: AspNetCoreFeatureFlags.SingleSpan)
60+
{
61+
}
62+
}
63+
64+
[Collection("IisTests")]
65+
public class AspNetCoreIisMinimalApisTestsOutOfProcessSingleSpan : AspNetCoreIisMinimalApisTests
66+
{
67+
public AspNetCoreIisMinimalApisTestsOutOfProcessSingleSpan(IisFixture fixture, ITestOutputHelper output)
68+
: base(fixture, output, inProcess: false, flags: AspNetCoreFeatureFlags.SingleSpan)
69+
{
70+
}
71+
}
72+
5573
public abstract class AspNetCoreIisMinimalApisTests : AspNetCoreIisMvcTestBase, IAsyncLifetime
5674
{
5775
private readonly IisFixture _iisFixture;
5876
private readonly string _testName;
5977

6078
protected AspNetCoreIisMinimalApisTests(IisFixture fixture, ITestOutputHelper output, bool inProcess, bool enableRouteTemplateResourceNames)
61-
: base("AspNetCoreMinimalApis", fixture, output, inProcess, enableRouteTemplateResourceNames)
79+
: this(fixture, output, inProcess, enableRouteTemplateResourceNames ? AspNetCoreFeatureFlags.RouteTemplateResourceNames : AspNetCoreFeatureFlags.None)
80+
{
81+
}
82+
83+
protected AspNetCoreIisMinimalApisTests(IisFixture fixture, ITestOutputHelper output, bool inProcess, AspNetCoreFeatureFlags flags)
84+
: base("AspNetCoreMinimalApis", fixture, output, inProcess, flags)
6285
{
6386
_testName = GetTestName(nameof(AspNetCoreIisMinimalApisTests));
6487
_iisFixture = fixture;

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/AspNetCore/AspNetCoreIisMvc31Tests.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,37 @@ public AspNetCoreIisMvc31TestsOutOfProcessWithFeatureFlag(IisFixture fixture, IT
5252
}
5353
}
5454

55+
#if NET6_0_OR_GREATER
56+
[Collection("IisTests")]
57+
public class AspNetCoreIisMvc31TestsInProcessSingleSpan : AspNetCoreIisMvc31Tests
58+
{
59+
public AspNetCoreIisMvc31TestsInProcessSingleSpan(IisFixture fixture, ITestOutputHelper output)
60+
: base(fixture, output, inProcess: true, flags: AspNetCoreFeatureFlags.SingleSpan)
61+
{
62+
}
63+
}
64+
65+
public class AspNetCoreIisMvc31TestsOutOfProcessSingleSpan : AspNetCoreIisMvc31Tests
66+
{
67+
public AspNetCoreIisMvc31TestsOutOfProcessSingleSpan(IisFixture fixture, ITestOutputHelper output)
68+
: base(fixture, output, inProcess: false, flags: AspNetCoreFeatureFlags.SingleSpan)
69+
{
70+
}
71+
}
72+
#endif
73+
5574
public abstract class AspNetCoreIisMvc31Tests : AspNetCoreIisMvcTestBase, IAsyncLifetime
5675
{
5776
private readonly IisFixture _iisFixture;
5877
private readonly string _testName;
5978

6079
protected AspNetCoreIisMvc31Tests(IisFixture fixture, ITestOutputHelper output, bool inProcess, bool enableRouteTemplateResourceNames)
61-
: base("AspNetCoreMvc31", fixture, output, inProcess, enableRouteTemplateResourceNames)
80+
: this(fixture, output, inProcess, enableRouteTemplateResourceNames ? AspNetCoreFeatureFlags.RouteTemplateResourceNames : AspNetCoreFeatureFlags.None)
81+
{
82+
}
83+
84+
protected AspNetCoreIisMvc31Tests(IisFixture fixture, ITestOutputHelper output, bool inProcess, AspNetCoreFeatureFlags flags)
85+
: base("AspNetCoreMvc31", fixture, output, inProcess, flags)
6286
{
6387
_testName = GetTestName(nameof(AspNetCoreIisMvc31Tests));
6488
_iisFixture = fixture;

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/AspNetCore/AspNetCoreIisMvcTestBase.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,24 @@ namespace Datadog.Trace.ClrProfiler.IntegrationTests.AspNetCore
1515
[UsesVerify]
1616
public abstract class AspNetCoreIisMvcTestBase : TracingIntegrationTest, IClassFixture<IisFixture>
1717
{
18-
private readonly bool _enableRouteTemplateResourceNames;
18+
private readonly AspNetCoreFeatureFlags _flags;
1919

2020
protected AspNetCoreIisMvcTestBase(string sampleName, IisFixture fixture, ITestOutputHelper output, bool inProcess, bool enableRouteTemplateResourceNames)
21+
: this(sampleName, fixture, output, inProcess, enableRouteTemplateResourceNames ? AspNetCoreFeatureFlags.RouteTemplateResourceNames : AspNetCoreFeatureFlags.None)
22+
{
23+
}
24+
25+
protected AspNetCoreIisMvcTestBase(string sampleName, IisFixture fixture, ITestOutputHelper output, bool inProcess, AspNetCoreFeatureFlags flags)
2126
: base(sampleName, output)
2227
{
2328
InProcess = inProcess;
24-
_enableRouteTemplateResourceNames = enableRouteTemplateResourceNames;
29+
_flags = flags;
2530
SetEnvironmentVariable(ConfigurationKeys.HttpServerErrorStatusCodes, "400-403, 500-503");
2631

2732
SetServiceVersion("1.0.0");
2833

29-
SetEnvironmentVariable(ConfigurationKeys.FeatureFlags.RouteTemplateResourceNamesEnabled, enableRouteTemplateResourceNames.ToString());
34+
SetEnvironmentVariable(ConfigurationKeys.FeatureFlags.RouteTemplateResourceNamesEnabled, (flags == AspNetCoreFeatureFlags.RouteTemplateResourceNames).ToString());
35+
SetEnvironmentVariable(ConfigurationKeys.FeatureFlags.SingleSpanAspnetcoreEnabled, (flags == AspNetCoreFeatureFlags.SingleSpan).ToString());
3036

3137
Fixture = fixture;
3238
}
@@ -64,7 +70,12 @@ protected string GetTestName(string testName)
6470
{
6571
return testName
6672
+ (InProcess ? ".InProcess" : ".OutOfProcess")
67-
+ (_enableRouteTemplateResourceNames ? ".WithFF" : ".NoFF");
73+
+ _flags switch
74+
{
75+
AspNetCoreFeatureFlags.RouteTemplateResourceNames => ".WithFF",
76+
AspNetCoreFeatureFlags.SingleSpan => ".Single",
77+
_ => ".NoFF",
78+
};
6879
}
6980
}
7081
}

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/AspNetCore/AspNetCoreMinimalApisTests.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,23 @@ namespace Datadog.Trace.ClrProfiler.IntegrationTests.AspNetCore
2020
public class AspNetCoreMinimalApisTestsCallTarget : AspNetCoreMinimalApisTests
2121
{
2222
public AspNetCoreMinimalApisTestsCallTarget(AspNetCoreTestFixture fixture, ITestOutputHelper output)
23-
: base(fixture, output, enableRouteTemplateResourceNames: false)
23+
: base(fixture, output, AspNetCoreFeatureFlags.None)
2424
{
2525
}
2626
}
2727

2828
public class AspNetCoreMinimalApisTestsCallTargetWithFeatureFlag : AspNetCoreMinimalApisTests
2929
{
3030
public AspNetCoreMinimalApisTestsCallTargetWithFeatureFlag(AspNetCoreTestFixture fixture, ITestOutputHelper output)
31-
: base(fixture, output, enableRouteTemplateResourceNames: true)
31+
: base(fixture, output, AspNetCoreFeatureFlags.RouteTemplateResourceNames)
32+
{
33+
}
34+
}
35+
36+
public class AspNetCoreMinimalApisTestsCallTargetSingleSpan : AspNetCoreMinimalApisTests
37+
{
38+
public AspNetCoreMinimalApisTestsCallTargetSingleSpan(AspNetCoreTestFixture fixture, ITestOutputHelper output)
39+
: base(fixture, output, AspNetCoreFeatureFlags.SingleSpan)
3240
{
3341
}
3442
}
@@ -37,8 +45,8 @@ public abstract class AspNetCoreMinimalApisTests : AspNetCoreMvcTestBase
3745
{
3846
private readonly string _testName;
3947

40-
protected AspNetCoreMinimalApisTests(AspNetCoreTestFixture fixture, ITestOutputHelper output, bool enableRouteTemplateResourceNames)
41-
: base("AspNetCoreMinimalApis", fixture, output, enableRouteTemplateResourceNames)
48+
protected AspNetCoreMinimalApisTests(AspNetCoreTestFixture fixture, ITestOutputHelper output, AspNetCoreFeatureFlags flags)
49+
: base("AspNetCoreMinimalApis", fixture, output, flags)
4250
{
4351
_testName = GetTestName(nameof(AspNetCoreMinimalApisTests));
4452
}

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/AspNetCore/AspNetCoreMvc31InferredProxySpansTests.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
44
// </copyright>
55

6-
#if NETCOREAPP3_1
6+
// Only testing a single specific TFM just to reduce overhead
7+
#if NET8_0
78

89
#pragma warning disable SA1402 // File may only contain a single class
910
#pragma warning disable SA1649 // File name must match first type name
@@ -24,38 +25,50 @@ namespace Datadog.Trace.ClrProfiler.IntegrationTests.AspNetCore
2425
public class AspNetCoreMvc31InferredProxySpansEnabled : AspNetCoreMvc31InferredProxySpansTests
2526
{
2627
public AspNetCoreMvc31InferredProxySpansEnabled(AspNetCoreTestFixture fixture, ITestOutputHelper output)
27-
: base(fixture, output, inferredProxySpansEnabled: true)
28+
: base(fixture, output, inferredProxySpansEnabled: true, AspNetCoreFeatureFlags.RouteTemplateResourceNames)
2829
{
2930
}
3031
}
3132

3233
public class AspNetCoreMvc31InferredProxySpansDisabled : AspNetCoreMvc31InferredProxySpansTests
3334
{
3435
public AspNetCoreMvc31InferredProxySpansDisabled(AspNetCoreTestFixture fixture, ITestOutputHelper output)
35-
: base(fixture, output, inferredProxySpansEnabled: false)
36+
: base(fixture, output, inferredProxySpansEnabled: false, AspNetCoreFeatureFlags.RouteTemplateResourceNames)
37+
{
38+
}
39+
}
40+
41+
public class AspNetCoreMvc31InferredProxySpansEnabledSingleSpan : AspNetCoreMvc31InferredProxySpansTests
42+
{
43+
public AspNetCoreMvc31InferredProxySpansEnabledSingleSpan(AspNetCoreTestFixture fixture, ITestOutputHelper output)
44+
: base(fixture, output, inferredProxySpansEnabled: true, AspNetCoreFeatureFlags.SingleSpan)
3645
{
3746
}
3847
}
3948

4049
public abstract class AspNetCoreMvc31InferredProxySpansTests : AspNetCoreMvcTestBase
4150
{
4251
private readonly bool _inferredProxySpansEnabled;
52+
private readonly bool _isSingleSpan;
4353
private readonly string _testName;
4454

4555
protected AspNetCoreMvc31InferredProxySpansTests(
4656
AspNetCoreTestFixture fixture,
4757
ITestOutputHelper output,
48-
bool inferredProxySpansEnabled)
58+
bool inferredProxySpansEnabled,
59+
AspNetCoreFeatureFlags flags)
4960
: base(
5061
"AspNetCoreMvc31",
5162
fixture,
5263
output,
53-
enableRouteTemplateResourceNames: true)
64+
flags)
5465
{
5566
_inferredProxySpansEnabled = inferredProxySpansEnabled;
67+
_isSingleSpan = flags == AspNetCoreFeatureFlags.SingleSpan;
5668

5769
var enabled = inferredProxySpansEnabled ? "Enabled" : "Disabled";
58-
_testName = $"{nameof(AspNetCoreMvc31InferredProxySpansTests)}.{enabled}";
70+
var single = flags == AspNetCoreFeatureFlags.SingleSpan ? ".Single" : string.Empty;
71+
_testName = $"{nameof(AspNetCoreMvc31InferredProxySpansTests)}.{enabled}{single}";
5972

6073
SetEnvironmentVariable(ConfigurationKeys.FeatureFlags.InferredProxySpansEnabled, inferredProxySpansEnabled ? "true" : "false");
6174
}
@@ -70,6 +83,12 @@ protected AspNetCoreMvc31InferredProxySpansTests(
7083
[InlineData("/handled-exception", 500, 2)]
7184
public async Task MeetsAllAspNetCoreMvcExpectations(string path, int statusCode, int spanCount)
7285
{
86+
// single span only creates a single span!
87+
if (_isSingleSpan)
88+
{
89+
spanCount = 1;
90+
}
91+
7392
var start = DateTimeOffset.UtcNow;
7493
await Fixture.TryStartApp(this);
7594

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/AspNetCore/AspNetCoreMvc31Tests.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,35 @@ namespace Datadog.Trace.ClrProfiler.IntegrationTests.AspNetCore
2020
public class AspNetCoreMvc31TestsCallTarget : AspNetCoreMvc31Tests
2121
{
2222
public AspNetCoreMvc31TestsCallTarget(AspNetCoreTestFixture fixture, ITestOutputHelper output)
23-
: base(fixture, output, enableRouteTemplateResourceNames: false)
23+
: base(fixture, output, AspNetCoreFeatureFlags.None)
2424
{
2525
}
2626
}
2727

2828
public class AspNetCoreMvc31TestsCallTargetWithFeatureFlag : AspNetCoreMvc31Tests
2929
{
3030
public AspNetCoreMvc31TestsCallTargetWithFeatureFlag(AspNetCoreTestFixture fixture, ITestOutputHelper output)
31-
: base(fixture, output, enableRouteTemplateResourceNames: true)
31+
: base(fixture, output, AspNetCoreFeatureFlags.RouteTemplateResourceNames)
3232
{
3333
}
3434
}
3535

36+
#if NET6_0_OR_GREATER
37+
public class AspNetCoreMvc31TestsCallTargetSingleSpan : AspNetCoreMvc31Tests
38+
{
39+
public AspNetCoreMvc31TestsCallTargetSingleSpan(AspNetCoreTestFixture fixture, ITestOutputHelper output)
40+
: base(fixture, output, AspNetCoreFeatureFlags.SingleSpan)
41+
{
42+
}
43+
}
44+
#endif
45+
3646
public abstract class AspNetCoreMvc31Tests : AspNetCoreMvcTestBase
3747
{
3848
private readonly string _testName;
3949

40-
protected AspNetCoreMvc31Tests(AspNetCoreTestFixture fixture, ITestOutputHelper output, bool enableRouteTemplateResourceNames)
41-
: base("AspNetCoreMvc31", fixture, output, enableRouteTemplateResourceNames)
50+
protected AspNetCoreMvc31Tests(AspNetCoreTestFixture fixture, ITestOutputHelper output, AspNetCoreFeatureFlags flags)
51+
: base("AspNetCoreMvc31", fixture, output, flags)
4252
{
4353
SetEnvironmentVariable("ADD_EXTRA_MIDDLEWARE", "1");
4454
_testName = GetTestName(nameof(AspNetCoreMvc31Tests));
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// <copyright file="AspNetCoreMvc31WrongMethodSingleSpanTests.cs" company="Datadog">
2+
// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
4+
// </copyright>
5+
6+
// Only testing a single specific TFM just to reduce overhead
7+
#if NET8_0
8+
using System.Threading.Tasks;
9+
using Datadog.Trace.TestHelpers;
10+
using Xunit;
11+
using Xunit.Abstractions;
12+
13+
namespace Datadog.Trace.ClrProfiler.IntegrationTests.AspNetCore;
14+
15+
public class AspNetCoreMvc31WrongMethodSingleSpanTests : AspNetCoreMvcWrongMethodTestBase
16+
{
17+
public AspNetCoreMvc31WrongMethodSingleSpanTests(AspNetCoreTestFixture fixture, ITestOutputHelper output)
18+
: base(nameof(AspNetCoreMvc31WrongMethodSingleSpanTests), "AspNetCoreMvc31", fixture, output, singleSpan: true)
19+
{
20+
}
21+
22+
[Trait("Category", "EndToEnd")]
23+
[Trait("RunOnWindows", "True")]
24+
[SkippableTheory]
25+
[InlineData("/")]
26+
[InlineData("/delay/0")]
27+
public async Task MeetsAllAspNetCoreMvcExpectationsWithIncorrectMethod(string path)
28+
{
29+
await TestIncorrectMethod(path);
30+
}
31+
}
32+
#endif

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/AspNetCore/AspNetCoreMvcResourceBasedSamplingTest.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
namespace Datadog.Trace.ClrProfiler.IntegrationTests.AspNetCore;
2121

22+
// Only testing a single specific TFM for each, just to reduce overhead
2223
#if NETCOREAPP2_1
2324
public class AspNetCoreMvc21ResourceBasedSamplingTests : AspNetCoreMvcResourceBasedSamplingTestBase
2425
{
@@ -90,6 +91,32 @@ public AspNetCoreIisMvc31MvcResourceBasedSamplingOutOfProcessTests(IisFixture fi
9091
{
9192
}
9293
}
94+
#elif NET8_0
95+
public class AspNetCoreMvc31ResourceBasedSamplingSingleSpanTests : AspNetCoreMvcResourceBasedSamplingTestBase
96+
{
97+
public AspNetCoreMvc31ResourceBasedSamplingSingleSpanTests(AspNetCoreTestFixture fixture, ITestOutputHelper output)
98+
: base(nameof(AspNetCoreMvc31ResourceBasedSamplingSingleSpanTests), "AspNetCoreMvc31", fixture, output, singleSpan: true)
99+
{
100+
}
101+
}
102+
103+
[Collection("IisTests")]
104+
public class AspNetCoreIisMvc31MvcResourceBasedSamplingInProcessSingleSpanTests : AspNetCoreIisMvcResourceBasedSamplingTestBase
105+
{
106+
public AspNetCoreIisMvc31MvcResourceBasedSamplingInProcessSingleSpanTests(IisFixture fixture, ITestOutputHelper output)
107+
: base(nameof(AspNetCoreIisMvc31MvcResourceBasedSamplingInProcessSingleSpanTests), "AspNetCoreMvc31", fixture, output, inProcess: true, singleSpan: true)
108+
{
109+
}
110+
}
111+
112+
[Collection("IisTests")]
113+
public class AspNetCoreIisMvc31MvcResourceBasedSamplingOutOfProcessSingleSpanTests : AspNetCoreIisMvcResourceBasedSamplingTestBase
114+
{
115+
public AspNetCoreIisMvc31MvcResourceBasedSamplingOutOfProcessSingleSpanTests(IisFixture fixture, ITestOutputHelper output)
116+
: base(nameof(AspNetCoreIisMvc31MvcResourceBasedSamplingOutOfProcessSingleSpanTests), "AspNetCoreMvc31", fixture, output, inProcess: false, singleSpan: true)
117+
{
118+
}
119+
}
93120
#endif
94121

95122
[UsesVerify]
@@ -98,8 +125,8 @@ public abstract class AspNetCoreMvcResourceBasedSamplingTestBase : AspNetCoreMvc
98125
private readonly AspNetCoreTestFixture fixture;
99126
private readonly string _testName;
100127

101-
public AspNetCoreMvcResourceBasedSamplingTestBase(string testName, string sampleName, AspNetCoreTestFixture fixture, ITestOutputHelper output)
102-
: base(sampleName, fixture, output, enableRouteTemplateResourceNames: true)
128+
public AspNetCoreMvcResourceBasedSamplingTestBase(string testName, string sampleName, AspNetCoreTestFixture fixture, ITestOutputHelper output, bool singleSpan = false)
129+
: base(sampleName, fixture, output, singleSpan ? AspNetCoreFeatureFlags.SingleSpan : AspNetCoreFeatureFlags.RouteTemplateResourceNames)
103130
{
104131
// These test resource-based sampling on the parent ASP.NET span (non-MVC) one.
105132
SetEnvironmentVariable(ConfigurationKeys.CustomSamplingRules, """[{"sample_rate":0.0, "service":"*", "resource":"GET /ping"}]""");
@@ -136,8 +163,8 @@ public abstract class AspNetCoreIisMvcResourceBasedSamplingTestBase : AspNetCore
136163
private readonly IisFixture _iisFixture;
137164
private readonly string _testName;
138165

139-
protected AspNetCoreIisMvcResourceBasedSamplingTestBase(string testName, string sampleName, IisFixture fixture, ITestOutputHelper output, bool inProcess)
140-
: base(sampleName, fixture, output, inProcess, enableRouteTemplateResourceNames: true)
166+
protected AspNetCoreIisMvcResourceBasedSamplingTestBase(string testName, string sampleName, IisFixture fixture, ITestOutputHelper output, bool inProcess, bool singleSpan = false)
167+
: base(sampleName, fixture, output, inProcess, singleSpan ? AspNetCoreFeatureFlags.SingleSpan : AspNetCoreFeatureFlags.RouteTemplateResourceNames)
141168
{
142169
_iisFixture = fixture;
143170
_testName = testName;

0 commit comments

Comments
 (0)