public void RemoveTelemetryDataTest()
        {
            IdentityModelTelemetryUtil.AddTelemetryData("parameter1", "value1");
            Assert.True(IdentityModelTelemetryUtil.telemetryData.ContainsKey("parameter1") && IdentityModelTelemetryUtil.telemetryData["parameter1"] == "value1");
            IdentityModelTelemetryUtil.RemoveTelemetryData("parameter1");
            Assert.True(!IdentityModelTelemetryUtil.telemetryData.ContainsKey("parameter1"));

            Assert.False(IdentityModelTelemetryUtil.RemoveTelemetryData(null));
            Assert.False(IdentityModelTelemetryUtil.RemoveTelemetryData(IdentityModelTelemetryUtil.skuTelemetry));
            Assert.False(IdentityModelTelemetryUtil.RemoveTelemetryData(IdentityModelTelemetryUtil.versionTelemetry));
        }
        public void UpdateTelemetryDataTest()
        {
            IdentityModelTelemetryUtil.UpdateDefaultTelemetryData("parameter1", "value1");
            Assert.True(IdentityModelTelemetryUtil.telemetryData.ContainsKey("parameter1") && IdentityModelTelemetryUtil.telemetryData["parameter1"] == "value1");
            IdentityModelTelemetryUtil.UpdateDefaultTelemetryData("parameter1", "value2");
            Assert.True(IdentityModelTelemetryUtil.telemetryData.ContainsKey("parameter1") && IdentityModelTelemetryUtil.telemetryData["parameter1"] == "value2");

            IdentityModelTelemetryUtil.UpdateDefaultTelemetryData(IdentityModelTelemetryUtil.skuTelemetry, "value1");
            Assert.True(IdentityModelTelemetryUtil.telemetryData.ContainsKey(IdentityModelTelemetryUtil.skuTelemetry) && IdentityModelTelemetryUtil.telemetryData[IdentityModelTelemetryUtil.skuTelemetry] == "value1");

            Assert.False(IdentityModelTelemetryUtil.UpdateDefaultTelemetryData(IdentityModelTelemetryUtil.skuTelemetry, null));
            Assert.False(IdentityModelTelemetryUtil.UpdateDefaultTelemetryData(null, "value1"));
        }
コード例 #3
0
        /// <summary>
        /// Returns a task which contains a string converted from remote document when completed, by using the provided address.
        /// </summary>
        /// <param name="address">Location of document</param>
        /// <param name="cancel">A cancellation token that can be used by other objects or threads to receive notice of cancellation. <see cref="CancellationToken"/></param>
        /// <returns>Document as a string</returns>
        public async Task <string> GetDocumentAsync(string address, CancellationToken cancel)
        {
            if (string.IsNullOrWhiteSpace(address))
            {
                throw LogHelper.LogArgumentNullException("address");
            }

            if (!Utility.IsHttps(address) && RequireHttps)
            {
                throw LogHelper.LogExceptionMessage(new ArgumentException(LogHelper.FormatInvariant(LogMessages.IDX20108, address), nameof(address)));
            }

            Exception           unsuccessfulHttpResponseException;
            HttpResponseMessage response;

            try
            {
                LogHelper.LogVerbose(LogMessages.IDX20805, address);
                var httpClient = _httpClient ?? _defaultHttpClient;
                var uri        = new Uri(address, UriKind.RelativeOrAbsolute);
                using (var message = new HttpRequestMessage(HttpMethod.Get, uri))
                {
                    if (SendAdditionalHeaderData)
                    {
                        IdentityModelTelemetryUtil.SetTelemetryData(message);
                    }

                    response = await httpClient.SendAsync(message).ConfigureAwait(false);
                }

                var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                if (response.IsSuccessStatusCode)
                {
                    return(responseContent);
                }

                unsuccessfulHttpResponseException = new IOException(LogHelper.FormatInvariant(LogMessages.IDX20807, address, response, responseContent));
            }
            catch (Exception ex)
            {
                throw LogHelper.LogExceptionMessage(new IOException(LogHelper.FormatInvariant(LogMessages.IDX20804, address), ex));
            }

            throw LogHelper.LogExceptionMessage(unsuccessfulHttpResponseException);
        }
        public void SetTelemetry(TelemetryTheoryData theoryData)
        {
            var testContext = new CompareContext();

            try
            {
                IdentityModelTelemetryUtil.SetTelemetryData(theoryData.HttpRequestMessage);
                // check if the resulting headers are as expected
                if (!IdentityComparer.AreEqual(theoryData.ExpectedHeaders, theoryData.HttpRequestMessage?.Headers))
                {
                    throw new ArgumentException("resulting headers do not match the expected headers.");
                }

                theoryData.ExpectedException.ProcessNoException(testContext);
            }
            catch (Exception ex)
            {
                theoryData.ExpectedException.ProcessException(ex, testContext);
            }

            TestUtilities.AssertFailIfErrors(testContext);
        }
        private async Task <HttpResponseMessage> SendAsyncAndRetryOnNetworkError(HttpClient httpClient, Uri uri)
        {
            int maxAttempt = 2;
            HttpResponseMessage response = null;

            for (int i = 1; i <= maxAttempt; i++)
            {
                // need to create a new message each time since you cannot send the same message twice
                using (var message = new HttpRequestMessage(HttpMethod.Get, uri))
                {
                    if (SendAdditionalHeaderData)
                    {
                        IdentityModelTelemetryUtil.SetTelemetryData(message, AdditionalHeaderData);
                    }

                    response = await httpClient.SendAsync(message).ConfigureAwait(false);

                    if (response.IsSuccessStatusCode)
                    {
                        return(response);
                    }

                    if (response.StatusCode.Equals(HttpStatusCode.RequestTimeout) || response.StatusCode.Equals(HttpStatusCode.ServiceUnavailable))
                    {
                        if (i < maxAttempt) // logging exception details and that we will attempt to retry document retrieval
                        {
                            LogHelper.LogInformation(LogHelper.FormatInvariant(LogMessages.IDX20808, response.StatusCode, await response.Content.ReadAsStringAsync().ConfigureAwait(false), message.RequestUri));
                        }
                    }
                    else // if the exception type does not indicate the need to retry we should break
                    {
                        LogHelper.LogWarning(LogHelper.FormatInvariant(LogMessages.IDX20809, message.RequestUri, response.StatusCode, await response.Content.ReadAsStringAsync().ConfigureAwait(false)));
                        break;
                    }
                }
            }

            return(response);
        }