Skip to content

Commit 9aa407a

Browse files
authored
Merge pull request #2 from hypertrace/main
Add abstract client tests (hypertrace#246)
2 parents 3ee1365 + 8275b70 commit 9aa407a

File tree

4 files changed

+382
-311
lines changed

4 files changed

+382
-311
lines changed

instrumentation/apache-httpclient-4.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheHttpClientInstrumentationTest.java

+30-178
Original file line numberDiff line numberDiff line change
@@ -16,204 +16,56 @@
1616

1717
package io.opentelemetry.javaagent.instrumentation.hypertrace.apachehttpclient.v4_0;
1818

19-
import io.opentelemetry.api.trace.Span;
20-
import io.opentelemetry.sdk.trace.data.SpanData;
21-
import java.io.BufferedReader;
2219
import java.io.IOException;
2320
import java.io.InputStream;
24-
import java.io.InputStreamReader;
25-
import java.io.UnsupportedEncodingException;
2621
import java.net.URI;
27-
import java.nio.charset.Charset;
28-
import java.nio.charset.StandardCharsets;
29-
import java.util.ArrayList;
30-
import java.util.List;
31-
import java.util.concurrent.TimeoutException;
32-
import org.apache.http.HttpEntity;
22+
import java.util.Map;
3323
import org.apache.http.HttpResponse;
34-
import org.apache.http.NameValuePair;
3524
import org.apache.http.client.HttpClient;
36-
import org.apache.http.client.entity.UrlEncodedFormEntity;
3725
import org.apache.http.client.methods.HttpGet;
3826
import org.apache.http.client.methods.HttpPost;
3927
import org.apache.http.entity.StringEntity;
4028
import org.apache.http.impl.client.DefaultHttpClient;
41-
import org.apache.http.message.BasicNameValuePair;
42-
import org.apache.http.protocol.HTTP;
43-
import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes;
44-
import org.hypertrace.agent.testing.AbstractInstrumenterTest;
45-
import org.hypertrace.agent.testing.TestHttpServer;
46-
import org.hypertrace.agent.testing.TestHttpServer.GetJsonHandler;
47-
import org.junit.jupiter.api.AfterAll;
48-
import org.junit.jupiter.api.Assertions;
49-
import org.junit.jupiter.api.BeforeAll;
50-
import org.junit.jupiter.api.Test;
29+
import org.hypertrace.agent.testing.AbstractHttpClientTest;
5130

52-
public class ApacheHttpClientInstrumentationTest extends AbstractInstrumenterTest {
53-
54-
private static final String JSON = "{\"id\":1,\"name\":\"John\"}";
55-
private static final TestHttpServer testHttpServer = new TestHttpServer();
31+
public class ApacheHttpClientInstrumentationTest extends AbstractHttpClientTest {
5632

5733
private final HttpClient client = new DefaultHttpClient();
5834

59-
@BeforeAll
60-
public static void startServer() throws Exception {
61-
testHttpServer.start();
62-
}
63-
64-
@AfterAll
65-
public static void closeServer() throws Exception {
66-
testHttpServer.close();
35+
public ApacheHttpClientInstrumentationTest() {
36+
super(true);
6737
}
6838

69-
@Test
70-
public void getJson() throws IOException, TimeoutException, InterruptedException {
71-
HttpGet getRequest = new HttpGet();
72-
getRequest.addHeader("foo", "bar");
73-
getRequest.setURI(
74-
URI.create(String.format("http://localhost:%d/get_json", testHttpServer.port())));
75-
HttpResponse response = client.execute(getRequest);
76-
Assertions.assertEquals(200, response.getStatusLine().getStatusCode());
77-
InputStream inputStream = response.getEntity().getContent();
78-
Assertions.assertEquals(GetJsonHandler.RESPONSE_BODY, readInputStream(inputStream));
79-
80-
Assertions.assertEquals(false, Span.current().isRecording());
81-
82-
TEST_WRITER.waitForTraces(1);
83-
List<List<SpanData>> traces = TEST_WRITER.getTraces();
84-
Assertions.assertEquals(1, traces.size());
85-
Assertions.assertEquals(2, traces.get(0).size());
86-
SpanData clientSpan = traces.get(0).get(0);
87-
88-
Assertions.assertEquals(
89-
"test-value",
90-
clientSpan
91-
.getAttributes()
92-
.get(HypertraceSemanticAttributes.httpResponseHeader("test-response-header")));
93-
Assertions.assertEquals(
94-
"bar",
95-
clientSpan.getAttributes().get(HypertraceSemanticAttributes.httpRequestHeader("foo")));
96-
Assertions.assertNull(
97-
clientSpan.getAttributes().get(HypertraceSemanticAttributes.HTTP_REQUEST_BODY));
98-
SpanData responseBodySpan = traces.get(0).get(1);
99-
Assertions.assertEquals(
100-
GetJsonHandler.RESPONSE_BODY,
101-
responseBodySpan.getAttributes().get(HypertraceSemanticAttributes.HTTP_RESPONSE_BODY));
102-
}
103-
104-
@Test
105-
public void postUrlEncoded() throws IOException, TimeoutException, InterruptedException {
106-
List<NameValuePair> nvps = new ArrayList<>();
107-
nvps.add(new BasicNameValuePair("key1", "value1"));
108-
nvps.add(new BasicNameValuePair("key2", "value2"));
109-
110-
HttpPost postRequest = new HttpPost();
111-
postRequest.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
112-
postRequest.setURI(
113-
URI.create(String.format("http://localhost:%d/post", testHttpServer.port())));
114-
HttpResponse response = client.execute(postRequest);
115-
Assertions.assertEquals(204, response.getStatusLine().getStatusCode());
116-
117-
TEST_WRITER.waitForTraces(1);
118-
List<List<SpanData>> traces = TEST_WRITER.getTraces();
119-
Assertions.assertEquals(1, traces.size());
120-
Assertions.assertEquals(1, traces.get(0).size());
121-
SpanData clientSpan = traces.get(0).get(0);
122-
123-
Assertions.assertEquals(
124-
"test-value",
125-
clientSpan
126-
.getAttributes()
127-
.get(HypertraceSemanticAttributes.httpResponseHeader("test-response-header")));
128-
Assertions.assertEquals(
129-
"key1=value1&key2=value2",
130-
clientSpan.getAttributes().get(HypertraceSemanticAttributes.HTTP_REQUEST_BODY));
131-
Assertions.assertNull(
132-
clientSpan.getAttributes().get(HypertraceSemanticAttributes.HTTP_RESPONSE_BODY));
133-
}
134-
135-
@Test
136-
public void postJson() throws IOException, TimeoutException, InterruptedException {
137-
StringEntity entity = new StringEntity(JSON);
138-
entity.setContentType("application/json");
139-
postJsonEntity(entity);
140-
}
39+
@Override
40+
public Response doPostRequest(
41+
String uri, Map<String, String> headers, String body, String contentType) throws IOException {
14142

142-
@Test
143-
public void postJsonNonRepeatableEntity()
144-
throws IOException, TimeoutException, InterruptedException {
145-
StringEntity entity = new NonRepeatableStringEntity(JSON);
146-
entity.setContentType("application/json");
147-
postJsonEntity(entity);
148-
}
149-
150-
public void postJsonEntity(HttpEntity entity)
151-
throws TimeoutException, InterruptedException, IOException {
152-
HttpPost postRequest = new HttpPost();
153-
postRequest.setEntity(entity);
154-
postRequest.setHeader("Content-type", "application/json");
155-
postRequest.setURI(
156-
URI.create(String.format("http://localhost:%d/post", testHttpServer.port())));
157-
HttpResponse response = client.execute(postRequest);
158-
Assertions.assertEquals(204, response.getStatusLine().getStatusCode());
159-
160-
TEST_WRITER.waitForTraces(1);
161-
List<List<SpanData>> traces = TEST_WRITER.getTraces();
162-
Assertions.assertEquals(1, traces.size());
163-
Assertions.assertEquals(1, traces.get(0).size());
164-
SpanData clientSpan = traces.get(0).get(0);
165-
166-
Assertions.assertEquals(
167-
"test-value",
168-
clientSpan
169-
.getAttributes()
170-
.get(HypertraceSemanticAttributes.httpResponseHeader("test-response-header")));
171-
Assertions.assertEquals(
172-
readInputStream(entity.getContent()),
173-
clientSpan.getAttributes().get(HypertraceSemanticAttributes.HTTP_REQUEST_BODY));
174-
Assertions.assertNull(
175-
clientSpan.getAttributes().get(HypertraceSemanticAttributes.HTTP_RESPONSE_BODY));
176-
}
177-
178-
@Test
179-
public void getContent_throws_exception() throws IOException {
180-
HttpClient client = new DefaultHttpClient();
181-
HttpGet getRequest = new HttpGet();
182-
getRequest.setURI(
183-
URI.create(String.format("http://localhost:%d/get_json", testHttpServer.port())));
184-
HttpResponse response = client.execute(getRequest);
185-
HttpEntity entity = response.getEntity();
186-
Assertions.assertNotNull(entity.getContent());
187-
try {
188-
entity.getContent();
189-
} catch (Exception ex) {
190-
Assertions.assertEquals(IllegalStateException.class, ex.getClass());
191-
}
192-
}
193-
194-
private static String readInputStream(InputStream inputStream) throws IOException {
195-
StringBuilder textBuilder = new StringBuilder();
196-
197-
try (BufferedReader reader =
198-
new BufferedReader(
199-
new InputStreamReader(inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
200-
int c;
201-
while ((c = reader.read()) != -1) {
202-
textBuilder.append((char) c);
203-
}
43+
HttpPost request = new HttpPost();
44+
for (Map.Entry<String, String> entry : headers.entrySet()) {
45+
request.addHeader(entry.getKey(), entry.getValue());
20446
}
205-
return textBuilder.toString();
47+
request.setURI(URI.create(uri));
48+
StringEntity entity = new StringEntity(body);
49+
entity.setContentType(contentType);
50+
request.setEntity(entity);
51+
request.addHeader("Content-type", contentType);
52+
HttpResponse response = client.execute(request);
53+
InputStream inputStream = response.getEntity().getContent();
54+
return new Response(readInputStream(inputStream), response.getStatusLine().getStatusCode());
20655
}
20756

208-
class NonRepeatableStringEntity extends StringEntity {
209-
210-
public NonRepeatableStringEntity(String s) throws UnsupportedEncodingException {
211-
super(s);
57+
@Override
58+
public Response doGetRequest(String uri, Map<String, String> headers) throws IOException {
59+
HttpGet request = new HttpGet();
60+
for (Map.Entry<String, String> entry : headers.entrySet()) {
61+
request.addHeader(entry.getKey(), entry.getValue());
21262
}
213-
214-
@Override
215-
public boolean isRepeatable() {
216-
return false;
63+
request.setURI(URI.create(uri));
64+
HttpResponse response = client.execute(request);
65+
if (response.getEntity() == null || response.getEntity().getContentLength() <= 0) {
66+
return new Response(null, response.getStatusLine().getStatusCode());
21767
}
68+
InputStream inputStream = response.getEntity().getContent();
69+
return new Response(readInputStream(inputStream), response.getStatusLine().getStatusCode());
21870
}
21971
}

0 commit comments

Comments
 (0)