Skip to content

Commit a4ff75f

Browse files
authored
[tests] Workload tests follow up (dotnet#4260)
- Remove unused workload install target - BuildEnvironment: always clean the local nuget cache on CI - Move all the RequiresDocker attribute classes to the Common directory - Improve failure message for workload tests when sdk+workload is not installed - Handle IOExceptions when deleting `testroot` to avoid failing the tests if something is in use by a running process - Install playwright dependencies on windows * Remove RequiresDockerTheory/RequiresDockerFact attributes .. in favor of one `RequiresDocker` attribute. * Use ProjectReference to Aspire.Components.Common.Tests instead of directly importing RequiresDocker*.cs files, so the xunit discoverer can run Co-authored by @ eerhardt
1 parent 42f0f22 commit a4ff75f

File tree

36 files changed

+152
-132
lines changed

36 files changed

+152
-132
lines changed

tests/Shared/WorkloadTesting/RequiresDockerAttribute.cs tests/Aspire.Components.Common.Tests/RequiresDockerAttribute.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4-
using Xunit;
54
using Xunit.Sdk;
65

7-
namespace Aspire.Workload.Tests;
6+
namespace Aspire.Components.Common.Tests;
87

9-
[TraitDiscoverer("Aspire.Workload.Tests.RequiresDockerDiscoverer", "Aspire.Workload.Tests")]
8+
[TraitDiscoverer("Aspire.Components.Common.Tests.RequiresDockerDiscoverer", "Aspire.Components.Common.Tests")]
109
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
1110
public class RequiresDockerAttribute : Attribute, ITraitAttribute
1211
{
12+
public static bool IsSupported => !OperatingSystem.IsWindows() || Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT") is null;
13+
1314
public string? Reason { get; init; }
1415
public RequiresDockerAttribute(string? reason = null)
1516
{

tests/Shared/WorkloadTesting/RequiresDockerDiscoverer.cs tests/Aspire.Components.Common.Tests/RequiresDockerDiscoverer.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4-
using Aspire.Components.Common.Tests;
54
using Microsoft.DotNet.XUnitExtensions;
65
using Xunit.Abstractions;
76
using Xunit.Sdk;
87

9-
namespace Aspire.Workload.Tests;
8+
namespace Aspire.Components.Common.Tests;
109

1110
public class RequiresDockerDiscoverer : ITraitDiscoverer
1211
{
1312
public IEnumerable<KeyValuePair<string, string>> GetTraits(IAttributeInfo traitAttribute)
1413
{
15-
if (!RequiresDockerTheoryAttribute.IsSupported)
14+
if (!RequiresDockerAttribute.IsSupported)
1615
{
1716
yield return new KeyValuePair<string, string>(XunitConstants.Category, "failing");
1817
}

tests/Aspire.Components.Common.Tests/RequiresDockerTheoryAttribute.cs

-41
This file was deleted.

tests/Aspire.EndToEnd.Tests/IntegrationServicesFixture.cs

+2-6
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,9 @@ public Task DumpComponentLogsAsync(TestResourceNames resource, ITestOutputHelper
125125

126126
public async Task DisposeAsync()
127127
{
128-
if (Project?.AppHostProcess is not null)
128+
if (_project is not null)
129129
{
130-
await Project.DumpDockerInfoAsync(new TestOutputWrapper(null));
131-
}
132-
if (Project is not null)
133-
{
134-
await Project.DisposeAsync();
130+
await _project.DisposeAsync();
135131
}
136132
}
137133

tests/Aspire.Microsoft.Data.SqlClient.Tests/ConformanceTests.cs

+6-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class ConformanceTests : ConformanceTests<SqlConnection, MicrosoftDataSql
1616
{
1717
private readonly SqlServerContainerFixture? _containerFixture;
1818
private string ConnectionString { get; set; }
19-
protected override bool CanConnectToServer => RequiresDockerTheoryAttribute.IsSupported;
19+
protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported;
2020
protected override ServiceLifetime ServiceLifetime => ServiceLifetime.Scoped;
2121

2222
// https://github.com/open-telemetry/opentelemetry-dotnet/blob/031ed48714e16ba4a5b099b6e14647994a0b9c1b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlActivitySourceHelper.cs#L31
@@ -50,7 +50,7 @@ protected override (string json, string error)[] InvalidJsonToErrorMessage => ne
5050
public ConformanceTests(SqlServerContainerFixture? containerFixture)
5151
{
5252
_containerFixture = containerFixture;
53-
ConnectionString = (_containerFixture is not null && RequiresDockerTheoryAttribute.IsSupported)
53+
ConnectionString = (_containerFixture is not null && RequiresDockerAttribute.IsSupported)
5454
? _containerFixture.GetConnectionString()
5555
: "Server=localhost;User ID=root;Password=password;Database=test_aspire_mysql";
5656
}
@@ -91,12 +91,14 @@ protected override void TriggerActivity(SqlConnection service)
9191
command.ExecuteScalar();
9292
}
9393

94-
[RequiresDockerFact]
94+
[Fact]
95+
[RequiresDocker]
9596
public void TracingEnablesTheRightActivitySource()
9697
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: null)),
9798
ConnectionString).Dispose();
9899

99-
[RequiresDockerFact]
100+
[Fact]
101+
[RequiresDocker]
100102
public void TracingEnablesTheRightActivitySource_Keyed()
101103
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: "key")),
102104
ConnectionString).Dispose();

