From 4cb3c10eadeb9677399630aef19db8d3c8cdc16b Mon Sep 17 00:00:00 2001 From: Bogdan Gavril Date: Sat, 27 Mar 2021 09:33:17 +0000 Subject: [PATCH] More unit testing in progerss --- .../CoreTests/RegionDiscoveryProviderTests.cs | 148 +-- .../TelemetryTests/RegionalTelemetryTests.cs | 856 +++++++++--------- 2 files changed, 512 insertions(+), 492 deletions(-) diff --git a/tests/Microsoft.Identity.Test.Unit/CoreTests/RegionDiscoveryProviderTests.cs b/tests/Microsoft.Identity.Test.Unit/CoreTests/RegionDiscoveryProviderTests.cs index 2511585d1d..8a3e598042 100644 --- a/tests/Microsoft.Identity.Test.Unit/CoreTests/RegionDiscoveryProviderTests.cs +++ b/tests/Microsoft.Identity.Test.Unit/CoreTests/RegionDiscoveryProviderTests.cs @@ -42,22 +42,24 @@ public override void TestInitialize() _harness = base.CreateTestHarness(); _httpManager = _harness.HttpManager; _userCancellationTokenSource = new CancellationTokenSource(); - _testRequestContext = new RequestContext(_harness.ServiceBundle, Guid.NewGuid(), _userCancellationTokenSource.Token); + _testRequestContext = new RequestContext( + _harness.ServiceBundle, + Guid.NewGuid(), + _userCancellationTokenSource.Token); _apiEvent = new ApiEvent( _harness.ServiceBundle.DefaultLogger, _harness.ServiceBundle.PlatformProxy.CryptographyManager, Guid.NewGuid().AsMatsCorrelationId()); _testRequestContext.ApiEvent = _apiEvent; - _regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager); + _regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager, true); } [TestCleanup] public override void TestCleanup() { Environment.SetEnvironmentVariable(TestConstants.RegionName, ""); - _testRequestContext.ServiceBundle.Config.AuthorityInfo.RegionToUse = ""; _harness?.Dispose(); - _regionDiscoveryProvider.Clear(); + _regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager, true); base.TestCleanup(); } @@ -66,17 +68,25 @@ public async Task SuccessfulResponseFromEnvironmentVariableAsync() { Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + _testRequestContext.ServiceBundle.Config.AzureRegion = null; // not configured - ValidateInstanceMetadata(regionalMetadata); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync( + new Uri("https://login.microsoftonline.com/common/"), _testRequestContext) + .ConfigureAwait(false); + + Assert.IsNull(regionalMetadata); } [TestMethod] public async Task SuccessfulResponseFromLocalImdsAsync() { AddMockedResponse(MockHelpers.CreateSuccessResponseMessage(TestConstants.Region)); + + _testRequestContext.ServiceBundle.Config.AzureRegion = + ConfidentialClientApplication.AttemptRegionDiscovery; - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync( + new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); ValidateInstanceMetadata(regionalMetadata); } @@ -86,12 +96,16 @@ public async Task FetchRegionFromLocalImdsThenGetMetadataFromCacheAsync() { AddMockedResponse(MockHelpers.CreateSuccessResponseMessage(TestConstants.Region)); - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + _testRequestContext.ServiceBundle.Config.AzureRegion = + ConfidentialClientApplication.AttemptRegionDiscovery; + + InstanceDiscoveryMetadataEntry regionalMetadata = + await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); ValidateInstanceMetadata(regionalMetadata); //get metadata from the instance metadata cache - regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); ValidateInstanceMetadata(regionalMetadata); } @@ -100,42 +114,49 @@ public async Task FetchRegionFromLocalImdsThenGetMetadataFromCacheAsync() public async Task SuccessfulResponseFromUserProvidedRegionAsync() { AddMockedResponse(MockHelpers.CreateNullMessage(System.Net.HttpStatusCode.NotFound)); - _testRequestContext.ServiceBundle.Config.AuthorityInfo.RegionToUse = TestConstants.Region; - IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager, new NetworkCacheMetadataProvider()); - InstanceDiscoveryMetadataEntry regionalMetadata = await regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + _testRequestContext.ServiceBundle.Config.AzureRegion = TestConstants.Region; + + IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager, true); + InstanceDiscoveryMetadataEntry regionalMetadata = await regionDiscoveryProvider.GetMetadataAsync( + new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.IsNotNull(regionalMetadata); Assert.AreEqual("centralus.login.microsoft.com", regionalMetadata.PreferredNetwork); - regionDiscoveryProvider.Clear(); + + Assert.AreEqual(TestConstants.Region, _testRequestContext.ApiEvent.RegionDiscovered); + Assert.AreEqual(TestConstants.Region, _testRequestContext.ApiEvent.RegionSource); + Assert.AreEqual(TestConstants.Region, _testRequestContext.ApiEvent.UserProvidedRegion); + Assert.AreEqual(TestConstants.Region, _testRequestContext.ApiEvent.IsValidUserProvidedRegion); + Assert.AreEqual(TestConstants.Region, _testRequestContext.ApiEvent.FallbackToGlobal); } [TestMethod] public async Task ResponseFromUserProvidedRegionSameAsRegionDetectedAsync() { Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - _testRequestContext.ServiceBundle.Config.AuthorityInfo.RegionToUse = TestConstants.Region; + _testRequestContext.ServiceBundle.Config.AzureRegion = TestConstants.Region; - IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager, new NetworkCacheMetadataProvider()); - InstanceDiscoveryMetadataEntry regionalMetadata = await regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + // IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.IsNotNull(regionalMetadata); Assert.AreEqual("centralus.login.microsoft.com", regionalMetadata.PreferredNetwork); - regionDiscoveryProvider.Clear(); + } [TestMethod] public async Task ResponseFromUserProvidedRegionDifferentFromRegionDetectedAsync() { Environment.SetEnvironmentVariable(TestConstants.RegionName, "eastus"); - _testRequestContext.ServiceBundle.Config.AuthorityInfo.RegionToUse = TestConstants.Region; + //_testRequestContext.ServiceBundle.Config.AuthorityInfo.RegionToUse = TestConstants.Region; - IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager, new NetworkCacheMetadataProvider()); - InstanceDiscoveryMetadataEntry regionalMetadata = await regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + //IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider(_httpManager, new NetworkCacheMetadataProvider()); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.IsNotNull(regionalMetadata); Assert.AreEqual("eastus.login.microsoft.com", regionalMetadata.PreferredNetwork); - regionDiscoveryProvider.Clear(); + // regionDiscoveryProvider.Clear(); } [TestMethod] @@ -144,10 +165,10 @@ public async Task SuccessfulResponseFromRegionalizedAuthorityAsync() var regionalizedAuthority = new Uri($"https://{TestConstants.Region}.login.microsoft.com/common/"); Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - - // In the instance discovery flow, TryGetMetadataAsync is always called with a known authority first, then with regionalized. - await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(regionalizedAuthority, _testRequestContext).ConfigureAwait(false); + + // In the instance discovery flow, GetMetadataAsync is always called with a known authority first, then with regionalized. + await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(regionalizedAuthority, _testRequestContext).ConfigureAwait(false); ValidateInstanceMetadata(regionalMetadata); } @@ -193,51 +214,51 @@ protected override async Task SendAsync(HttpRequestMessage } } - [TestMethod] - public async Task NoImdsCancellation_UserCancelled_Async() - { - var httpManager = new HttpManager(new SimpleHttpClientFactory()); + //[TestMethod] + //public async Task NoImdsCancellation_UserCancelled_Async() + //{ + // var httpManager = new HttpManager(new SimpleHttpClientFactory()); - IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider( - httpManager, - new NetworkCacheMetadataProvider()); + // IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider( + // httpManager, + // new NetworkCacheMetadataProvider()); - _userCancellationTokenSource.Cancel(); + // _userCancellationTokenSource.Cancel(); - var ex = await AssertException.TaskThrowsAsync(() => regionDiscoveryProvider.TryGetMetadataAsync( - new Uri("https://login.microsoftonline.com/common/"), - _testRequestContext)) - .ConfigureAwait(false); + // var ex = await AssertException.TaskThrowsAsync(() => regionDiscoveryProvider.GetMetadataAsync( + // new Uri("https://login.microsoftonline.com/common/"), + // _testRequestContext)) + // .ConfigureAwait(false); - Assert.AreEqual(MsalError.RegionDiscoveryFailed, ex.ErrorCode); - regionDiscoveryProvider.Clear(); - } + // Assert.AreEqual(MsalError.RegionDiscoveryFailed, ex.ErrorCode); + // regionDiscoveryProvider.Clear(); + //} - [TestMethod] - public async Task ImdsTimeout_Async() - { - var httpManager = new HttpManager(new SimpleHttpClientFactory()); + //[TestMethod] + //public async Task ImdsTimeout_Async() + //{ + // var httpManager = new HttpManager(new SimpleHttpClientFactory()); - IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider( - httpManager, - new NetworkCacheMetadataProvider(), - imdsCallTimeout: 0); + // IRegionDiscoveryProvider regionDiscoveryProvider = new RegionDiscoveryProvider( + // httpManager, + // new NetworkCacheMetadataProvider(), + // imdsCallTimeout: 0); - var ex = await AssertException.TaskThrowsAsync(() => regionDiscoveryProvider.TryGetMetadataAsync( - new Uri("https://login.microsoftonline.com/common/"), - _testRequestContext)) - .ConfigureAwait(false); + // var ex = await AssertException.TaskThrowsAsync(() => regionDiscoveryProvider.GetMetadataAsync( + // new Uri("https://login.microsoftonline.com/common/"), + // _testRequestContext)) + // .ConfigureAwait(false); - Assert.AreEqual(MsalError.RegionDiscoveryFailed, ex.ErrorCode); - regionDiscoveryProvider.Clear(); - } + // Assert.AreEqual(MsalError.RegionDiscoveryFailed, ex.ErrorCode); + // // regionDiscoveryProvider.Clear(); + //} [TestMethod] public async Task NonPublicCloudTestAsync() { Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.someenv.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.someenv.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.IsNotNull(regionalMetadata); Assert.AreEqual("centralus.login.someenv.com", regionalMetadata.PreferredNetwork); @@ -250,7 +271,7 @@ public async Task ResponseMissingRegionFromLocalImdsAsync() try { - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.Fail("Exception should be thrown."); } @@ -269,7 +290,7 @@ public async Task ErrorResponseFromLocalImdsAsync() try { - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.Fail("Exception should be thrown."); } @@ -289,7 +310,7 @@ public async Task UpdateApiversionWhenCurrentVersionExpiresForImdsAsync() ResourceHelper.GetTestResourceRelativePath("local-imds-error-response.json"))), expectedParams: false); AddMockedResponse(MockHelpers.CreateSuccessResponseMessage(TestConstants.Region), apiVersion: "2020-10-01"); - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); ValidateInstanceMetadata(regionalMetadata); } @@ -302,7 +323,7 @@ public async Task UpdateApiversionFailsWithEmptyResponseBodyAsync() try { - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.Fail("The call should fail with MsalServiceException as the updated version for imds was not returned."); } @@ -323,7 +344,7 @@ public async Task UpdateApiversionFailsWithNoNewestVersionsAsync() try { - InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.TryGetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); + InstanceDiscoveryMetadataEntry regionalMetadata = await _regionDiscoveryProvider.GetMetadataAsync(new Uri("https://login.microsoftonline.com/common/"), _testRequestContext).ConfigureAwait(false); Assert.Fail("The call should fail with MsalServiceException as the newest versions were missing in the response."); } @@ -377,13 +398,12 @@ private void ValidateInstanceMetadata(InstanceDiscoveryMetadataEntry entry) { InstanceDiscoveryMetadataEntry expectedEntry = new InstanceDiscoveryMetadataEntry() { - Aliases = new[] { "centralus.login.microsoft.com" }, + Aliases = new[] { "centralus.login.microsoft.com", "login.microsoftonline.com" }, PreferredCache = "login.microsoftonline.com", PreferredNetwork = "centralus.login.microsoft.com" }; - Assert.IsNotNull(entry, "The instance metadata should not be empty."); - Assert.AreEqual(expectedEntry.Aliases.Single(), entry.Aliases.Single()); + CollectionAssert.AreEquivalent(expectedEntry.Aliases, entry.Aliases); Assert.AreEqual(expectedEntry.PreferredCache, entry.PreferredCache); Assert.AreEqual(expectedEntry.PreferredNetwork, entry.PreferredNetwork); } diff --git a/tests/Microsoft.Identity.Test.Unit/TelemetryTests/RegionalTelemetryTests.cs b/tests/Microsoft.Identity.Test.Unit/TelemetryTests/RegionalTelemetryTests.cs index 7ebbeb9b53..a6ee0e47b1 100644 --- a/tests/Microsoft.Identity.Test.Unit/TelemetryTests/RegionalTelemetryTests.cs +++ b/tests/Microsoft.Identity.Test.Unit/TelemetryTests/RegionalTelemetryTests.cs @@ -1,428 +1,428 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; -using Microsoft.Identity.Client; -using Microsoft.Identity.Client.OAuth2.Throttling; -using Microsoft.Identity.Client.TelemetryCore; -using Microsoft.Identity.Test.Common.Core.Helpers; -using Microsoft.Identity.Test.Common.Core.Mocks; -using Microsoft.Identity.Test.Unit.Throttling; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using static Microsoft.Identity.Client.TelemetryCore.Internal.Events.ApiEvent; - -namespace Microsoft.Identity.Test.Unit.TelemetryTests -{ - [TestClass] - public class RegionalTelemetryTests : TestBase - { - private MockHttpAndServiceBundle _harness; - private ConfidentialClientApplication _app; - - [TestInitialize] - public override void TestInitialize() - { - base.TestInitialize(); - - _harness = CreateTestHarness(); - _app = ConfidentialClientApplicationBuilder.Create(TestConstants.ClientId) - .WithAuthority(AzureCloudInstance.AzurePublic, TestConstants.TenantId) - .WithClientSecret(TestConstants.ClientSecret) - .WithHttpManager(_harness.HttpManager) - .WithExperimentalFeatures(true) - .BuildConcrete(); - } - - [TestCleanup] - public override void TestCleanup() - { - Environment.SetEnvironmentVariable(TestConstants.RegionName, null); - _harness?.Dispose(); - base.TestCleanup(); - } - - /// - /// 1. Acquire Token For Client with Region successfully - /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 0, - /// Last_request = 4 | 0 | | | - /// - /// 2. Acquire Token for client with Region -> HTTP error 503 (Service Unavailable) - /// - /// Current_request = 4 | ATC_ID, 1 | centralus, 3, 0, - /// Last_request = 4 | 0 | | | - /// - /// 3. Acquire Token For Client with Region -> successful - /// - /// Sent to the server - - /// Current_request = 4 | ATC_ID, 1 | centralus, 3, 0, - /// Last_request = 4 | 0 | ATC_ID, corr_step_2 | ServiceUnavailable | centralus, 3 - /// - [TestMethod] - public async Task TelemetryAcceptanceTestAsync() - { - Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - - Trace.WriteLine("Step 1. Acquire Token For Client with region successful"); - var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.Success).ConfigureAwait(false); - AssertCurrentTelemetry(result.HttpRequest, ApiIds.AcquireTokenForClient, "1"); - AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); - - Trace.WriteLine("Step 2. Acquire Token For Client -> HTTP 5xx error (i.e. AAD is down)"); - result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.AADUnavailableError).ConfigureAwait(false); - Guid step2CorrelationId = result.Correlationid; - - // we can assert telemetry here, as it will be sent to AAD. However, AAD is down, so it will not record it. - AssertCurrentTelemetry(result.HttpRequest, ApiIds.AcquireTokenForClient, "3"); - AssertPreviousTelemetry( - result.HttpRequest, - expectedSilentCount: 0); - - // the 5xx error puts MSAL in a throttling state, so "wait" until this clears - _harness.ServiceBundle.ThrottlingManager.SimulateTimePassing( - HttpStatusProvider.s_throttleDuration.Add(TimeSpan.FromSeconds(1))); - - Trace.WriteLine("Step 3. Acquire Token For Client -> Success"); - result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.Success, true).ConfigureAwait(false); - - AssertCurrentTelemetry(result.HttpRequest, ApiIds.AcquireTokenForClient, "3"); - AssertPreviousTelemetry( - result.HttpRequest, - expectedSilentCount: 0, - expectedFailedApiIds: new[] { ApiIds.AcquireTokenForClient }, - expectedCorrelationIds: new[] { step2CorrelationId }, - expectedErrors: new[] { "service_not_available" }, - expectedRegions: new[] { "centralus" }, - expectedRegionSources: new[] { "3" }); - } - - /// - /// Acquire token for client with serialized token cache successfully - /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1 - /// Last_request = 4 | 0 | | | - /// - [TestMethod] - public async Task TelemetrySerializedTokenCacheTestAsync() - { - Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - - var inMemoryTokenCache = new InMemoryTokenCache(); - inMemoryTokenCache.Bind(_app.AppTokenCache); - - Trace.WriteLine("Acquire token for client with token serialization."); - var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.Success).ConfigureAwait(false); - AssertCurrentTelemetry(result.HttpRequest, - ApiIds.AcquireTokenForClient, - "1", - isCacheSerialized: true); - AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); - } - - /// - /// Acquire token for client with regionToUse when auto region discovery fails - /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, centralus, - /// Last_request = 4 | 0 | | | - /// - [TestMethod] - public async Task TelemetryUserProvidedRegionAutoDiscoveryFailsTestsAsync() - { - Trace.WriteLine("Acquire token for client with region provided by user and region detection fails."); - _harness.HttpManager.AddMockHandlerContentNotFound(HttpMethod.Get, TestConstants.ImdsUrl); - var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.UserProvidedRegion).ConfigureAwait(false); - AssertCurrentTelemetry(result.HttpRequest, - ApiIds.AcquireTokenForClient, - "4", - isCacheSerialized: false, - userProvidedRegion: TestConstants.Region); - AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); - } - - /// - /// Acquire token for client with regionToUse when auto region discovery passes with region same as regionToUse - /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, centralus, 1 - /// Last_request = 4 | 0 | | | - /// - [TestMethod] - public async Task TelemetryUserProvidedRegionAutoDiscoverRegionSameTestsAsync() - { - Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - - Trace.WriteLine("Acquire token for client with region provided by user and region detected is same as regionToUse."); - var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.UserProvidedRegion).ConfigureAwait(false); - AssertCurrentTelemetry(result.HttpRequest, - ApiIds.AcquireTokenForClient, - "1", - isCacheSerialized: false, - userProvidedRegion: TestConstants.Region, - isValidUserProvidedRegion: "1"); - AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); - } - - /// - /// Acquire token for client with regionToUse when auto region discovery passes with region different from regionToUse - /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, invalid, 0 - /// Last_request = 4 | 0 | | | - /// - [TestMethod] - public async Task TelemetryUserProvidedRegionAutoDiscoverRegionDifferentTestsAsync() - { - Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); - - Trace.WriteLine("Acquire token for client with region provided by user and region detected is different from regionToUse."); - var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.UserProvidedInvalidRegion).ConfigureAwait(false); - AssertCurrentTelemetry(result.HttpRequest, - ApiIds.AcquireTokenForClient, - "1", - isCacheSerialized: false, - userProvidedRegion: "invalid", - isValidUserProvidedRegion: "0"); - AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); - } - - /// - /// Acquire token for client with regionToUse when auto region discovery fails - /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, centralus, - /// Last_request = 4 | 0 | | | - /// - [TestMethod] - public async Task TelemetryUserProvidedRegionAutoDiscoveryFailsFallbackToGlobalTestsAsync() - { - Trace.WriteLine("Acquire token for client with region provided by user and region detection fails."); - _harness.HttpManager.AddMockHandlerContentNotFound(HttpMethod.Get, TestConstants.ImdsUrl); - var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.FallbackToGlobal).ConfigureAwait(false); - AssertCurrentTelemetry(result.HttpRequest, - ApiIds.AcquireTokenForClient, - "", - region: "", - isCacheSerialized: false, - fallbackToGlobal: "1"); - AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); - } - - private enum AcquireTokenForClientOutcome - { - Success, - UserProvidedRegion, - UserProvidedInvalidRegion, - AADUnavailableError, - FallbackToGlobal - } - - private async Task<(HttpRequestMessage HttpRequest, Guid Correlationid)> RunAcquireTokenForClientAsync( - AcquireTokenForClientOutcome outcome, bool forceRefresh = false) - { - MockHttpMessageHandler tokenRequestHandler = null; - Guid correlationId = default; - - switch (outcome) - { - case AcquireTokenForClientOutcome.Success: - - tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional); - var authResult = await _app - .AcquireTokenForClient(TestConstants.s_scope) - .WithPreferredAzureRegion(true) - .WithForceRefresh(forceRefresh) - .ExecuteAsync() - .ConfigureAwait(false); - correlationId = authResult.CorrelationId; - break; - - case AcquireTokenForClientOutcome.FallbackToGlobal: - _harness.HttpManager.AddInstanceDiscoveryMockHandler(); - tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityTenant); - authResult = await _app - .AcquireTokenForClient(TestConstants.s_scope) - .WithPreferredAzureRegion(true) - .WithForceRefresh(forceRefresh) - .ExecuteAsync() - .ConfigureAwait(false); - correlationId = authResult.CorrelationId; - break; - - case AcquireTokenForClientOutcome.UserProvidedRegion: - - tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional); - authResult = await _app - .AcquireTokenForClient(TestConstants.s_scope) - .WithPreferredAzureRegion(true, TestConstants.Region) - .WithForceRefresh(forceRefresh) - .ExecuteAsync() - .ConfigureAwait(false); - correlationId = authResult.CorrelationId; - break; - - case AcquireTokenForClientOutcome.UserProvidedInvalidRegion: - - tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional); - authResult = await _app - .AcquireTokenForClient(TestConstants.s_scope) - .WithPreferredAzureRegion(true, "invalid") - .WithForceRefresh(forceRefresh) - .ExecuteAsync() - .ConfigureAwait(false); - correlationId = authResult.CorrelationId; - break; - - case AcquireTokenForClientOutcome.AADUnavailableError: - correlationId = Guid.NewGuid(); - - tokenRequestHandler = new MockHttpMessageHandler() - { - ExpectedMethod = HttpMethod.Post, - ResponseMessage = MockHelpers.CreateFailureMessage( - System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout") - }; - var tokenRequestHandler2 = new MockHttpMessageHandler() - { - ExpectedMethod = HttpMethod.Post, - ResponseMessage = MockHelpers.CreateFailureMessage( - System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout") - }; - - // 2 of these are needed because MSAL has a "retry once" policy for 5xx errors - _harness.HttpManager.AddMockHandler(tokenRequestHandler2); - _harness.HttpManager.AddMockHandler(tokenRequestHandler); - - var serviceEx = await AssertException.TaskThrowsAsync(() => - _app - .AcquireTokenForClient(TestConstants.s_scope) - .WithPreferredAzureRegion(true) - .WithForceRefresh(true) - .WithCorrelationId(correlationId) - .ExecuteAsync()) - .ConfigureAwait(false); - - break; - - default: - throw new NotImplementedException(); - } - - Assert.AreEqual(0, _harness.HttpManager.QueueSize); - - return (tokenRequestHandler?.ActualRequestMessage, correlationId); - } - - private static void AssertCurrentTelemetry( - HttpRequestMessage requestMessage, - ApiIds apiId, - string regionSource, - string region = TestConstants.Region, - bool isCacheSerialized = false, - string userProvidedRegion = "", - string isValidUserProvidedRegion = "", - string fallbackToGlobal = "0") - { - string[] telemetryCategories = requestMessage.Headers.GetValues( - TelemetryConstants.XClientCurrentTelemetry).Single().Split('|'); - - Assert.AreEqual(3, telemetryCategories.Length); - Assert.AreEqual(1, telemetryCategories[0].Split(',').Length); // version - Assert.AreEqual(2, telemetryCategories[1].Split(',').Length); // api_id, cache_info - Assert.AreEqual(7, telemetryCategories[2].Split(',').Length); // platform_fields - - Assert.AreEqual(TelemetryConstants.HttpTelemetrySchemaVersion, telemetryCategories[0]); // version - - Assert.AreEqual( - apiId.ToString("D"), - telemetryCategories[1].Split(',')[0]); // current_api_id - - string[] platformConfig = telemetryCategories[2].Split(','); - Assert.AreEqual(region, platformConfig[0]); - Assert.AreEqual(regionSource, platformConfig[1]); - Assert.AreEqual(isCacheSerialized ? "1" : "0", platformConfig[2]); - Assert.AreEqual(userProvidedRegion, platformConfig[3]); - Assert.AreEqual(isValidUserProvidedRegion, platformConfig[4]); - Assert.AreEqual(fallbackToGlobal, platformConfig[5]); - } - - private static void AssertPreviousTelemetry( - HttpRequestMessage requestMessage, - int expectedSilentCount, - ApiIds[] expectedFailedApiIds = null, - Guid[] expectedCorrelationIds = null, - string[] expectedErrors = null, - string[] expectedRegions = null, - string[] expectedRegionSources = null) - { - expectedFailedApiIds = expectedFailedApiIds ?? new ApiIds[0]; - expectedCorrelationIds = expectedCorrelationIds ?? new Guid[0]; - expectedErrors = expectedErrors ?? new string[0]; - expectedRegions = expectedRegions ?? new string[0]; - expectedRegionSources = expectedRegionSources ?? new string[0]; - - var actualHeader = ParseLastRequestHeader(requestMessage); - - Assert.AreEqual(expectedSilentCount, actualHeader.SilentCount); - CoreAssert.AreEqual(actualHeader.FailedApis.Length, actualHeader.CorrelationIds.Length, actualHeader.Errors.Length); - - CollectionAssert.AreEqual( - expectedFailedApiIds.Select(apiId => ((int)apiId).ToString(CultureInfo.InvariantCulture)).ToArray(), - actualHeader.FailedApis); - - CollectionAssert.AreEqual( - expectedCorrelationIds.Select(g => g.ToString()).ToArray(), - actualHeader.CorrelationIds); - - CollectionAssert.AreEqual( - expectedErrors, - actualHeader.Errors); - - CollectionAssert.AreEqual( - expectedRegions, - actualHeader.Regions); - - CollectionAssert.AreEqual( - expectedRegionSources, - actualHeader.RegionSources); - } - - private static (int SilentCount, string[] FailedApis, string[] CorrelationIds, string[] Errors, string[] Regions, string[] RegionSources) ParseLastRequestHeader(HttpRequestMessage requestMessage) - { - // schema_version | silent_succesful_count | failed_requests | errors | platform_fields - // where a failed_request is "api_id, correlation_id" - string lastTelemetryHeader = requestMessage.Headers.GetValues( - TelemetryConstants.XClientLastTelemetry).Single(); - var lastRequestParts = lastTelemetryHeader.Split('|'); - - Assert.AreEqual(5, lastRequestParts.Length); // 2 | 1 | | | - Assert.AreEqual(TelemetryConstants.HttpTelemetrySchemaVersion, lastRequestParts[0]); // version - - int actualSuccessfullSilentCount = int.Parse(lastRequestParts[1], CultureInfo.InvariantCulture); - - string[] actualFailedApiIds = lastRequestParts[2] - .Split(',') - .Where((item, index) => index % 2 == 0) - .Where(it => !string.IsNullOrEmpty(it)) - .ToArray(); - string[] correlationIds = lastRequestParts[2] - .Split(',') - .Where((item, index) => index % 2 != 0) - .Where(it => !string.IsNullOrEmpty(it)) - .ToArray(); - - string[] actualErrors = lastRequestParts[3] - .Split(',') - .Where(it => !string.IsNullOrEmpty(it)) - .ToArray(); - - string[] regions = lastRequestParts[4] - .Split(',') - .Where((item, index) => index % 2 == 0) - .Where(it => !string.IsNullOrEmpty(it)) - .ToArray(); - string[] regionSources = lastRequestParts[4] - .Split(',') - .Where((item, index) => index % 2 != 0) - .Where(it => !string.IsNullOrEmpty(it)) - .ToArray(); - - return (actualSuccessfullSilentCount, actualFailedApiIds, correlationIds, actualErrors, regions, regionSources); - } - } -} +//// Copyright (c) Microsoft Corporation. All rights reserved. +//// Licensed under the MIT License. + +//using System; +//using System.Diagnostics; +//using System.Globalization; +//using System.Linq; +//using System.Net.Http; +//using System.Threading.Tasks; +//using Microsoft.Identity.Client; +//using Microsoft.Identity.Client.OAuth2.Throttling; +//using Microsoft.Identity.Client.TelemetryCore; +//using Microsoft.Identity.Test.Common.Core.Helpers; +//using Microsoft.Identity.Test.Common.Core.Mocks; +//using Microsoft.Identity.Test.Unit.Throttling; +//using Microsoft.VisualStudio.TestTools.UnitTesting; +//using static Microsoft.Identity.Client.TelemetryCore.Internal.Events.ApiEvent; + +//namespace Microsoft.Identity.Test.Unit.TelemetryTests +//{ +// [TestClass] +// public class RegionalTelemetryTests : TestBase +// { +// private MockHttpAndServiceBundle _harness; +// private ConfidentialClientApplication _app; + +// [TestInitialize] +// public override void TestInitialize() +// { +// base.TestInitialize(); + +// _harness = CreateTestHarness(); +// _app = ConfidentialClientApplicationBuilder.Create(TestConstants.ClientId) +// .WithAuthority(AzureCloudInstance.AzurePublic, TestConstants.TenantId) +// .WithClientSecret(TestConstants.ClientSecret) +// .WithHttpManager(_harness.HttpManager) +// .WithExperimentalFeatures(true) +// .BuildConcrete(); +// } + +// [TestCleanup] +// public override void TestCleanup() +// { +// Environment.SetEnvironmentVariable(TestConstants.RegionName, null); +// _harness?.Dispose(); +// base.TestCleanup(); +// } + +// /// +// /// 1. Acquire Token For Client with Region successfully +// /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 0, +// /// Last_request = 4 | 0 | | | +// /// +// /// 2. Acquire Token for client with Region -> HTTP error 503 (Service Unavailable) +// /// +// /// Current_request = 4 | ATC_ID, 1 | centralus, 3, 0, +// /// Last_request = 4 | 0 | | | +// /// +// /// 3. Acquire Token For Client with Region -> successful +// /// +// /// Sent to the server - +// /// Current_request = 4 | ATC_ID, 1 | centralus, 3, 0, +// /// Last_request = 4 | 0 | ATC_ID, corr_step_2 | ServiceUnavailable | centralus, 3 +// /// +// [TestMethod] +// public async Task TelemetryAcceptanceTestAsync() +// { +// Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); + +// Trace.WriteLine("Step 1. Acquire Token For Client with region successful"); +// var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.Success).ConfigureAwait(false); +// AssertCurrentTelemetry(result.HttpRequest, ApiIds.AcquireTokenForClient, "1"); +// AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); + +// Trace.WriteLine("Step 2. Acquire Token For Client -> HTTP 5xx error (i.e. AAD is down)"); +// result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.AADUnavailableError).ConfigureAwait(false); +// Guid step2CorrelationId = result.Correlationid; + +// // we can assert telemetry here, as it will be sent to AAD. However, AAD is down, so it will not record it. +// AssertCurrentTelemetry(result.HttpRequest, ApiIds.AcquireTokenForClient, "3"); +// AssertPreviousTelemetry( +// result.HttpRequest, +// expectedSilentCount: 0); + +// // the 5xx error puts MSAL in a throttling state, so "wait" until this clears +// _harness.ServiceBundle.ThrottlingManager.SimulateTimePassing( +// HttpStatusProvider.s_throttleDuration.Add(TimeSpan.FromSeconds(1))); + +// Trace.WriteLine("Step 3. Acquire Token For Client -> Success"); +// result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.Success, true).ConfigureAwait(false); + +// AssertCurrentTelemetry(result.HttpRequest, ApiIds.AcquireTokenForClient, "3"); +// AssertPreviousTelemetry( +// result.HttpRequest, +// expectedSilentCount: 0, +// expectedFailedApiIds: new[] { ApiIds.AcquireTokenForClient }, +// expectedCorrelationIds: new[] { step2CorrelationId }, +// expectedErrors: new[] { "service_not_available" }, +// expectedRegions: new[] { "centralus" }, +// expectedRegionSources: new[] { "3" }); +// } + +// /// +// /// Acquire token for client with serialized token cache successfully +// /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1 +// /// Last_request = 4 | 0 | | | +// /// +// [TestMethod] +// public async Task TelemetrySerializedTokenCacheTestAsync() +// { +// Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); + +// var inMemoryTokenCache = new InMemoryTokenCache(); +// inMemoryTokenCache.Bind(_app.AppTokenCache); + +// Trace.WriteLine("Acquire token for client with token serialization."); +// var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.Success).ConfigureAwait(false); +// AssertCurrentTelemetry(result.HttpRequest, +// ApiIds.AcquireTokenForClient, +// "1", +// isCacheSerialized: true); +// AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); +// } + +// /// +// /// Acquire token for client with regionToUse when auto region discovery fails +// /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, centralus, +// /// Last_request = 4 | 0 | | | +// /// +// [TestMethod] +// public async Task TelemetryUserProvidedRegionAutoDiscoveryFailsTestsAsync() +// { +// Trace.WriteLine("Acquire token for client with region provided by user and region detection fails."); +// _harness.HttpManager.AddMockHandlerContentNotFound(HttpMethod.Get, TestConstants.ImdsUrl); +// var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.UserProvidedRegion).ConfigureAwait(false); +// AssertCurrentTelemetry(result.HttpRequest, +// ApiIds.AcquireTokenForClient, +// "4", +// isCacheSerialized: false, +// userProvidedRegion: TestConstants.Region); +// AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); +// } + +// /// +// /// Acquire token for client with regionToUse when auto region discovery passes with region same as regionToUse +// /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, centralus, 1 +// /// Last_request = 4 | 0 | | | +// /// +// [TestMethod] +// public async Task TelemetryUserProvidedRegionAutoDiscoverRegionSameTestsAsync() +// { +// Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); + +// Trace.WriteLine("Acquire token for client with region provided by user and region detected is same as regionToUse."); +// var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.UserProvidedRegion).ConfigureAwait(false); +// AssertCurrentTelemetry(result.HttpRequest, +// ApiIds.AcquireTokenForClient, +// "1", +// isCacheSerialized: false, +// userProvidedRegion: TestConstants.Region, +// isValidUserProvidedRegion: "1"); +// AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); +// } + +// /// +// /// Acquire token for client with regionToUse when auto region discovery passes with region different from regionToUse +// /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, invalid, 0 +// /// Last_request = 4 | 0 | | | +// /// +// [TestMethod] +// public async Task TelemetryUserProvidedRegionAutoDiscoverRegionDifferentTestsAsync() +// { +// Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region); + +// Trace.WriteLine("Acquire token for client with region provided by user and region detected is different from regionToUse."); +// var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.UserProvidedInvalidRegion).ConfigureAwait(false); +// AssertCurrentTelemetry(result.HttpRequest, +// ApiIds.AcquireTokenForClient, +// "1", +// isCacheSerialized: false, +// userProvidedRegion: "invalid", +// isValidUserProvidedRegion: "0"); +// AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); +// } + +// /// +// /// Acquire token for client with regionToUse when auto region discovery fails +// /// Current_request = 4 | ATC_ID, 0 | centralus, 1, 1, centralus, +// /// Last_request = 4 | 0 | | | +// /// +// [TestMethod] +// public async Task TelemetryUserProvidedRegionAutoDiscoveryFailsFallbackToGlobalTestsAsync() +// { +// Trace.WriteLine("Acquire token for client with region provided by user and region detection fails."); +// _harness.HttpManager.AddMockHandlerContentNotFound(HttpMethod.Get, TestConstants.ImdsUrl); +// var result = await RunAcquireTokenForClientAsync(AcquireTokenForClientOutcome.FallbackToGlobal).ConfigureAwait(false); +// AssertCurrentTelemetry(result.HttpRequest, +// ApiIds.AcquireTokenForClient, +// "", +// region: "", +// isCacheSerialized: false, +// fallbackToGlobal: "1"); +// AssertPreviousTelemetry(result.HttpRequest, expectedSilentCount: 0); +// } + +// private enum AcquireTokenForClientOutcome +// { +// Success, +// UserProvidedRegion, +// UserProvidedInvalidRegion, +// AADUnavailableError, +// FallbackToGlobal +// } + +// private async Task<(HttpRequestMessage HttpRequest, Guid Correlationid)> RunAcquireTokenForClientAsync( +// AcquireTokenForClientOutcome outcome, bool forceRefresh = false) +// { +// MockHttpMessageHandler tokenRequestHandler = null; +// Guid correlationId = default; + +// switch (outcome) +// { +// case AcquireTokenForClientOutcome.Success: + +// tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional); +// var authResult = await _app +// .AcquireTokenForClient(TestConstants.s_scope) +// .WithPreferredAzureRegion(true) +// .WithForceRefresh(forceRefresh) +// .ExecuteAsync() +// .ConfigureAwait(false); +// correlationId = authResult.CorrelationId; +// break; + +// case AcquireTokenForClientOutcome.FallbackToGlobal: +// _harness.HttpManager.AddInstanceDiscoveryMockHandler(); +// tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityTenant); +// authResult = await _app +// .AcquireTokenForClient(TestConstants.s_scope) +// .WithPreferredAzureRegion(true) +// .WithForceRefresh(forceRefresh) +// .ExecuteAsync() +// .ConfigureAwait(false); +// correlationId = authResult.CorrelationId; +// break; + +// case AcquireTokenForClientOutcome.UserProvidedRegion: + +// tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional); +// authResult = await _app +// .AcquireTokenForClient(TestConstants.s_scope) +// .WithPreferredAzureRegion(true, TestConstants.Region) +// .WithForceRefresh(forceRefresh) +// .ExecuteAsync() +// .ConfigureAwait(false); +// correlationId = authResult.CorrelationId; +// break; + +// case AcquireTokenForClientOutcome.UserProvidedInvalidRegion: + +// tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional); +// authResult = await _app +// .AcquireTokenForClient(TestConstants.s_scope) +// .WithPreferredAzureRegion(true, "invalid") +// .WithForceRefresh(forceRefresh) +// .ExecuteAsync() +// .ConfigureAwait(false); +// correlationId = authResult.CorrelationId; +// break; + +// case AcquireTokenForClientOutcome.AADUnavailableError: +// correlationId = Guid.NewGuid(); + +// tokenRequestHandler = new MockHttpMessageHandler() +// { +// ExpectedMethod = HttpMethod.Post, +// ResponseMessage = MockHelpers.CreateFailureMessage( +// System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout") +// }; +// var tokenRequestHandler2 = new MockHttpMessageHandler() +// { +// ExpectedMethod = HttpMethod.Post, +// ResponseMessage = MockHelpers.CreateFailureMessage( +// System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout") +// }; + +// // 2 of these are needed because MSAL has a "retry once" policy for 5xx errors +// _harness.HttpManager.AddMockHandler(tokenRequestHandler2); +// _harness.HttpManager.AddMockHandler(tokenRequestHandler); + +// var serviceEx = await AssertException.TaskThrowsAsync(() => +// _app +// .AcquireTokenForClient(TestConstants.s_scope) +// .WithPreferredAzureRegion(true) +// .WithForceRefresh(true) +// .WithCorrelationId(correlationId) +// .ExecuteAsync()) +// .ConfigureAwait(false); + +// break; + +// default: +// throw new NotImplementedException(); +// } + +// Assert.AreEqual(0, _harness.HttpManager.QueueSize); + +// return (tokenRequestHandler?.ActualRequestMessage, correlationId); +// } + +// private static void AssertCurrentTelemetry( +// HttpRequestMessage requestMessage, +// ApiIds apiId, +// string regionSource, +// string region = TestConstants.Region, +// bool isCacheSerialized = false, +// string userProvidedRegion = "", +// string isValidUserProvidedRegion = "", +// string fallbackToGlobal = "0") +// { +// string[] telemetryCategories = requestMessage.Headers.GetValues( +// TelemetryConstants.XClientCurrentTelemetry).Single().Split('|'); + +// Assert.AreEqual(3, telemetryCategories.Length); +// Assert.AreEqual(1, telemetryCategories[0].Split(',').Length); // version +// Assert.AreEqual(2, telemetryCategories[1].Split(',').Length); // api_id, cache_info +// Assert.AreEqual(7, telemetryCategories[2].Split(',').Length); // platform_fields + +// Assert.AreEqual(TelemetryConstants.HttpTelemetrySchemaVersion, telemetryCategories[0]); // version + +// Assert.AreEqual( +// apiId.ToString("D"), +// telemetryCategories[1].Split(',')[0]); // current_api_id + +// string[] platformConfig = telemetryCategories[2].Split(','); +// Assert.AreEqual(region, platformConfig[0]); +// Assert.AreEqual(regionSource, platformConfig[1]); +// Assert.AreEqual(isCacheSerialized ? "1" : "0", platformConfig[2]); +// Assert.AreEqual(userProvidedRegion, platformConfig[3]); +// Assert.AreEqual(isValidUserProvidedRegion, platformConfig[4]); +// Assert.AreEqual(fallbackToGlobal, platformConfig[5]); +// } + +// private static void AssertPreviousTelemetry( +// HttpRequestMessage requestMessage, +// int expectedSilentCount, +// ApiIds[] expectedFailedApiIds = null, +// Guid[] expectedCorrelationIds = null, +// string[] expectedErrors = null, +// string[] expectedRegions = null, +// string[] expectedRegionSources = null) +// { +// expectedFailedApiIds = expectedFailedApiIds ?? new ApiIds[0]; +// expectedCorrelationIds = expectedCorrelationIds ?? new Guid[0]; +// expectedErrors = expectedErrors ?? new string[0]; +// expectedRegions = expectedRegions ?? new string[0]; +// expectedRegionSources = expectedRegionSources ?? new string[0]; + +// var actualHeader = ParseLastRequestHeader(requestMessage); + +// Assert.AreEqual(expectedSilentCount, actualHeader.SilentCount); +// CoreAssert.AreEqual(actualHeader.FailedApis.Length, actualHeader.CorrelationIds.Length, actualHeader.Errors.Length); + +// CollectionAssert.AreEqual( +// expectedFailedApiIds.Select(apiId => ((int)apiId).ToString(CultureInfo.InvariantCulture)).ToArray(), +// actualHeader.FailedApis); + +// CollectionAssert.AreEqual( +// expectedCorrelationIds.Select(g => g.ToString()).ToArray(), +// actualHeader.CorrelationIds); + +// CollectionAssert.AreEqual( +// expectedErrors, +// actualHeader.Errors); + +// CollectionAssert.AreEqual( +// expectedRegions, +// actualHeader.Regions); + +// CollectionAssert.AreEqual( +// expectedRegionSources, +// actualHeader.RegionSources); +// } + +// private static (int SilentCount, string[] FailedApis, string[] CorrelationIds, string[] Errors, string[] Regions, string[] RegionSources) ParseLastRequestHeader(HttpRequestMessage requestMessage) +// { +// // schema_version | silent_succesful_count | failed_requests | errors | platform_fields +// // where a failed_request is "api_id, correlation_id" +// string lastTelemetryHeader = requestMessage.Headers.GetValues( +// TelemetryConstants.XClientLastTelemetry).Single(); +// var lastRequestParts = lastTelemetryHeader.Split('|'); + +// Assert.AreEqual(5, lastRequestParts.Length); // 2 | 1 | | | +// Assert.AreEqual(TelemetryConstants.HttpTelemetrySchemaVersion, lastRequestParts[0]); // version + +// int actualSuccessfullSilentCount = int.Parse(lastRequestParts[1], CultureInfo.InvariantCulture); + +// string[] actualFailedApiIds = lastRequestParts[2] +// .Split(',') +// .Where((item, index) => index % 2 == 0) +// .Where(it => !string.IsNullOrEmpty(it)) +// .ToArray(); +// string[] correlationIds = lastRequestParts[2] +// .Split(',') +// .Where((item, index) => index % 2 != 0) +// .Where(it => !string.IsNullOrEmpty(it)) +// .ToArray(); + +// string[] actualErrors = lastRequestParts[3] +// .Split(',') +// .Where(it => !string.IsNullOrEmpty(it)) +// .ToArray(); + +// string[] regions = lastRequestParts[4] +// .Split(',') +// .Where((item, index) => index % 2 == 0) +// .Where(it => !string.IsNullOrEmpty(it)) +// .ToArray(); +// string[] regionSources = lastRequestParts[4] +// .Split(',') +// .Where((item, index) => index % 2 != 0) +// .Where(it => !string.IsNullOrEmpty(it)) +// .ToArray(); + +// return (actualSuccessfullSilentCount, actualFailedApiIds, correlationIds, actualErrors, regions, regionSources); +// } +// } +//}