40
40
import org .mockito .ArgumentCaptor ;
41
41
import org .mockito .Mock ;
42
42
import org .mockito .runners .MockitoJUnitRunner ;
43
+ import software .amazon .awssdk .core .Response ;
44
+ import software .amazon .awssdk .core .async .EmptyPublisher ;
43
45
import software .amazon .awssdk .core .client .config .SdkAdvancedAsyncClientOption ;
44
46
import software .amazon .awssdk .core .client .config .SdkClientConfiguration ;
45
47
import software .amazon .awssdk .core .http .ExecutionContext ;
46
48
import software .amazon .awssdk .core .http .NoopTestRequest ;
47
49
import software .amazon .awssdk .core .interceptor .ExecutionAttributes ;
48
50
import software .amazon .awssdk .core .internal .http .HttpClientDependencies ;
49
51
import software .amazon .awssdk .core .internal .http .RequestExecutionContext ;
52
+ import software .amazon .awssdk .core .internal .http .TransformingAsyncResponseHandler ;
50
53
import software .amazon .awssdk .core .internal .http .timers .ClientExecutionAndRequestTimerTestUtils ;
51
54
import software .amazon .awssdk .core .internal .util .AsyncResponseHandlerTestUtils ;
52
55
import software .amazon .awssdk .http .SdkHttpFullRequest ;
53
56
import software .amazon .awssdk .http .SdkHttpMethod ;
54
57
import software .amazon .awssdk .http .async .AsyncExecuteRequest ;
55
58
import software .amazon .awssdk .http .async .SdkAsyncHttpClient ;
56
59
import software .amazon .awssdk .metrics .MetricCollector ;
60
+ import software .amazon .awssdk .metrics .NoOpMetricCollector ;
57
61
import utils .ValidSdkObjects ;
58
62
59
63
@ RunWith (MockitoJUnitRunner .class )
@@ -65,7 +69,7 @@ public class MakeAsyncHttpRequestStageTest {
65
69
@ Mock
66
70
private ScheduledExecutorService timeoutExecutor ;
67
71
68
- private CompletableFuture <Void > clientExecuteFuture = CompletableFuture . completedFuture ( null );
72
+ private CompletableFuture <Void > clientExecuteFuture = new CompletableFuture <>( );
69
73
70
74
@ Mock
71
75
private ScheduledFuture future ;
@@ -107,8 +111,86 @@ public void apiCallAttemptTimeoutNotEnabled_shouldNotInvokeExecutor() throws Exc
107
111
verify (timeoutExecutor , never ()).schedule (any (Runnable .class ), anyLong (), any (TimeUnit .class ));
108
112
}
109
113
114
+ @ Test
115
+ public void success_stageShouldNotCompleteBeforeHttpClientFutureIsCompleted () throws Exception {
116
+ TransformingAsyncResponseHandler <Response <Object >> handler =
117
+ AsyncResponseHandlerTestUtils .noOpResponseHandler ();
118
+
119
+ stage = new MakeAsyncHttpRequestStage <>(handler , clientDependencies (null ));
120
+ CompletableFuture <SdkHttpFullRequest > requestFuture =
121
+ CompletableFuture .completedFuture (ValidSdkObjects .sdkHttpFullRequest ().build ());
122
+
123
+ CompletableFuture <?> result = stage .execute (requestFuture , requestContext ());
124
+
125
+ assertThat (result .isDone ()).isFalse ();
126
+ handler .onStream (new EmptyPublisher <>());
127
+ assertThat (result .isDone ()).isFalse ();
128
+ clientExecuteFuture .complete (null );
129
+ assertThat (result .isDone ()).isTrue ();
130
+ assertThat (result .isCompletedExceptionally ()).isFalse ();
131
+ }
132
+
133
+ @ Test
134
+ public void success_stageShouldNotCompleteBeforeResponseHandlerFutureIsCompleted () throws Exception {
135
+ TransformingAsyncResponseHandler <Response <Object >> handler =
136
+ AsyncResponseHandlerTestUtils .noOpResponseHandler ();
137
+
138
+ stage = new MakeAsyncHttpRequestStage <>(handler , clientDependencies (null ));
139
+ CompletableFuture <SdkHttpFullRequest > requestFuture =
140
+ CompletableFuture .completedFuture (ValidSdkObjects .sdkHttpFullRequest ().build ());
141
+
142
+ CompletableFuture <?> result = stage .execute (requestFuture , requestContext ());
143
+
144
+ assertThat (result .isDone ()).isFalse ();
145
+ clientExecuteFuture .complete (null );
146
+ assertThat (result .isDone ()).isFalse ();
147
+ handler .onStream (new EmptyPublisher <>());
148
+ assertThat (result .isDone ()).isTrue ();
149
+ assertThat (result .isCompletedExceptionally ()).isFalse ();
150
+ }
151
+
152
+ @ Test
153
+ public void failure_stageShouldNotCompleteBeforeHttpClientFutureIsCompleted () throws Exception {
154
+ TransformingAsyncResponseHandler <Response <Object >> handler =
155
+ AsyncResponseHandlerTestUtils .noOpResponseHandler ();
156
+
157
+ stage = new MakeAsyncHttpRequestStage <>(handler , clientDependencies (null ));
158
+ CompletableFuture <SdkHttpFullRequest > requestFuture =
159
+ CompletableFuture .completedFuture (ValidSdkObjects .sdkHttpFullRequest ().build ());
160
+
161
+ CompletableFuture <?> result = stage .execute (requestFuture , requestContext ());
162
+
163
+ assertThat (result .isDone ()).isFalse ();
164
+ handler .onError (new Throwable ());
165
+ assertThat (result .isDone ()).isFalse ();
166
+ clientExecuteFuture .complete (null );
167
+ assertThat (result .isDone ()).isTrue ();
168
+ assertThat (result .isCompletedExceptionally ()).isTrue ();
169
+ }
170
+
171
+ @ Test
172
+ public void failure_stageShouldNotCompleteBeforeResponseHandlerFutureIsCompleted () throws Exception {
173
+ TransformingAsyncResponseHandler <Response <Object >> handler =
174
+ AsyncResponseHandlerTestUtils .noOpResponseHandler ();
175
+
176
+ stage = new MakeAsyncHttpRequestStage <>(handler , clientDependencies (null ));
177
+ CompletableFuture <SdkHttpFullRequest > requestFuture =
178
+ CompletableFuture .completedFuture (ValidSdkObjects .sdkHttpFullRequest ().build ());
179
+
180
+ CompletableFuture <?> result = stage .execute (requestFuture , requestContext ());
181
+
182
+ assertThat (result .isDone ()).isFalse ();
183
+ clientExecuteFuture .completeExceptionally (new Throwable ());
184
+ assertThat (result .isDone ()).isFalse ();
185
+ handler .onStream (new EmptyPublisher <>());
186
+ assertThat (result .isDone ()).isTrue ();
187
+ assertThat (result .isCompletedExceptionally ()).isTrue ();
188
+ }
189
+
110
190
@ Test
111
191
public void testExecute_contextContainsMetricCollector_addsChildToExecuteRequest () {
192
+ clientExecuteFuture .complete (null );
193
+
112
194
stage = new MakeAsyncHttpRequestStage <>(
113
195
combinedAsyncResponseHandler (AsyncResponseHandlerTestUtils .noOpResponseHandler (),
114
196
AsyncResponseHandlerTestUtils .noOpResponseHandler ()),
@@ -168,9 +250,11 @@ private HttpClientDependencies clientDependencies(Duration timeout) {
168
250
169
251
private RequestExecutionContext requestContext () {
170
252
ExecutionContext executionContext = ClientExecutionAndRequestTimerTestUtils .executionContext (ValidSdkObjects .sdkHttpFullRequest ().build ());
171
- return RequestExecutionContext .builder ()
172
- .executionContext (executionContext )
173
- .originalRequest (NoopTestRequest .builder ().build ())
174
- .build ();
253
+ RequestExecutionContext requestContext = RequestExecutionContext .builder ()
254
+ .executionContext (executionContext )
255
+ .originalRequest (NoopTestRequest .builder ().build ())
256
+ .build ();
257
+ requestContext .attemptMetricCollector (NoOpMetricCollector .create ());
258
+ return requestContext ;
175
259
}
176
260
}
0 commit comments