tests/Aspire.Microsoft.Data.SqlClient.Tests/SqlServerContainerFixture.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public string GetConnectionString() => Container?.GetConnectionString() ??
1717

1818
public async Task InitializeAsync()
1919
{
20-
if (RequiresDockerTheoryAttribute.IsSupported)
20+
if (RequiresDockerAttribute.IsSupported)
2121
{
2222
Container = new MsSqlBuilder()
2323
.WithImage($"{SqlServerContainerImageTags.Registry}/{SqlServerContainerImageTags.Image}:{SqlServerContainerImageTags.Tag}")

tests/Aspire.Microsoft.EntityFrameworkCore.SqlServer.Tests/ConformanceTests.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class ConformanceTests : ConformanceTests<TestDbContext, MicrosoftEntityF
1818
private readonly SqlServerContainerFixture? _containerFixture;
1919
protected string ConnectionString { get; private set; }
2020

21-
protected override bool CanConnectToServer => RequiresDockerTheoryAttribute.IsSupported;
21+
protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported;
2222
protected override ServiceLifetime ServiceLifetime => ServiceLifetime.Singleton;
2323

2424
// https://github.com/open-telemetry/opentelemetry-dotnet/blob/031ed48714e16ba4a5b099b6e14647994a0b9c1b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlActivitySourceHelper.cs#L31
@@ -65,7 +65,7 @@ protected override (string json, string error)[] InvalidJsonToErrorMessage => ne
6565
public ConformanceTests(SqlServerContainerFixture? fixture)
6666
{
6767
_containerFixture = fixture;
68-
ConnectionString = (_containerFixture is not null && RequiresDockerTheoryAttribute.IsSupported)
68+
ConnectionString = (_containerFixture is not null && RequiresDockerAttribute.IsSupported)
6969
? _containerFixture.GetConnectionString()
7070
: "Server=localhost;User ID=root;Password=password;Database=test_aspire_mysql";
7171
}
@@ -114,7 +114,8 @@ public void DbContextCanBeAlwaysResolved()
114114
Assert.NotNull(dbContext);
115115
}
116116

117-
[RequiresDockerFact]
117+
[Fact]
118+
[RequiresDocker]
118119
public void TracingEnablesTheRightActivitySource()
119120
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: null)),
120121
ConnectionString).Dispose();

tests/Aspire.MongoDB.Driver.Tests/AspireMongoDBDriverExtensionsTests.cs

+8-4
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public void AddKeyedMongoDBDataSource_ReadsFromConnectionStringsCorrectly(string
8888
}
8989
}
9090

