private async Task <HealthServiceResponseData> SendRequestAsync(string requestXml, Guid?correlationId = null)
        {
            try
            {
                Debug.WriteLine($"Sent message: {requestXml}");

                byte[] requestXmlBytes = Encoding.UTF8.GetBytes(requestXml);

                CancellationTokenSource cancellationTokenSource = null;
                HttpResponseMessage     response;
                try
                {
                    cancellationTokenSource = new CancellationTokenSource(Configuration.RequestTimeoutDuration);

                    response = await _webRequestClient.SendAsync(
                        ServiceInstance.HealthServiceUrl,
                        requestXmlBytes,
                        requestXml.Length,
                        new Dictionary <string, string> {
                        { CorrelationIdContextKey, correlationId.GetValueOrDefault(Guid.NewGuid()).ToString() }
                    },
                        (CancellationToken)cancellationTokenSource?.Token).ConfigureAwait(false);
                }
                finally
                {
                    cancellationTokenSource?.Dispose();
                }

                // Platform returns a platform request id with the responses. This allows
                // developers to have additional information if necessary for debugging/logging purposes.
                Guid responseId;
                if (response.Headers != null &&
                    response.Headers.Contains(ResponseIdContextKey) &&
                    Guid.TryParse(response.Headers.GetValues(ResponseIdContextKey)?.FirstOrDefault(), out responseId))
                {
                    // TODO: Provide a plug in for applications to plug in their telemetry
                    if (HealthVaultPlatformTrace.LoggingEnabled)
                    {
                        HealthVaultPlatformTrace.Log(TraceEventType.Information, "Response Id: {0}", responseId);
                    }
                }

                HealthServiceResponseData responseData = await _healthServiceResponseParser.ParseResponseAsync(response).ConfigureAwait(false);

                return(responseData);
            }
            catch (XmlException xmlException)
            {
                throw new HealthServiceException(
                          Resources.InvalidResponseFromXMLRequest,
                          xmlException);
            }
        }
        public async Task WhenAuthenticateCalledWithNoStoredInfo_ThenInfoIsFetchedAndStored()
        {
            SetupEmptyLocalStore();

            _healthVaultConfiguration.MasterApplicationId = s_masterApplicationId;

            var responseMessage1 = GenerateResponseMessage("NewApplicationCreationInfoResult.xml");
            var responseMessage2 = GenerateResponseMessage("GetServiceDefinitionResult.xml");

            // #3 is CAST call - but goes through IClientSessionCredentialClient and not HealthWebRequestClient
            var responseMessage4 = GenerateResponseMessage("GetAuthorizedPeopleResult.xml");

            // The first few calls use the default endpoint
            _subHealthWebRequestClient
            .SendAsync(
                new Uri("https://platform2.healthvault.com/platform/wildcat.ashx"),
                Arg.Any <byte[]>(),
                Arg.Any <int>(),
                Arg.Any <IDictionary <string, string> >(),
                Arg.Any <CancellationToken>())
            .Returns(responseMessage1, responseMessage2);

            // After GetServiceDefinition called, we are calling new endpoint
            _subHealthWebRequestClient
            .SendAsync(
                new Uri("https://platform.healthvault-ppe.com/platform/wildcat.ashx"),
                Arg.Any <byte[]>(),
                Arg.Any <int>(),
                Arg.Any <IDictionary <string, string> >(),
                Arg.Any <CancellationToken>())
            .Returns(responseMessage4);

            var sessionCredential = new SessionCredential
            {
                Token        = SessionToken,
                SharedSecret = SessionSharedSecret
            };

            _subClientSessionCredentialClient
            .GetSessionCredentialAsync(Arg.Any <CancellationToken>())
            .Returns(sessionCredential);

            _subServiceLocator
            .GetInstance <IClientSessionCredentialClient>()
            .Returns(_subClientSessionCredentialClient);

            // These values match the values in NewApplicationCreationInfoResult.xml
            _subShellAuthService
            .ProvisionApplicationAsync(
                new Uri("https://account.healthvault.com"),
                s_masterApplicationId,
                ApplicationCreationToken,
                ApplicationInstanceId)
            .Returns("1");

            HealthVaultSodaConnection healthVaultSodaConnection = CreateHealthVaultSodaConnection();
            await healthVaultSodaConnection.AuthenticateAsync();

            _subClientSessionCredentialClient.Received().AppSharedSecret = ApplicationSharedSecret;
            _subClientSessionCredentialClient.Received().Connection      = healthVaultSodaConnection;

            await _subLocalObjectStore.Received()
            .WriteAsync(
                HealthVaultSodaConnection.ServiceInstanceKey,
                Arg.Is <object>(o => ((HealthServiceInstance)o).HealthServiceUrl == new Uri("https://platform.healthvault-ppe.com/platform/wildcat.ashx")));

            await _subLocalObjectStore.Received()
            .WriteAsync(
                HealthVaultSodaConnection.ApplicationCreationInfoKey,
                Arg.Is <object>(o => ((ApplicationCreationInfo)o).AppInstanceId == new Guid("b5c5593b-afb4-466d-88f2-31707fb8634b")));

            await _subLocalObjectStore.Received()
            .WriteAsync(
                HealthVaultSodaConnection.SessionCredentialKey,
                Arg.Is <object>(o => ((SessionCredential)o).SharedSecret == SessionSharedSecret));

            await _subLocalObjectStore.Received()
            .WriteAsync(
                HealthVaultSodaConnection.PersonInfoKey,
                Arg.Is <object>(o => ((PersonInfo)o).Name == "David Rickard"));
        }