/**
* 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.cns.test.unit;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Random;
import org.json.JSONObject;
import org.junit.Test;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.SubscribeRequest;
import com.amazonaws.services.sns.model.UnsubscribeRequest;
import com.amazonaws.services.sqs.model.DeleteMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
import com.comcast.cmb.test.tools.CMBAWSBaseTest;
import com.comcast.cmb.test.tools.CMBTestingConstants;
import com.comcast.cmb.test.tools.CNSTestingUtils;
public class CNSPublishTest extends CMBAWSBaseTest {
private Random rand = new Random();
@Test
public void testPublishToInvalidArn() {
try {
PublishRequest publishRequest = new PublishRequest();
publishRequest.setMessage("test");
publishRequest.setTopicArn("abc");
try {
cns1.publish(publishRequest);
} catch (Exception ex) {
return;
}
fail("call did not fail");
} catch (Exception ex) {
logger.error("test failed", ex);
fail(ex.getMessage());
}
}
@Test
public void testPublishToMissingArn() {
try {
PublishRequest publishRequest = new PublishRequest();
publishRequest.setMessage("test");
try {
cns1.publish(publishRequest);
} catch (Exception ex) {
return;
}
fail("call did not fail");
} catch (Exception ex) {
fail(ex.getMessage());
}
}
@Test
public void testPublishMissingMessage() {
String topicArn = null;
String queueUrl = null;
String queueArn = null;
try {
topicArn = getTopic(1, USR.USER1);
queueUrl = getQueueUrl(1, USR.USER1);
queueArn = com.comcast.cqs.util.Util.getArnForAbsoluteQueueUrl(queueUrl);
Thread.sleep(1000);
String endPoint = queueArn;
SubscribeRequest subscribeRequest = new SubscribeRequest();
subscribeRequest.setEndpoint(endPoint);
subscribeRequest.setProtocol("cqs");
subscribeRequest.setTopicArn(topicArn);
String subscriptionArn = cns1.subscribe(subscribeRequest).getSubscriptionArn();
PublishRequest publishRequest = new PublishRequest();
publishRequest.setTopicArn(topicArn);
try {
cns1.publish(publishRequest);
} catch (Exception ex) {
return;
}
fail("call did not fail");
} catch (Exception ex) {
logger.error("test failed", ex);
fail(ex.getMessage());
}
}
@Test
public void testPublishBadMessage() {
String topicArn = null;
String queueUrl = null;
String queueArn = null;
try {
String endPoint = CMBTestingConstants.HTTP_ENDPOINT_BASE_URL + "recv/" + rand.nextInt();
topicArn = getTopic(1, USR.USER1);
queueUrl = getQueueUrl(1, USR.USER1);
queueArn = com.comcast.cqs.util.Util.getArnForAbsoluteQueueUrl(queueUrl);
Thread.sleep(1000);
endPoint = queueArn;
SubscribeRequest subscribeRequest = new SubscribeRequest();
subscribeRequest.setEndpoint(endPoint);
subscribeRequest.setProtocol("cqs");
subscribeRequest.setTopicArn(topicArn);
String subscriptionArn = cns1.subscribe(subscribeRequest).getSubscriptionArn();
String messageStructure = "json";
String message = "boo";
PublishRequest publishRequest = new PublishRequest();
publishRequest.setMessageStructure(messageStructure);
publishRequest.setMessage(message);
publishRequest.setTopicArn(topicArn);
try {
cns1.publish(publishRequest);
} catch (Exception ex) {
return;
}
fail("call did not fail");
} catch (Exception ex) {
logger.error("test failed", ex);
fail(ex.getMessage());
}
}
@Test
public void testMultipleEndpoints() {
String topicArn = null;
String queueUrl = null;
String queueArn = null;
try {
String endPoint = CMBTestingConstants.HTTP_ENDPOINT_BASE_URL + "recv/" + rand.nextInt();
topicArn = getTopic(1, USR.USER1);
queueUrl = getQueueUrl(1, USR.USER1);
queueArn = com.comcast.cqs.util.Util.getArnForAbsoluteQueueUrl(queueUrl);
Thread.sleep(1000);
SubscribeRequest subscribeRequest = new SubscribeRequest();
subscribeRequest.setEndpoint(endPoint);
subscribeRequest.setProtocol("http");
subscribeRequest.setTopicArn(topicArn);
String subscriptionArn = cns1.subscribe(subscribeRequest).getSubscriptionArn();
String lastMessageUrl = endPoint.replace("recv", "info") + "?showLast=true";
if (subscriptionArn.equals("pending confirmation")) {
String resp = CNSTestingUtils.sendHttpMessage(lastMessageUrl, "");
JSONObject o = new JSONObject(resp);
if (!o.has("SubscribeURL")) {
fail("Message is not a confirmation messsage");
}
String subscriptionUrl = o.getString("SubscribeURL");
resp = CNSTestingUtils.sendHttpMessage(subscriptionUrl, "");
}
endPoint = queueArn;
subscribeRequest = new SubscribeRequest();
subscribeRequest.setEndpoint(endPoint);
subscribeRequest.setProtocol("cqs");
subscribeRequest.setTopicArn(topicArn);
String subscriptionArn2 = cns1.subscribe(subscribeRequest).getSubscriptionArn();
String message = "test message";
PublishRequest publishRequest = new PublishRequest();
publishRequest.setMessage(message);
publishRequest.setTopicArn(topicArn);
cns1.publish(publishRequest);
Thread.sleep(1000);
String resp = CNSTestingUtils.sendHttpMessage(lastMessageUrl, "");
assertTrue("Expected message '" + message + "', instead found " + resp, resp.contains(message));
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
receiveMessageRequest.setQueueUrl(queueUrl);
ReceiveMessageResult result = cqs1.receiveMessage(receiveMessageRequest);
assertTrue("No message found", result.getMessages().size() > 0);
String msg = result.getMessages().get(0).getBody();
assertTrue("Expected message '" + message + "', instead found " + msg, msg.contains(message));
String receiptHandle = result.getMessages().get(0).getReceiptHandle();
assertTrue("Receipt handle is null", receiptHandle != null);
DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest();
deleteMessageRequest.setQueueUrl(queueUrl);
deleteMessageRequest.setReceiptHandle(receiptHandle);
cqs1.deleteMessage(deleteMessageRequest);
UnsubscribeRequest unsubscribeRequest = new UnsubscribeRequest();
unsubscribeRequest.setSubscriptionArn(subscriptionArn2);
cns1.unsubscribe(unsubscribeRequest);
} catch (Exception ex) {
logger.error("test failed", ex);
fail(ex.getMessage());
}
}
@Test
public void testMessageStructure() {
String topicArn = null;
String queueUrl = null;
String queueArn = null;
try {
String endPoint = CMBTestingConstants.HTTP_ENDPOINT_BASE_URL + "recv/" + rand.nextInt();
String httpMessage = "test Http servlet 2";
String cqsMessage = "test CQS servlet 2";
topicArn = getTopic(1, USR.USER1);
queueUrl = getQueueUrl(1, USR.USER1);
queueArn = com.comcast.cqs.util.Util.getArnForAbsoluteQueueUrl(queueUrl);
Thread.sleep(1000);
SubscribeRequest subscribeRequest = new SubscribeRequest();
subscribeRequest.setEndpoint(endPoint);
subscribeRequest.setProtocol("http");
subscribeRequest.setTopicArn(topicArn);
String subscriptionArn = cns1.subscribe(subscribeRequest).getSubscriptionArn();
String lastMessageUrl = endPoint.replace("recv", "info") + "?showLast=true";
if (subscriptionArn.equals("pending confirmation")) {
String resp = CNSTestingUtils.sendHttpMessage(lastMessageUrl, "");
JSONObject o = new JSONObject(resp);
if (!o.has("SubscribeURL")) {
fail("Message is not a confirmation messsage");
}
String subscriptionUrl = o.getString("SubscribeURL");
resp = CNSTestingUtils.sendHttpMessage(subscriptionUrl, "");
}
endPoint = queueArn;
subscribeRequest = new SubscribeRequest();
subscribeRequest.setEndpoint(endPoint);
subscribeRequest.setProtocol("cqs");
subscribeRequest.setTopicArn(topicArn);
String subscriptionArn2 = cns1.subscribe(subscribeRequest).getSubscriptionArn();
String messageStructure = "json";
String message = CNSTestingUtils.generateMultiendpointMessageJson(null, null, "test message", httpMessage, null, cqsMessage);
PublishRequest publishRequest = new PublishRequest();
publishRequest.setMessageStructure(messageStructure);
publishRequest.setMessage(message);
publishRequest.setTopicArn(topicArn);
cns1.publish(publishRequest);
Thread.sleep(1000);
String resp = CNSTestingUtils.sendHttpMessage(lastMessageUrl, "");
JSONObject json = new JSONObject(resp);
String resp_message = json.getString("Message");
assertTrue("Expected message '" + httpMessage + "', instead found " + resp_message, resp_message.equals(httpMessage));
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
receiveMessageRequest.setQueueUrl(queueUrl);
ReceiveMessageResult result = cqs1.receiveMessage(receiveMessageRequest);
assertTrue("No message found", result.getMessages().size() > 0);
String msg = result.getMessages().get(0).getBody();
assertTrue("Expected message '" + cqsMessage + "', instead found " + resp_message, msg.contains(cqsMessage));
String receiptHandle = result.getMessages().get(0).getReceiptHandle();
assertTrue("Receipt handle is null", receiptHandle != null);
DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest();
deleteMessageRequest.setQueueUrl(queueUrl);
deleteMessageRequest.setReceiptHandle(receiptHandle);
cqs1.deleteMessage(deleteMessageRequest);
httpMessage = "test Http servlet 45554";
cqsMessage = "test CQS servlet 2758";
message = CNSTestingUtils.generateMultiendpointMessageJson(null, null, "test message", httpMessage, null, cqsMessage);
publishRequest = new PublishRequest();
publishRequest.setMessageStructure(messageStructure);
publishRequest.setMessage(message);
publishRequest.setTopicArn(topicArn);
cns1.publish(publishRequest);
Thread.sleep(1000);
resp = CNSTestingUtils.sendHttpMessage(lastMessageUrl, "");
json = new JSONObject(resp);
resp_message = json.getString("Message");
assertTrue("Expected message '" + httpMessage + "', instead found " + resp_message, resp_message.contains(httpMessage));
receiveMessageRequest = new ReceiveMessageRequest();
receiveMessageRequest.setQueueUrl(queueUrl);
result = cqs1.receiveMessage(receiveMessageRequest);
assertTrue("No message found", result.getMessages().size() > 0);
msg = result.getMessages().get(0).getBody();
assertTrue("Expected message '" + cqsMessage + "', instead found " + resp_message, msg.contains(cqsMessage));
receiptHandle = result.getMessages().get(0).getReceiptHandle();
assertTrue("Receipt handle is null", receiptHandle != null);
deleteMessageRequest = new DeleteMessageRequest();
deleteMessageRequest.setQueueUrl(queueUrl);
deleteMessageRequest.setReceiptHandle(receiptHandle);
cqs1.deleteMessage(deleteMessageRequest);
UnsubscribeRequest unsubscribeRequest = new UnsubscribeRequest();
unsubscribeRequest.setSubscriptionArn(subscriptionArn2);
cns1.unsubscribe(unsubscribeRequest);
} catch (Exception ex) {
logger.error("test failed", ex);
fail(ex.getMessage());
}
}
}