91-
[RequiresDockerFact]
91+
[Fact]
92+
[RequiresDocker]
9293
public async Task AddMongoDBDataSource_HealthCheckShouldBeRegisteredWhenEnabled()
9394
{
9495
var builder = CreateBuilder(DefaultConnectionString);
@@ -110,7 +111,8 @@ public async Task AddMongoDBDataSource_HealthCheckShouldBeRegisteredWhenEnabled(
110111
Assert.Contains(healthCheckReport.Entries, x => x.Key == healthCheckName);
111112
}
112113

113-
[RequiresDockerFact]
114+
[Fact]
115+
[RequiresDocker]
114116
public void AddKeyedMongoDBDataSource_HealthCheckShouldNotBeRegisteredWhenDisabled()
115117
{
116118
var builder = CreateBuilder(DefaultConnectionString);
@@ -128,7 +130,8 @@ public void AddKeyedMongoDBDataSource_HealthCheckShouldNotBeRegisteredWhenDisabl
128130

129131
}
130132

131-
[RequiresDockerFact]
133+
[Fact]
134+
[RequiresDocker]
132135
public async Task AddKeyedMongoDBDataSource_HealthCheckShouldBeRegisteredWhenEnabled()
133136
{
134137
var key = DefaultConnectionName;
@@ -152,7 +155,8 @@ public async Task AddKeyedMongoDBDataSource_HealthCheckShouldBeRegisteredWhenEna
152155
Assert.Contains(healthCheckReport.Entries, x => x.Key == healthCheckName);
153156
}
154157

155-
[RequiresDockerFact]
158+
[Fact]
159+
[RequiresDocker]
156160
public void AddMongoDBDataSource_HealthCheckShouldNotBeRegisteredWhenDisabled()
157161
{
158162
var builder = CreateBuilder(DefaultConnectionString);

tests/Aspire.MongoDB.Driver.Tests/ConformanceTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class ConformanceTests : ConformanceTests<IMongoClient, MongoDBSettings>,
2121

2222
protected override bool SupportsKeyedRegistrations => true;
2323

24-
protected override bool CanConnectToServer => RequiresDockerTheoryAttribute.IsSupported;
24+
protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported;
2525

2626
protected override string ValidJsonConfig => """
2727
{
@@ -58,7 +58,7 @@ protected override (string json, string error)[] InvalidJsonToErrorMessage => ne
5858

5959
protected override void PopulateConfiguration(ConfigurationManager configuration, string? key = null)
6060
{
61-
var connectionString = RequiresDockerTheoryAttribute.IsSupported ?
61+
var connectionString = RequiresDockerAttribute.IsSupported ?
6262
$"{_containerFixture.GetConnectionString()}test_db" :
6363
"mongodb://root:password@localhost:27017/test_db";
6464

tests/Aspire.MongoDB.Driver.Tests/MongoDbContainerFixture.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public string GetConnectionString() => Container?.GetConnectionString() ??
1717

1818
public async Task InitializeAsync()
1919
{
20-
if (RequiresDockerTheoryAttribute.IsSupported)
20+
if (RequiresDockerAttribute.IsSupported)
2121
{
2222
// testcontainers uses mongo:mongo by default,
2323
// resetting that for tests

tests/Aspire.MySqlConnector.Tests/AspireMySqlConnectorExtensionsTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Aspire.MySqlConnector.Tests;
1313
public class AspireMySqlConnectorExtensionsTests : IClassFixture<MySqlContainerFixture>
1414
{
1515
private readonly MySqlContainerFixture _containerFixture;
16-
private string ConnectionString => RequiresDockerTheoryAttribute.IsSupported
16+
private string ConnectionString => RequiresDockerAttribute.IsSupported
1717
? _containerFixture.GetConnectionString()
1818
: "Server=localhost;Database=test_aspire_mysql";
1919
private string NormalizedConnectionString => new MySqlConnectionStringBuilder(ConnectionString).ConnectionString;

tests/Aspire.MySqlConnector.Tests/ConformanceTests.cs

+6-4
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class ConformanceTests : ConformanceTests<MySqlDataSource, MySqlConnector
3232

3333
protected override bool SupportsKeyedRegistrations => true;
3434

35-
protected override bool CanConnectToServer => RequiresDockerTheoryAttribute.IsSupported;
35+
protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported;
3636

3737
protected override string ValidJsonConfig => """
3838
{
@@ -56,7 +56,7 @@ protected override (string json, string error)[] InvalidJsonToErrorMessage => ne
5656
public ConformanceTests(MySqlContainerFixture? containerFixture)
5757
{
5858
_containerFixture = containerFixture;
59-
ConnectionString = (_containerFixture is not null && RequiresDockerTheoryAttribute.IsSupported)
59+
ConnectionString = (_containerFixture is not null && RequiresDockerAttribute.IsSupported)
6060
? _containerFixture.GetConnectionString()
6161
: "Server=localhost;User ID=root;Password=password;Database=test_aspire_mysql";
6262
}
@@ -121,12 +121,14 @@ public void BothDataSourceAndConnectionCanBeResolved(string? key)
121121
T? Resolve<T>() => key is null ? host.Services.GetService<T>() : host.Services.GetKeyedService<T>(key);
122122
}
123123

124-
[RequiresDockerFact]
124+
[Fact]
125+
[RequiresDocker]
125126
public void TracingEnablesTheRightActivitySource()
126127
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: null)),
127128
ConnectionString).Dispose();
128129

