/** * Copyright 2012 Comcast Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.comcast.cqs.test.unit; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import java.util.Random; import java.util.UUID; import org.json.JSONObject; import org.junit.Test; import com.amazonaws.AmazonServiceException; import com.amazonaws.services.sns.model.PublishRequest; import com.amazonaws.services.sns.model.SubscribeRequest; import com.amazonaws.services.sns.model.SubscribeResult; import com.amazonaws.services.sqs.model.AddPermissionRequest; import com.amazonaws.services.sqs.model.ChangeMessageVisibilityBatchRequest; import com.amazonaws.services.sqs.model.ChangeMessageVisibilityBatchRequestEntry; import com.amazonaws.services.sqs.model.ChangeMessageVisibilityRequest; import com.amazonaws.services.sqs.model.DeleteMessageBatchRequest; import com.amazonaws.services.sqs.model.DeleteMessageBatchRequestEntry; import com.amazonaws.services.sqs.model.DeleteMessageRequest; import com.amazonaws.services.sqs.model.GetQueueAttributesRequest; import com.amazonaws.services.sqs.model.GetQueueAttributesResult; import com.amazonaws.services.sqs.model.Message; import com.amazonaws.services.sqs.model.ReceiveMessageRequest; import com.amazonaws.services.sqs.model.ReceiveMessageResult; import com.amazonaws.services.sqs.model.RemovePermissionRequest; import com.amazonaws.services.sqs.model.SendMessageBatchRequest; import com.amazonaws.services.sqs.model.SendMessageBatchRequestEntry; import com.amazonaws.services.sqs.model.SendMessageRequest; import com.amazonaws.services.sqs.model.SendMessageResult; import com.amazonaws.services.sqs.model.SetQueueAttributesRequest; import com.comcast.cmb.common.util.PersistenceException; import com.comcast.cmb.test.tools.CMBAWSBaseTest; import com.comcast.cmb.test.tools.CNSTestingUtils; import com.comcast.cqs.util.CQSErrorCodes; public class CQSIntegrationTest extends CMBAWSBaseTest { private static HashMap<String, String> attributeParams = new HashMap<String, String>(); static { attributeParams.put("MessageRetentionPeriod", "600"); attributeParams.put("VisibilityTimeout", "30"); } @Test public void testSubscribeConfirmPublish() { try { String queueUrl = getQueueUrl(1, USR.USER1); AddPermissionRequest addPermissionRequest = new AddPermissionRequest(); addPermissionRequest.setQueueUrl(queueUrl); addPermissionRequest.setActions(Arrays.asList("SendMessage")); addPermissionRequest.setLabel(UUID.randomUUID().toString()); addPermissionRequest.setAWSAccountIds(Arrays.asList(user2.getUserId())); cqs1.addPermission(addPermissionRequest); String topicArn = getTopic(1, USR.USER2); SubscribeRequest subscribeRequest = new SubscribeRequest(); String queueArn = com.comcast.cqs.util.Util.getArnForAbsoluteQueueUrl(queueUrl); subscribeRequest.setEndpoint(queueArn); subscribeRequest.setProtocol("cqs"); subscribeRequest.setTopicArn(topicArn); SubscribeResult subscribeResult = cns2.subscribe(subscribeRequest); String subscriptionArn = subscribeResult.getSubscriptionArn(); if (subscriptionArn.equals("pending confirmation")) { Thread.sleep(500); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(1); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); List<Message> messages = receiveMessageResult.getMessages(); if (messages != null && messages.size() == 1) { JSONObject o = new JSONObject(messages.get(0).getBody()); if (!o.has("SubscribeURL")) { fail("Message is not a confirmation messsage"); } String subscriptionUrl = o.getString("SubscribeURL"); CNSTestingUtils.sendHttpMessage(subscriptionUrl, ""); DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest(); deleteMessageRequest.setQueueUrl(queueUrl); deleteMessageRequest.setReceiptHandle(messages.get(0).getReceiptHandle()); cqs1.deleteMessage(deleteMessageRequest); } else { fail("No confirmation message found"); } } else { fail("No confirmation requested"); } logger.info("Publishing message to " + topicArn); PublishRequest publishRequest = new PublishRequest(); String messageText = "quamvis sint sub aqua, sub aqua maledicere temptant"; publishRequest.setMessage(messageText); publishRequest.setSubject("unit test message"); publishRequest.setTopicArn(topicArn); cns2.publish(publishRequest); Thread.sleep(2000); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(1); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); List<Message> messages = receiveMessageResult.getMessages(); if (messages != null && messages.size() == 1) { String messageBody = messages.get(0).getBody(); assertTrue(messageBody.contains(messageText)); } else { fail("No messages found"); } } catch (Exception ex) { logger.error("test failed", ex); fail(ex.getMessage()); } } @Test public void testGetSetQueueAttributes() throws PersistenceException, InterruptedException { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); GetQueueAttributesRequest getQueueAttributesRequest = new GetQueueAttributesRequest(); getQueueAttributesRequest.setQueueUrl(queueUrl); getQueueAttributesRequest.setAttributeNames(Arrays.asList("VisibilityTimeout", "MessageRetentionPeriod", "All")); GetQueueAttributesResult result = cqs1.getQueueAttributes(getQueueAttributesRequest); assertTrue(result.getAttributes().get("MessageRetentionPeriod").equals("600")); assertTrue(result.getAttributes().get("VisibilityTimeout").equals("30")); SetQueueAttributesRequest setQueueAttributesRequest = new SetQueueAttributesRequest(); setQueueAttributesRequest.setQueueUrl(queueUrl); HashMap<String, String> attributes = new HashMap<String, String>(); attributes.put("MessageRetentionPeriod", "300"); attributes.put("VisibilityTimeout", "80"); attributes.put("MaximumMessageSize", "10240"); attributes.put("DelaySeconds", "100"); String policy = "{\"Version\":\"2008-10-17\",\"Id\":\""+queueUrl+"/SQSDefaultPolicy\",\"Statement\":[{\"Sid\":\"test\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\""+user1.getUserId()+"\"},\"Action\":\"CQS:SendMessage\",\"Resource\":\""+com.comcast.cqs.util.Util.getArnForAbsoluteQueueUrl(queueUrl)+"\"}]}"; attributes.put("Policy", policy); setQueueAttributesRequest.setAttributes(attributes); cqs1.setQueueAttributes(setQueueAttributesRequest); result = cqs1.getQueueAttributes(getQueueAttributesRequest); assertTrue("Expected retention period of 300 sec, instead found " + result.getAttributes().get("MessageRetentionPeriod"), result.getAttributes().get("MessageRetentionPeriod").equals("300")); assertTrue("Expected visibility timeout to be 80 sec, instead found " + result.getAttributes().get("VisibilityTimeout"), result.getAttributes().get("VisibilityTimeout").equals("80")); assertTrue("Expected max message size to be 10240, instead found " + result.getAttributes().get("MaximumMessageSize"), result.getAttributes().get("MaximumMessageSize").equals("10240")); assertTrue("Expected delay seconds to be 100, instead found " + result.getAttributes().get("DelaySeconds"), result.getAttributes().get("DelaySeconds").equals("100")); attributes = new HashMap<String, String>(){ {put("VisibilityTimeout", "100");}}; setQueueAttributesRequest.setAttributes(attributes); cqs1.setQueueAttributes(setQueueAttributesRequest); result = cqs1.getQueueAttributes(getQueueAttributesRequest); assertTrue("Expected visibility timeout to be 100 sec, instead found " + result.getAttributes().get("VisibilityTimeout"), result.getAttributes().get("VisibilityTimeout").equals("100")); // try triggering missing parameter error try { setQueueAttributesRequest = new SetQueueAttributesRequest(); setQueueAttributesRequest.setQueueUrl(queueUrl); cqs1.setQueueAttributes(setQueueAttributesRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not receive missing parameter exception", ase.getErrorCode().equals(CQSErrorCodes.MissingParameter.getCMBCode())); } // try trigger unknown attribute name error try { getQueueAttributesRequest = new GetQueueAttributesRequest(); getQueueAttributesRequest.setQueueUrl(queueUrl); getQueueAttributesRequest.setAttributeNames(Arrays.asList("all")); cqs1.getQueueAttributes(getQueueAttributesRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue(ase.getErrorCode().equals(CQSErrorCodes.InvalidAttributeName.getCMBCode())); } } @Test public void testAddRemovePermission() throws PersistenceException, InterruptedException { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); AddPermissionRequest addPermissionRequest = new AddPermissionRequest(); addPermissionRequest.setQueueUrl(queueUrl); addPermissionRequest.setActions(Arrays.asList("SendMessage")); addPermissionRequest.setLabel("testLabel"); addPermissionRequest.setAWSAccountIds(Arrays.asList(user1.getUserId(), user2.getUserId())); cqs1.addPermission(addPermissionRequest); addPermissionRequest.setLabel("testLabel2"); addPermissionRequest.setActions(Arrays.asList("SendMessage", "GetQueueUrl")); cqs1.addPermission(addPermissionRequest); GetQueueAttributesRequest getQueueAttributesRequest = new GetQueueAttributesRequest(); getQueueAttributesRequest.setAttributeNames(Arrays.asList("All")); getQueueAttributesRequest.setQueueUrl(queueUrl); GetQueueAttributesResult res = cqs1.getQueueAttributes(getQueueAttributesRequest); res = cqs1.getQueueAttributes(getQueueAttributesRequest); assertTrue("Did not find labels testLabel and testLabel2", res.toString().contains("testLabel") && res.toString().contains("testLabel2")); RemovePermissionRequest removePermissionRequest = new RemovePermissionRequest(); removePermissionRequest.setLabel("testLabel"); removePermissionRequest.setQueueUrl(queueUrl); cqs1.removePermission(removePermissionRequest); removePermissionRequest.setLabel("testLabel2"); cqs1.removePermission(removePermissionRequest); } @Test public void testInvalidRequest() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); logger.info("Send a message with empty message body"); try { SendMessageRequest sendMessageRequest = new SendMessageRequest(); sendMessageRequest.setQueueUrl(queueUrl); cqs1.sendMessage(sendMessageRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get missing parameter exception", ase.getErrorCode().equals(CQSErrorCodes.MissingParameter.getCMBCode())); } logger.info("Send a message with invalid DelaySeconds"); try { SendMessageRequest sendMessageRequest = new SendMessageRequest(); sendMessageRequest.setQueueUrl(queueUrl); String msg = "This is a message to test invalid delay seconds;"; sendMessageRequest.setMessageBody(msg); sendMessageRequest.setDelaySeconds(1000); cqs1.sendMessage(sendMessageRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get invalid parameter exception", ase.getErrorCode().contains(CQSErrorCodes.InvalidParameterValue.getCMBCode())); } logger.info("Send a very long message"); try { SendMessageRequest sendMessageRequest = new SendMessageRequest(); sendMessageRequest.setQueueUrl(queueUrl); StringBuffer msg = new StringBuffer(""); for (int i=0; i<300*1024; i++) { msg.append("M"); } sendMessageRequest.setMessageBody(msg.toString()); cqs1.sendMessage(sendMessageRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get an invalid value exception", ase.getErrorCode().equals(CQSErrorCodes.InvalidParameterValue.getCMBCode())); } logger.info("Receive messages with invalid max number of messages"); try { ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); receiveMessageRequest.setVisibilityTimeout(10); receiveMessageRequest.setMaxNumberOfMessages(12); cqs1.receiveMessage(receiveMessageRequest).getMessages(); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get an invalid value exception", ase.getErrorCode().contains(CQSErrorCodes.InvalidParameterValue.getCMBCode())); } logger.info("Receive messages with invalid max number of messages"); try { ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); receiveMessageRequest.setVisibilityTimeout(10); receiveMessageRequest.setMaxNumberOfMessages(0); cqs1.receiveMessage(receiveMessageRequest).getMessages(); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get an invalid value exception", ase.getErrorCode().contains(CQSErrorCodes.InvalidParameterValue.getCMBCode())); } } @Test public void testInvalidBatchDeleteRequest() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException, InterruptedException { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); try { List<SendMessageBatchRequestEntry> messageList = Arrays.asList( new SendMessageBatchRequestEntry("id1", "This is the 1st message in a batch"), new SendMessageBatchRequestEntry("id2", "This is the 2nd message in a batch"), new SendMessageBatchRequestEntry("id3", "This is the 3rd message in a batch"), new SendMessageBatchRequestEntry("id4", "This is the 4th message in a batch"), new SendMessageBatchRequestEntry("id5", "This is the 5th message in a batch"), new SendMessageBatchRequestEntry("id6", "This is the 6th message in a batch") ); SendMessageBatchRequest batchSendRequest = new SendMessageBatchRequest(queueUrl, messageList); cqs1.sendMessageBatch(batchSendRequest); } catch (AmazonServiceException ase) { fail(ase.toString()); } logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(60); receiveMessageRequest.setMaxNumberOfMessages(6); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Did not receive any messages", messages.size() > 0); List<DeleteMessageBatchRequestEntry> deleteMsgList = new ArrayList<DeleteMessageBatchRequestEntry>(); int i = 0; for (Message message : messages) { logger.info("MessageId: " + message.getMessageId()); logger.info("ReceiptHandle: " + message.getReceiptHandle()); deleteMsgList.add(new DeleteMessageBatchRequestEntry("msg" + i, message.getReceiptHandle())); i++; } try { DeleteMessageBatchRequest batchDeleteRequest = new DeleteMessageBatchRequest(queueUrl, deleteMsgList); cqs1.deleteMessageBatch(batchDeleteRequest); } catch (AmazonServiceException ase) { fail("exception where none expected"); } logger.info("Delete a batch of messages with empty receipt handle"); try { deleteMsgList.get(0).setId("somerandomid"); deleteMsgList.get(deleteMsgList.size() - 1).setId("some-random-id"); deleteMsgList.get(0).setReceiptHandle("somerandomestring"); DeleteMessageBatchRequest batchDeleteRequest = new DeleteMessageBatchRequest(queueUrl, deleteMsgList); cqs1.deleteMessageBatch(batchDeleteRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get internal error exception", ase.getErrorCode().equals(CQSErrorCodes.InternalError.getCMBCode())); } } @Test public void testInvalidBatchChangeMessageVisibilityRequest() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException, InterruptedException { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); try { List<SendMessageBatchRequestEntry> messageList = Arrays.asList( new SendMessageBatchRequestEntry("id1", "This is the 1st message in a batch"), new SendMessageBatchRequestEntry("id2", "This is the 2nd message in a batch"), new SendMessageBatchRequestEntry("id3", "This is the 3rd message in a batch"), new SendMessageBatchRequestEntry("id4", "This is the 4th message in a batch"), new SendMessageBatchRequestEntry("id5", "This is the 5th message in a batch"), new SendMessageBatchRequestEntry("id6", "This is the 6th message in a batch") ); SendMessageBatchRequest batchSendRequest = new SendMessageBatchRequest(queueUrl, messageList); cqs1.sendMessageBatch(batchSendRequest); } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail("exception where none expected"); } logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(60); receiveMessageRequest.setMaxNumberOfMessages(6); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); List<ChangeMessageVisibilityBatchRequestEntry> msgList = new ArrayList<ChangeMessageVisibilityBatchRequestEntry>(); for (Message message : messages) { logger.info("MessageId: " + message.getMessageId()); logger.info("ReceiptHandle: " + message.getReceiptHandle()); ChangeMessageVisibilityBatchRequestEntry entry = new ChangeMessageVisibilityBatchRequestEntry("1", message.getReceiptHandle()); entry.setVisibilityTimeout(60); msgList.add(entry); } logger.info("Change a batch of message visibility timeout with same supplied id"); try { ChangeMessageVisibilityBatchRequest batchRequest = new ChangeMessageVisibilityBatchRequest(queueUrl, msgList); cqs1.changeMessageVisibilityBatch(batchRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { //assertTrue("Did not get distinct id excpetion", ase.getErrorCode().contains(CQSErrorCodes.BatchEntryIdsNotDistinct.getCMBCode())); } logger.info("Change a batch of messages with empty or invalid supplied id"); try { msgList.get(0).setId("bad.id"); ChangeMessageVisibilityBatchRequest batchRequest = new ChangeMessageVisibilityBatchRequest(queueUrl, msgList); cqs1.changeMessageVisibilityBatch(batchRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get invalid batch entry id exception", ase.getErrorCode().contains(CQSErrorCodes.InvalidBatchEntryId.getCMBCode())); } logger.info("Change a batch of messages with empty ReceiptHandle:"); try { msgList.get(0).setId("somerandomid"); msgList.get(msgList.size() - 1).setId("some-random-id"); msgList.get(0).setReceiptHandle("somerandomestring"); ChangeMessageVisibilityBatchRequest batchRequest = new ChangeMessageVisibilityBatchRequest(queueUrl, msgList); cqs1.changeMessageVisibilityBatch(batchRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get internal error exception", ase.getErrorCode().contains(CQSErrorCodes.BatchEntryIdsNotDistinct.getCMBCode())); } } @Test public void testInvalidBatchSendRequest() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); logger.info("Send a batch of messages with empty supplied Id"); try { List<SendMessageBatchRequestEntry> messageList = Arrays.asList( new SendMessageBatchRequestEntry("id1", "This is the first message in a batch"), new SendMessageBatchRequestEntry("id.1", "This is the second message in a batch"), new SendMessageBatchRequestEntry("id3", "This is the third message in a batch") ); SendMessageBatchRequest batchSendRequest = new SendMessageBatchRequest(queueUrl, messageList); cqs1.sendMessageBatch(batchSendRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get invalid batch entry id exception", ase.getErrorCode().contains(CQSErrorCodes.InvalidBatchEntryId.getCMBCode())); } logger.info("Send a batch of messages with empty message"); try { List<SendMessageBatchRequestEntry> messageList = Arrays.asList( new SendMessageBatchRequestEntry("id1", "This is the first message in a batch"), new SendMessageBatchRequestEntry("id2", "This is the second message in a batch"), new SendMessageBatchRequestEntry("id3", "") ); SendMessageBatchRequest batchSendRequest = new SendMessageBatchRequest(queueUrl, messageList); cqs1.sendMessageBatch(batchSendRequest); } catch (AmazonServiceException ase) { fail(ase.getMessage()); } logger.info("Send a batch of messages with same supplied id"); try { List<SendMessageBatchRequestEntry> messageList = Arrays.asList( new SendMessageBatchRequestEntry("1", "This is the first message in a batch"), new SendMessageBatchRequestEntry("2", "This is the second message in a batch"), new SendMessageBatchRequestEntry("1", "Test") ); SendMessageBatchRequest batchSendRequest = new SendMessageBatchRequest(queueUrl, messageList); cqs1.sendMessageBatch(batchSendRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { //assertTrue("Did not get batch entry id not distinct exception", ase.getErrorCode().contains(CQSErrorCodes.BatchEntryIdsNotDistinct.getCMBCode())); } logger.info("Send a batch of messages with supplied id too long"); try { List<SendMessageBatchRequestEntry> messageList = Arrays.asList( new SendMessageBatchRequestEntry("1", "This is the first message in a batch"), new SendMessageBatchRequestEntry("2", "This is the second message in a batch"), new SendMessageBatchRequestEntry("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", "Test") ); SendMessageBatchRequest batchSendRequest = new SendMessageBatchRequest(queueUrl, messageList); cqs1.sendMessageBatch(batchSendRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get invalid batch entry id", ase.getErrorCode().contains(CQSErrorCodes.InvalidBatchEntryId.getCMBCode())); } logger.info("Send a batch of messages total length over 64KB"); try { char[] chars = new char[300*1024 - 10]; java.util.Arrays.fill(chars, 'x'); List<SendMessageBatchRequestEntry> messageList = Arrays.asList( new SendMessageBatchRequestEntry("1", "This is the first message in a batch"), new SendMessageBatchRequestEntry("2", "This is the second message in a batch"), new SendMessageBatchRequestEntry("3", new String(chars)) ); SendMessageBatchRequest batchSendRequest = new SendMessageBatchRequest(queueUrl, messageList); cqs1.sendMessageBatch(batchSendRequest); fail("missing expected exception"); } catch (AmazonServiceException ase) { assertTrue("Did not get batch request too long exception", ase.getErrorCode().contains(CQSErrorCodes.BatchRequestTooLong.getCMBCode())); } } @Test public void testInvalidPermissionUpdate() { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); cqs1.addPermission(new AddPermissionRequest(queueUrl, "label1", Arrays.asList(user1.getUserId()), Arrays.asList("SendMessage", "DeleteMessage"))); try { cqs1.addPermission(new AddPermissionRequest(queueUrl, "label1", Arrays.asList(user1.getUserId()), Arrays.asList("SendMessage"))); fail("missing expected exception"); } catch (Exception ex) { assertTrue("Did not get label already exists exception", ex.getMessage().contains("Already exists")); } cqs1.removePermission(new RemovePermissionRequest(queueUrl, "label1")); cqs1.addPermission(new AddPermissionRequest(queueUrl, "label1", Arrays.asList(user1.getUserId()), Arrays.asList("SendMessage"))); } @Test public void testCreateDeleteQueue() throws InterruptedException { try { String queueUrl1 = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl1, attributeParams)); String queueUrl2 = getQueueUrl(2, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl1, attributeParams)); Thread.sleep(1000); // List queues logger.info("Listing all queues"); List<String> queueUrls = cqs1.listQueues().getQueueUrls(); for (String queueUrl : queueUrls) { logger.info(queueUrl); } assertTrue("Expected 2 queue urls but got " + queueUrls.size(), queueUrls.size() == 2); assertTrue("Missing queue url " + queueUrl1, queueUrls.contains(queueUrl1)); assertTrue("Missing queue url " + queueUrl2, queueUrls.contains(queueUrl2)); // Send a message logger.info("Sending messages to " + queueUrl1); cqs1.sendMessage(new SendMessageRequest(queueUrl1, "This is my message text 1. " + (new Random()).nextInt())); cqs1.sendMessage(new SendMessageRequest(queueUrl1, "This is my message text 2. " + (new Random()).nextInt())); cqs1.sendMessage(new SendMessageRequest(queueUrl1, "This is my message text 3. " + (new Random()).nextInt())); logger.info("Receiving messages from " + queueUrl1); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl1); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(600); receiveMessageRequest.setMaxNumberOfMessages(2); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 2 messages, instead found " + messages.size(), messages.size() == 2); for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } } List<Message> messages2 = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected one message, instead found " + messages2.size(), messages2.size() == 1); for (Message message : messages2) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } } if (messages.size() > 0) { logger.info("Deleting a message"); String messageRecieptHandle = messages.get(0).getReceiptHandle(); cqs1.deleteMessage(new DeleteMessageRequest(queueUrl1, messageRecieptHandle)); } } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail(ase.getMessage()); } } @Test public void testChangeMessageVisibility() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException, InterruptedException { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); // send message logger.info("Sending a message to " + queueUrl); cqs1.sendMessage(new SendMessageRequest(queueUrl, "This is my message text. " + (new Random()).nextInt())); // receive message logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(60); receiveMessageRequest.setMaxNumberOfMessages(10); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 1 message, instead found " + messages.size(), messages.size() == 1); String receiptHandle = null; for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); receiptHandle = message.getReceiptHandle(); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } } // message should be invisible now logger.info("Trying to receive message, none expected"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 0 messages, instead found "+ messages.size(), messages.size() == 0); int timeoutSeconds = 10; int waitSeconds = 2; int waitedAlreadySeconds = 0; logger.info("Changing visibility timeout to " + timeoutSeconds); ChangeMessageVisibilityRequest changeMessageVisibilityRequest = new ChangeMessageVisibilityRequest(queueUrl, receiptHandle, timeoutSeconds); cqs1.changeMessageVisibility(changeMessageVisibilityRequest); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); // keep checking while (messages.size() == 0) { if (waitedAlreadySeconds > timeoutSeconds + 2*waitSeconds) { fail("Message did not become revisible after " + waitedAlreadySeconds + " seconds"); } Thread.sleep(waitSeconds*1000); waitedAlreadySeconds += waitSeconds; logger.info("Checking for messages for " + waitedAlreadySeconds + " seconds"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); } assertTrue("Received " + messages.size() + " instead of 1 message", messages.size() == 1); assertTrue("Message content dorky: " + messages.get(0).getBody(), messages.get(0).getBody().startsWith("This is my message text.")); // delete message logger.info("Deleting message with receipt handle " + messages.get(0).getReceiptHandle()); cqs1.deleteMessage(new DeleteMessageRequest(queueUrl, messages.get(0).getReceiptHandle())); } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail(ase.getMessage()); } } @Test public void testMessageVisibilityOnReceive() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException, InterruptedException { try { String queueUrl = getQueueUrl(1, USR.USER1); Thread.sleep(1000); // send message logger.info("Sending a message to " + queueUrl); cqs1.sendMessage(new SendMessageRequest(queueUrl, "This is my message text. " + (new Random()).nextInt())); // receive message logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); int timeoutSeconds = 40; List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(timeoutSeconds); receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setWaitTimeSeconds(2); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 1 message, instead found " + messages.size(), messages.size() == 1); for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } } // message should be invisible now logger.info("Trying to receive message until it becomes revisible"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 0 messages, instead found "+ messages.size(), messages.size() == 0); long start = System.currentTimeMillis(); // keep checking int waitedAlreadySeconds = 0; while (messages.size() == 0) { logger.info("Checking for messages for " + waitedAlreadySeconds + " seconds"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); waitedAlreadySeconds = (int)((System.currentTimeMillis()-start)/1000); if (waitedAlreadySeconds > (int)(timeoutSeconds*1.1)) { fail("Message did not become revisible after " + waitedAlreadySeconds + " seconds"); } } assertTrue("Message became visible too soon after " + waitedAlreadySeconds + " sec", waitedAlreadySeconds < (int)(timeoutSeconds*1.1)); assertTrue("Received " + messages.size() + " instead of 1 message", messages.size() == 1); assertTrue("Message content dorky: " + messages.get(0).getBody(), messages.get(0).getBody().startsWith("This is my message text.")); // delete message logger.info("Deleting message with receipt handle " + messages.get(0).getReceiptHandle()); cqs1.deleteMessage(new DeleteMessageRequest(queueUrl, messages.get(0).getReceiptHandle())); // check if message reappears waitedAlreadySeconds = 0; start = System.currentTimeMillis(); for (int i=0; i<10; i++) { logger.info("Checking for messages for " + waitedAlreadySeconds + " seconds"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); waitedAlreadySeconds = (int)((System.currentTimeMillis()-start)/1000); assertTrue("Message reappeared", messages.size() == 0); } } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail(ase.getMessage()); } } @Test public void testMessageVisibilityOnReceiveLongPoll() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException, InterruptedException { try { final String queueUrl = getQueueUrl(1, USR.USER1); Thread.sleep(1000); final ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); receiveMessageRequest.setVisibilityTimeout(120); receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setWaitTimeSeconds(20); (new Thread() { public void run() { long ts1 = System.currentTimeMillis(); logger.info("event=lp_receive vto=120 wt=20"); List<Message> messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 1 message, instead found " + messages.size(), messages.size() == 1); long ts2 = System.currentTimeMillis(); logger.info("event=message_found duration=" + (ts2-ts1)); } }).start(); Thread.sleep(100); // send message logger.info("event=send_message queue_url=" + queueUrl); cqs1.sendMessage(new SendMessageRequest(queueUrl, "This is my message text. " + (new Random()).nextInt())); Thread.sleep(100); // receive message // message should be invisible now List<Message> messages = null; long ts = System.currentTimeMillis(); for (int i=0; i<5; i++) { logger.info("event=receive"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); if (messages.size() > 0) { logger.info("event=message_found delay=" + (System.currentTimeMillis()-ts)); } assertTrue("Expected 0 messages, instead found "+ messages.size(), messages.size() == 0); } for (int i=0; i<5; i++) { logger.info("event=receive"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); if (messages.size() > 0) { logger.info("event=message_found delay=" + (System.currentTimeMillis()-ts)); return; } } fail("message not found any more"); } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail(ase.getMessage()); } } @Test public void testSendDeleteLargeMessage() throws InterruptedException, PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); // send a batch of messages StringBuffer msg256k = new StringBuffer(""); // 256k msg for (int i=0; i<256000; i++) { msg256k.append("X"); } logger.info("Sending large message to " + queueUrl); SendMessageRequest sendMessageRequest = new SendMessageRequest(queueUrl, msg256k.toString()); SendMessageResult sendResult = cqs1.sendMessage(sendMessageRequest); assertNotNull("Message id is null", sendResult.getMessageId()); StringBuffer msg280k = new StringBuffer(""); // 280k msg for (int i=0; i<280000; i++) { msg280k.append("X"); } try { logger.info("Sending too large message to " + queueUrl); sendMessageRequest = new SendMessageRequest(queueUrl, msg280k.toString()); sendResult = cqs1.sendMessage(sendMessageRequest); fail("should not accept messages > 256k"); } catch (Exception ex) { assertTrue("wrong error, expected message too long", ex.getMessage().contains("body must be shorter than")); } // receive messages logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(60); receiveMessageRequest.setMaxNumberOfMessages(1); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected one message, instead got " + messages.size(), messages.size() == 1); for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } } DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest(queueUrl, messages.get(0).getReceiptHandle()); cqs1.deleteMessage(deleteMessageRequest); } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail(ase.getMessage()); } } @Test public void testSendDeleteMessage() throws InterruptedException, PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); // send a batch of messages logger.info("Sending message to " + queueUrl); SendMessageRequest sendMessageRequest = new SendMessageRequest(queueUrl, "This is a test message"); SendMessageResult sendResult = cqs1.sendMessage(sendMessageRequest); assertNotNull("Message id is null", sendResult.getMessageId()); // receive messages logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(60); receiveMessageRequest.setMaxNumberOfMessages(10); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected one message, instead got " + messages.size(), messages.size() == 1); for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } } DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest(queueUrl, messages.get(0).getReceiptHandle()); cqs1.deleteMessage(deleteMessageRequest); } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail(ase.getMessage()); } } @Test public void testSendDeleteMessageBatch() throws PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException, InterruptedException { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); // send batch of messages logger.info("Sending batch messages to " + queueUrl); SendMessageBatchRequest sendMessageBatchRequest = new SendMessageBatchRequest(queueUrl); List<SendMessageBatchRequestEntry> sendEntryList = new ArrayList<SendMessageBatchRequestEntry>(); for (int i = 0; i < 5; i++) { sendEntryList.add(new SendMessageBatchRequestEntry("msg_" + i, "This is a test message: batch " + i)); } sendMessageBatchRequest.setEntries(sendEntryList); cqs1.sendMessageBatch(sendMessageBatchRequest); Thread.sleep(1000); // receive messages logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setVisibilityTimeout(60); receiveMessageRequest.setMaxNumberOfMessages(10); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 5 messages, instead found " + messages.size(), messages.size() == 5); List<DeleteMessageBatchRequestEntry> deleteEntryList = new ArrayList<DeleteMessageBatchRequestEntry>(); int i = 0; for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } i++; deleteEntryList.add(new DeleteMessageBatchRequestEntry(i + "", message.getReceiptHandle())); } DeleteMessageBatchRequest deleteMessageBatchRequest = new DeleteMessageBatchRequest(queueUrl); deleteMessageBatchRequest.setEntries(deleteEntryList); cqs1.deleteMessageBatch(deleteMessageBatchRequest); } catch (AmazonServiceException ase) { logger.error("test failed", ase); fail(ase.getMessage()); } } @Test public void testChangeMessageVisibilityBatch() throws InterruptedException, PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); // send batch of messages logger.info("Sending batch messages to " + queueUrl); SendMessageBatchRequest sendMessageBatchRequest = new SendMessageBatchRequest(queueUrl); List<SendMessageBatchRequestEntry> sendEntryList = new ArrayList<SendMessageBatchRequestEntry>(); for (int i = 0; i < 5; i++) { sendEntryList.add(new SendMessageBatchRequestEntry("msg_" + i, "This is a test message: batch " + i)); } sendMessageBatchRequest.setEntries(sendEntryList); cqs1.sendMessageBatch(sendMessageBatchRequest); Thread.sleep(1000); // receive messages logger.info("Receiving messages from " + queueUrl); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); List<Message> messages = new ArrayList<Message>(); receiveMessageRequest.setMaxNumberOfMessages(10); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 5 messages, received " + messages.size(), messages.size() == 5); // change message visibility batch to 10 sec for all messages int i = 0; ChangeMessageVisibilityBatchRequest changeMessageVisibilityBatchRequest = new ChangeMessageVisibilityBatchRequest(); changeMessageVisibilityBatchRequest.setQueueUrl(queueUrl); List<ChangeMessageVisibilityBatchRequestEntry> visibilityEntryList = new ArrayList<ChangeMessageVisibilityBatchRequestEntry>(); for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } i++; ChangeMessageVisibilityBatchRequestEntry entry = new ChangeMessageVisibilityBatchRequestEntry(i + "", message.getReceiptHandle()); entry.setVisibilityTimeout(10); visibilityEntryList.add(entry); } changeMessageVisibilityBatchRequest.setEntries(visibilityEntryList); cqs1.changeMessageVisibilityBatch(changeMessageVisibilityBatchRequest); // check if messages invisible messages = new ArrayList<Message>(); receiveMessageRequest.setMaxNumberOfMessages(10); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); assertTrue("Expected 0 messages, received " + messages.size(), messages.size() == 0); Thread.sleep(11000); // check if messages revisible messages = null; receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setWaitTimeSeconds(1); while (messages == null || messages.size() == 0) { logger.info("event=scanning_for_messages"); messages = cqs1.receiveMessage(receiveMessageRequest).getMessages(); } assertTrue("Expected 5 messages, received " + messages.size(), messages.size() == 5); // delete messages List<DeleteMessageBatchRequestEntry> deleteEntryList = new ArrayList<DeleteMessageBatchRequestEntry>(); for (Message message : messages) { logger.info(" Message"); logger.info(" MessageId: " + message.getMessageId()); logger.info(" ReceiptHandle: " + message.getReceiptHandle()); logger.info(" MD5OfBody: " + message.getMD5OfBody()); logger.info(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { logger.info(" Attribute"); logger.info(" Name: " + entry.getKey()); logger.info(" Value: " + entry.getValue()); } i++; deleteEntryList.add(new DeleteMessageBatchRequestEntry(i+"", message.getReceiptHandle())); } DeleteMessageBatchRequest deleteMessageBatchRequest = new DeleteMessageBatchRequest(queueUrl); deleteMessageBatchRequest.setEntries(deleteEntryList); cqs1.deleteMessageBatch(deleteMessageBatchRequest); } catch (AmazonServiceException ase) { fail(ase.toString()); } } }