package com.comcast.cns.test.unit;
import static org.junit.Assert.fail;
import org.apache.log4j.Logger;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.SubscribeRequest;
import com.amazonaws.services.sns.model.SubscribeResult;
import com.comcast.cmb.test.tools.CMBAWSBaseTest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import java.util.concurrent.CountDownLatch;
import java.util.List;
import java.util.ArrayList;
import java.util.Random;
public class CNSRedisPubSubTest extends CMBAWSBaseTest {
// logic largely taken from https://gist.github.com/FredrikWendt/3343861
private static Random rand = new Random();
private CountDownLatch messageReceivedLatch = new CountDownLatch(1);
private CountDownLatch publishLatch = new CountDownLatch(1);
private String redisHost = "127.0.0.1";
private String redisPort = "6379";
String redisChannel = "unittest1";
List<String> messageContainer = new ArrayList<String>();
String message = "redisUnitTest";
public void setup() throws Exception {
super.setup();
logger = Logger.getLogger(CNSRedisPubSubTest.class);
}
//@Test
public void testRedisPubSub() {
JedisPubSub jedisPubSub = setupSubscriber();
try {
setupCNSMessagePublisher();
logger.info("Finished starting setupCNSMessagePublisher");
publishLatch.countDown();
logger.info("Finished publish latch countdown");
messageReceivedLatch.await();
logger.info("Waiting for message receive");
if (! messageContainer.iterator().next().equals(message)) {
logger.info("published message did not match received message");
fail("published message did not match received message");
} else {
logger.info("message received and matched published message");
}
jedisPubSub.unsubscribe();
} catch (InterruptedException ie) {
fail("interrupted " + ie);
}
}
private void setupCNSMessagePublisher() {
new Thread(new Runnable() {
@Override
public void run() {
try {
logger.info("setting up cnsMessagePublisher");
String redisEndPointUrl = "redis://" + redisHost + ":" + redisPort + "/" + redisChannel;
String topicArn = getTopic(1, USR.USER1);
SubscribeRequest redisEndPointSubscribeRequest = new SubscribeRequest();
redisEndPointSubscribeRequest.setEndpoint(redisEndPointUrl);
redisEndPointSubscribeRequest.setProtocol("redis");
redisEndPointSubscribeRequest.setTopicArn(topicArn);
SubscribeResult subscribeResult = cns1.subscribe(redisEndPointSubscribeRequest);
logger.info("subscribeResult=" + subscribeResult);
PublishRequest publishRequest = new PublishRequest();
publishRequest.setMessage(message);
publishRequest.setTopicArn(topicArn);
cns1.publish(publishRequest);
logger.info("published message with contents=" + message);
} catch (Exception e) {
e.printStackTrace();
fail("Caught error in setupCNSMessagePublisher");
logger.error(e);
}
}
}, "publisherThread").start();
}
private JedisPubSub setupSubscriber() {
final JedisPubSub jedisPubSub = new JedisPubSub() {
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
logger.info("onUnsubscribe channel=" + channel);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) {
logger.info("onSubscribe channel=" + channel);
}
@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
}
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
}
@Override
public void onPMessage(String pattern, String channel, String message) {
}
@Override
public void onMessage(String channel, String receivedMessage) {
messageContainer.add(receivedMessage);
logger.info("Redis message received = " + message);
messageReceivedLatch.countDown();
}
};
new Thread(new Runnable() {
@Override
public void run() {
try {
logger.info("Connecting to redis host=" + redisHost);
Jedis jedis = new Jedis(redisHost);
logger.info("Subscribing to redis channel " + redisChannel);
jedis.subscribe(jedisPubSub, redisChannel);
logger.info("Subscribe returned, closing down");
jedis.quit();
} catch (Exception e) {
logger.error("Redis subscription had an error " + e.getMessage());
fail("redis subscribe hit an error " + e.getMessage());
}
}
}, "subscriberThread").start();
return jedisPubSub;
}
}