From 232fefb972b4ba94710329bae4bbf32167c14980 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:26:59 +0100 Subject: [PATCH 01/26] Use Assert.Throws instead of home-grown --- .../ExceptionTest/ConnectionExceptionTest.cs | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs index 6ee0681a0d..7ff56d7fbd 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs @@ -35,21 +35,16 @@ public void TestConnectionStateWithErrorClass20() Assert.Equal(System.Data.ConnectionState.Open, conn.State); server.Dispose(); - try - { - int result2 = cmd.ExecuteNonQuery(); - } - catch (SqlException ex) - { - Assert.Equal(11, ex.Class); - Assert.NotNull(ex.InnerException); - SqlException innerEx = Assert.IsType(ex.InnerException); - Assert.Equal(20, innerEx.Class); - Assert.StartsWith("A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.", innerEx.Message); - // Since the server is not accessible driver can close the close the connection - // It is user responsibilty to maintain the connection. - Assert.Equal(System.Data.ConnectionState.Closed, conn.State); - } + + var exception = Assert.Throws(() => cmd.ExecuteNonQuery()); + Assert.Equal(11, exception.Class); + Assert.NotNull(exception.InnerException); + SqlException innerEx = Assert.IsType(exception.InnerException); + Assert.Equal(20, innerEx.Class); + Assert.StartsWith("A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.", innerEx.Message); + // Since the server is not accessible driver can close the close the connection + // It is user responsibilty to maintain the connection. + Assert.Equal(System.Data.ConnectionState.Closed, conn.State); } [Fact] From 2f95c8a993df98930058c16da809f0527e2dc55b Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:30:26 +0100 Subject: [PATCH 02/26] Activate WeakRefTestYukonSpecific, it runs fine on Linux --- .../SQL/WeakRefTestYukonSpecific/WeakRefTestYukonSpecific.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/WeakRefTestYukonSpecific/WeakRefTestYukonSpecific.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/WeakRefTestYukonSpecific/WeakRefTestYukonSpecific.cs index 493f7e0035..9683e474a1 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/WeakRefTestYukonSpecific/WeakRefTestYukonSpecific.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/WeakRefTestYukonSpecific/WeakRefTestYukonSpecific.cs @@ -17,7 +17,6 @@ public static class WeakRefTestYukonSpecific private const int CONCURRENT_COMMANDS = 5; // TODO Synapse: Remove dependency on Northwind database - [ActiveIssue("6643", TestPlatforms.AnyUnix)] [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] public static void TestReaderMars() { From 4aa1123308fc7baa947a3c09c86fcc82b2852c16 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:31:41 +0100 Subject: [PATCH 03/26] Activate IntegratedAuthenticationTest, it runs fine --- .../IntegratedAuthenticationTest/IntegratedAuthenticationTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/IntegratedAuthenticationTest/IntegratedAuthenticationTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/IntegratedAuthenticationTest/IntegratedAuthenticationTest.cs index e043b2253c..c6ef21bc5a 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/IntegratedAuthenticationTest/IntegratedAuthenticationTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/IntegratedAuthenticationTest/IntegratedAuthenticationTest.cs @@ -30,7 +30,6 @@ public static void IntegratedAuthenticationTestWithOutConnectionPooling() TryOpenConnectionWithIntegratedAuthentication(builder.ConnectionString); } - [ActiveIssue("21707")] [ConditionalFact(nameof(IsIntegratedSecurityEnvironmentSet), nameof(AreConnectionStringsSetup))] public static void IntegratedAuthenticationTest_InvalidServerSPN() { From c97b74a17a06325cd18c7963b9576a75d317bb93 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:32:20 +0100 Subject: [PATCH 04/26] Activate LocalDBTest, make sure Local DB is present. They run fine --- .../tests/ManualTests/SQL/LocalDBTest/LocalDBTest.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/LocalDBTest/LocalDBTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/LocalDBTest/LocalDBTest.cs index 29ff71270c..4896a20e20 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/LocalDBTest/LocalDBTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/LocalDBTest/LocalDBTest.cs @@ -92,15 +92,13 @@ public static void SqlLocalDbSharedInstanceConnectionTest() #region NamedPipeTests - [Fact] - [ActiveIssue("20245")] //pending pipeline configuration + [ConditionalFact(nameof(IsLocalDBEnvironmentSet))] public static void SqlLocalDbNamedPipeConnectionTest() { ConnectionTest(s_localDbNamedPipeConnectionString); } - [Fact] - [ActiveIssue("20245")] //pending pipeline configuration + [ConditionalFact(nameof(IsLocalDBEnvironmentSet))] public static void LocalDBNamedPipeEncryptionNotSupportedTest() { // Encryption is not supported by SQL Local DB. @@ -108,8 +106,7 @@ public static void LocalDBNamedPipeEncryptionNotSupportedTest() ConnectionWithEncryptionTest(s_localDbNamedPipeConnectionString); } - [Fact] - [ActiveIssue("20245")] //pending pipeline configuration + [ConditionalFact(nameof(IsLocalDBEnvironmentSet))] public static void LocalDBNamepipeMarsTest() { ConnectionWithMarsTest(s_localDbNamedPipeConnectionString); From ae33c5ffd1786c1fcfa4d5c14eac0bdc8943dae6 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:33:04 +0100 Subject: [PATCH 05/26] Activate reliability tests, they run fine --- .../ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs | 6 ++---- .../SQL/RetryLogic/SqlConnectionReliabilityTest.cs | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs index 7c590ebe05..0f4234dae9 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs @@ -135,7 +135,6 @@ public void RetryExecuteCancel(string cnnString, SqlRetryLogicBaseProvider provi } } - [ActiveIssue("14588")] [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.IsNotAzureSynapse), nameof(DataTestUtility.AreConnStringsSetup))] [MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCommand), parameters: new object[] { 5 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)] public void RetryExecuteWithTransScope(string cnnString, SqlRetryLogicBaseProvider provider) @@ -261,7 +260,6 @@ public void RetryExecuteUnauthorizedSqlStatementDML(string cnnString, SqlRetryLo } } - [ActiveIssue("14325")] // avoid creating a new database in Azure [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.IsNotAzureSynapse), nameof(DataTestUtility.AreConnStringsSetup))] [MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyDropDB), parameters: new object[] { 5 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)] @@ -283,7 +281,7 @@ public void DropDatabaseWithActiveConnection(string cnnString, SqlRetryLogicBase cnn1.Open(); cmd.Connection = cnn1; // Create the database and wait until it is finalized. - cmd.CommandText = $"CREATE DATABASE [{database}]; \nWHILE(NOT EXISTS(SELECT 1 FROM sys.databases WHERE name = '{database}')) \nWAITFOR DELAY '00:00:10' "; + cmd.CommandText = $"CREATE DATABASE [{database}]; \nWHILE(NOT EXISTS(SELECT 1 FROM sys.databases WHERE name = '{database}')) \nWAITFOR DELAY '00:00:01' "; cmd.ExecuteNonQuery(); try @@ -292,7 +290,7 @@ public void DropDatabaseWithActiveConnection(string cnnString, SqlRetryLogicBase cnn2.Open(); cnn3.Open(); - // kill the active connection to the database after the first faliure. + // kill the active connection to the database after the first failure. provider.Retrying += (s, e) => { currentRetries = e.RetryCount; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs index 61a1b07c5e..a1420813b5 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs @@ -51,7 +51,6 @@ public void ConnectionCancelRetryOpenInvalidCatalog(string cnnString, SqlRetryLo } } - [ActiveIssue("14590", TestPlatforms.Windows)] // avoid creating a new database in Azure [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.IsNotAzureSynapse), nameof(DataTestUtility.AreConnStringsSetup))] [MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyLongRunner), parameters: new object[] { 10 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)] @@ -76,7 +75,7 @@ public void CreateDatabaseWhileTryingToConnect(string cnnString, SqlRetryLogicBa provider.Retrying += (s, e) => { currentRetries = e.RetryCount; - // Try to create database just after first faliure. + // Try to create database just after first failure. if (createDBTask == null || createDBTask.Status == TaskStatus.Faulted) { cmd.CommandText = $"IF (NOT EXISTS(SELECT 1 FROM sys.databases WHERE name = '{database}')) CREATE DATABASE [{database}];"; @@ -100,7 +99,6 @@ public void CreateDatabaseWhileTryingToConnect(string cnnString, SqlRetryLogicBa Assert.True(currentRetries > 0); } - [ActiveIssue("25147")] [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] [MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)] public void ConcurrentExecution(string cnnString, SqlRetryLogicBaseProvider provider) From 6fcd4050e2719c1135a5d71d23c90abf65063a33 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:40:45 +0100 Subject: [PATCH 06/26] Activate Credential Tests, they seem to work fine --- .../ManualTests/SQL/SqlCredentialTest/SqlCredentialTest.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCredentialTest/SqlCredentialTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCredentialTest/SqlCredentialTest.cs index ae656f11a4..5c345922c7 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCredentialTest/SqlCredentialTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCredentialTest/SqlCredentialTest.cs @@ -44,7 +44,6 @@ public static void CreateSqlConnectionWithCredential() } } - [ActiveIssue("9196")] [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] public static void SqlConnectionChangePasswordPlaintext() { @@ -78,7 +77,6 @@ public static void SqlConnectionChangePasswordPlaintext() } } - [ActiveIssue("9196")] [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] public static void SqlConnectionChangePasswordSecureString() { From 68b7e1af8950fa660c82c316e7ded3bb60b18dd1 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:44:03 +0100 Subject: [PATCH 07/26] Activate CommandCancel tests, add Conditions to existing issue --- .../SQL/SqlCommand/SqlCommandCancelTest.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCancelTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCancelTest.cs index 0928a71569..0ffb275b2c 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCancelTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCancelTest.cs @@ -157,7 +157,7 @@ public static void TimeoutCancel() TimeoutCancel(tcp_connStr); } - [ActiveIssue("12167")] + [ActiveIssue("12167", typeof(DataTestUtility), nameof(DataTestUtility.UseManagedSNIOnWindows))] // Managed SNI does not seem to work here [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] [PlatformSpecific(TestPlatforms.Windows)] public static void TimeoutCancelNP() @@ -178,15 +178,13 @@ public static void CancelAndDisposePreparedCommandNP() CancelAndDisposePreparedCommand(np_connStr); } - [ActiveIssue("5541")] - [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.IsNotNamedInstance))] public static void TimeOutDuringRead() { TimeOutDuringRead(tcp_connStr); } - [ActiveIssue("5541")] - [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.IsNotNamedInstance))] [PlatformSpecific(TestPlatforms.Windows)] public static void TimeOutDuringReadNP() { @@ -357,7 +355,8 @@ private static void TimeoutCancel(string constr) cmd.CommandText = "WAITFOR DELAY '00:00:20';select * from Customers"; string errorMessage = SystemDataResourceManager.Instance.SQL_Timeout_Execution; - DataTestUtility.ExpectFailure(() => ExecuteReaderOnCmd(cmd), new string[] { errorMessage }); + var ex = Assert.Throws(() => ExecuteReaderOnCmd(cmd)); + Assert.Equal(errorMessage, ex.Message); VerifyConnection(cmd); } From 372c4bd3a93b8e85c5b407f8e2fc5559f70be761 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:48:01 +0100 Subject: [PATCH 08/26] Activate Udt tests, they seem to work fine --- .../tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs | 1 - .../tests/ManualTests/SQL/UdtTest/UdtTest2.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs index 8adf6c7bb5..49e83ede43 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs @@ -11,7 +11,6 @@ public class UdtBulkCopyTest { private string _connStr; - [ActiveIssue("5535")] [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsUdtTestDatabasePresent), nameof(DataTestUtility.AreConnStringsSetup))] public void RunCopyTest() { diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs index 16d48d7c37..16d8195bd8 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs @@ -11,7 +11,6 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests { - [ActiveIssue("5536")] // TODO Synapse: Remove dependency from UDTTest Database public class UdtTest2 { From a46ca193f82696222589ae24a220d4f34dec70af Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:48:30 +0100 Subject: [PATCH 09/26] Activate PacketNumberWraparound test, it works fine --- .../tests/ManualTests/SQL/ParameterTest/TvpTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs index 8b5b6d0a40..829589750c 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs @@ -53,7 +53,6 @@ public void TestMain() } [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] - [ActiveIssue("5531")] public void TestPacketNumberWraparound() { // this test uses a specifically crafted sql record enumerator and data to put the TdsParserStateObject.WritePacket(byte,bool) From aefc7f2179a640227a8264cfa2018dfc77b16f89 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:49:35 +0100 Subject: [PATCH 10/26] Improve certificate tests by checking IsAdmin outside the constructor --- .../AlwaysEncrypted/CspProviderExt.cs | 2 +- .../ManualTests/DataCommon/DataTestUtility.cs | 11 +++++-- .../CertificateTest.cs | 32 +++++++++---------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs index f164dff220..53b906621e 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs @@ -25,7 +25,7 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted [PlatformSpecific(TestPlatforms.Windows)] public class CspProviderExt { - [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringSetupForAE))] + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringSetupForAE), nameof(DataTestUtility.IsAdmin))] [ClassData(typeof(AEConnectionStringProvider))] public void TestKeysFromCertificatesCreatedWithMultipleCryptoProviders(string connectionString) { diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs index 01452c555a..967c99d855 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs @@ -94,7 +94,7 @@ public static class DataTestUtility //SQL Server EngineEdition private static string s_sqlServerEngineEdition; - // JSON Coloumn type + // JSON Column type public static readonly bool IsJsonSupported = false; // Azure Synapse EngineEditionId == 6 @@ -107,8 +107,8 @@ public static bool IsAzureSynapse { s_sqlServerEngineEdition ??= GetSqlServerProperty(TCPConnectionString, "EngineEdition"); } - _ = int.TryParse(s_sqlServerEngineEdition, out int engineEditon); - return engineEditon == 6; + _ = int.TryParse(s_sqlServerEngineEdition, out int engineEdition); + return engineEdition == 6; } } @@ -468,6 +468,11 @@ public static bool IsLocalHost() return ParseDataSource(builder.DataSource, out string hostname, out _, out _) && string.Equals("localhost", hostname, StringComparison.OrdinalIgnoreCase); } + public static bool IsNotNamedInstance() + { + return !AreConnStringsSetup() || !new SqlConnectionStringBuilder(TCPConnectionString).DataSource.Contains(@"\"); + } + // Synapse: Always Encrypted is not supported with Azure Synapse. // Ref: https://feedback.azure.com/forums/307516-azure-synapse-analytics/suggestions/17858869-support-always-encrypted-in-sql-data-warehouse public static bool IsAKVSetupAvailable() diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs index 1a177c5c39..5f9961d191 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs @@ -18,6 +18,7 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests { + [PlatformSpecific(TestPlatforms.Windows)] public class CertificateTest : IDisposable { #region Private Fields @@ -75,10 +76,11 @@ public CertificateTest() SlashInstanceName = $"\\{InstanceName}"; } - Assert.True(DataTestUtility.IsAdmin, "CertificateTest class needs to be run in Admin mode."); - - CreateValidCertificate(s_fullPathToPowershellScript); - _thumbprint = Environment.GetEnvironmentVariable(ThumbPrintEnvName, EnvironmentVariableTarget.Machine); + if (IsAdmin()) + { + CreateValidCertificate(s_fullPathToPowershellScript); + _thumbprint = Environment.GetEnvironmentVariable(ThumbPrintEnvName, EnvironmentVariableTarget.Machine); + } } private static bool IsLocalHost() @@ -91,17 +93,16 @@ private static bool IsLocalHost() private static bool AreConnStringsSetup() => DataTestUtility.AreConnStringsSetup(); private static bool IsNotAzureServer() => DataTestUtility.IsNotAzureServer(); private static bool UseManagedSNIOnWindows() => DataTestUtility.UseManagedSNIOnWindows; + private static bool IsAdmin() => DataTestUtility.IsAdmin; - [ActiveIssue("31754")] - [ConditionalFact(nameof(AreConnStringsSetup), nameof(IsNotAzureServer), nameof(IsLocalHost))] - [PlatformSpecific(TestPlatforms.Windows)] - public void OpenningConnectionWithGoodCertificateTest() + [ConditionalFact(nameof(AreConnStringsSetup), nameof(IsNotAzureServer), nameof(IsLocalHost), nameof(IsAdmin))] + public void OpeningConnectionWithGoodCertificateTest() { SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString); // confirm that ForceEncryption is enabled - using SqlConnection notEncryptedConnection = new(builder.ConnectionString); builder.Encrypt = SqlConnectionEncryptOption.Optional; + using SqlConnection notEncryptedConnection = new(builder.ConnectionString); notEncryptedConnection.Open(); Assert.Equal(ConnectionState.Open, notEncryptedConnection.State); @@ -122,9 +123,7 @@ public void OpenningConnectionWithGoodCertificateTest() // Provided hostname in certificate are: // localhost, FQDN, Loopback IPv4: 127.0.0.1, IPv6: ::1 - [ActiveIssue("31754")] - [ConditionalFact(nameof(AreConnStringsSetup), nameof(IsNotAzureServer), nameof(IsLocalHost))] - [PlatformSpecific(TestPlatforms.Windows)] + [ConditionalFact(nameof(AreConnStringsSetup), nameof(IsNotAzureServer), nameof(IsLocalHost), nameof(IsAdmin))] public void OpeningConnectionWitHNICTest() { // Mandatory @@ -142,8 +141,8 @@ public void OpeningConnectionWitHNICTest() connection.Open(); Assert.Equal(ConnectionState.Open, connection.State); - // Ipv6 however causes name mistmatch error - // In net6 Manged SNI does not check for SAN. Therefore Application using Net6 have to use FQDN as HNIC + // Ipv6 however causes name mismatch error + // In net6 Manged SNI does not check for SAN. Therefor Application using Net6 have to use FQDN as HNIC // According to above no other hostname in certificate than FQDN will work in net6 which is same as SubjectName in case of RemoteCertificateNameMismatch // Net7.0 the new API added by dotnet runtime will check SANS and then SubjectName @@ -165,9 +164,8 @@ public void OpeningConnectionWitHNICTest() Assert.Equal(ConnectionState.Open, connection3.State); } } - - [ConditionalFact(nameof(AreConnStringsSetup), nameof(UseManagedSNIOnWindows), nameof(IsNotAzureServer), nameof(IsLocalHost))] - [PlatformSpecific(TestPlatforms.Windows)] + + [ConditionalFact(nameof(AreConnStringsSetup), nameof(UseManagedSNIOnWindows), nameof(IsNotAzureServer), nameof(IsLocalHost), nameof(IsAdmin))] public void RemoteCertificateNameMismatchErrorTest() { SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString) From fbcb046392e7eb12dd7de5f92ab30ee2595927b0 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 13:51:13 +0100 Subject: [PATCH 11/26] - Remove AsyncTest (why would Async be faster than Sync?) - Move tests around to TestSet when necessary, consolidate AE test sets --- ....Data.SqlClient.ManualTesting.Tests.csproj | 57 +++++----- .../ManualTests/SQL/AsyncTest/AsyncTest.cs | 106 ------------------ 2 files changed, 27 insertions(+), 136 deletions(-) delete mode 100644 src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/AsyncTest.cs 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 e3414ea7ee..f9d22f44f5 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 @@ -13,31 +13,12 @@ true - - - - - - - - PreserveNewest - TCECryptoNativeBaseline.txt - - - PreserveNewest - TCECryptoNativeBaselineRsa.txt - - - - - - - - - + + + @@ -57,6 +38,8 @@ + + @@ -70,6 +53,21 @@ + + PreserveNewest + TCECryptoNativeBaseline.txt + + + PreserveNewest + TCECryptoNativeBaselineRsa.txt + + + + + + + + @@ -79,7 +77,6 @@ - @@ -174,15 +171,21 @@ + + + + + + @@ -194,6 +197,7 @@ + @@ -279,7 +283,6 @@ - @@ -291,12 +294,6 @@ - - - - - - diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/AsyncTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/AsyncTest.cs deleted file mode 100644 index 8208f7e496..0000000000 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/AsyncTest.cs +++ /dev/null @@ -1,106 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Diagnostics; -using System.Threading.Tasks; -using Xunit; - -namespace Microsoft.Data.SqlClient.ManualTesting.Tests -{ - public static class AsyncTest - { - [ActiveIssue("5533")] // Async Operations slower than Sync operations - [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] - public static void TestReadAsyncTimeConsumed() - { - const string sql = "SET NOCOUNT ON" - + " SELECT 'a'" - + " DECLARE @t DATETIME = SYSDATETIME()" - + " WHILE DATEDIFF(s, @t, SYSDATETIME()) < 20 BEGIN" - + " SELECT 2 x INTO #y" - + " DROP TABLE #y" - + " END" - + " SELECT 'b'"; - Task t = RunReadAsync(sql); - double elapsedSync = RunReadSync(sql); - t.Wait(); - double elapsedAsync = t.Result; - Assert.True(elapsedAsync < elapsedSync, "Asynchronous operation should be finished quicker than synchronous one"); - int limit = 100; - Assert.True(elapsedAsync < limit, $"Asynchronous operation should be finished within {limit}ms"); - } - - private static async Task RunReadAsync(string sql) - { - double maxElapsedTimeMillisecond = 0; - using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) - { - await connection.OpenAsync(); - using (SqlCommand command = connection.CreateCommand()) - { - command.CommandText = sql; - using (SqlDataReader reader = await command.ExecuteReaderAsync()) - { - Task t; - Stopwatch stopwatch = new Stopwatch(); - do - { - do - { - stopwatch.Start(); - t = reader.ReadAsync(); - stopwatch.Stop(); - double elased = stopwatch.Elapsed.TotalMilliseconds; - if (maxElapsedTimeMillisecond < elased) - { - maxElapsedTimeMillisecond = elased; - } - } - while (await t); - } - while (reader.NextResult()); - } - } - } - - return maxElapsedTimeMillisecond; - } - - private static double RunReadSync(string sql) - { - double maxElapsedTimeMillisecond = 0; - using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) - { - connection.Open(); - using (SqlCommand command = connection.CreateCommand()) - { - command.CommandText = sql; - using (SqlDataReader reader = command.ExecuteReader()) - { - bool result; - Stopwatch stopwatch = new Stopwatch(); - do - { - do - { - stopwatch.Start(); - result = reader.Read(); - stopwatch.Stop(); - double elased = stopwatch.Elapsed.TotalMilliseconds; - if (maxElapsedTimeMillisecond < elased) - { - maxElapsedTimeMillisecond = elased; - } - } - while (result); - } - while (reader.NextResult()); - } - } - } - - return maxElapsedTimeMillisecond; - } - } -} From 801d2f36b7a48f260d8d43e1f5392e23008c30fb Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 18 Nov 2024 16:25:39 +0100 Subject: [PATCH 12/26] Fix grammatical errors Co-authored-by: Edward Neal <55035479+edwardneal@users.noreply.github.com> --- .../ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs index 7ff56d7fbd..85194c1fb3 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ExceptionTest/ConnectionExceptionTest.cs @@ -42,8 +42,8 @@ public void TestConnectionStateWithErrorClass20() SqlException innerEx = Assert.IsType(exception.InnerException); Assert.Equal(20, innerEx.Class); Assert.StartsWith("A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.", innerEx.Message); - // Since the server is not accessible driver can close the close the connection - // It is user responsibilty to maintain the connection. + // Since the server is not accessible, the driver can close the connection. + // It is the user's responsibility to maintain the connection. Assert.Equal(System.Data.ConnectionState.Closed, conn.State); } From 04bce8ee57878300ea870f85b81383a66b882a0d Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Sun, 24 Nov 2024 07:43:59 +0100 Subject: [PATCH 13/26] Use Close instead of Dispose, as Dispose swallows the exception --- .../tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index 7fda024ed5..928088361a 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -31,7 +31,6 @@ public static void RunAllTestsForSingleServer_NP() } } - [ActiveIssue("5540")] [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] public static void RunAllTestsForSingleServer_TCP() { @@ -2074,7 +2073,7 @@ private static void NonFatalTimeoutDuringRead(string connectionString) // Close will now observe the stored timeout error string errorMessage = SystemDataResourceManager.Instance.SQL_Timeout_Execution; - DataTestUtility.AssertThrowsWrapper(reader.Dispose, errorMessage); + DataTestUtility.AssertThrowsWrapper(reader.Close, errorMessage); } } } From 910688a45fbbb40417d384b59b46c90a84ded8cc Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Sun, 24 Nov 2024 07:48:10 +0100 Subject: [PATCH 14/26] Remove comment about IPv6 & Cert as this now works in NET8+ --- .../SQL/ConnectionTestWithSSLCert/CertificateTest.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs index 5f9961d191..f92ec9ba2b 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionTestWithSSLCert/CertificateTest.cs @@ -141,11 +141,6 @@ public void OpeningConnectionWitHNICTest() connection.Open(); Assert.Equal(ConnectionState.Open, connection.State); - // Ipv6 however causes name mismatch error - // In net6 Manged SNI does not check for SAN. Therefor Application using Net6 have to use FQDN as HNIC - // According to above no other hostname in certificate than FQDN will work in net6 which is same as SubjectName in case of RemoteCertificateNameMismatch - // Net7.0 the new API added by dotnet runtime will check SANS and then SubjectName - builder.DataSource = IPV6 + SlashInstanceName; builder.HostNameInCertificate = Dns.GetHostEntry(Environment.MachineName).HostName; builder.Encrypt = SqlConnectionEncryptOption.Mandatory; From e44241e8ae281f579cea918a00655e8e406bb7a8 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Sun, 24 Nov 2024 08:36:43 +0100 Subject: [PATCH 15/26] Do not run XEvent test on azure --- .../ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index 928088361a..9495d52602 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -12,6 +12,7 @@ using System.Threading; using System.Threading.Tasks; using System.Xml; +using Microsoft.Data.SqlClient.TestUtilities; using Xunit; namespace Microsoft.Data.SqlClient.ManualTesting.Tests @@ -31,7 +32,7 @@ public static void RunAllTestsForSingleServer_NP() } } - [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] public static void RunAllTestsForSingleServer_TCP() { RunAllTestsForSingleServer(DataTestUtility.TCPConnectionString); @@ -177,7 +178,12 @@ private static void RunAllTestsForSingleServer(string connectionString, bool usi ReadTextReader(connectionString); StreamingBlobDataTypes(connectionString); OutOfOrderGetChars(connectionString); - TestXEventsStreaming(connectionString); + + // Azure Database does not support Server scoped XEvents + if (!Utils.IsAzureSqlServer(connectionString)) + { + TestXEventsStreaming(connectionString); + } // These tests fail with named pipes, since they try to do DNS lookups on named pipe paths. if (!usingNamePipes) @@ -186,6 +192,7 @@ private static void RunAllTestsForSingleServer(string connectionString, bool usi { TimeoutDuringReadAsyncWithClosedReaderTest(connectionString); } + NonFatalTimeoutDuringRead(connectionString); } } From 0e3ad414966658de97ba546f7b3a02ff4513a756 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Sun, 24 Nov 2024 08:37:43 +0100 Subject: [PATCH 16/26] The rest of the tests run fine on Azure --- .../tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index 9495d52602..1810deec97 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -32,7 +32,7 @@ public static void RunAllTestsForSingleServer_NP() } } - [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] public static void RunAllTestsForSingleServer_TCP() { RunAllTestsForSingleServer(DataTestUtility.TCPConnectionString); From 19340e45d993cf3da9ac095a5cb9fa44d6ebb635 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Sun, 24 Nov 2024 13:33:24 +0100 Subject: [PATCH 17/26] Fix azure check --- .../tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index 1810deec97..9922d94aa3 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -180,7 +180,7 @@ private static void RunAllTestsForSingleServer(string connectionString, bool usi OutOfOrderGetChars(connectionString); // Azure Database does not support Server scoped XEvents - if (!Utils.IsAzureSqlServer(connectionString)) + if (!Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(connectionString).DataSource)) { TestXEventsStreaming(connectionString); } From 76af285acdc6d490efaf272e1e2fa63ef0e62b2d Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 25 Nov 2024 10:33:55 +0100 Subject: [PATCH 18/26] Disable more tests for Azure --- .../SQL/DataStreamTest/DataStreamTest.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index 9922d94aa3..edba03805f 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -179,12 +179,14 @@ private static void RunAllTestsForSingleServer(string connectionString, bool usi StreamingBlobDataTypes(connectionString); OutOfOrderGetChars(connectionString); - // Azure Database does not support Server scoped XEvents - if (!Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(connectionString).DataSource)) + // Azure Database does not support Server scoped XEvents and the timeout tests use the ProxyServer which also does not work + if (IsAzureSqlServer(connectionString)) { - TestXEventsStreaming(connectionString); + return; } + TestXEventsStreaming(connectionString); + // These tests fail with named pipes, since they try to do DNS lookups on named pipe paths. if (!usingNamePipes) { @@ -263,6 +265,11 @@ private static void MultipleResults(string connectionString) } } + private static bool IsAzureSqlServer(string connectionString) + { + return Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(connectionString).DataSource); + } + private static void InvalidRead(string connectionString) { using (SqlConnection c = new SqlConnection(connectionString)) From 178c7cf2ff653a96aea8002c30c65ab093c35b41 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 25 Nov 2024 11:40:47 +0100 Subject: [PATCH 19/26] Also disable named instances --- .../ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index edba03805f..3938fee663 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -179,8 +179,8 @@ private static void RunAllTestsForSingleServer(string connectionString, bool usi StreamingBlobDataTypes(connectionString); OutOfOrderGetChars(connectionString); - // Azure Database does not support Server scoped XEvents and the timeout tests use the ProxyServer which also does not work - if (IsAzureSqlServer(connectionString)) + // Azure Database does not support Server scoped XEvents and the timeout tests use the ProxyServer which also does not work on Azure and on named instances + if (IsAzureSqlServer(connectionString) || IsNamedInstance(connectionString)) { return; } @@ -269,6 +269,11 @@ private static bool IsAzureSqlServer(string connectionString) { return Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(connectionString).DataSource); } + + private static bool IsNamedInstance(string connectionString) + { + return new SqlConnectionStringBuilder(connectionString).DataSource.Contains(@"\"); + } private static void InvalidRead(string connectionString) { From 6c0204e46a72ba6c05f9d4c792e999764cfe59a4 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 25 Nov 2024 14:03:57 +0100 Subject: [PATCH 20/26] Remove ExectueXmlReaderTest on ARM Factor out tests that have different conditions --- .../ManualTests/DataCommon/DataTestUtility.cs | 10 +++ .../SQL/DataStreamTest/DataStreamTest.cs | 68 ++++++++++--------- 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs index 967c99d855..f0c8eac344 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs @@ -234,6 +234,16 @@ static DataTestUtility() } } + public static IEnumerable GetConnectionStringsWithEnclaveMemberData() + { + return GetConnectionStrings(true).Select(x => new object[] { x }); + } + + public static IEnumerable GetConnectionStringsWithoutEnclaveMemberData() + { + return GetConnectionStrings(false).Select(x => new object[] { x }); + } + public static IEnumerable ConnectionStrings => GetConnectionStrings(withEnclave: true); public static IEnumerable GetConnectionStrings(bool withEnclave) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index 3938fee663..ae98661858 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -24,11 +24,11 @@ public static void RunAllTestsForSingleServer_NP() { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - DataTestUtility.AssertThrowsWrapper(() => RunAllTestsForSingleServer(DataTestUtility.NPConnectionString, true)); + DataTestUtility.AssertThrowsWrapper(() => RunAllTestsForSingleServer(DataTestUtility.NPConnectionString)); } else { - RunAllTestsForSingleServer(DataTestUtility.NPConnectionString, true); + RunAllTestsForSingleServer(DataTestUtility.NPConnectionString); } } @@ -37,7 +37,7 @@ public static void RunAllTestsForSingleServer_TCP() { RunAllTestsForSingleServer(DataTestUtility.TCPConnectionString); } - + // Synapse: The statement failed. Column 'foo' has a data type that cannot participate in a columnstore index. [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] public static async Task AsyncMultiPacketStreamRead() @@ -119,7 +119,35 @@ static async Task LocalCopyTo(Stream source, Stream destination, int bufferSize, Assert.Fail($"input and output differ at index {index}, input={inputData[index]}, output={outputData[index]}"); } } + } + + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))] + [MemberData(nameof(DataTestUtility.GetConnectionStringsWithEnclaveMemberData), MemberType = typeof(DataTestUtility))] + public static void XEventsStreamingTest(string connectionString) + { + TestXEventsStreaming(connectionString); + } + + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsUsingNativeSNI), nameof(DataTestUtility.IsNotNamedInstance))] + [MemberData(nameof(DataTestUtility.GetConnectionStringsWithEnclaveMemberData), MemberType = typeof(DataTestUtility))] + public static void TestTimeoutDuringReadAsyncWithClosedReaderTest(string connectionString) + { + TimeoutDuringReadAsyncWithClosedReaderTest(connectionString); + } + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotNamedInstance))] + [MemberData(nameof(DataTestUtility.GetConnectionStringsWithEnclaveMemberData), MemberType = typeof(DataTestUtility))] + public static void NonFatalTimeoutDuringReadTest(string connectionString) + { + NonFatalTimeoutDuringRead(connectionString); + } + + [ActiveIssue("https://github.com/dotnet/SqlClient/issues/3035", typeof(DataStreamTest), nameof(IsArm))] + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + [MemberData(nameof(DataTestUtility.GetConnectionStringsWithEnclaveMemberData), MemberType = typeof(DataTestUtility))] + public static void XmlReaderTest(string connectionString) + { + ExecuteXmlReaderTest(connectionString); } private static byte[] CreateBinaryTable(SqlConnection connection, string tableName, int packetSize) @@ -152,7 +180,7 @@ IF OBJECT_ID('dbo.{tableName}', 'U') IS NOT NULL return data; } - private static void RunAllTestsForSingleServer(string connectionString, bool usingNamePipes = false) + private static void RunAllTestsForSingleServer(string connectionString) { RowBuffer(connectionString); InvalidRead(connectionString); @@ -165,7 +193,6 @@ private static void RunAllTestsForSingleServer(string connectionString, bool usi TimestampRead(connectionString); OrphanReader(connectionString); BufferSize(connectionString); - ExecuteXmlReaderTest(connectionString); SequentialAccess(connectionString); HasRowsTest(connectionString); CloseConnection(connectionString); @@ -178,25 +205,6 @@ private static void RunAllTestsForSingleServer(string connectionString, bool usi ReadTextReader(connectionString); StreamingBlobDataTypes(connectionString); OutOfOrderGetChars(connectionString); - - // Azure Database does not support Server scoped XEvents and the timeout tests use the ProxyServer which also does not work on Azure and on named instances - if (IsAzureSqlServer(connectionString) || IsNamedInstance(connectionString)) - { - return; - } - - TestXEventsStreaming(connectionString); - - // These tests fail with named pipes, since they try to do DNS lookups on named pipe paths. - if (!usingNamePipes) - { - if (DataTestUtility.IsUsingNativeSNI()) - { - TimeoutDuringReadAsyncWithClosedReaderTest(connectionString); - } - - NonFatalTimeoutDuringRead(connectionString); - } } private static void MultipleResults(string connectionString) @@ -265,15 +273,11 @@ private static void MultipleResults(string connectionString) } } - private static bool IsAzureSqlServer(string connectionString) - { - return Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(connectionString).DataSource); - } + private static bool IsAzureSqlServer(string connectionString) => Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(connectionString).DataSource); - private static bool IsNamedInstance(string connectionString) - { - return new SqlConnectionStringBuilder(connectionString).DataSource.Contains(@"\"); - } + private static bool IsNamedInstance(string connectionString) => new SqlConnectionStringBuilder(connectionString).DataSource.Contains(@"\"); + + private static bool IsArm => RuntimeInformation.ProcessArchitecture == Architecture.Arm || RuntimeInformation.ProcessArchitecture == Architecture.Arm64; private static void InvalidRead(string connectionString) { From 0b106c5991f258e7c51208b305877409aada3e71 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Mon, 25 Nov 2024 16:17:31 +0100 Subject: [PATCH 21/26] Disable tests with proxy for azure --- .../tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index ae98661858..ad3cecaafd 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -128,14 +128,14 @@ public static void XEventsStreamingTest(string connectionString) TestXEventsStreaming(connectionString); } - [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsUsingNativeSNI), nameof(DataTestUtility.IsNotNamedInstance))] + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsUsingNativeSNI), nameof(DataTestUtility.IsNotNamedInstance), nameof(DataTestUtility.IsNotAzureServer))] [MemberData(nameof(DataTestUtility.GetConnectionStringsWithEnclaveMemberData), MemberType = typeof(DataTestUtility))] public static void TestTimeoutDuringReadAsyncWithClosedReaderTest(string connectionString) { TimeoutDuringReadAsyncWithClosedReaderTest(connectionString); } - [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotNamedInstance))] + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotNamedInstance), nameof(DataTestUtility.IsNotAzureServer))] [MemberData(nameof(DataTestUtility.GetConnectionStringsWithEnclaveMemberData), MemberType = typeof(DataTestUtility))] public static void NonFatalTimeoutDuringReadTest(string connectionString) { From 7e2dc88ade141b5a7033a185f09141b564877c48 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Wed, 27 Nov 2024 07:20:52 +0100 Subject: [PATCH 22/26] Add data ordering to queries --- .../ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index ad3cecaafd..2bd117df7f 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -701,7 +701,7 @@ private static void ExecuteXmlReaderTest(string connectionString) using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); - using (SqlCommand cmd = new SqlCommand("select employeeId, lastname, firstname from employees for xml auto", conn)) + using (SqlCommand cmd = new SqlCommand("select employeeId, lastname, firstname from employees order by employeeId asc for xml auto", conn)) { XmlReader xr; using (xr = cmd.ExecuteXmlReader()) @@ -730,7 +730,7 @@ private static void ExecuteXmlReaderTest(string connectionString) } // use a big result to fill up the pipe and do a partial read - cmd.CommandText = "select * from orders for xml auto"; + cmd.CommandText = "select * from orders order by orderid asc for xml auto"; string errorMessage; using (xr = cmd.ExecuteXmlReader()) { @@ -774,9 +774,9 @@ private static void ExecuteXmlReaderTest(string connectionString) // multiple results cmd.CommandText = - "select orderid from orders where orderid < 10253 for xml auto;" + - "select customerid from customers where customerid < 'ANTON' for xml auto;" + - "select employeeId from employees where employeeid < 3 for xml auto;"; + "select orderid from orders where orderid < 10253 order by orderid asc for xml auto;" + + "select customerid from customers where customerid < 'ANTON' order by customerid asc for xml auto;" + + "select employeeId from employees where employeeid < 3 order by employeeid asc for xml auto;"; using (xr = cmd.ExecuteXmlReader()) { string[] expectedResults = @@ -915,7 +915,7 @@ private static void SequentialAccess(string connectionString) } } - using (SqlCommand cmd = new SqlCommand("select * from employees", conn)) + using (SqlCommand cmd = new SqlCommand("select * from employees order by EmployeeID", conn)) { // test sequential access with partial reads using (reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) From d1a2347bd81dfd9e63a0e6c55ba256e6f0ada606 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Wed, 27 Nov 2024 09:12:37 +0100 Subject: [PATCH 23/26] Enable test on ARM --- .../tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index 2bd117df7f..b48930ca4b 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -142,7 +142,6 @@ public static void NonFatalTimeoutDuringReadTest(string connectionString) NonFatalTimeoutDuringRead(connectionString); } - [ActiveIssue("https://github.com/dotnet/SqlClient/issues/3035", typeof(DataStreamTest), nameof(IsArm))] [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] [MemberData(nameof(DataTestUtility.GetConnectionStringsWithEnclaveMemberData), MemberType = typeof(DataTestUtility))] public static void XmlReaderTest(string connectionString) @@ -273,12 +272,6 @@ private static void MultipleResults(string connectionString) } } - private static bool IsAzureSqlServer(string connectionString) => Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(connectionString).DataSource); - - private static bool IsNamedInstance(string connectionString) => new SqlConnectionStringBuilder(connectionString).DataSource.Contains(@"\"); - - private static bool IsArm => RuntimeInformation.ProcessArchitecture == Architecture.Arm || RuntimeInformation.ProcessArchitecture == Architecture.Arm64; - private static void InvalidRead(string connectionString) { using (SqlConnection c = new SqlConnection(connectionString)) From 2c7320d29e60c4695fce09a0a584ae1345202b46 Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Wed, 27 Nov 2024 09:14:45 +0100 Subject: [PATCH 24/26] Remove whitespace --- .../tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs index b48930ca4b..858cef0715 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs @@ -37,7 +37,7 @@ public static void RunAllTestsForSingleServer_TCP() { RunAllTestsForSingleServer(DataTestUtility.TCPConnectionString); } - + // Synapse: The statement failed. Column 'foo' has a data type that cannot participate in a columnstore index. [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] public static async Task AsyncMultiPacketStreamRead() From b5005bc2e9d29eef632e945ee942df78c2c2c42d Mon Sep 17 00:00:00 2001 From: Michel Zehnder Date: Tue, 3 Dec 2024 06:43:52 +0100 Subject: [PATCH 25/26] Restore newline --- src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj index 70f6b3ff2c..ed113b724e 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj +++ b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj @@ -17,4 +17,5 @@ + From 1cca601df7f7396fb8ac0f6391c999d67f777ee1 Mon Sep 17 00:00:00 2001 From: Ben Russell Date: Mon, 28 Apr 2025 13:21:46 -0500 Subject: [PATCH 26/26] Removing duplicated method --- .../tests/ManualTests/DataCommon/DataTestUtility.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs index f0c8eac344..26ff8e0942 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs @@ -467,11 +467,6 @@ public static bool IsNotAzureServer() return !AreConnStringsSetup() || !Utils.IsAzureSqlServer(new SqlConnectionStringBuilder(TCPConnectionString).DataSource); } - public static bool IsNotNamedInstance() - { - return !AreConnStringsSetup() || !new SqlConnectionStringBuilder(TCPConnectionString).DataSource.Contains(@"\"); - } - public static bool IsLocalHost() { SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString);