Ejemplo n.º 1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RestHttpClientMock"/> class.
 /// </summary>
 /// <param name="httpClient">The HttpClient from http client factory.</param>
 /// <param name="loggerFactory">The logger factory.</param>
 /// <param name="configuration">The configuration.</param>
 /// <param name="httpContextAccessor">The HTTP context accessor.</param>
 public RestHttpClientMock(HttpClient httpClient,
                           ILoggerFactory loggerFactory,
                           RestHttpClientOptions configuration,
                           IHttpContextAccessor httpContextAccessor)
     : base(httpClient, loggerFactory, configuration, httpContextAccessor)
 {
 }
Ejemplo n.º 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RestHttpClientFromOptionsMock`1"/> class.
 /// </summary>
 /// <param name="optionsAccessor">The options.</param>
 /// <param name="httpClient">The HttpClient from http client factory.</param>
 /// <param name="loggerFactory">The logger factory.</param>
 /// <param name="configuration">The configuration.</param>
 /// <param name="httpContextAccessor">The HTTP context accessor.</param>
 /// <param name="baseUri">The base Uri of all requests. For example: http://rsm.api.monq.cloud</param>
 public RestHttpClientFromOptionsMock(IOptions <ServiceOptions> optionsAccessor,
                                      HttpClient httpClient,
                                      ILoggerFactory loggerFactory,
                                      RestHttpClientOptions configuration,
                                      IHttpContextAccessor httpContextAccessor,
                                      string baseUri)
     : base(optionsAccessor, httpClient, loggerFactory, configuration, httpContextAccessor, baseUri)
 {
 }
        public async Task ShouldProperlyMakeGetRequestByAbsoluteUriWithForwardedHeaders()
        {
            var modelJson = JsonConvert.SerializeObject(new Service[] {
                new Service {
                    Id = 1, Name = "Service1"
                },
                new Service {
                    Id = 2, Name = "Service2"
                }
            });
            var          traceEventId = Guid.NewGuid().ToString();
            const string userspaceId  = "10";
            const string uri          = "http://unittest/api/services";

            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add(TraceEventIdHeader, traceEventId);
            httpContext.Request.Headers.Add(UserspaceIdHeader, userspaceId);

            var headerOptions = new RestHttpClientHeaderOptions();

            headerOptions.AddForwardedHeader(TraceEventIdHeader);
            headerOptions.AddForwardedHeader(UserspaceIdHeader);
            var conf = new RestHttpClientOptions();

            conf.ConfigHeaders(headerOptions);

            var client         = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson));
            var restHttpClient = CreateRestHttpClient(client, httpContext, conf);

            var response = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10));

            Assert.True(client.DefaultRequestHeaders.Contains(TraceEventIdHeader));
            Assert.True(client.DefaultRequestHeaders.Contains(UserspaceIdHeader));

            Assert.Equal(traceEventId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == TraceEventIdHeader).Value.FirstOrDefault());
            Assert.Equal(userspaceId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == UserspaceIdHeader).Value.FirstOrDefault());

            var services = response.ResultObject?.ToList();

            Assert.NotNull(services);
            Assert.Equal(2, services !.Count);
            Assert.Equal(1, services[0].Id);
            Assert.Equal("Service1", services[0].Name);
            Assert.Equal(2, services[1].Id);
            Assert.Equal("Service2", services[1].Name);
            var _logger = _loggers.First();

            Assert.Equal(2, _logger.LoggingEvents.Count);
            Assert.Equal($"Start downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}].", _logger.LoggingEvents[0]);
            Assert.Contains($"Downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}] finished with StatusCode {(int)HttpStatusCode.OK} at", _logger.LoggingEvents[1]);
        }
 /// <summary>
 /// Инициализирует новый экземпляр класса <see cref="TestService" />.
 /// </summary>
 /// <param name="optionsAccessor">The options.</param>
 /// <param name="loggerFactory">The logger factory.</param>
 /// <param name="configuration">The configuration.</param>
 /// <param name="httpContextAccessor">The HTTP context accessor.</param>
 /// <param name="httpMessageInvoker">The HTTP message invoker.</param>
 /// <exception cref="System.ArgumentNullException">baseUri - Не указан базовый Uri сервиса.</exception>
 public TestService(
     IOptions <ServiceUriOptions> optionsAccessor,
     HttpClient httpClient,
     ILoggerFactory loggerFactory,
     RestHttpClientOptions configuration,
     IHttpContextAccessor httpContextAccessor) :
     base(optionsAccessor,
          httpClient,
          loggerFactory,
          configuration,
          httpContextAccessor,
          optionsAccessor.Value.TestServiceUri)
 {
 }
        public async Task ShouldProperlyReuseHttpClientObjectInParallelWithHeaders()
        {
            var modelJson = JsonConvert.SerializeObject(new Service[] {
                new Service {
                    Id = 1, Name = "Service1"
                },
                new Service {
                    Id = 2, Name = "Service2"
                }
            });

            const string uri = "http://unittest/api/services";

            var headerOptions = new RestHttpClientHeaderOptions();

            headerOptions.AddForwardedHeader(TraceEventIdHeader);
            headerOptions.AddForwardedHeader(UserspaceIdHeader);
            var conf = new RestHttpClientOptions();

            conf.ConfigHeaders(headerOptions);

            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add(TraceEventIdHeader, "eventId");
            httpContext.Request.Headers.Add(UserspaceIdHeader, "12");
            const int totalRequests = 1000;

            var client         = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson));
            var restHttpClient = CreateRestHttpClient(client, httpContext, conf);

            var firstResult = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10));

            Assert.Equal(2, firstResult.ResultObject?.Count());

            var results = Enumerable.Range(0, totalRequests).AsParallel().AsOrdered().WithDegreeOfParallelism(10)
                          .Select(_ => restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10)).GetAwaiter().GetResult())
                          .AsSequential()
                          .ToList();

            Assert.Empty(results.Where(x => x.OriginalResponse?.RequestMessage?.Headers.Count() != 2));
            Assert.Equal(2 * totalRequests, results.Where(x => x.ResultObject is not null).SelectMany(x => x.ResultObject).Count());
        }