Skip to content

Commit 19fb8e5

Browse files
committed
Parameterize almost-identical metrics tests.
1 parent 8fffc06 commit 19fb8e5

File tree

3 files changed

+66
-126
lines changed

3 files changed

+66
-126
lines changed

tests/MySqlConnector.Tests/Metrics/ConnectionsUsageTests.cs

Lines changed: 18 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ namespace MySqlConnector.Tests.Metrics;
44

55
public class ConnectionsUsageTests : MetricsTestsBase
66
{
7-
[Fact(Skip = MetricsSkip)]
8-
public void NamedDataSource()
7+
[Theory(Skip = MetricsSkip)]
8+
[MemberData(nameof(GetPoolCreators))]
9+
public void PoolCreators(IConnectionCreator connectionCreator)
910
{
10-
PoolName = "metrics-test";
11-
using var dataSource = new MySqlDataSourceBuilder(CreateConnectionStringBuilder().ConnectionString)
12-
.UseName(PoolName)
13-
.Build();
11+
connectionCreator.SetConnectionStringBuilder(CreateConnectionStringBuilder());
12+
PoolName = connectionCreator.PoolName;
1413

1514
// no connections at beginning of test
1615
AssertMeasurement("db.client.connections.usage", 0);
@@ -19,7 +18,7 @@ public void NamedDataSource()
1918
Assert.Equal(0, Server.ActiveConnections);
2019

2120
// opening a connection creates a 'used' connection
22-
using (var connection = dataSource.OpenConnection())
21+
using (var connection = connectionCreator.OpenConnection())
2322
{
2423
AssertMeasurement("db.client.connections.usage", 1);
2524
AssertMeasurement("db.client.connections.usage|idle", 0);
@@ -34,7 +33,7 @@ public void NamedDataSource()
3433
Assert.Equal(1, Server.ActiveConnections);
3534

3635
// reopening the connection transitions it back to 'used'
37-
using (var connection = dataSource.OpenConnection())
36+
using (var connection = connectionCreator.OpenConnection())
3837
{
3938
AssertMeasurement("db.client.connections.usage", 1);
4039
AssertMeasurement("db.client.connections.usage|idle", 0);
@@ -43,8 +42,8 @@ public void NamedDataSource()
4342
Assert.Equal(1, Server.ActiveConnections);
4443

4544
// opening a second connection creates a net new 'used' connection
46-
using (var connection = dataSource.OpenConnection())
47-
using (var connection2 = dataSource.OpenConnection())
45+
using (var connection = connectionCreator.OpenConnection())
46+
using (var connection2 = connectionCreator.OpenConnection())
4847
{
4948
AssertMeasurement("db.client.connections.usage", 2);
5049
AssertMeasurement("db.client.connections.usage|idle", 0);
@@ -56,6 +55,15 @@ public void NamedDataSource()
5655
AssertMeasurement("db.client.connections.usage|idle", 2);
5756
AssertMeasurement("db.client.connections.usage|used", 0);
5857
Assert.Equal(2, Server.ActiveConnections);
58+
59+
connectionCreator.Dispose();
60+
}
61+
62+
public static IEnumerable<object[]> GetPoolCreators()
63+
{
64+
yield return new object[] { new DataSourceConnectionCreator("metrics-test") };
65+
yield return new object[] { new DataSourceConnectionCreator(null) };
66+
yield return new object[] { new PlainConnectionCreator() };
5967
}
6068

6169
[Fact(Skip = MetricsSkip)]
@@ -91,121 +99,6 @@ public void NamedDataSourceWithMinPoolSize()
9199
Assert.Equal(3, Server.ActiveConnections);
92100
}
93101

94-
[Fact(Skip = MetricsSkip)]
95-
public void UnnamedDataSource()
96-
{
97-
var csb = CreateConnectionStringBuilder();
98-
99-
// NOTE: pool "name" is connection string (without password)
100-
PoolName = csb.GetConnectionString(includePassword: false);
101-
102-
using var dataSource = new MySqlDataSourceBuilder(csb.ConnectionString)
103-
.Build();
104-
105-
// no connections at beginning of test
106-
AssertMeasurement("db.client.connections.usage", 0);
107-
AssertMeasurement("db.client.connections.usage|idle", 0);
108-
AssertMeasurement("db.client.connections.usage|used", 0);
109-
Assert.Equal(0, Server.ActiveConnections);
110-
111-
// opening a connection creates a 'used' connection
112-
using (var connection = dataSource.OpenConnection())
113-
{
114-
AssertMeasurement("db.client.connections.usage", 1);
115-
AssertMeasurement("db.client.connections.usage|idle", 0);
116-
AssertMeasurement("db.client.connections.usage|used", 1);
117-
Assert.Equal(1, Server.ActiveConnections);
118-
}
119-
120-
// closing it creates an 'idle' connection
121-
AssertMeasurement("db.client.connections.usage", 1);
122-
AssertMeasurement("db.client.connections.usage|idle", 1);
123-
AssertMeasurement("db.client.connections.usage|used", 0);
124-
Assert.Equal(1, Server.ActiveConnections);
125-
126-
// reopening the connection transitions it back to 'used'
127-
using (var connection = dataSource.OpenConnection())
128-
{
129-
AssertMeasurement("db.client.connections.usage", 1);
130-
AssertMeasurement("db.client.connections.usage|idle", 0);
131-
AssertMeasurement("db.client.connections.usage|used", 1);
132-
}
133-
Assert.Equal(1, Server.ActiveConnections);
134-
135-
// opening a second connection creates a net new 'used' connection
136-
using (var connection = dataSource.OpenConnection())
137-
using (var connection2 = dataSource.OpenConnection())
138-
{
139-
AssertMeasurement("db.client.connections.usage", 2);
140-
AssertMeasurement("db.client.connections.usage|idle", 0);
141-
AssertMeasurement("db.client.connections.usage|used", 2);
142-
Assert.Equal(2, Server.ActiveConnections);
143-
}
144-
145-
AssertMeasurement("db.client.connections.usage", 2);
146-
AssertMeasurement("db.client.connections.usage|idle", 2);
147-
AssertMeasurement("db.client.connections.usage|used", 0);
148-
Assert.Equal(2, Server.ActiveConnections);
149-
}
150-
151-
[Fact(Skip = MetricsSkip)]
152-
public void NoDataSource()
153-
{
154-
var csb = CreateConnectionStringBuilder();
155-
156-
// NOTE: pool "name" is connection string (without password)
157-
PoolName = csb.GetConnectionString(includePassword: false);
158-
159-
// no connections at beginning of test
160-
AssertMeasurement("db.client.connections.usage", 0);
161-
AssertMeasurement("db.client.connections.usage|idle", 0);
162-
AssertMeasurement("db.client.connections.usage|used", 0);
163-
Assert.Equal(0, Server.ActiveConnections);
164-
165-
// opening a connection creates a 'used' connection
166-
using (var connection = new MySqlConnection(csb.ConnectionString))
167-
{
168-
connection.Open();
169-
AssertMeasurement("db.client.connections.usage", 1);
170-
AssertMeasurement("db.client.connections.usage|idle", 0);
171-
AssertMeasurement("db.client.connections.usage|used", 1);
172-
Assert.Equal(1, Server.ActiveConnections);
173-
}
174-
175-
// closing it creates an 'idle' connection
176-
AssertMeasurement("db.client.connections.usage", 1);
177-
AssertMeasurement("db.client.connections.usage|idle", 1);
178-
AssertMeasurement("db.client.connections.usage|used", 0);
179-
Assert.Equal(1, Server.ActiveConnections);
180-
181-
// reopening the connection transitions it back to 'used'
182-
using (var connection = new MySqlConnection(csb.ConnectionString))
183-
{
184-
connection.Open();
185-
AssertMeasurement("db.client.connections.usage", 1);
186-
AssertMeasurement("db.client.connections.usage|idle", 0);
187-
AssertMeasurement("db.client.connections.usage|used", 1);
188-
}
189-
Assert.Equal(1, Server.ActiveConnections);
190-
191-
// opening a second connection creates a net new 'used' connection
192-
using (var connection = new MySqlConnection(csb.ConnectionString))
193-
using (var connection2 = new MySqlConnection(csb.ConnectionString))
194-
{
195-
connection.Open();
196-
connection2.Open();
197-
AssertMeasurement("db.client.connections.usage", 2);
198-
AssertMeasurement("db.client.connections.usage|idle", 0);
199-
AssertMeasurement("db.client.connections.usage|used", 2);
200-
Assert.Equal(2, Server.ActiveConnections);
201-
}
202-
203-
AssertMeasurement("db.client.connections.usage", 2);
204-
AssertMeasurement("db.client.connections.usage|idle", 2);
205-
AssertMeasurement("db.client.connections.usage|used", 0);
206-
Assert.Equal(2, Server.ActiveConnections);
207-
}
208-
209102
[Fact(Skip = MetricsSkip)]
210103
public async Task PendingRequestForCreation()
211104
{
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#nullable enable
2+
3+
namespace MySqlConnector.Tests.Metrics;
4+
5+
public interface IConnectionCreator : IDisposable
6+
{
7+
void SetConnectionStringBuilder(MySqlConnectionStringBuilder connectionStringBuilder);
8+
string PoolName { get; }
9+
MySqlConnection OpenConnection();
10+
}
11+
12+
internal sealed class DataSourceConnectionCreator(string? poolName) : IConnectionCreator
13+
{
14+
public void SetConnectionStringBuilder(MySqlConnectionStringBuilder connectionStringBuilder)
15+
{
16+
m_connectionStringBuilder = connectionStringBuilder;
17+
m_dataSource = new MySqlDataSourceBuilder(connectionStringBuilder.ConnectionString)
18+
.UseName(m_poolName)
19+
.Build();
20+
}
21+
22+
public MySqlConnection OpenConnection() => m_dataSource!.OpenConnection();
23+
public string PoolName => m_poolName ?? m_connectionStringBuilder!.GetConnectionString(includePassword: false);
24+
public override string ToString() => $"DataSource: {m_poolName ?? "(unnamed)"}";
25+
public void Dispose() => m_dataSource!.Dispose();
26+
27+
private readonly string? m_poolName = poolName;
28+
private MySqlConnectionStringBuilder? m_connectionStringBuilder;
29+
private MySqlDataSource? m_dataSource;
30+
}
31+
32+
internal sealed class PlainConnectionCreator : IConnectionCreator
33+
{
34+
public MySqlConnection OpenConnection()
35+
{
36+
var connection = new MySqlConnection(m_connectionStringBuilder!.ConnectionString);
37+
connection.Open();
38+
return connection;
39+
}
40+
41+
public void SetConnectionStringBuilder(MySqlConnectionStringBuilder connectionStringBuilder) => m_connectionStringBuilder = connectionStringBuilder;
42+
public string PoolName => m_connectionStringBuilder!.GetConnectionString(includePassword: false);
43+
public override string ToString() => "Plain";
44+
public void Dispose() { }
45+
46+
private MySqlConnectionStringBuilder? m_connectionStringBuilder;
47+
}

tests/MySqlConnector.Tests/MySqlConnector.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
1616
<AssemblyOriginatorKeyFile>..\..\MySqlConnector.snk</AssemblyOriginatorKeyFile>
1717
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
18-
<LangVersion>11.0</LangVersion>
18+
<LangVersion>12.0</LangVersion>
1919
</PropertyGroup>
2020

2121
<PropertyGroup Condition=" '$(GITHUB_ACTIONS)' == 'true' OR '$(APPVEYOR)' == 'True' OR '$(TF_BUILD)' == 'True' ">

0 commit comments

Comments
 (0)