22
33import static org .junit .Assert .assertEquals ;
44import static org .junit .Assert .fail ;
5+ import static org .mockito .ArgumentMatchers .any ;
6+ import static org .mockito .Mockito .mock ;
7+ import static org .mockito .Mockito .verify ;
58
6- import java .util .Optional ;
79import java .util .concurrent .TimeUnit ;
10+ import java .util .function .BiConsumer ;
811
12+ import com .amazonaws .services .sqs .model .CreateQueueRequest ;
13+ import com .amazonaws .services .sqs .model .Message ;
14+ import com .amazonaws .services .sqs .model .QueueDoesNotExistException ;
15+ import com .amazonaws .services .sqs .model .ReceiveMessageRequest ;
16+ import com .amazonaws .services .sqs .model .SendMessageRequest ;
917import org .junit .After ;
1018import org .junit .Before ;
1119import org .junit .Test ;
1220
13- import com .amazonaws .services .sqs .model .CreateQueueRequest ;
14- import com .amazonaws .services .sqs .model .QueueDoesNotExistException ;
15- import com .amazonaws .services .sqs .model .ReceiveMessageRequest ;
1621import com .amazonaws .services .sqs .util .IntegrationTest ;
1722
1823public class AmazonSQSVirtualQueuesClientIT extends IntegrationTest {
1924
2025 private static String hostQueueUrl ;
2126 private static AmazonSQS client ;
2227
28+ BiConsumer <String , Message > orphanedMessageHandlerMock ;
29+
2330 @ Before
2431 public void setup () {
25- client = AmazonSQSVirtualQueuesClientBuilder .standard ().withAmazonSQS (sqs ).build ();
32+ orphanedMessageHandlerMock = mock (BiConsumer .class );
33+ client = AmazonSQSVirtualQueuesClientBuilder .standard ().withAmazonSQS (sqs ).withOrphanedMessageHandler (orphanedMessageHandlerMock ).build ();
2634 hostQueueUrl = client .createQueue (queueNamePrefix + "-HostQueue" ).getQueueUrl ();
2735 }
2836
@@ -43,7 +51,7 @@ public void expiringVirtualQueue() throws InterruptedException {
4351 .addAttributesEntry (AmazonSQSVirtualQueuesClient .VIRTUAL_QUEUE_HOST_QUEUE_ATTRIBUTE , hostQueueUrl )
4452 .addAttributesEntry (AmazonSQSIdleQueueDeletingClient .IDLE_QUEUE_RETENTION_PERIOD , "10" );
4553 String virtualQueueUrl = client .createQueue (request ).getQueueUrl ();
46-
54+
4755 // Do a few long poll receives and validate the queue stays alive.
4856 // We expect empty receives but not errors.
4957 ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest ()
@@ -108,4 +116,26 @@ public void virtualQueueShouldNotExpireDuringLongReceive() throws InterruptedExc
108116 // Delete the queue so we don't get a spurious message about it expiring during the test shutdown
109117 client .deleteQueue (virtualQueueUrl );
110118 }
119+
120+ @ Test
121+ public void missingMessageAttributeIsReceivedAndDeleted () throws InterruptedException {
122+ CreateQueueRequest request = new CreateQueueRequest ()
123+ .withQueueName ("ShortLived" )
124+ .addAttributesEntry (AmazonSQSVirtualQueuesClient .VIRTUAL_QUEUE_HOST_QUEUE_ATTRIBUTE , hostQueueUrl )
125+ .addAttributesEntry (AmazonSQSIdleQueueDeletingClient .IDLE_QUEUE_RETENTION_PERIOD , "10" );
126+ String virtualQueueUrl = client .createQueue (request ).getQueueUrl ();
127+
128+ ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest ()
129+ .withQueueUrl (virtualQueueUrl )
130+ .withWaitTimeSeconds (20 );
131+ SendMessageRequest sendMessageRequest = new SendMessageRequest ()
132+ .withQueueUrl (hostQueueUrl )
133+ .withMessageBody ("Missing Message attributes!" )
134+ .withDelaySeconds (5 );
135+
136+ client .sendMessage (sendMessageRequest );
137+ // Message sent with missing attribute is deleted
138+ assertEquals (0 , client .receiveMessage (receiveRequest ).getMessages ().size ());
139+ verify (orphanedMessageHandlerMock ).accept (any (), any ());
140+ }
111141}
0 commit comments