Skip to content

Commit 7b52f20

Browse files
[4.0] Test fixes to accommodate recent infra changes (#2707)
Co-authored-by: David Engel <[email protected]>
1 parent 1c48ea6 commit 7b52f20

File tree

9 files changed

+72
-36
lines changed

9 files changed

+72
-36
lines changed

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationProvider.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,11 @@ public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenti
120120
CancellationTokenSource cts = new CancellationTokenSource();
121121

122122
// Use Connection timeout value to cancel token acquire request after certain period of time.
123-
cts.CancelAfter(parameters.ConnectionTimeout * 1000); // Convert to milliseconds
123+
int timeout = parameters.ConnectionTimeout * 1000;
124+
if (timeout > 0) // if ConnectionTimeout is 0 or the millis overflows an int, no need to set CancelAfter
125+
{
126+
cts.CancelAfter(timeout); // Convert to milliseconds
127+
}
124128

125129
string scope = parameters.Resource.EndsWith(s_defaultScopeSuffix) ? parameters.Resource : parameters.Resource + s_defaultScopeSuffix;
126130
string[] scopes = new string[] { scope };

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public static class DataTestUtility
6161
public static readonly string EnclaveAzureDatabaseConnString = null;
6262
public static bool ManagedIdentitySupported = true;
6363
public static string AADAccessToken = null;
64+
public static bool SupportsSystemAssignedManagedIdentity = false;
6465
public static string AADSystemIdentityAccessToken = null;
6566
public static string AADUserIdentityAccessToken = null;
6667
public const string ApplicationClientId = "2fd908ad-0664-4344-b9be-cd3e8b574c38";
@@ -78,6 +79,15 @@ public static class DataTestUtility
7879
public static readonly string KerberosDomainUser = null;
7980
internal static readonly string KerberosDomainPassword = null;
8081

82+
public static bool TcpConnectionStringDoesNotUseAadAuth
83+
{
84+
get
85+
{
86+
SqlConnectionStringBuilder builder = new (TCPConnectionString);
87+
return builder.Authentication == SqlAuthenticationMethod.SqlPassword || builder.Authentication == SqlAuthenticationMethod.NotSpecified;
88+
}
89+
}
90+
8191
static DataTestUtility()
8292
{
8393
Config c = Config.Load();
@@ -475,7 +485,7 @@ public static string GetAccessToken()
475485

476486
public static string GetSystemIdentityAccessToken()
477487
{
478-
if (true == ManagedIdentitySupported && null == AADSystemIdentityAccessToken && IsAADPasswordConnStrSetup())
488+
if (ManagedIdentitySupported && SupportsSystemAssignedManagedIdentity && null == AADSystemIdentityAccessToken && IsAADPasswordConnStrSetup())
479489
{
480490
AADSystemIdentityAccessToken = AADUtility.GetManagedIdentityToken().GetAwaiter().GetResult();
481491
if (AADSystemIdentityAccessToken == null)
@@ -488,7 +498,7 @@ public static string GetSystemIdentityAccessToken()
488498

489499
public static string GetUserIdentityAccessToken()
490500
{
491-
if (true == ManagedIdentitySupported && null == AADUserIdentityAccessToken && IsAADPasswordConnStrSetup())
501+
if (ManagedIdentitySupported && null == AADUserIdentityAccessToken && IsAADPasswordConnStrSetup())
492502
{
493503
// Pass User Assigned Managed Identity Client Id here.
494504
AADUserIdentityAccessToken = AADUtility.GetManagedIdentityToken(UserManagedIdentityClientId).GetAwaiter().GetResult();

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,14 @@ public void UpdateOffsetTest()
991991
}
992992
}
993993

994-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
994+
public static bool CanRunSchemaTests()
995+
{
996+
return DataTestUtility.AreConnStringsSetup() &&
997+
// Tests switch to master database, which is not guaranteed when using AAD auth
998+
DataTestUtility.TcpConnectionStringDoesNotUseAadAuth;
999+
}
1000+
1001+
[ConditionalFact(nameof(CanRunSchemaTests))]
9951002
public void SelectAllTest()
9961003
{
9971004
// Test exceptions

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/AADConnectionTest.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,14 @@ private static void ConnectAndDisconnect(string connectionString, SqlCredential
7575
private static bool IsAccessTokenSetup() => DataTestUtility.IsAccessTokenSetup();
7676
private static bool IsAADConnStringsSetup() => DataTestUtility.IsAADPasswordConnStrSetup();
7777
private static bool IsManagedIdentitySetup() => DataTestUtility.ManagedIdentitySupported;
78+
private static bool SupportsSystemAssignedManagedIdentity() => DataTestUtility.SupportsSystemAssignedManagedIdentity;
7879

7980
[PlatformSpecific(TestPlatforms.Windows)]
80-
[ConditionalFact(nameof(IsAccessTokenSetup), nameof(IsAADConnStringsSetup))]
81+
[ConditionalFact(nameof(IsAccessTokenSetup), nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
8182
public static void KustoDatabaseTest()
8283
{
8384
// This is a sample Kusto database that can be connected by any AD account.
84-
using SqlConnection connection = new SqlConnection("Data Source=help.kusto.windows.net; Authentication=Active Directory Default;Trust Server Certificate=True;");
85+
using SqlConnection connection = new SqlConnection($"Data Source=help.kusto.windows.net; Authentication=Active Directory Default;Trust Server Certificate=True;User ID = {DataTestUtility.UserManagedIdentityClientId};");
8586
connection.Open();
8687
Assert.True(connection.State == System.Data.ConnectionState.Open);
8788
}
@@ -559,7 +560,7 @@ public static void ActiveDirectoryDefaultMustPass()
559560
{
560561
string[] credKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
561562
string connStr = DataTestUtility.RemoveKeysInConnStr(DataTestUtility.AADPasswordConnectionString, credKeys) +
562-
"Authentication=ActiveDirectoryDefault;";
563+
$"Authentication=ActiveDirectoryDefault;User ID={DataTestUtility.UserManagedIdentityClientId};";
563564

564565
// Connection should be established using Managed Identity by default.
565566
ConnectAndDisconnect(connStr);
@@ -615,7 +616,7 @@ public static void ConnectionSpeed()
615616

616617
#region Managed Identity Authentication tests
617618

618-
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
619+
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
619620
public static void SystemAssigned_ManagedIdentityTest()
620621
{
621622
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
@@ -633,7 +634,7 @@ public static void UserAssigned_ManagedIdentityTest()
633634
ConnectAndDisconnect(connStr);
634635
}
635636

636-
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
637+
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
637638
public static void AccessToken_SystemManagedIdentityTest()
638639
{
639640
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
@@ -661,7 +662,7 @@ public static void AccessToken_UserManagedIdentityTest()
661662
}
662663
}
663664

664-
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure))]
665+
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
665666
public static void Azure_SystemManagedIdentityTest()
666667
{
667668
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD", "Trusted_Connection", "Integrated Security" };
@@ -691,7 +692,7 @@ public static void Azure_UserManagedIdentityTest()
691692
}
692693
}
693694

694-
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure))]
695+
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsAccessTokenSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
695696
public static void Azure_AccessToken_SystemManagedIdentityTest()
696697
{
697698
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD", "Trusted_Connection", "Integrated Security" };

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,8 @@ public static void ConnectionStringPersistentInfoTest()
359359
}
360360
}
361361

