Skip to content

Commit 202ec89

Browse files
russcamMpdreamz
authored andcommitted
Tests for .Net Core HttpConnection (#2427)
1 parent e77a507 commit 202ec89

File tree

2 files changed

+121
-4
lines changed

2 files changed

+121
-4
lines changed

src/Elasticsearch.Net/Connection/HttpConnection-CoreFx.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class HttpConnection : IConnection
3131
{
3232
private readonly object _lock = new object();
3333

34-
private readonly ConcurrentDictionary<int, HttpClient> _clients = new ConcurrentDictionary<int, HttpClient>();
34+
protected readonly ConcurrentDictionary<int, HttpClient> Clients = new ConcurrentDictionary<int, HttpClient>();
3535

3636
private string DefaultContentType => "application/json";
3737

@@ -41,11 +41,11 @@ private HttpClient GetClient(RequestData requestData)
4141
{
4242
var key = GetClientKey(requestData);
4343
HttpClient client;
44-
if (!this._clients.TryGetValue(key, out client))
44+
if (!this.Clients.TryGetValue(key, out client))
4545
{
4646
lock (_lock)
4747
{
48-
client = this._clients.GetOrAdd(key, h =>
48+
client = this.Clients.GetOrAdd(key, h =>
4949
{
5050
var handler = CreateHttpClientHandler(requestData);
5151
var httpClient = new HttpClient(handler, false)
@@ -226,7 +226,7 @@ private static int GetClientKey(RequestData requestData)
226226

227227
protected virtual void DisposeManagedResources()
228228
{
229-
foreach (var c in _clients)
229+
foreach (var c in Clients)
230230
c.Value.Dispose();
231231
}
232232
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#if DOTNETCORE
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Elasticsearch.Net;
8+
using FluentAssertions;
9+
using Nest;
10+
using Tests.Framework;
11+
12+
namespace Tests.ClientConcepts.Connection
13+
{
14+
public class HttpConnectionTests
15+
{
16+
public class TestableHttpConnection : HttpConnection
17+
{
18+
public int ClientCount => this.Clients.Count;
19+
20+
public int CallCount { get; private set; }
21+
22+
public override ElasticsearchResponse<TReturn> Request<TReturn>(RequestData requestData)
23+
{
24+
CallCount++;
25+
return base.Request<TReturn>(requestData);
26+
}
27+
28+
public override Task<ElasticsearchResponse<TReturn>> RequestAsync<TReturn>(RequestData requestData, CancellationToken cancellationToken)
29+
{
30+
CallCount++;
31+
return base.RequestAsync<TReturn>(requestData, cancellationToken);
32+
}
33+
}
34+
35+
[U]
36+
public async Task SingleInstanceOfHttpClient()
37+
{
38+
var connection = new TestableHttpConnection();
39+
var requestData = CreateRequestData(TimeSpan.FromMinutes(1));
40+
connection.Request<string>(requestData);
41+
42+
connection.CallCount.Should().Be(1);
43+
connection.ClientCount.Should().Be(1);
44+
45+
await connection.RequestAsync<string>(requestData, CancellationToken.None).ConfigureAwait(false);
46+
47+
connection.CallCount.Should().Be(2);
48+
connection.ClientCount.Should().Be(1);
49+
}
50+
51+
[U]
52+
public async Task MultipleInstancesOfHttpClientWhenRequestTimeoutChanges()
53+
{
54+
await MultipleInstancesOfHttpClientWhen(() => CreateRequestData(TimeSpan.FromSeconds(30)));
55+
}
56+
57+
[U]
58+
public async Task MultipleInstancesOfHttpClientWhenProxyChanges()
59+
{
60+
await MultipleInstancesOfHttpClientWhen(() => CreateRequestData(proxyAddress: new Uri("http://localhost:9400")));
61+
}
62+
63+
[U]
64+
public async Task MultipleInstancesOfHttpClientWhenAutomaticProxyDetectionChanges()
65+
{
66+
await MultipleInstancesOfHttpClientWhen(() => CreateRequestData(disableAutomaticProxyDetection: true));
67+
}
68+
69+
[U]
70+
public async Task MultipleInstancesOfHttpClientWhenHttpCompressionChanges()
71+
{
72+
await MultipleInstancesOfHttpClientWhen(() => CreateRequestData(httpCompression: true));
73+
}
74+
75+
private static async Task MultipleInstancesOfHttpClientWhen(Func<RequestData> differentRequestData)
76+
{
77+
var connection = new TestableHttpConnection();
78+
var requestData = CreateRequestData();
79+
connection.Request<string>(requestData);
80+
81+
connection.CallCount.Should().Be(1);
82+
connection.ClientCount.Should().Be(1);
83+
84+
requestData = differentRequestData();
85+
await connection.RequestAsync<string>(requestData, CancellationToken.None).ConfigureAwait(false);
86+
87+
connection.CallCount.Should().Be(2);
88+
connection.ClientCount.Should().Be(2);
89+
}
90+
91+
private static RequestData CreateRequestData(
92+
TimeSpan requestTimeout = default(TimeSpan),
93+
Uri proxyAddress = null,
94+
bool disableAutomaticProxyDetection = false,
95+
bool httpCompression = false)
96+
{
97+
if (requestTimeout == default(TimeSpan))
98+
requestTimeout = TimeSpan.FromMinutes(1);
99+
100+
var connectionSettings = new ConnectionSettings(new Uri("http://localhost:9200"))
101+
.RequestTimeout(requestTimeout)
102+
.DisableAutomaticProxyDetection(disableAutomaticProxyDetection)
103+
.EnableHttpCompression(httpCompression);
104+
105+
if (proxyAddress != null)
106+
connectionSettings.Proxy(proxyAddress, null, null);
107+
108+
var requestData = new RequestData(HttpMethod.GET, "/", null, connectionSettings, new PingRequestParameters(),
109+
new MemoryStreamFactory())
110+
{
111+
Node = new Node(new Uri("http://localhost:9200"))
112+
};
113+
return requestData;
114+
}
115+
}
116+
}
117+
#endif

0 commit comments

Comments
 (0)