Skip to content

Commit f2a8cd2

Browse files
authored
Tests | Activate SplitPacket Tests (#3061)
* Activate SplitPacketTest * Close vs Dispose in netcore * Minor refactoring to use existing functions * Proxy does not work on named instances
1 parent 7663524 commit f2a8cd2

File tree

2 files changed

+73
-56
lines changed

2 files changed

+73
-56
lines changed

src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,18 @@ public static bool IsAADAuthorityURLSetup()
454454

455455
public static bool IsNotAzureServer()
456456
{
457-
return !AreConnStringsSetup() || !Utils.IsAzureSqlServer(new SqlConnectionStringBuilder((TCPConnectionString)).DataSource);
457+
return !AreConnStringsSetup() || !Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(TCPConnectionString).DataSource);
458+
}
459+
460+
public static bool IsNotNamedInstance()
461+
{
462+
return !AreConnStringsSetup() || !new SqlConnectionStringBuilder(TCPConnectionString).DataSource.Contains(@"\");
463+
}
464+
465+
public static bool IsLocalHost()
466+
{
467+
SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString);
468+
return ParseDataSource(builder.DataSource, out string hostname, out _, out _) && string.Equals("localhost", hostname, StringComparison.OrdinalIgnoreCase);
458469
}
459470

460471
// Synapse: Always Encrypted is not supported with Azure Synapse.

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SplitPacketTest/SplitPacketTest.cs

Lines changed: 61 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -11,79 +11,83 @@
1111

1212
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
1313
{
14-
[ActiveIssue("5538")] // Only testable on localhost
15-
public class SplitPacketTest
14+
public class SplitPacketTest : IDisposable
1615
{
17-
private int Port = -1;
18-
private int SplitPacketSize = 1;
19-
private string BaseConnString;
16+
private int _port = -1;
17+
private int _splitPacketSize = 1;
18+
private string _baseConnString;
19+
private TcpListener _listener;
20+
private CancellationTokenSource _cts = new CancellationTokenSource();
2021

2122
public SplitPacketTest()
2223
{
23-
string actualHost;
24-
int actualPort;
25-
2624
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString);
27-
GetTcpInfoFromDataSource(builder.DataSource, out actualHost, out actualPort);
25+
DataSourceBuilder dataSourceBuilder = new DataSourceBuilder(builder.DataSource);
2826

29-
Task.Factory.StartNew(() => { SetupProxy(actualHost, actualPort); });
27+
Task.Factory.StartNew(() => { SetupProxy(dataSourceBuilder.ServerName, dataSourceBuilder.Port ?? 1433, _cts.Token); });
3028

31-
for (int i = 0; i < 10 && Port == -1; i++)
29+
for (int i = 0; i < 10 && _port == -1; i++)
3230
{
3331
Thread.Sleep(500);
3432
}
35-
if (Port == -1)
33+
if (_port == -1)
3634
throw new InvalidOperationException("Proxy local port not defined!");
3735

38-
builder.DataSource = "tcp:127.0.0.1," + Port;
39-
BaseConnString = builder.ConnectionString;
36+
builder.DataSource = "tcp:127.0.0.1," + _port;
37+
_baseConnString = builder.ConnectionString;
4038
}
4139

42-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
40+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsTCPConnStringSetup), nameof(DataTestUtility.IsLocalHost), nameof(DataTestUtility.IsNotNamedInstance))]
4341
public void OneByteSplitTest()
4442
{
45-
SplitPacketSize = 1;
43+
_splitPacketSize = 1;
4644
OpenConnection();
45+
Assert.True(true);
4746
}
4847

49-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
48+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsTCPConnStringSetup), nameof(DataTestUtility.IsLocalHost), nameof(DataTestUtility.IsNotNamedInstance))]
5049
public void AlmostFullHeaderTest()
5150
{
52-
SplitPacketSize = 7;
51+
_splitPacketSize = 7;
5352
OpenConnection();
53+
Assert.True(true);
5454
}
5555

56-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
56+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsTCPConnStringSetup), nameof(DataTestUtility.IsLocalHost), nameof(DataTestUtility.IsNotNamedInstance))]
5757
public void FullHeaderTest()
5858
{
59-
SplitPacketSize = 8;
59+
_splitPacketSize = 8;
6060
OpenConnection();
61+
Assert.True(true);
6162
}
6263

63-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
64+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsTCPConnStringSetup), nameof(DataTestUtility.IsLocalHost), nameof(DataTestUtility.IsNotNamedInstance))]
6465
public void HeaderPlusOneTest()
6566
{
66-
SplitPacketSize = 9;
67+
_splitPacketSize = 9;
6768
OpenConnection();
69+
Assert.True(true);
6870
}
6971

70-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
72+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsTCPConnStringSetup), nameof(DataTestUtility.IsLocalHost), nameof(DataTestUtility.IsNotNamedInstance))]
7173
public void MARSSplitTest()
7274
{
73-
SplitPacketSize = 1;
75+
_splitPacketSize = 1;
7476
OpenMarsConnection("select * from Orders");
77+
Assert.True(true);
7578
}
7679

