29
29
import static software .amazon .awssdk .core .metrics .CoreMetric .SIGNING_DURATION ;
30
30
31
31
import java .nio .ByteBuffer ;
32
+ import java .time .Clock ;
32
33
import java .time .Instant ;
33
34
import java .time .temporal .ChronoUnit ;
34
35
import java .util .concurrent .CompletableFuture ;
@@ -148,9 +149,9 @@ public void execute_selectedAuthScheme_doesSraSign() throws Exception {
148
149
verifyNoInteractions (oldSigner );
149
150
}
150
151
151
-
152
152
@ Test
153
153
public void execute_selectedAuthSchemeAndTimeOffsetSet_doesSraSignAndAdjustTheSigningClock () throws Exception {
154
+ AsyncRequestBody asyncPayload = AsyncRequestBody .fromString ("async request body" );
154
155
// Set up a scheme with a signer property
155
156
SelectedAuthScheme <Identity > selectedAuthScheme = new SelectedAuthScheme <>(
156
157
CompletableFuture .completedFuture (identity ),
@@ -159,17 +160,19 @@ public void execute_selectedAuthSchemeAndTimeOffsetSet_doesSraSignAndAdjustTheSi
159
160
.schemeId ("my.auth#myAuth" )
160
161
.putSignerProperty (SIGNER_PROPERTY , "value" )
161
162
.build ());
162
- RequestExecutionContext context = createContext (selectedAuthScheme , (Signer ) null );
163
-
164
- // Setup the timeoffset to test that the clock is setup properly.
165
- httpClientDependencies .updateTimeOffset (TEST_TIME_OFFSET );
163
+ RequestExecutionContext context = createContext (selectedAuthScheme , asyncPayload , null );
166
164
167
165
SdkHttpRequest signedRequest = ValidSdkObjects .sdkHttpFullRequest ().build ();
168
- when (signer .sign (Mockito .<SignRequest <? extends Identity >>any ()))
169
- .thenReturn (SignedRequest .builder ()
170
- .request (signedRequest )
171
- .build ());
166
+ Publisher <ByteBuffer > signedPayload = AsyncRequestBody .fromString ("signed async request body" );
167
+ when (signer .signAsync (Mockito .<AsyncSignRequest <? extends Identity >>any ()))
168
+ .thenReturn (
169
+ CompletableFuture .completedFuture (AsyncSignedRequest .builder ()
170
+ .request (signedRequest )
171
+ .payload (signedPayload )
172
+ .build ()));
172
173
174
+ // Setup the timeoffset to test that the clock is setup properly.
175
+ httpClientDependencies .updateTimeOffset (TEST_TIME_OFFSET );
173
176
SdkHttpFullRequest request = ValidSdkObjects .sdkHttpFullRequest ().build ();
174
177
SdkHttpFullRequest result = stage .execute (request , context ).join ();
175
178
@@ -178,8 +181,8 @@ public void execute_selectedAuthSchemeAndTimeOffsetSet_doesSraSignAndAdjustTheSi
178
181
assertThat (context .executionContext ().interceptorContext ().httpRequest ()).isSameAs (result );
179
182
180
183
// assert that the input to the signer is as expected, including that signer properties are set
181
- verify (signer ).sign ( signRequestCaptor .capture ());
182
- SignRequest <? extends Identity > signRequest = signRequestCaptor .getValue ();
184
+ verify (signer ).signAsync ( asyncSignRequestCaptor .capture ());
185
+ AsyncSignRequest <? extends Identity > signRequest = asyncSignRequestCaptor .getValue ();
183
186
assertThat (signRequest .identity ()).isSameAs (identity );
184
187
assertThat (signRequest .request ()).isSameAs (request );
185
188
assertThat (signRequest .property (SIGNER_PROPERTY )).isEqualTo ("value" );
@@ -196,6 +199,58 @@ public void execute_selectedAuthSchemeAndTimeOffsetSet_doesSraSignAndAdjustTheSi
196
199
verifyNoInteractions (oldSigner );
197
200
}
198
201
202
+ @ Test
203
+ public void execute_selectedAuthScheme_doesSraSignAndDoesNotOverrideAuthSchemeOptionClock () throws Exception {
204
+ AsyncRequestBody asyncPayload = AsyncRequestBody .fromString ("async request body" );
205
+ // Set up a scheme with a signer property and the signing clock set
206
+ Clock clock = SigningStageTest .testClock ();
207
+ SelectedAuthScheme <Identity > selectedAuthScheme = new SelectedAuthScheme <>(
208
+ CompletableFuture .completedFuture (identity ),
209
+ signer ,
210
+ AuthSchemeOption .builder ()
211
+ .schemeId ("my.auth#myAuth" )
212
+ .putSignerProperty (SIGNER_PROPERTY , "value" )
213
+ // The auth scheme option includes the signing clock property
214
+ .putSignerProperty (HttpSigner .SIGNING_CLOCK , clock )
215
+ .build ());
216
+
217
+ RequestExecutionContext context = createContext (selectedAuthScheme , asyncPayload , null );
218
+
219
+ SdkHttpRequest signedRequest = ValidSdkObjects .sdkHttpFullRequest ().build ();
220
+ when (signer .signAsync (Mockito .<AsyncSignRequest <? extends Identity >>any ()))
221
+ .thenReturn (
222
+ CompletableFuture .completedFuture (AsyncSignedRequest .builder ()
223
+ .request (signedRequest )
224
+ .build ()));
225
+
226
+ SdkHttpFullRequest request = ValidSdkObjects .sdkHttpFullRequest ().build ();
227
+ SdkHttpFullRequest result = stage .execute (request , context ).join ();
228
+
229
+ assertThat (result ).isSameAs (signedRequest );
230
+ // assert that interceptor context is updated with result
231
+ assertThat (context .executionContext ().interceptorContext ().httpRequest ()).isSameAs (result );
232
+
233
+ // assert that the input to the signer is as expected, including that signer properties are set
234
+ verify (signer ).signAsync (asyncSignRequestCaptor .capture ());
235
+ AsyncSignRequest <? extends Identity > signRequest = asyncSignRequestCaptor .getValue ();
236
+ assertThat (signRequest .identity ()).isSameAs (identity );
237
+ assertThat (signRequest .request ()).isSameAs (request );
238
+ assertThat (signRequest .property (SIGNER_PROPERTY )).isEqualTo ("value" );
239
+
240
+ // Assert that the time offset set was zero
241
+ assertThat (signRequest .property (HttpSigner .SIGNING_CLOCK )).isNotNull ();
242
+ assertThat (signRequest .property (HttpSigner .SIGNING_CLOCK ).instant ())
243
+ .isCloseTo (Instant .now (), within (10 , ChronoUnit .MILLIS ));
244
+
245
+ // assert that the signing stage does not override the auth-option provided clock.
246
+ assertThat (signRequest .property (HttpSigner .SIGNING_CLOCK )).isSameAs (clock );
247
+
248
+ // assert that metrics are collected
249
+ verify (metricCollector ).reportMetric (eq (SIGNING_DURATION ), any ());
250
+
251
+ verifyNoInteractions (oldSigner );
252
+ }
253
+
199
254
@ Test
200
255
public void execute_selectedAuthScheme_asyncRequestBody_doesSraSignAsync () throws Exception {
201
256
AsyncRequestBody asyncPayload = AsyncRequestBody .fromString ("async request body" );
0 commit comments