362-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
362+
// ConnectionOpenDisableRetry relies on error 4060 for automatic retry, which is not returned when using AAD auth
363+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
363364
public static void ConnectionOpenDisableRetry()
364365
{
365366
SqlConnectionStringBuilder connectionStringBuilder = new(DataTestUtility.TCPConnectionString)

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataBaseSchemaTest/ConnectionSchemaTest.cs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,86 +10,92 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests
1010
{
1111
public static class ConnectionSchemaTest
1212
{
13+
public static bool CanRunSchemaTests()
14+
{
15+
return DataTestUtility.AreConnStringsSetup() &&
16+
// Tests switch to master database, which is not guaranteed when using AAD auth
17+
DataTestUtility.TcpConnectionStringDoesNotUseAadAuth;
18+
}
1319

14-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
20+
[ConditionalFact(nameof(CanRunSchemaTests))]
1521
public static void GetTablesFromSchema()
1622
{
1723
VerifySchemaTable(SqlClientMetaDataCollectionNames.Tables, new string[] { "TABLE_CATALOG", "TABLE_SCHEMA", "TABLE_NAME", "TABLE_TYPE" });
1824
}
1925

20-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
26+
[ConditionalFact(nameof(CanRunSchemaTests))]
2127
public static void GetProceduresFromSchema()
2228
{
2329
VerifySchemaTable(SqlClientMetaDataCollectionNames.Procedures, new string[] { "ROUTINE_SCHEMA", "ROUTINE_NAME", "ROUTINE_TYPE" });
2430
}
2531

26-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
32+
[ConditionalFact(nameof(CanRunSchemaTests))]
2733
public static void GetProcedureParametersFromSchema()
2834
{
2935
VerifySchemaTable(SqlClientMetaDataCollectionNames.ProcedureParameters, new string[] { "PARAMETER_MODE", "PARAMETER_NAME" });
3036
}
3137

32-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
38+
[ConditionalFact(nameof(CanRunSchemaTests))]
3339
public static void GetDatabasesFromSchema()
3440
{
3541
VerifySchemaTable(SqlClientMetaDataCollectionNames.Databases, new string[] { "database_name", "dbid", "create_date" });
3642
}
3743

38-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
44+
[ConditionalFact(nameof(CanRunSchemaTests))]
3945
public static void GetForeignKeysFromSchema()
4046
{
4147
VerifySchemaTable(SqlClientMetaDataCollectionNames.ForeignKeys, new string[] { "CONSTRAINT_TYPE", "IS_DEFERRABLE", "INITIALLY_DEFERRED" });
4248
}
4349

44-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
50+
[ConditionalFact(nameof(CanRunSchemaTests))]
4551
public static void GetIndexesFromSchema()
4652
{
4753
VerifySchemaTable(SqlClientMetaDataCollectionNames.Indexes, new string[] { "index_name", "constraint_name" });
4854
}
4955

50-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
56+
[ConditionalFact(nameof(CanRunSchemaTests))]
5157
public static void GetIndexColumnsFromSchema()
5258
{
5359
VerifySchemaTable(SqlClientMetaDataCollectionNames.IndexColumns, new string[] { "index_name", "KeyType", "column_name" });
5460
}
5561

56-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
62+
[ConditionalFact(nameof(CanRunSchemaTests))]
5763
public static void GetColumnsFromSchema()
5864
{
5965
VerifySchemaTable(SqlClientMetaDataCollectionNames.Columns, new string[] { "IS_NULLABLE", "COLUMN_DEFAULT" });
6066
}
6167

62-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
68+
[ConditionalFact(nameof(CanRunSchemaTests))]
6369
public static void GetAllColumnsFromSchema()
6470
{
6571
VerifySchemaTable(SqlClientMetaDataCollectionNames.AllColumns, new string[] { "IS_NULLABLE", "COLUMN_DEFAULT", "IS_FILESTREAM", "IS_SPARSE", "IS_COLUMN_SET" });
6672
}
67-
68-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
73+
74+
[ConditionalFact(nameof(CanRunSchemaTests))]
6975
public static void GetColumnSetColumnsFromSchema()
7076
{
7177
VerifySchemaTable(SqlClientMetaDataCollectionNames.ColumnSetColumns, new string[] { "IS_NULLABLE", "COLUMN_DEFAULT", "IS_FILESTREAM", "IS_SPARSE", "IS_COLUMN_SET" });
7278
}
7379

74-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
80+
[ConditionalFact(nameof(CanRunSchemaTests))]
7581
public static void GetUsersFromSchema()
7682
{
7783
VerifySchemaTable(SqlClientMetaDataCollectionNames.Users, new string[] { "uid", "user_name" });
7884
}
7985

80-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
86+
[ConditionalFact(nameof(CanRunSchemaTests))]
8187
public static void GetViewsFromSchema()
8288
{
8389
VerifySchemaTable(SqlClientMetaDataCollectionNames.Views, new string[] { "TABLE_NAME", "CHECK_OPTION", "IS_UPDATABLE" });
8490
}
8591

86-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
92+
[ConditionalFact(nameof(CanRunSchemaTests))]
8793
public static void GetViewColumnsFromSchema()
8894
{
8995
VerifySchemaTable(SqlClientMetaDataCollectionNames.ViewColumns, new string[] { "VIEW_CATALOG", "VIEW_SCHEMA", "VIEW_NAME" });
9096
}
9197

92-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
98+
[ConditionalFact(nameof(CanRunSchemaTests))]
9399
public static void GetUserDefinedTypesFromSchema()
94100
{
95101
VerifySchemaTable(SqlClientMetaDataCollectionNames.UserDefinedTypes, new string[] { "assembly_name", "version_revision", "culture_info" });

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public static void ExceptionTests()
200200
}
201201

202202
// Synapse: 110003;Invalid user or password
203-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
203+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))]
204204
public static void VariousExceptionTests()
205205
{
206206
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString);
@@ -218,7 +218,7 @@ public static void VariousExceptionTests()
218218
}
219219

