/** * 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.*; import java.util.HashMap; import org.junit.Test; import com.amazonaws.services.sqs.model.ChangeMessageVisibilityRequest; import com.amazonaws.services.sqs.model.DeleteMessageRequest; 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.SendMessageRequest; import com.amazonaws.services.sqs.model.SetQueueAttributesRequest; import com.comcast.cmb.test.tools.CMBAWSBaseTest; public class CQSDelaySecondsTest extends CMBAWSBaseTest { private static HashMap<String, String> attributeParams = new HashMap<String, String>(); static { attributeParams.put("MessageRetentionPeriod", "600"); attributeParams.put("VisibilityTimeout", "20"); attributeParams.put("DelaySeconds", "20"); } @Test public void testDelayQueue() { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); cqs1.sendMessage(new SendMessageRequest(queueUrl, "test message")); long ts1 = System.currentTimeMillis(); while (true) { logger.info("checking for messages"); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(1); //receiveMessageRequest.setWaitTimeSeconds(20); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); if (receiveMessageResult.getMessages().size() == 1) { assertTrue("Wrong message content", receiveMessageResult.getMessages().get(0).getBody().equals("test message")); logger.info("message found"); long duration = System.currentTimeMillis() - ts1; assertTrue("Wrong delay " + duration, duration >= 18000 && duration <= 25000); break; } if (System.currentTimeMillis() - ts1 > 25*1000) { fail("no message found in 25 seconds"); } Thread.sleep(500); } } catch (Exception ex) { logger.error("test failed", ex); fail(ex.getMessage()); } } @Test public void testDelayMessage() { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); SendMessageRequest sendMessageRequest = new SendMessageRequest(queueUrl, "test message"); sendMessageRequest.setDelaySeconds(10); cqs1.sendMessage(sendMessageRequest); long ts1 = System.currentTimeMillis(); while (true) { logger.info("checking for messages"); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(1); //receiveMessageRequest.setWaitTimeSeconds(20); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); if (receiveMessageResult.getMessages().size() == 1) { assertTrue("Wrong message content", receiveMessageResult.getMessages().get(0).getBody().equals("test message")); logger.info("message found"); long duration = System.currentTimeMillis() - ts1; assertTrue("Wrong delay " + duration, duration >= 8000 && duration <= 15000); break; } if (System.currentTimeMillis() - ts1 > 25*1000) { fail("no message found in 25 seconds"); } Thread.sleep(500); } } catch (Exception ex) { logger.error("test failed", ex); fail(ex.getMessage()); } } @Test public void testMultipleDelayMessage() { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); for (int i=0; i<1000; i++) { logger.info("event=sending_message no=" + i); SendMessageRequest sendMessageRequest = new SendMessageRequest(queueUrl, "test message " + i); sendMessageRequest.setDelaySeconds(20); cqs1.sendMessage(sendMessageRequest); } long ts1 = System.currentTimeMillis(); int count = 0; while (true) { logger.info("event=scanning_for_delayed_messages found_so_far=" + count + " seconds_passed=" + ((System.currentTimeMillis()-ts1)/1000)); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setVisibilityTimeout(15); receiveMessageRequest.setWaitTimeSeconds(1); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); count += receiveMessageResult.getMessages().size(); if (count >=1000) { break; } if (System.currentTimeMillis() - ts1 > 120*1000) { fail("only " + count + " messages found in 120 seconds"); } } ts1 = System.currentTimeMillis(); count = 0; while (true) { logger.info("event=scanning_for_revisible_messages found_so_far=" + count + " seconds_passed=" + ((System.currentTimeMillis()-ts1)/1000)); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setWaitTimeSeconds(1); receiveMessageRequest.setVisibilityTimeout(10); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); count += receiveMessageResult.getMessages().size(); for (Message msg : receiveMessageResult.getMessages()) { ChangeMessageVisibilityRequest changeMessageVisibilityRequest = new ChangeMessageVisibilityRequest(queueUrl, msg.getReceiptHandle(), 23); cqs1.changeMessageVisibility(changeMessageVisibilityRequest); } if (count >=1000) { break; } if (System.currentTimeMillis() - ts1 > 120*1000) { fail("only " + count + " messages found in 120 seconds"); } } ts1 = System.currentTimeMillis(); count = 0; while (true) { logger.info("event=deleting_newly_revisible_messages found_so_far=" + count + " seconds_passed=" + ((System.currentTimeMillis()-ts1)/1000)); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setWaitTimeSeconds(1); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); count += receiveMessageResult.getMessages().size(); for (Message msg : receiveMessageResult.getMessages()) { DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest(queueUrl, msg.getReceiptHandle()); cqs1.deleteMessage(deleteMessageRequest); } if (count >=1000) { break; } if (System.currentTimeMillis() - ts1 > 120*1000) { fail("only " + count + " messages found in 120 seconds"); } } } catch (Exception ex) { logger.error("test failed", ex); fail(ex.getMessage()); } } @Test public void testDelayOutlierMessage() { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); for (int i=0; i<1000; i++) { logger.info("event=sending_message no=" + i); SendMessageRequest sendMessageRequest = new SendMessageRequest(queueUrl, "test message " + i); sendMessageRequest.setDelaySeconds(60); cqs1.sendMessage(sendMessageRequest); } logger.info("event=sending_message no=" + 1001); SendMessageRequest sendMessageRequest = new SendMessageRequest(queueUrl, "test message 1001"); sendMessageRequest.setDelaySeconds(4); cqs1.sendMessage(sendMessageRequest); long ts1 = System.currentTimeMillis(); int count = 0; for (int i=0; i<30; i++) { logger.info("event=scanning_for_delayed_messages found_so_far=" + count + " seconds_passed=" + ((System.currentTimeMillis()-ts1)/1000)); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setVisibilityTimeout(15); receiveMessageRequest.setWaitTimeSeconds(1); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); count += receiveMessageResult.getMessages().size(); for (Message msg : receiveMessageResult.getMessages()) { DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest(queueUrl, msg.getReceiptHandle()); cqs1.deleteMessage(deleteMessageRequest); } if (count > 1) { fail("expected 1 message but found " + count); } } if (count != 1) { fail("expected 1 message but found " + count); } } catch (Exception ex) { logger.error("test failed", ex); fail(ex.getMessage()); } } @Test public void testVTOOutlierMessage() { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); for (int i=0; i<1000; i++) { logger.info("event=sending_message no=" + i); SendMessageRequest sendMessageRequest = new SendMessageRequest(queueUrl, "test message " + i); sendMessageRequest.setDelaySeconds(0); cqs1.sendMessage(sendMessageRequest); } long ts1 = System.currentTimeMillis(); int count = 0; boolean first = true; while (true) { logger.info("event=scanning_for_messages found_so_far=" + count + " seconds_passed=" + ((System.currentTimeMillis()-ts1)/1000)); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(10); if (first) { first = false; receiveMessageRequest.setVisibilityTimeout(20); } else { receiveMessageRequest.setVisibilityTimeout(120); } receiveMessageRequest.setWaitTimeSeconds(1); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); count += receiveMessageResult.getMessages().size(); if (count >= 1000) { break; } if (System.currentTimeMillis() - ts1 > 120*1000) { fail("only " + count + " messages found in 120 seconds"); } } count = 0; ts1 = System.currentTimeMillis(); for (int i=0; i<30; i++) { logger.info("event=scanning_for_delayed_messages found_so_far=" + count + " seconds_passed=" + ((System.currentTimeMillis()-ts1)/1000)); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(10); receiveMessageRequest.setVisibilityTimeout(15); receiveMessageRequest.setWaitTimeSeconds(1); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); count += receiveMessageResult.getMessages().size(); for (Message msg : receiveMessageResult.getMessages()) { DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest(queueUrl, msg.getReceiptHandle()); cqs1.deleteMessage(deleteMessageRequest); } if (count > 10) { fail("expected 1 message but found " + count); } } if (count != 10) { fail("expected 1 message but found " + count); } } catch (Exception ex) { logger.error("test failed", ex); fail(ex.getMessage()); } } /** * Change queue attributes to turn queue into a standard non-delay queue and check functionality */ @Test public void testNoDelay() { try { String queueUrl = getQueueUrl(1, USR.USER1); cqs1.setQueueAttributes(new SetQueueAttributesRequest(queueUrl, attributeParams)); Thread.sleep(1000); SetQueueAttributesRequest setQueueAttributesRequest = new SetQueueAttributesRequest(); setQueueAttributesRequest.setQueueUrl(queueUrl); attributeParams.put("DelaySeconds", "0"); setQueueAttributesRequest.setAttributes(attributeParams); cqs1.setQueueAttributes(setQueueAttributesRequest); cqs1.sendMessage(new SendMessageRequest(queueUrl, "test message")); long ts1 = System.currentTimeMillis(); while (true) { logger.info("checking for messages"); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(); receiveMessageRequest.setQueueUrl(queueUrl); receiveMessageRequest.setMaxNumberOfMessages(1); //receiveMessageRequest.setWaitTimeSeconds(20); ReceiveMessageResult receiveMessageResult = cqs1.receiveMessage(receiveMessageRequest); if (receiveMessageResult.getMessages().size() == 1) { assertTrue("Wrong message content", receiveMessageResult.getMessages().get(0).getBody().equals("test message")); logger.info("message found"); long duration = System.currentTimeMillis() - ts1; assertTrue("Wrong delay " + duration, duration >= 0 && duration <= 2000); break; } if (System.currentTimeMillis() - ts1 > 25*1000) { fail("no message found in 25 seconds"); } Thread.sleep(500); } } catch (Exception ex) { logger.error("test failed", ex); fail(ex.getMessage()); } } }