2020
2121package com .spotify .github .http .okhttp ;
2222
23+ import static org .junit .jupiter .api .Assertions .*;
24+ import static org .mockito .ArgumentMatchers .any ;
25+ import static org .mockito .Mockito .*;
26+
2327import com .spotify .github .http .HttpRequest ;
2428import com .spotify .github .http .HttpResponse ;
2529import com .spotify .github .http .ImmutableHttpRequest ;
30+ import com .spotify .github .tracing .NoopTracer ;
31+ import com .spotify .github .tracing .Span ;
32+ import com .spotify .github .tracing .TraceHelper ;
2633import com .spotify .github .tracing .Tracer ;
34+ import com .spotify .github .tracing .opencensus .OpenCensusTracer ;
35+ import com .spotify .github .tracing .opentelemetry .OpenTelemetryTracer ;
36+ import java .io .IOException ;
37+ import java .util .ArrayList ;
38+ import java .util .List ;
39+ import java .util .concurrent .CompletableFuture ;
40+ import java .util .concurrent .CompletionException ;
41+ import java .util .stream .Stream ;
2742import okhttp3 .*;
2843import org .junit .jupiter .api .AfterEach ;
2944import org .junit .jupiter .api .BeforeAll ;
30- import org .junit .jupiter .api .Test ;
45+ import org .junit .jupiter .api .BeforeEach ;
46+ import org .junit .jupiter .params .ParameterizedTest ;
47+ import org .junit .jupiter .params .provider .MethodSource ;
3148import org .mockito .ArgumentCaptor ;
3249
33- import java .io .IOException ;
34- import java .util .concurrent .CompletableFuture ;
35- import java .util .concurrent .CompletionException ;
36-
37- import static org .junit .jupiter .api .Assertions .*;
38- import static org .mockito .ArgumentMatchers .any ;
39- import static org .mockito .Mockito .*;
40-
4150class OkHttpHttpClientTest {
42- private static OkHttpClient okHttpClient ;
51+ private static final OkHttpClient okHttpClient = mock (OkHttpClient .class );
52+ private static final OkHttpClient .Builder mockOkHttpClientBuilder =
53+ mock (OkHttpClient .Builder .class );
54+ private static final Tracer noopTracer = mock (NoopTracer .class );
55+ private static final Tracer ocTracer = mock (OpenCensusTracer .class );
56+ private static final Tracer otTracer = mock (OpenTelemetryTracer .class );
57+ private static final Span mockSpan = mock (Span .class );
58+ private static final Call .Factory mockCallFactory = mock (Call .Factory .class );
59+
4360 private static OkHttpHttpClient httpClient ;
44- private static Tracer tracer ;
61+
62+ static Stream <Tracer > tracers () {
63+ return Stream .of (noopTracer , ocTracer , otTracer );
64+ }
4565
4666 @ BeforeAll
4767 static void setUp () {
48- okHttpClient = mock (OkHttpClient .class );
49- tracer = mock (Tracer .class );
50- httpClient = new OkHttpHttpClient (okHttpClient , tracer );
68+ httpClient =
69+ new OkHttpHttpClient (okHttpClient , noopTracer ) {
70+ @ Override
71+ protected Call .Factory createTracedClientOpenTelemetry () {
72+ return mockCallFactory ;
73+ }
74+ };
75+ }
76+
77+ @ BeforeEach
78+ void setUpEach () {
79+ List <Interceptor > interceptors = new ArrayList <>();
80+ when (okHttpClient .newBuilder ()).thenReturn (mockOkHttpClientBuilder );
81+ when (mockOkHttpClientBuilder .networkInterceptors ()).thenReturn (interceptors );
82+ when (mockOkHttpClientBuilder .build ()).thenReturn (okHttpClient );
5183 }
5284
5385 @ AfterEach
5486 void tearDown () {
55- reset (okHttpClient , tracer );
87+ reset (okHttpClient , noopTracer , ocTracer , otTracer , mockSpan );
5688 }
5789
58- @ Test
59- void sendSuccessfully () throws IOException {
90+ @ ParameterizedTest
91+ @ MethodSource ("tracers" )
92+ void sendSuccessfully (Tracer tracer ) throws IOException {
6093 // Given
6194 final Call call = mock (Call .class );
6295 final ArgumentCaptor <Callback > capture = ArgumentCaptor .forClass (Callback .class );
@@ -72,8 +105,12 @@ void sendSuccessfully() throws IOException {
72105
73106 HttpRequest httpRequest = ImmutableHttpRequest .builder ().url ("https://example.com" ).build ();
74107 when (okHttpClient .newCall (any ())).thenReturn (call );
108+ when (mockCallFactory .newCall (any ())).thenReturn (call );
109+
110+ when (tracer .span (any ())).thenReturn (mockSpan );
75111
76112 // When
113+ httpClient .setTracer (tracer );
77114 CompletableFuture <HttpResponse > futureResponse = httpClient .send (httpRequest );
78115 capture .getValue ().onResponse (call , response );
79116 HttpResponse httpResponse = futureResponse .join ();
@@ -84,11 +121,19 @@ void sendSuccessfully() throws IOException {
84121 assertEquals (200 , httpResponse .statusCode ());
85122 assertEquals ("foo" , httpResponse .statusMessage ());
86123 assertTrue (httpResponse .isSuccessful ());
87- verify (tracer , times (1 )).span (any (HttpRequest .class ));
124+ if (tracer instanceof NoopTracer || tracer instanceof OpenTelemetryTracer ) {
125+ verify (tracer , times (1 )).span (any (HttpRequest .class ));
126+
127+ } else if (tracer instanceof OpenCensusTracer ) {
128+ verify (tracer , times (2 )).span (any (HttpRequest .class ));
129+ verify (mockSpan ).addTag (TraceHelper .TraceTags .HTTP_URL , "https://example.com/" );
130+ }
131+ verify (mockSpan , times (1 )).close ();
88132 }
89133
90- @ Test
91- void sendWithException () {
134+ @ ParameterizedTest
135+ @ MethodSource ("tracers" )
136+ void sendWithException (Tracer tracer ) {
92137 // Given
93138 final Call call = mock (Call .class );
94139 final ArgumentCaptor <Callback > capture = ArgumentCaptor .forClass (Callback .class );
@@ -97,18 +142,29 @@ void sendWithException() {
97142
98143 HttpRequest httpRequest = ImmutableHttpRequest .builder ().url ("https://example.com" ).build ();
99144 when (okHttpClient .newCall (any ())).thenReturn (call );
145+ when (mockCallFactory .newCall (any ())).thenReturn (call );
146+ when (tracer .span (any ())).thenReturn (mockSpan );
100147
101148 // When
149+ httpClient .setTracer (tracer );
102150 CompletableFuture <HttpResponse > futureResponse = httpClient .send (httpRequest );
103151 capture .getValue ().onFailure (call , exception );
104152
105153 // Then
106154 assertThrows (CompletionException .class , futureResponse ::join );
107- verify (tracer , times (1 )).span (any (HttpRequest .class ));
155+ if (tracer instanceof NoopTracer || tracer instanceof OpenTelemetryTracer ) {
156+ verify (tracer , times (1 )).span (any (HttpRequest .class ));
157+
158+ } else if (tracer instanceof OpenCensusTracer ) {
159+ verify (tracer , times (2 )).span (any (HttpRequest .class ));
160+ verify (mockSpan ).addTag (TraceHelper .TraceTags .HTTP_URL , "https://example.com/" );
161+ }
162+ verify (mockSpan , times (1 )).close ();
108163 }
109164
110- @ Test
111- void sendWithClientError () throws IOException {
165+ @ ParameterizedTest
166+ @ MethodSource ("tracers" )
167+ void sendWithClientError (Tracer tracer ) throws IOException {
112168 // Given
113169 final Call call = mock (Call .class );
114170 final ArgumentCaptor <Callback > capture = ArgumentCaptor .forClass (Callback .class );
@@ -125,8 +181,11 @@ void sendWithClientError() throws IOException {
125181
126182 HttpRequest httpRequest = ImmutableHttpRequest .builder ().url ("https://example.com" ).build ();
127183 when (okHttpClient .newCall (any ())).thenReturn (call );
184+ when (mockCallFactory .newCall (any ())).thenReturn (call );
185+ when (tracer .span (any ())).thenReturn (mockSpan );
128186
129187 // When
188+ httpClient .setTracer (tracer );
130189 CompletableFuture <HttpResponse > futureResponse = httpClient .send (httpRequest );
131190 capture .getValue ().onResponse (call , response );
132191 HttpResponse httpResponse = futureResponse .join ();
@@ -137,6 +196,13 @@ void sendWithClientError() throws IOException {
137196 assertEquals (404 , httpResponse .statusCode ());
138197 assertEquals ("Not Found" , httpResponse .statusMessage ());
139198 assertFalse (httpResponse .isSuccessful ());
140- verify (tracer , times (1 )).span (any (HttpRequest .class ));
199+ if (tracer instanceof NoopTracer || tracer instanceof OpenTelemetryTracer ) {
200+ verify (tracer , times (1 )).span (any (HttpRequest .class ));
201+
202+ } else if (tracer instanceof OpenCensusTracer ) {
203+ verify (tracer , times (2 )).span (any (HttpRequest .class ));
204+ verify (mockSpan ).addTag (TraceHelper .TraceTags .HTTP_URL , "https://example.com/" );
205+ }
206+ verify (mockSpan , times (1 )).close ();
141207 }
142208}
0 commit comments