220220
// Test 1 - B
221-
badBuilder = new SqlConnectionStringBuilder(builder.ConnectionString) { Password = string.Empty, IntegratedSecurity = false };
221+
badBuilder = new SqlConnectionStringBuilder(builder.ConnectionString) { Password = string.Empty, IntegratedSecurity = false, Authentication = SqlAuthenticationMethod.NotSpecified };
222222
using (var sqlConnection = new SqlConnection(badBuilder.ConnectionString))
223223
{
224224
string errorMessage = string.Format(CultureInfo.InvariantCulture, logonFailedErrorMessage, badBuilder.UserID);

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConfigurationManagerReliabilityTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public class SqlConfigurationManagerReliabilityTest
2323
{ InitialCatalog = SqlConnectionReliabilityTest.InvalidInitialCatalog, ConnectTimeout = 1 }.ConnectionString;
2424

2525
#region Internal Functions
26-
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
26+
// Test relies on error 4060 for automatic retry, which is not returned when using AAD auth
27+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
2728
[InlineData(RetryLogicConfigHelper.RetryMethodName_Fix, RetryLogicConfigHelper.RetryMethodName_Inc)]
2829
[InlineData(RetryLogicConfigHelper.RetryMethodName_Inc, RetryLogicConfigHelper.RetryMethodName_Exp)]
2930
[InlineData(RetryLogicConfigHelper.RetryMethodName_Exp, RetryLogicConfigHelper.RetryMethodName_Fix)]
@@ -129,7 +130,8 @@ public void InvalidRetryMethodName(string methodName)
129130
s_commandCRLTest.NoneRetriableExecuteFail(TcpCnnString, cmdProvider);
130131
}
131132

132-
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
133+
// Test relies on error 4060 for automatic retry, which is not returned when using AAD auth
134+
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
133135
[InlineData("InvalidRetrylogicTypeName")]
134136
[InlineData("")]
135137
[InlineData(null)]

0 commit comments

Comments
 (0)