77-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
80+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsTCPConnStringSetup), nameof(DataTestUtility.IsLocalHost), nameof(DataTestUtility.IsNotNamedInstance))]
7881
public void MARSReplicateTest()
7982
{
80-
SplitPacketSize = 1;
83+
_splitPacketSize = 1;
8184
OpenMarsConnection("select REPLICATE('A', 10000)");
85+
Assert.True(true);
8286
}
8387

8488
private void OpenMarsConnection(string cmdText)
8589
{
86-
using (SqlConnection conn = new SqlConnection((new SqlConnectionStringBuilder(BaseConnString) { MultipleActiveResultSets = true }).ConnectionString))
90+
using (SqlConnection conn = new SqlConnection((new SqlConnectionStringBuilder(_baseConnString) { MultipleActiveResultSets = true }).ConnectionString))
8791
{
8892
conn.Open();
8993
using (SqlCommand cmd1 = new SqlCommand(cmdText, conn))
@@ -102,7 +106,7 @@ private void OpenMarsConnection(string cmdText)
102106

103107
private void OpenConnection()
104108
{
105-
using (SqlConnection conn = new SqlConnection(BaseConnString))
109+
using (SqlConnection conn = new SqlConnection(_baseConnString))
106110
{
107111
conn.Open();
108112
using (SqlCommand cmd = new SqlCommand("select * from Orders", conn))
@@ -114,23 +118,23 @@ private void OpenConnection()
114118
}
115119
}
116120

117-
private void SetupProxy(string actualHost, int actualPort)
121+
private void SetupProxy(string actualHost, int actualPort, CancellationToken cancellationToken)
118122
{
119-
TcpListener listener = new TcpListener(IPAddress.Loopback, 0);
120-
listener.Start();
121-
Port = ((IPEndPoint)listener.LocalEndpoint).Port;
122-
var client = listener.AcceptTcpClientAsync().GetAwaiter().GetResult();
123+
_listener = new TcpListener(IPAddress.Loopback, 0);
124+
_listener.Start();
125+
_port = ((IPEndPoint)_listener.LocalEndpoint).Port;
126+
var client = _listener.AcceptTcpClientAsync().GetAwaiter().GetResult();
123127

124128
var sqlClient = new TcpClient();
125-
sqlClient.ConnectAsync(actualHost, actualPort).Wait();
129+
sqlClient.ConnectAsync(actualHost, actualPort).Wait(cancellationToken);
126130

127-
Task.Factory.StartNew(() => { ForwardToSql(client, sqlClient); });
128-
Task.Factory.StartNew(() => { ForwardToClient(client, sqlClient); });
131+
Task.Factory.StartNew(() => { ForwardToSql(client, sqlClient, cancellationToken); }, cancellationToken);
132+
Task.Factory.StartNew(() => { ForwardToClient(client, sqlClient, cancellationToken); }, cancellationToken);
129133
}
130134

131-
private void ForwardToSql(TcpClient ourClient, TcpClient sqlClient)
135+
private void ForwardToSql(TcpClient ourClient, TcpClient sqlClient, CancellationToken cancellationToken)
132136
{
133-
while (true)
137+
while (!cancellationToken.IsCancellationRequested)
134138
{
135139
byte[] buffer = new byte[1024];
136140
int bytesRead = ourClient.GetStream().Read(buffer, 0, buffer.Length);
@@ -139,11 +143,11 @@ private void ForwardToSql(TcpClient ourClient, TcpClient sqlClient)
139143
}
140144
}
141145

142-
private void ForwardToClient(TcpClient ourClient, TcpClient sqlClient)
146+
private void ForwardToClient(TcpClient ourClient, TcpClient sqlClient, CancellationToken cancellationToken)
143147
{
144-
while (true)
148+
while (!cancellationToken.IsCancellationRequested)
145149
{
146-
byte[] buffer = new byte[SplitPacketSize];
150+
byte[] buffer = new byte[_splitPacketSize];
147151
int bytesRead = sqlClient.GetStream().Read(buffer, 0, buffer.Length);
148152

149153
ourClient.GetStream().Write(buffer, 0, bytesRead);
@@ -155,22 +159,24 @@ private void ForwardToClient(TcpClient ourClient, TcpClient sqlClient)
155159
}
156160
}
157161

158-
private static void GetTcpInfoFromDataSource(string dataSource, out string hostName, out int port)
162+
public void Dispose()
159163
{
160-
string[] dataSourceParts = dataSource.Split(',');
161-
if (dataSourceParts.Length == 1)
162-
{
163-
hostName = dataSourceParts[0].Replace("tcp:", "");
164-
port = 1433;
165-
}
166-
else if (dataSourceParts.Length == 2)
167-
{
168-
hostName = dataSourceParts[0].Replace("tcp:", "");
169-
port = int.Parse(dataSourceParts[1]);
170-
}
171-
else
164+
Dispose(true);
165+
GC.SuppressFinalize(this);
166+
}
167+
168+
protected virtual void Dispose(bool disposing)
169+
{
170+
if (disposing)
172171
{
173-
throw new InvalidOperationException("TCP Connection String not in correct format!");
172+
_cts.Cancel();
173+
_cts.Dispose();
174+
_listener?.Server.Dispose();
175+
#if NETFRAMEWORK
176+
_listener?.Stop();
177+
#else
178+
_listener?.Dispose();
179+
#endif
174180
}
175181
}
176182
}

0 commit comments

Comments
 (0)