3131import io .opentelemetry .testing .internal .armeria .common .MediaType ;
3232import io .opentelemetry .testing .internal .armeria .testing .junit5 .server .mock .MockWebServerExtension ;
3333import io .opentelemetry .testing .internal .armeria .testing .junit5 .server .mock .RecordedRequest ;
34+ import java .lang .reflect .Method ;
35+ import java .lang .reflect .Proxy ;
3436import java .util .Arrays ;
37+ import java .util .concurrent .CompletableFuture ;
3538import java .util .concurrent .ExecutionException ;
3639import java .util .concurrent .Future ;
3740import java .util .function .Function ;
@@ -243,23 +246,30 @@ private static void assertDynamoDbRequest(SpanDataAssert span, String operation)
243246 equalTo (maybeStable (DB_OPERATION ), operation ));
244247 }
245248
249+ @ SuppressWarnings ("unchecked" )
250+ protected static <T , U > T wrapClient (
251+ Class <T > syncClientClass , Class <U > asyncClientClass , U asyncClient ) {
252+ return (T )
253+ Proxy .newProxyInstance (
254+ AbstractAws2ClientCoreTest .class .getClassLoader (),
255+ new Class <?>[] {syncClientClass },
256+ (proxy , method , args ) -> {
257+ Method asyncMethod =
258+ asyncClientClass .getMethod (method .getName (), method .getParameterTypes ());
259+ CompletableFuture <?> future =
260+ (CompletableFuture <?>) asyncMethod .invoke (asyncClient , args );
261+ return future .get ();
262+ });
263+ }
264+
246265 private static Stream <Arguments > provideArguments () {
247266 return Stream .of (
248267 Arguments .of (
249268 "CreateTable" ,
250- (Function <DynamoDbClient , Object >) c -> c .createTable (createTableRequest ()),
251- (Function <DynamoDbAsyncClient , Object >) c -> c .createTable (createTableRequest ())),
269+ (Function <DynamoDbClient , Object >) c -> c .createTable (createTableRequest ())),
252270 Arguments .of (
253271 "DeleteItem" ,
254272 (Function <DynamoDbClient , Object >)
255- c ->
256- c .deleteItem (
257- DeleteItemRequest .builder ()
258- .tableName ("sometable" )
259- .key (createTableRequestKey )
260- .conditionExpression ("property in (:one, :two)" )
261- .build ()),
262- (Function <DynamoDbAsyncClient , Object >)
263273 c ->
264274 c .deleteItem (
265275 DeleteItemRequest .builder ()
@@ -270,20 +280,10 @@ private static Stream<Arguments> provideArguments() {
270280 Arguments .of (
271281 "DeleteTable" ,
272282 (Function <DynamoDbClient , Object >)
273- c -> c .deleteTable (DeleteTableRequest .builder ().tableName ("sometable" ).build ()),
274- (Function <DynamoDbAsyncClient , Object >)
275283 c -> c .deleteTable (DeleteTableRequest .builder ().tableName ("sometable" ).build ())),
276284 Arguments .of (
277285 "GetItem" ,
278286 (Function <DynamoDbClient , Object >)
279- c ->
280- c .getItem (
281- GetItemRequest .builder ()
282- .tableName ("sometable" )
283- .key (getItemRequestKey )
284- .attributesToGet ("propertyOne" , "propertyTwo" )
285- .build ()),
286- (Function <DynamoDbAsyncClient , Object >)
287287 c ->
288288 c .getItem (
289289 GetItemRequest .builder ()
@@ -294,14 +294,6 @@ private static Stream<Arguments> provideArguments() {
294294 Arguments .of (
295295 "PutItem" ,
296296 (Function <DynamoDbClient , Object >)
297- c ->
298- c .putItem (
299- PutItemRequest .builder ()
300- .tableName ("sometable" )
301- .item (putItemRequestKey )
302- .conditionExpression ("attributeOne <> :someVal" )
303- .build ()),
304- (Function <DynamoDbAsyncClient , Object >)
305297 c ->
306298 c .putItem (
307299 PutItemRequest .builder ()
@@ -312,16 +304,6 @@ private static Stream<Arguments> provideArguments() {
312304 Arguments .of (
313305 "Query" ,
314306 (Function <DynamoDbClient , Object >)
315- c ->
316- c .query (
317- QueryRequest .builder ()
318- .tableName ("sometable" )
319- .select ("ALL_ATTRIBUTES" )
320- .keyConditionExpression ("attribute = :aValue" )
321- .filterExpression ("anotherAttribute = :someVal" )
322- .limit (10 )
323- .build ()),
324- (Function <DynamoDbAsyncClient , Object >)
325307 c ->
326308 c .query (
327309 QueryRequest .builder ()
@@ -334,20 +316,6 @@ private static Stream<Arguments> provideArguments() {
334316 Arguments .of (
335317 "UpdateItem" ,
336318 (Function <DynamoDbClient , Object >)
337- c ->
338- c .updateItem (
339- UpdateItemRequest .builder ()
340- .tableName ("sometable" )
341- .key (
342- ImmutableMap .of (
343- "keyOne" ,
344- AttributeValue .builder ().s ("value" ).build (),
345- "keyTwo" ,
346- AttributeValue .builder ().s ("differentValue" ).build ()))
347- .conditionExpression ("attributeOne <> :someVal" )
348- .updateExpression ("set attributeOne = :updateValue" )
349- .build ()),
350- (Function <DynamoDbAsyncClient , Object >)
351319 c ->
352320 c .updateItem (
353321 UpdateItemRequest .builder ()
@@ -384,9 +352,7 @@ void testSendDynamoDbRequestWithBuilderAndMockedResponse(
384352 @ ParameterizedTest
385353 @ MethodSource ("provideArguments" )
386354 void testSendDynamoDbAsyncRequestWithBuilderAndMockedResponse (
387- String operation ,
388- Function <DynamoDbClient , Object > call ,
389- Function <DynamoDbAsyncClient , Object > asyncCall )
355+ String operation , Function <DynamoDbClient , Object > call )
390356 throws ExecutionException , InterruptedException {
391357 DynamoDbAsyncClientBuilder builder = DynamoDbAsyncClient .builder ();
392358 configureSdkClient (builder );
@@ -397,7 +363,8 @@ void testSendDynamoDbAsyncRequestWithBuilderAndMockedResponse(
397363 .credentialsProvider (CREDENTIALS_PROVIDER )
398364 .build ();
399365 server .enqueue (HttpResponse .of (HttpStatus .OK , MediaType .PLAIN_TEXT_UTF_8 , "" ));
400- Object response = asyncCall .apply (client );
366+ Object response =
367+ call .apply (wrapClient (DynamoDbClient .class , DynamoDbAsyncClient .class , client ));
401368 validateOperationResponse (operation , response );
402369 }
403370}
0 commit comments