Ejemplo n.º 1
0
        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);
        }