public void SynchronizeAzureASInstance_FailsAfterTooManyRetries() { Mock <ICommandRuntime> commandRuntimeMock = new Mock <ICommandRuntime>(); // Setup // Clear the the current profile AsAzureClientSession.Instance.Profile.Environments.Clear(); var mockAuthenticationProvider = new Mock <IAsAzureAuthenticationProvider>(); mockAuthenticationProvider.Setup( authProvider => authProvider.GetAadAuthenticatedToken( It.IsAny <AsAzureContext>(), It.IsAny <SecureString>(), #if NETSTANDARD It.IsAny <Action <string> >(), #else It.IsAny <PromptBehavior>(), #endif It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Uri>())).Returns(testToken); AsAzureClientSession.Instance.SetAsAzureAuthenticationProvider(mockAuthenticationProvider.Object); commandRuntimeMock.Setup(f => f.ShouldProcess(It.IsAny <string>(), It.IsAny <string>())).Returns(true); // Set up AsAzureHttpClient mock var mockAsAzureHttpClient = new Mock <IAsAzureHttpClient>(); // set up cluster resolve respnose ClusterResolutionResult resolveResult = new ClusterResolutionResult() { ClusterFQDN = "resolved.westcentralus.asazure.windows.net", CoreServerName = testServer + ":rw", TenantId = Guid.NewGuid().ToString() }; mockAsAzureHttpClient .Setup(obj => obj.CallPostAsync( It.IsAny <Uri>(), It.Is <string>(s => s.Contains("clusterResolve")), It.IsAny <string>(), It.IsAny <HttpContent>())) .Returns(Task <HttpResponseMessage> .FromResult( new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(JsonConvert.SerializeObject(resolveResult)) })); // set up sync respnose var postResponse = new HttpResponseMessage(HttpStatusCode.Accepted); postResponse.Headers.Location = new Uri("https://1"); postResponse.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromMilliseconds(500)); postResponse.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); postResponse.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); mockAsAzureHttpClient .Setup(obj => obj.CallPostAsync( It.IsAny <Uri>(), It.Is <string>(s => s.Contains("sync")), It.IsAny <string>(), It.IsAny <Guid>(), null)) .Returns(Task <Mock <HttpResponseMessage> > .FromResult(postResponse)); var getResponse1 = new HttpResponseMessage(HttpStatusCode.SeeOther); getResponse1.Headers.Location = new Uri("https://done"); getResponse1.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromMilliseconds(500)); getResponse1.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); getResponse1.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); mockAsAzureHttpClient .Setup(obj => obj.CallGetAsync( It.Is <Uri>(u => u.OriginalString.Contains("1")), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Guid>())) .Returns(Task <HttpResponseMessage> .FromResult(getResponse1)); var getResponseSucceed = new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = new StringContent( "{\n\"database\":\"db0\",\n\"syncstate\":\"Completed\"\n}", Encoding.UTF8, "application/json") }; getResponseSucceed.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); getResponseSucceed.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); var getResponseError = new HttpResponseMessage(HttpStatusCode.InternalServerError); getResponseError.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); getResponseError.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); var finalResponses = new Queue <HttpResponseMessage>(new[] { getResponseError, getResponseError, getResponseError, getResponseSucceed }); mockAsAzureHttpClient .Setup(obj => obj.CallGetAsync( It.Is <Uri>(u => u.OriginalString.Contains("done")), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Guid>())) .Returns(() => Task.FromResult(finalResponses.Dequeue())); var mockTokenCacheItemProvider = new Mock <ITokenCacheItemProvider>(); mockTokenCacheItemProvider .Setup(obj => obj.GetTokenFromTokenCache(It.IsAny <TokenCache>(), It.IsAny <string>())) .Returns(testToken); var syncCmdlet = new SynchronizeAzureAzureAnalysisServer(mockAsAzureHttpClient.Object, mockTokenCacheItemProvider.Object) { CommandRuntime = commandRuntimeMock.Object }; var addAmdlet = new AddAzureASAccountCommand() { CommandRuntime = commandRuntimeMock.Object }; DoLogin(addAmdlet); syncCmdlet.Instance = testServer + ":rw"; syncCmdlet.Database = "db0"; // Act syncCmdlet.InvokeBeginProcessing(); Assert.Throws <SynchronizationFailedException>(() => syncCmdlet.ExecuteCmdlet()); syncCmdlet.InvokeEndProcessing(); }
/// <summary> /// Create a properly mocked Sync cmdlet for testing. /// </summary> /// <param name="tooManyRetries">Flag to set the planned failures to be greater than the retry count.</param> /// <returns>A properly mocked sync cmdlet for testing.</returns> private SynchronizeAzureAzureAnalysisServer CreateTestSyncCmdlet(bool tooManyRetries = false) { // Set up mock http client var mockHttpClient = new Mock <IAsAzureHttpClient>(); var postResponse = new HttpResponseMessage(HttpStatusCode.Accepted); postResponse.Headers.Location = new Uri("https://done"); postResponse.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromMilliseconds(500)); postResponse.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); postResponse.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); mockHttpClient .Setup(m => m.CallPostAsync( It.IsAny <Uri>(), It.Is <string>(s => s.Contains("sync")), It.IsAny <Guid>(), null)) .Returns(Task <Mock <HttpResponseMessage> > .FromResult(postResponse)); var getResponse = new HttpResponseMessage(HttpStatusCode.SeeOther); getResponse.Headers.Location = new Uri("https://done"); getResponse.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromMilliseconds(500)); getResponse.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); getResponse.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); mockHttpClient .Setup(m => m.CallGetAsync( It.Is <Uri>(u => u.OriginalString.Contains("1")), string.Empty, It.IsAny <Guid>())) .Returns(Task <HttpResponseMessage> .FromResult(getResponse)); var getResponseSucceed = new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = new StringContent("{\n\"database\":\"db0\",\n\"syncstate\":\"Completed\"\n}", Encoding.UTF8, "application/json") }; getResponseSucceed.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); getResponseSucceed.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); var getResponseError = new HttpResponseMessage(HttpStatusCode.InternalServerError); getResponseError.Headers.Add("x-ms-root-activity-id", Guid.NewGuid().ToString()); getResponseError.Headers.Add("x-ms-current-utc-date", Guid.NewGuid().ToString()); var finalResponses = tooManyRetries ? new Queue <HttpResponseMessage>(new[] { getResponseError, getResponseError, getResponseError, getResponseSucceed }) : new Queue <HttpResponseMessage>(new[] { getResponseError, getResponseSucceed }); mockHttpClient .Setup(m => m.CallGetAsync( It.Is <Uri>(u => u.OriginalString.Contains("done")), string.Empty, It.IsAny <Guid>())) .Returns(() => Task.FromResult(finalResponses.Dequeue())); Mock <ICommandRuntime> commandRuntimeMock = new Mock <ICommandRuntime>(); commandRuntimeMock.Setup(f => f.ShouldProcess(It.IsAny <string>(), It.IsAny <string>())).Returns(true); var cmdlet = new SynchronizeAzureAzureAnalysisServer() { CommandRuntime = commandRuntimeMock.Object, Instance = testInstance + ":rw", Database = "db0", AsAzureDataplaneClient = mockHttpClient.Object }; return(cmdlet); }