diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/AKVTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/AKVTests.cs index 8a56a7690c..9abd481113 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/AKVTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/AKVTests.cs @@ -12,7 +12,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public class AKVTest : IClassFixture + [Collection("AlwaysEncryptedAKV")] + public sealed class AKVTest : IDisposable { private readonly SQLSetupStrategyAzureKeyVault _fixture; private readonly string _akvTableName; @@ -191,6 +192,19 @@ public void TestLocalCekCacheIsScopedToProvider() Assert.StartsWith("The current credential is not configured to acquire tokens for tenant", ex.InnerException.Message); } + public void Dispose() + { + foreach (string connection in DataTestUtility.AEConnStringsSetup) + { + using (SqlConnection sqlConnection = new SqlConnection(connection)) + { + sqlConnection.Open(); + + Table.DeleteData(_fixture.AKVTestTable.Name, sqlConnection); + } + } + } + private class EmptyKeyStoreProvider : SqlColumnEncryptionKeyStoreProvider { public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs index c72b52ef0f..12f5484f96 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs @@ -21,7 +21,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted /// /// Always Encrypted public API Manual tests. /// - public sealed class ApiShould : IClassFixture, IDisposable + [Collection("AlwaysEncryptedCertStore")] + public sealed class ApiShould : IDisposable { private SQLSetupStrategy _fixture; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAE.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAE.cs index c0b80fe977..ce1e2b9548 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAE.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAE.cs @@ -12,7 +12,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted /// /// Always Encrypted public API Manual tests. /// - public sealed class BulkCopyAE : IClassFixture, IDisposable + [Collection("AlwaysEncryptedCertStore")] + public sealed class BulkCopyAE : IDisposable { private SQLSetupStrategy fixture; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAEErrorMessage.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAEErrorMessage.cs index a824575f6f..ffd47aba3c 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAEErrorMessage.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/BulkCopyAEErrorMessage.cs @@ -11,7 +11,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted /// /// Always Encrypted public API Manual tests. /// - public class BulkCopyAEErrorMessage : IClassFixture + [Collection("AlwaysEncryptedCertStore")] + public class BulkCopyAEErrorMessage { private SQLSetupStrategy _fixture; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ColumnDecryptErrorTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ColumnDecryptErrorTests.cs index d7435b95af..253e7eec57 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ColumnDecryptErrorTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ColumnDecryptErrorTests.cs @@ -10,7 +10,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public sealed class ColumnDecryptErrorTests : IClassFixture, IDisposable + [Collection("AlwaysEncryptedAKV")] + public sealed class ColumnDecryptErrorTests : IDisposable { private SQLSetupStrategyAzureKeyVault fixture; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs index 245e1cbd67..a7cd46c4b1 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs @@ -9,7 +9,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public class CoreCryptoTests : IClassFixture + [Collection("AlwaysEncryptedCertStore")] + public class CoreCryptoTests { // Synapse: Always Encrypted not supported in Azure Synapse. [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/DateOnlyReadTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/DateOnlyReadTests.cs index 2cd1e18019..fd4e517740 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/DateOnlyReadTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/DateOnlyReadTests.cs @@ -10,7 +10,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public sealed class DateOnlyReadTests : IClassFixture, IDisposable + [Collection("AlwaysEncryptedCertStore")] + public sealed class DateOnlyReadTests : IDisposable { private SQLSetupStrategy fixture; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/End2EndSmokeTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/End2EndSmokeTests.cs index a9c30646ae..ea122f960a 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/End2EndSmokeTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/End2EndSmokeTests.cs @@ -11,7 +11,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public sealed class End2EndSmokeTests : IClassFixture, IDisposable + [Collection("AlwaysEncryptedCertStore")] + public sealed class End2EndSmokeTests : IDisposable { private SQLSetupStrategy fixture; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ExceptionTestAKVStore.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ExceptionTestAKVStore.cs index 15679176ac..8786a6b6e6 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ExceptionTestAKVStore.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ExceptionTestAKVStore.cs @@ -10,7 +10,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public class ExceptionTestAKVStore : IClassFixture + [Collection("AlwaysEncryptedAKV")] + public class ExceptionTestAKVStore { private const string MasterKeyEncAlgo = "RSA_OAEP"; private const string BadMasterKeyEncAlgo = "BadMasterKeyAlgorithm"; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlBulkCopyTruncation.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlBulkCopyTruncation.cs index 0bc6d63545..436f72bd60 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlBulkCopyTruncation.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlBulkCopyTruncation.cs @@ -11,7 +11,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public class SqlBulkCopyTruncation : IClassFixture + [Collection("AlwaysEncryptedCertStore")] + public class SqlBulkCopyTruncation { private SQLSetupStrategy _fixture; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlNullValues.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlNullValues.cs index c69a3cc314..e604e60734 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlNullValues.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/SqlNullValues.cs @@ -11,7 +11,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public sealed class SqlNullValuesTests : IClassFixture, IDisposable + [Collection("AlwaysEncryptedCertStore")] + public sealed class SqlNullValuesTests : IDisposable { private SQLSetupStrategy fixture; private readonly string tableName; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/AlwaysEncryptedAKVCollection.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/AlwaysEncryptedAKVCollection.cs new file mode 100644 index 0000000000..7d585126af --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/AlwaysEncryptedAKVCollection.cs @@ -0,0 +1,23 @@ +// 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 Xunit; + +namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted.TestFixtures +{ + /// + /// This class has no code, and is never created. It serves only to + /// associate the AlwaysEncryptedAKV [CollectionDefinition] and its + /// ICollectionFixture<> interfaces. + /// + /// Use this collection definition for tests that rely on the + /// SQLSetupStrategyAzureKeyVault fixture. Always clean data from + /// any tables used directly in the test, as the same fixture instance + /// and database tables are shared across test classes. + /// + [CollectionDefinition("AlwaysEncryptedAKV")] + public class AlwaysEncryptedAKVCollection : ICollectionFixture + { + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/AlwaysEncryptedCertStoreCollection.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/AlwaysEncryptedCertStoreCollection.cs new file mode 100644 index 0000000000..743553f55a --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/AlwaysEncryptedCertStoreCollection.cs @@ -0,0 +1,23 @@ +// 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 Xunit; + +namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted.TestFixtures +{ + /// + /// This class has no code, and is never created. It serves only to + /// associate the AlwaysEncryptedCertStore [CollectionDefinition] and its + /// ICollectionFixture<> interfaces. + /// + /// Use this collection definition for tests that rely on the + /// SQLSetupStrategyCertStoreProvider fixture. Always clean data from + /// any tables used directly in the test, as the same fixture instance + /// and database tables are shared across test classes. + /// + [CollectionDefinition("AlwaysEncryptedCertStore")] + public class AlwaysEncryptedCertStoreCollection :ICollectionFixture + { + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs index 7e564362a5..478fe11e3d 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs @@ -198,7 +198,6 @@ public static string GetConnectionString(bool fTceEnabled, SqlConnectionStringBu builder.EnclaveAttestationUrl = sb.EnclaveAttestationUrl; builder.AttestationProtocol = sb.AttestationProtocol; } - builder.ConnectTimeout = 10000; return builder.ToString(); } diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestTrustedMasterKeyPaths.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestTrustedMasterKeyPaths.cs index 4012f00914..855d409083 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestTrustedMasterKeyPaths.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestTrustedMasterKeyPaths.cs @@ -5,7 +5,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { - public class TestTrustedMasterKeyPaths : IClassFixture + [Collection("AlwaysEncryptedCertStore")] + public class TestTrustedMasterKeyPaths { private readonly string dummyThumbprint; private readonly string tableName; @@ -48,9 +49,10 @@ private void ValidateResultSet(SqlDataReader sqlDataReader) [ClassData(typeof(AEConnectionStringProvider))] public void TestTrustedColumnEncryptionMasterKeyPathsWithNullDictionary(string connection) { - SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection); - connBuilder.ConnectTimeout = 10000; - string connStringNow = connBuilder.ToString(); + SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection) + { + ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled + }; // 1. Default should succeed. if (SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Count != 0) @@ -58,7 +60,7 @@ public void TestTrustedColumnEncryptionMasterKeyPathsWithNullDictionary(string c SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Clear(); } - using (SqlConnection sqlConnection = new SqlConnection(string.Concat(connStringNow, @";Column Encryption Setting = Enabled;"))) + using (SqlConnection sqlConnection = new SqlConnection(connBuilder.ConnectionString)) { sqlConnection.Open(); @@ -86,9 +88,10 @@ FROM [{tableName}] [ClassData(typeof(AEConnectionStringProvider))] public void TestTrustedColumnEncryptionMasterKeyPathsWithOneServer(string connection) { - SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection); - connBuilder.ConnectTimeout = 10000; - string connStringNow = connBuilder.ToString(); + SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection) + { + ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled + }; // 2.. Test with valid key path // @@ -103,7 +106,7 @@ public void TestTrustedColumnEncryptionMasterKeyPathsWithOneServer(string connec trustedKeyPaths.Add(columnMasterKeyPath); SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Add(connBuilder.DataSource, trustedKeyPaths); - using (SqlConnection sqlConnection = new SqlConnection(string.Concat(connStringNow, @";Column Encryption Setting = Enabled;"))) + using (SqlConnection sqlConnection = new SqlConnection(connBuilder.ConnectionString)) { sqlConnection.Open(); @@ -131,9 +134,10 @@ FROM [{tableName}] [ClassData(typeof(AEConnectionStringProvider))] public void TestTrustedColumnEncryptionMasterKeyPathsWithMultipleServers(string connection) { - SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection); - connBuilder.ConnectTimeout = 10000; - string connStringNow = connBuilder.ToString(); + SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection) + { + ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled + }; // 3. Test with multiple servers with multiple key paths // @@ -161,7 +165,7 @@ public void TestTrustedColumnEncryptionMasterKeyPathsWithMultipleServers(string server2TrustedKeyPaths.Add(@"https://balneetestkeyvault.vault.azure.net/keys/CryptoTest4/f4eb1dbbe6a9446599efe3c952614e70"); SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Add(@"randomeserver", server2TrustedKeyPaths); - using (SqlConnection sqlConnection = new SqlConnection(string.Concat(connStringNow, @";Column Encryption Setting = Enabled;"))) + using (SqlConnection sqlConnection = new SqlConnection(connBuilder.ConnectionString)) { sqlConnection.Open(); @@ -189,9 +193,10 @@ FROM [{tableName}] [ClassData(typeof(AEConnectionStringProvider))] public void TestTrustedColumnEncryptionMasterKeyPathsWithInvalidInputs(string connection) { - SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection); - connBuilder.ConnectTimeout = 10000; - string connStringNow = connBuilder.ToString(); + SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connection) + { + ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled + }; // 1. Test with null List // @@ -207,7 +212,7 @@ public void TestTrustedColumnEncryptionMasterKeyPathsWithInvalidInputs(string co // Prepare a dictionary with null list. SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Add(connBuilder.DataSource, (List)null); - using (SqlConnection sqlConnection = new SqlConnection(string.Concat(connStringNow, @";Column Encryption Setting = Enabled;"))) + using (SqlConnection sqlConnection = new SqlConnection(connBuilder.ConnectionString)) { sqlConnection.Open(); @@ -239,7 +244,7 @@ FROM [{tableName}] List emptyKeyPathList = new List(); SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Add(connBuilder.DataSource, emptyKeyPathList); - using (SqlConnection sqlConnection = new SqlConnection(string.Concat(connStringNow, @";Column Encryption Setting = Enabled;"))) + using (SqlConnection sqlConnection = new SqlConnection(connBuilder.ConnectionString)) { sqlConnection.Open(); @@ -273,7 +278,7 @@ FROM [{tableName}] invalidKeyPathList.Add(invalidKeyPath); SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Add(connBuilder.DataSource, invalidKeyPathList); - using (SqlConnection sqlConnection = new SqlConnection(string.Concat(connStringNow, @";Column Encryption Setting = Enabled;"))) + using (SqlConnection sqlConnection = new SqlConnection(connBuilder.ConnectionString)) { sqlConnection.Open(); 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 fbaf55db72..ec5bed2cad 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 @@ -12,64 +12,64 @@ $(BinFolder)$(Configuration).$(Platform).$(AssemblyName) true - - - - - - - - - PreserveNewest - TCECryptoNativeBaseline.txt - - - PreserveNewest - TCECryptoNativeBaselineRsa.txt - - + - - - - - - + + + + + + + + + + + + - - - - - - - - + + + + + - + + + + + + + PreserveNewest + TCECryptoNativeBaseline.txt + + + PreserveNewest + TCECryptoNativeBaselineRsa.txt +