Skip to content

Commit 1c4afd9

Browse files
author
SqlClient Azure DevOps
committed
Merge in 'release/5.1' changes
2 parents d141006 + 5645b14 commit 1c4afd9

File tree

9 files changed

+70
-35
lines changed

9 files changed

+70
-35
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
@@ -64,6 +64,7 @@ public static class DataTestUtility
6464
public static readonly string EnclaveAzureDatabaseConnString = null;
6565
public static bool ManagedIdentitySupported = true;
6666
public static string AADAccessToken = null;
67+
public static bool SupportsSystemAssignedManagedIdentity = false;
6768
public static string AADSystemIdentityAccessToken = null;
6869
public static string AADUserIdentityAccessToken = null;
6970
public const string ApplicationClientId = "2fd908ad-0664-4344-b9be-cd3e8b574c38";
@@ -83,6 +84,15 @@ public static class DataTestUtility
8384
public static readonly string KerberosDomainUser = null;
8485
internal static readonly string KerberosDomainPassword = null;
8586

87+
public static bool TcpConnectionStringDoesNotUseAadAuth
88+
{
89+
get
90+
{
91+
SqlConnectionStringBuilder builder = new (TCPConnectionString);
92+
return builder.Authentication == SqlAuthenticationMethod.SqlPassword || builder.Authentication == SqlAuthenticationMethod.NotSpecified;
93+
}
94+
}
95+
8696
static DataTestUtility()
8797
{
8898
Config c = Config.Load();
@@ -529,7 +539,7 @@ public static string GetAccessToken()
529539

530540
public static string GetSystemIdentityAccessToken()
531541
{
532-
if (true == ManagedIdentitySupported && null == AADSystemIdentityAccessToken && IsAADPasswordConnStrSetup())
542+
if (ManagedIdentitySupported && SupportsSystemAssignedManagedIdentity && null == AADSystemIdentityAccessToken && IsAADPasswordConnStrSetup())
533543
{
534544
AADSystemIdentityAccessToken = AADUtility.GetManagedIdentityToken().GetAwaiter().GetResult();
535545
if (AADSystemIdentityAccessToken == null)
@@ -542,7 +552,7 @@ public static string GetSystemIdentityAccessToken()
542552

543553
public static string GetUserIdentityAccessToken()
544554
{
545-
if (true == ManagedIdentitySupported && null == AADUserIdentityAccessToken && IsAADPasswordConnStrSetup())
555+
if (ManagedIdentitySupported && null == AADUserIdentityAccessToken && IsAADPasswordConnStrSetup())
546556
{
547557
// Pass User Assigned Managed Identity Client Id here.
548558
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
@@ -72,13 +72,14 @@ private static void ConnectAndDisconnect(string connectionString, SqlCredential
7272
private static bool IsAccessTokenSetup() => DataTestUtility.IsAccessTokenSetup();
7373
private static bool IsAADConnStringsSetup() => DataTestUtility.IsAADPasswordConnStrSetup();
7474
private static bool IsManagedIdentitySetup() => DataTestUtility.ManagedIdentitySupported;
75+
private static bool SupportsSystemAssignedManagedIdentity() => DataTestUtility.SupportsSystemAssignedManagedIdentity;
7576

7677
[PlatformSpecific(TestPlatforms.Windows)]
77-
[ConditionalFact(nameof(IsAccessTokenSetup), nameof(IsAADConnStringsSetup))]
78+
[ConditionalFact(nameof(IsAccessTokenSetup), nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
7879
public static void KustoDatabaseTest()
7980
{
8081
// This is a sample Kusto database that can be connected by any AD account.
81-
using SqlConnection connection = new SqlConnection("Data Source=help.kusto.windows.net; Authentication=Active Directory Default;Trust Server Certificate=True;");
82+
using SqlConnection connection = new SqlConnection($"Data Source=help.kusto.windows.net; Authentication=Active Directory Default;Trust Server Certificate=True;User ID = {DataTestUtility.UserManagedIdentityClientId};");
8283
connection.Open();
8384
Assert.True(connection.State == System.Data.ConnectionState.Open);
8485
}
@@ -556,7 +557,7 @@ public static void ActiveDirectoryDefaultMustPass()
556557
{
557558
string[] credKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
558559
string connStr = DataTestUtility.RemoveKeysInConnStr(DataTestUtility.AADPasswordConnectionString, credKeys) +
559-
"Authentication=ActiveDirectoryDefault;";
560+
$"Authentication=ActiveDirectoryDefault;User ID={DataTestUtility.UserManagedIdentityClientId};";
560561

561562
// Connection should be established using Managed Identity by default.
562563
ConnectAndDisconnect(connStr);
@@ -612,7 +613,7 @@ public static void ConnectionSpeed()
612613

613614
#region Managed Identity Authentication tests
614615

615-
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
616+
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
616617
public static void SystemAssigned_ManagedIdentityTest()
617618
{
618619
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
@@ -630,7 +631,7 @@ public static void UserAssigned_ManagedIdentityTest()
630631
ConnectAndDisconnect(connStr);
631632
}
632633

633-
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup))]
634+
[ConditionalFact(nameof(IsAADConnStringsSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
634635
public static void AccessToken_SystemManagedIdentityTest()
635636
{
636637
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD" };
@@ -658,7 +659,7 @@ public static void AccessToken_UserManagedIdentityTest()
658659
}
659660
}
660661

661-
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsManagedIdentitySetup))]
662+
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
662663
public static void Azure_SystemManagedIdentityTest()
663664
{
664665
string[] removeKeys = { "Authentication", "User ID", "Password", "UID", "PWD", "Trusted_Connection", "Integrated Security" };
@@ -688,7 +689,7 @@ public static void Azure_UserManagedIdentityTest()
688689
}
689690
}
690691

691-
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsAccessTokenSetup), nameof(IsManagedIdentitySetup))]
692+
[ConditionalFact(nameof(AreConnStringsSetup), nameof(IsAzure), nameof(IsAccessTokenSetup), nameof(IsManagedIdentitySetup), nameof(SupportsSystemAssignedManagedIdentity))]
692693
public static void Azure_AccessToken_SystemManagedIdentityTest()
693694
{
694695
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
@@ -362,7 +362,8 @@ public static void ConnectionStringPersistentInfoTest()
362362
}
363363
}
364364

365-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
365+
// ConnectionOpenDisableRetry relies on error 4060 for automatic retry, which is not returned when using AAD auth
366+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
366367
public static void ConnectionOpenDisableRetry()
367368
{
368369
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,92 +10,98 @@ 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
}
6773

68-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
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" });
96102
}
97103

98-
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
104+
[ConditionalFact(nameof(CanRunSchemaTests))]
99105
public static void GetStructuredTypeMembersFromSchema()
100106
{
101107
VerifySchemaTable(SqlClientMetaDataCollectionNames.StructuredTypeMembers, new string[] { "TYPE_CATALOG", "TYPE_SCHEMA", "TYPE_NAME", "MEMBER_NAME", "ORDINAL_POSITION" });

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

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

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

221221
// Test 1 - B
222-
badBuilder = new SqlConnectionStringBuilder(builder.ConnectionString) { Password = string.Empty, IntegratedSecurity = false };
222+
badBuilder = new SqlConnectionStringBuilder(builder.ConnectionString) { Password = string.Empty, IntegratedSecurity = false, Authentication = SqlAuthenticationMethod.NotSpecified };
223223
using (var sqlConnection = new SqlConnection(badBuilder.ConnectionString))
224224
{
225225
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)