diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AADAuthenticationTests.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AADAuthenticationTests.cs
index 18997a4d86..e97b251613 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AADAuthenticationTests.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AADAuthenticationTests.cs
@@ -53,7 +53,7 @@ private void InvalidCombinationCheck(SqlCredential credential)
[Fact]
public void CustomActiveDirectoryProviderTest()
{
- SqlAuthenticationProvider authProvider = new ActiveDirectoryAuthenticationProvider(CustomDeviceFlowCallback);
+ SqlAuthenticationProvider authProvider = new ActiveDirectoryAuthenticationProvider(static (result) => Task.CompletedTask);
SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow, authProvider);
Assert.Equal(authProvider, SqlAuthenticationProvider.GetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow));
}
@@ -69,15 +69,9 @@ public void CustomActiveDirectoryProviderTest_AppClientId()
[Fact]
public void CustomActiveDirectoryProviderTest_AppClientId_DeviceFlowCallback()
{
- SqlAuthenticationProvider authProvider = new ActiveDirectoryAuthenticationProvider(CustomDeviceFlowCallback, Guid.NewGuid().ToString());
+ SqlAuthenticationProvider authProvider = new ActiveDirectoryAuthenticationProvider(static (result) => Task.CompletedTask, Guid.NewGuid().ToString());
SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow, authProvider);
Assert.Equal(authProvider, SqlAuthenticationProvider.GetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow));
}
-
- private Task CustomDeviceFlowCallback(DeviceCodeResult result)
- {
- Console.WriteLine(result.Message);
- return Task.FromResult(0);
- }
}
}
diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs
index a21da26b99..446ddefd36 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs
@@ -65,7 +65,7 @@ public async Task PreLoginEncryptionExcludedTest()
[PlatformSpecific(TestPlatforms.Windows)]
public async Task TransientFaultTestAsync(uint errorCode)
{
- using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, true, errorCode);
+ using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, false, errorCode);
SqlConnectionStringBuilder builder = new()
{
DataSource = "localhost," + server.Port,
@@ -85,7 +85,7 @@ public async Task TransientFaultTestAsync(uint errorCode)
[PlatformSpecific(TestPlatforms.Windows)]
public void TransientFaultTest(uint errorCode)
{
- using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, true, errorCode);
+ using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, false, errorCode);
SqlConnectionStringBuilder builder = new()
{
DataSource = "localhost," + server.Port,
@@ -112,7 +112,7 @@ public void TransientFaultTest(uint errorCode)
[PlatformSpecific(TestPlatforms.Windows)]
public void TransientFaultDisabledTestAsync(uint errorCode)
{
- using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, true, errorCode);
+ using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, false, errorCode);
SqlConnectionStringBuilder builder = new()
{
DataSource = "localhost," + server.Port,
@@ -134,7 +134,7 @@ public void TransientFaultDisabledTestAsync(uint errorCode)
[PlatformSpecific(TestPlatforms.Windows)]
public void TransientFaultDisabledTest(uint errorCode)
{
- using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, true, errorCode);
+ using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, false, errorCode);
SqlConnectionStringBuilder builder = new()
{
DataSource = "localhost," + server.Port,
diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestRoutingTdsServer.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestRoutingTdsServer.cs
index 275cb58035..130b50cad9 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestRoutingTdsServer.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestRoutingTdsServer.cs
@@ -42,7 +42,7 @@ public static TestRoutingTdsServer StartTestServer(IPEndPoint destinationEndpoin
server._endpoint = new TDSServerEndPoint(server) { ServerEndPoint = new IPEndPoint(IPAddress.Any, 0) };
server._endpoint.EndpointName = methodName;
// The server EventLog should be enabled as it logs the exceptions.
- server._endpoint.EventLog = Console.Out;
+ server._endpoint.EventLog = enableLog ? Console.Out : null;
server._endpoint.Start();
int port = server._endpoint.ServerEndPoint.Port;
diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestTdsServer.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestTdsServer.cs
index 7cd9d88e3e..a5976fd6d5 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestTdsServer.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestTdsServer.cs
@@ -49,7 +49,7 @@ public static TestTdsServer StartServerWithQueryEngine(QueryEngine engine, bool
server._endpoint = new TDSServerEndPoint(server) { ServerEndPoint = new IPEndPoint(IPAddress.Any, 0) };
server._endpoint.EndpointName = methodName;
// The server EventLog should be enabled as it logs the exceptions.
- server._endpoint.EventLog = Console.Out;
+ server._endpoint.EventLog = enableLog ? Console.Out : null;
server._endpoint.Start();
int port = server._endpoint.ServerEndPoint.Port;
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj
index 112814212e..7ac5a74996 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj
@@ -243,11 +243,6 @@
PreserveNewest
data.xml
-
- PreserveNewest
- MultipleResultsTest.bsl
-
-
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.bsl b/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.bsl
deleted file mode 100644
index 99bde8b2c0..0000000000
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.bsl
+++ /dev/null
@@ -1,47 +0,0 @@
-MultipleErrorHandling SqlConnection
-**** ExecuteNonQuery *****
-SqlException: Error 1
-Error 2
-Error 3
-Error 4
-Error 5
-0
-1
-3
-4
-5
-6
-7
-8
-9
-10
-11
-**** ExecuteScalar ****
-*** SQL CONNECTION INFO MESSAGE : 0 ****
-**** ExecuteReader ****
-*** SQL CONNECTION INFO MESSAGE : 0 ****
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 1 ****
-SqlException: Error 1
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 3 ****
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 4 ****
-SqlException: Error 2
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 5 ****
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 6 ****
-SqlException: Error 3
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 7 ****
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 8 ****
-SqlException: Error 4
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 9 ****
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 10 ****
-SqlException: Error 5
-NextResult
-*** SQL CONNECTION INFO MESSAGE : 11 ****
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs
index cc5d6b42c2..199b93e15f 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs
@@ -3,365 +3,160 @@
// See the LICENSE file in the project root for more information.
using System;
-using System.Data.Common;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Text;
+using System.Collections.Concurrent;
using Xunit;
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
{
public class MultipleResultsTest
{
- private StringBuilder _globalBuilder = new StringBuilder();
- private StringBuilder _outputBuilder;
- private string[] _outputFilter;
+ private const string ResultSet1_Message = "0";
+ private const string ResultSet2_Message = "1";
+ private const string ResultSet2_Error = "Error 1";
+
+ private const string ResultSet3_Message = "3";
+ private const string ResultSet4_Message = "4";
+ private const string ResultSet4_Error = "Error 2";
+
+ private const string ResultSet5_Message = "5";
+ private const string ResultSet6_Message = "6";
+ private const string ResultSet6_Error = "Error 3";
+
+ private const string ResultSet7_Message = "7";
+ private const string ResultSet8_Message = "8";
+ private const string ResultSet8_Error = "Error 4";
+
+ private const string ResultSet9_Message = "9";
+ private const string ResultSet10_Message = "10";
+ private const string ResultSet10_Error = "Error 5";
+
+ private const string ResultSet11_Message = "11";
+
+ private readonly static string s_sqlStatement =
+ $"PRINT N'{ResultSet1_Message}'; SELECT num = 1, str = 'ABC';\n" +
+ $"PRINT N'{ResultSet2_Message}'; RAISERROR('{ResultSet2_Error}', 15, 1);\n" +
+ $"PRINT N'{ResultSet3_Message}'; SELECT num = 2, str = 'ABC';\n" +
+ $"PRINT N'{ResultSet4_Message}'; RAISERROR('{ResultSet4_Error}', 15, 1);\n" +
+ $"PRINT N'{ResultSet5_Message}'; SELECT num = 3, str = 'ABC';\n" +
+ $"PRINT N'{ResultSet6_Message}'; RAISERROR('{ResultSet6_Error}', 15, 1);\n" +
+ $"PRINT N'{ResultSet7_Message}'; SELECT num = 4, str = 'ABC';\n" +
+ $"PRINT N'{ResultSet8_Message}'; RAISERROR('{ResultSet8_Error}', 15, 1);\n" +
+ $"PRINT N'{ResultSet9_Message}'; SELECT num = 5, str = 'ABC';\n" +
+ $"PRINT N'{ResultSet10_Message}'; RAISERROR('{ResultSet10_Error}', 15, 1);\n" +
+ $"PRINT N'{ResultSet11_Message}';";
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
- public void TestMain()
+ public void ExecuteNonQuery()
{
- Assert.True(RunTestCoreAndCompareWithBaseline());
- }
+ using SqlConnection connection = new SqlConnection((new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString) { MultipleActiveResultSets = true }).ConnectionString);
+ using SqlCommand command = connection.CreateCommand();
+ ConcurrentQueue messages = new ConcurrentQueue();
- private void RunTest()
- {
- MultipleErrorHandling(new SqlConnection((new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString) { MultipleActiveResultSets = true }).ConnectionString));
- }
+ connection.InfoMessage += (object sender, SqlInfoMessageEventArgs args) =>
+ messages.Enqueue(args.Message);
- private void MultipleErrorHandling(DbConnection connection)
- {
- try
- {
- Console.WriteLine("MultipleErrorHandling {0}", connection.GetType().Name);
- Type expectedException = null;
- if (connection is SqlConnection)
- {
- ((SqlConnection)connection).InfoMessage += delegate (object sender, SqlInfoMessageEventArgs args)
- {
- Console.WriteLine("*** SQL CONNECTION INFO MESSAGE : {0} ****", args.Message);
- };
- expectedException = typeof(SqlException);
- }
- connection.Open();
-
- using (DbCommand command = connection.CreateCommand())
- {
- command.CommandText =
- "PRINT N'0';\n" +
- "SELECT num = 1, str = 'ABC';\n" +
- "PRINT N'1';\n" +
- "RAISERROR('Error 1', 15, 1);\n" +
- "PRINT N'3';\n" +
- "SELECT num = 2, str = 'ABC';\n" +
- "PRINT N'4';\n" +
- "RAISERROR('Error 2', 15, 1);\n" +
- "PRINT N'5';\n" +
- "SELECT num = 3, str = 'ABC';\n" +
- "PRINT N'6';\n" +
- "RAISERROR('Error 3', 15, 1);\n" +
- "PRINT N'7';\n" +
- "SELECT num = 4, str = 'ABC';\n" +
- "PRINT N'8';\n" +
- "RAISERROR('Error 4', 15, 1);\n" +
- "PRINT N'9';\n" +
- "SELECT num = 5, str = 'ABC';\n" +
- "PRINT N'10';\n" +
- "RAISERROR('Error 5', 15, 1);\n" +
- "PRINT N'11';\n";
-
- try
- {
- Console.WriteLine("**** ExecuteNonQuery *****");
- command.ExecuteNonQuery();
- }
- catch (Exception e)
- {
- PrintException(expectedException, e);
- }
-
- try
- {
- Console.WriteLine("**** ExecuteScalar ****");
- command.ExecuteScalar();
- }
- catch (Exception e)
- {
- PrintException(expectedException, e);
- }
-
- try
- {
- Console.WriteLine("**** ExecuteReader ****");
- using (DbDataReader reader = command.ExecuteReader())
- {
- bool moreResults = true;
- do
- {
- try
- {
- Console.WriteLine("NextResult");
- moreResults = reader.NextResult();
- }
- catch (Exception e)
- {
- PrintException(expectedException, e);
- }
- } while (moreResults);
- }
- }
- catch (Exception e)
- {
- PrintException(null, e);
- }
- }
- }
- catch (Exception e)
- {
- PrintException(null, e);
- }
- try
- {
- connection.Dispose();
- }
- catch (Exception e)
- {
- PrintException(null, e);
- }
- }
+ connection.Open();
- private bool RunTestCoreAndCompareWithBaseline()
- {
- string outputPath = "MultipleResultsTest.out";
- string baselinePath = "MultipleResultsTest.bsl";
-
- var fstream = new FileStream(outputPath, FileMode.Create, FileAccess.Write, FileShare.Read);
- var swriter = new StreamWriter(fstream, Encoding.UTF8);
- // Convert all string writes of '\n' to '\r\n' so output files can be 'text' not 'binary'
- var twriter = new CarriageReturnLineFeedReplacer(swriter);
- Console.SetOut(twriter); // "redirect" Console.Out
-
- // Run Test
- RunTest();
-
- Console.Out.Flush();
- Console.Out.Dispose();
-
- // Recover the standard output stream
- StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput());
- standardOutput.AutoFlush = true;
- Console.SetOut(standardOutput);
-
- // Compare output file
- var comparisonResult = FindDiffFromBaseline(baselinePath, outputPath);
-
- if (string.IsNullOrEmpty(comparisonResult))
- {
- return true;
- }
-
- Console.WriteLine("Test Failed!");
- Console.WriteLine("Please compare baseline : {0} with output :{1}", Path.GetFullPath(baselinePath), Path.GetFullPath(outputPath));
- Console.WriteLine("Comparison Results : ");
- Console.WriteLine(comparisonResult);
- return false;
- }
+ command.CommandText = s_sqlStatement;
- private void PrintException(Type expected, Exception e, params string[] values)
- {
- try
- {
- Debug.Assert(e != null, "PrintException: null exception");
-
- _globalBuilder.Length = 0;
- _globalBuilder.Append(e.GetType().Name).Append(": ");
-
- if (e is COMException)
- {
- _globalBuilder.Append("0x").Append((((COMException)e).HResult).ToString("X8"));
- if (expected != e.GetType())
- {
- _globalBuilder.Append(": ").Append(e.ToString());
- }
- }
- else
- {
- _globalBuilder.Append(e.Message);
- }
- AssemblyFilter(_globalBuilder);
- Console.WriteLine(_globalBuilder.ToString());
-
- if (expected != e.GetType())
- {
- Console.WriteLine(e.StackTrace);
- }
- if (values != null)
- {
- foreach (string value in values)
- {
- Console.WriteLine(value);
- }
- }
- if (e.InnerException != null)
- {
- PrintException(e.InnerException.GetType(), e.InnerException);
- }
- Console.Out.Flush();
- }
- catch (Exception f)
- {
- Console.WriteLine(f);
- }
- }
+ // ExecuteNonQuery will drain every result set, info message and exception, collating these into a single exception.
+ Func