129-
[RequiresDockerFact]
130+
[Fact]
131+
[RequiresDocker]
130132
public void TracingEnablesTheRightActivitySource_Keyed()
131133
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: "key")),
132134
ConnectionString).Dispose();

tests/Aspire.MySqlConnector.Tests/MySqlContainerFixture.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public string GetConnectionString() => Container?.GetConnectionString() ??
1717

1818
public async Task InitializeAsync()
1919
{
20-
if (RequiresDockerTheoryAttribute.IsSupported)
20+
if (RequiresDockerAttribute.IsSupported)
2121
{
2222
Container = new MySqlBuilder()
2323
.WithImage($"{MySqlContainerImageTags.Image}:{MySqlContainerImageTags.Tag}")

tests/Aspire.NATS.Net.Tests/AspireNatsClientExtensionsTests.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class AspireNatsClientExtensionsTests : IClassFixture<NatsContainerFixtur
2323
public AspireNatsClientExtensionsTests(NatsContainerFixture containerFixture)
2424
{
2525
_containerFixture = containerFixture;
26-
_connectionString = RequiresDockerTheoryAttribute.IsSupported
26+
_connectionString = RequiresDockerAttribute.IsSupported
2727
? _containerFixture.GetConnectionString()
2828
: "nats://apire-host:4222";
2929
}
@@ -175,7 +175,8 @@ public void AddNatsClient_HealthCheckShouldNotBeRegisteredWhenDisabled(bool useK
175175
Assert.Null(healthCheckService);
176176
}
177177

178-
[RequiresDockerFact]
178+
[Fact]
179+
[RequiresDocker]
179180
public void NatsInstrumentationEndToEnd()
180181
{
181182
RemoteExecutor.Invoke(async (connectionString) =>

tests/Aspire.NATS.Net.Tests/ConformanceTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class ConformanceTests : ConformanceTests<INatsConnection, NatsClientSett
1818
public ConformanceTests(NatsContainerFixture containerFixture)
1919
{
2020
_containerFixture = containerFixture;
21-
_connectionString = RequiresDockerTheoryAttribute.IsSupported
21+
_connectionString = RequiresDockerAttribute.IsSupported
2222
? _containerFixture.GetConnectionString()
2323
: "nats://apire-host:4222";
2424
}
@@ -53,7 +53,7 @@ protected override void PopulateConfiguration(ConfigurationManager configuration
5353

5454
protected override bool CanCreateClientWithoutConnectingToServer => false;
5555

56-
protected override bool CanConnectToServer => RequiresDockerTheoryAttribute.IsSupported;
56+
protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported;
5757

5858
protected override void TriggerActivity(INatsConnection service)
5959
{

tests/Aspire.NATS.Net.Tests/NatsContainerFixture.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public string GetConnectionString() => Container?.GetConnectionString() ??
1717

1818
public async Task InitializeAsync()
1919
{
20-
if (RequiresDockerTheoryAttribute.IsSupported)
20+
if (RequiresDockerAttribute.IsSupported)
2121
{
2222
Container = new NatsBuilder()
2323
.WithImage($"{NatsContainerImageTags.Image}:{NatsContainerImageTags.Tag}")

tests/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL.Tests/ConformanceTests.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class ConformanceTests : ConformanceTests<TestDbContext, NpgsqlEntityFram
4949
"Npgsql.Exception"
5050
};
5151

52-
protected override bool CanConnectToServer => RequiresDockerTheoryAttribute.IsSupported;
52+
protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported;
5353

5454
protected override string ValidJsonConfig => """
5555
{
@@ -79,7 +79,7 @@ protected override (string json, string error)[] InvalidJsonToErrorMessage => ne
7979
public ConformanceTests(PostgreSQLContainerFixture? containerFixture)
8080
{
8181
_containerFixture = containerFixture;
82-
ConnectionString = (_containerFixture is not null && RequiresDockerTheoryAttribute.IsSupported)
82+
ConnectionString = (_containerFixture is not null && RequiresDockerAttribute.IsSupported)
8383
? _containerFixture.GetConnectionString()
8484
: "Server=localhost;User ID=root;Password=password;Database=test_aspire_mysql";
8585
}
@@ -131,7 +131,8 @@ public void DbContextCanBeAlwaysResolved()
131131
Assert.NotNull(dbContext);
132132
}
133133

134-
[RequiresDockerFact]
134+
[Fact]
135+
[RequiresDocker]
135136
public void TracingEnablesTheRightActivitySource()
136137
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: null)),
137138
ConnectionString).Dispose();

tests/Aspire.Npgsql.Tests/ConformanceTests.cs

+6-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class ConformanceTests : ConformanceTests<NpgsqlDataSource, NpgsqlSetting
3434

3535
protected override bool SupportsKeyedRegistrations => true;
3636

37-
protected override bool CanConnectToServer => RequiresDockerTheoryAttribute.IsSupported;
37+
protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported;
3838

3939
protected override string ValidJsonConfig => """
4040
{
@@ -58,7 +58,7 @@ protected override (string json, string error)[] InvalidJsonToErrorMessage => ne
5858
public ConformanceTests(PostgreSQLContainerFixture? containerFixture)
5959
{
6060
_containerFixture = containerFixture;
61-
ConnectionString = (_containerFixture is not null && RequiresDockerTheoryAttribute.IsSupported)
61+
ConnectionString = (_containerFixture is not null && RequiresDockerAttribute.IsSupported)
6262
? _containerFixture.GetConnectionString()
6363
: "Server=localhost;User ID=root;Password=password;Database=test_aspire_mysql";
6464
}
@@ -123,12 +123,14 @@ public void BothDataSourceAndConnectionCanBeResolved(string? key)
123123
T? Resolve<T>() => key is null ? host.Services.GetService<T>() : host.Services.GetKeyedService<T>(key);
124124
}
125125

126-
[RequiresDockerFact]
126+
[Fact]
127+
[RequiresDocker]
127128
public void TracingEnablesTheRightActivitySource()
128129
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: null)),
129130
ConnectionString).Dispose();
130131

131-
[RequiresDockerFact]
132+
[Fact]
133+
[RequiresDocker]
132134
public void TracingEnablesTheRightActivitySource_Keyed()
133135
=> RemoteExecutor.Invoke(static connectionStringToUse => RunWithConnectionString(connectionStringToUse, obj => obj.ActivitySourceTest(key: "key")),
134136
ConnectionString).Dispose();

0 commit comments

Comments
 (0)