|
25 | 25 | import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
|
26 | 26 | import software.amazon.awssdk.core.ApiName;
|
27 | 27 | import software.amazon.awssdk.core.ResponseInputStream;
|
| 28 | +import software.amazon.awssdk.core.exception.SdkException; |
28 | 29 | import software.amazon.awssdk.core.sync.RequestBody;
|
29 | 30 | import software.amazon.awssdk.http.AbortableInputStream;
|
30 | 31 | import software.amazon.awssdk.services.s3.S3Client;
|
31 | 32 | import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;
|
32 | 33 | import software.amazon.awssdk.services.s3.model.GetObjectRequest;
|
33 | 34 | import software.amazon.awssdk.services.s3.model.GetObjectResponse;
|
| 35 | +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; |
34 | 36 | import software.amazon.awssdk.services.s3.model.ObjectCannedACL;
|
35 | 37 | import software.amazon.awssdk.services.s3.model.PutObjectRequest;
|
36 | 38 | import software.amazon.awssdk.services.sqs.SqsClient;
|
|
59 | 61 |
|
60 | 62 | import static com.amazon.sqs.javamessaging.AmazonSQSExtendedClient.USER_AGENT_NAME;
|
61 | 63 | import static com.amazon.sqs.javamessaging.AmazonSQSExtendedClient.USER_AGENT_VERSION;
|
| 64 | + |
62 | 65 | import static org.junit.jupiter.api.Assertions.assertEquals;
|
63 | 66 | import static org.junit.jupiter.api.Assertions.assertFalse;
|
64 | 67 | import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
@@ -696,6 +699,60 @@ private void testReceiveMessage_when_MessageIsLarge(String reservedAttributeName
|
696 | 699 | verify(mockS3, times(1)).getObject(isA(GetObjectRequest.class));
|
697 | 700 | }
|
698 | 701 |
|
| 702 | + @Test |
| 703 | + public void testReceiveMessage_when_ignorePayloadNotFound_then_messageWithPayloadNotFoundIsDeletedFromSQS() { |
| 704 | + ExtendedClientConfiguration extendedClientConfiguration = new ExtendedClientConfiguration() |
| 705 | + .withPayloadSupportEnabled(mockS3, S3_BUCKET_NAME) |
| 706 | + .withIgnorePayloadNotFound(true); |
| 707 | + SqsClient sqsExtended = spy(new AmazonSQSExtendedClient(mockSqsBackend, extendedClientConfiguration)); |
| 708 | + |
| 709 | + String receiptHandle = "receipt-handle"; |
| 710 | + Message message = Message.builder() |
| 711 | + .messageAttributes(ImmutableMap.of(SQSExtendedClientConstants.RESERVED_ATTRIBUTE_NAME, MessageAttributeValue.builder().build())) |
| 712 | + .body(new PayloadS3Pointer(S3_BUCKET_NAME, "S3Key").toJson()) |
| 713 | + .receiptHandle(receiptHandle) |
| 714 | + .build(); |
| 715 | + |
| 716 | + when(mockSqsBackend.receiveMessage(isA(ReceiveMessageRequest.class))).thenReturn(ReceiveMessageResponse.builder().messages(message).build()); |
| 717 | + doThrow(NoSuchKeyException.class).when(mockS3).getObject(any(GetObjectRequest.class)); |
| 718 | + |
| 719 | + ReceiveMessageRequest messageRequest = ReceiveMessageRequest.builder().queueUrl(SQS_QUEUE_URL).build(); |
| 720 | + ReceiveMessageResponse receiveMessageResponse = sqsExtended.receiveMessage(messageRequest); |
| 721 | + |
| 722 | + Assert.assertTrue(receiveMessageResponse.messages().isEmpty()); |
| 723 | + |
| 724 | + ArgumentCaptor<DeleteMessageRequest> deleteMessageRequestArgumentCaptor = ArgumentCaptor.forClass(DeleteMessageRequest.class); |
| 725 | + verify(mockSqsBackend).deleteMessage(deleteMessageRequestArgumentCaptor.capture()); |
| 726 | + Assert.assertEquals(SQS_QUEUE_URL, deleteMessageRequestArgumentCaptor.getValue().queueUrl()); |
| 727 | + Assert.assertEquals(receiptHandle, deleteMessageRequestArgumentCaptor.getValue().receiptHandle()); |
| 728 | + } |
| 729 | + |
| 730 | + @Test |
| 731 | + public void testReceiveMessage_when_ignorePayloadNotFoundIsFalse_then_messageWithPayloadNotFoundThrowsException() { |
| 732 | + ExtendedClientConfiguration extendedClientConfiguration = new ExtendedClientConfiguration() |
| 733 | + .withPayloadSupportEnabled(mockS3, S3_BUCKET_NAME) |
| 734 | + .withIgnorePayloadNotFound(false); |
| 735 | + SqsClient sqsExtended = spy(new AmazonSQSExtendedClient(mockSqsBackend, extendedClientConfiguration)); |
| 736 | + |
| 737 | + Message message = Message.builder() |
| 738 | + .messageAttributes(ImmutableMap.of(SQSExtendedClientConstants.RESERVED_ATTRIBUTE_NAME, MessageAttributeValue.builder().build())) |
| 739 | + .body(new PayloadS3Pointer(S3_BUCKET_NAME, "S3Key").toJson()) |
| 740 | + .receiptHandle("receipt-handle") |
| 741 | + .build(); |
| 742 | + |
| 743 | + when(mockSqsBackend.receiveMessage(isA(ReceiveMessageRequest.class))).thenReturn(ReceiveMessageResponse.builder().messages(message).build()); |
| 744 | + doThrow(NoSuchKeyException.class).when(mockS3).getObject(any(GetObjectRequest.class)); |
| 745 | + |
| 746 | + ReceiveMessageRequest messageRequest = ReceiveMessageRequest.builder().build(); |
| 747 | + try { |
| 748 | + sqsExtended.receiveMessage(messageRequest); |
| 749 | + fail("Expected exception after receiving NoSuchKeyException from S3 was not thrown."); |
| 750 | + } catch (SdkException e) { |
| 751 | + assertEquals(NoSuchKeyException.class.getName(), e.getCause().getClass().getName()); |
| 752 | + verify(mockSqsBackend, never()).deleteMessage(any(DeleteMessageRequest.class)); |
| 753 | + } |
| 754 | + } |
| 755 | + |
699 | 756 | private DeleteMessageBatchRequest generateLargeDeleteBatchRequest(List<String> originalReceiptHandles) {
|
700 | 757 | List<DeleteMessageBatchRequestEntry> deleteEntries = IntStream.range(0, originalReceiptHandles.size())
|
701 | 758 | .mapToObj(i -> DeleteMessageBatchRequestEntry.builder()
|
|
0 commit comments