package org.swisspush.redisques;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.Timeout;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.swisspush.redisques.util.RedisquesConfiguration;
import redis.clients.jedis.Jedis;
import static org.swisspush.redisques.util.RedisquesAPI.*;
/**
* Class RedisQueueBrowserTest.
*
* @author baldim, webermarca
*/
public class RedisQuesTest extends AbstractTestCase {
@Rule
public Timeout rule = Timeout.seconds(5);
@BeforeClass
public static void deployRedisques(TestContext context) {
vertx = Vertx.vertx();
JsonObject config = RedisquesConfiguration.with()
.processorAddress(PROCESSOR_ADDRESS)
.redisEncoding("ISO-8859-1")
.refreshPeriod(2)
.build()
.asJsonObject();
RedisQues redisQues = new RedisQues();
vertx.deployVerticle(redisQues, new DeploymentOptions().setConfig(config), context.asyncAssertSuccess(event -> {
deploymentId = event;
log.info("vert.x Deploy - " + redisQues.getClass().getSimpleName() + " was successful.");
jedis = new Jedis("localhost", 6379, 5000);
}));
}
@Test
public void testUnsupportedOperation(TestContext context) {
Async async = context.async();
JsonObject op = new JsonObject();
op.put(OPERATION, "some_unkown_operation");
eventBusSend(op, message -> {
context.assertEquals(ERROR, message.result().body().getString(STATUS));
context.assertEquals("QUEUE_ERROR: Unsupported operation received: some_unkown_operation", message.result().body().getString(MESSAGE));
async.complete();
});
}
@Test
public void enqueue(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
eventBusSend(buildEnqueueOperation("queueEnqueue", "helloEnqueue"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertEquals("helloEnqueue", jedis.lindex(getQueuesRedisKeyPrefix() + "queueEnqueue", 0));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
async.complete();
});
}
@Test
public void getQueueItems(TestContext context) {
Async async = context.async();
flushAll();
eventBusSend(buildGetQueueItemsOperation("queue1", null), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertEquals(0, message.result().body().getJsonArray(VALUE).size());
eventBusSend(buildEnqueueOperation("queue1", "a_queue_item"), message1 -> {
context.assertEquals(OK, message1.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
eventBusSend(buildGetQueueItemsOperation("queue1", null), event -> {
context.assertEquals(OK, event.result().body().getString(STATUS));
context.assertEquals(1, event.result().body().getJsonArray(VALUE).size());
context.assertEquals("a_queue_item", event.result().body().getJsonArray(VALUE).getString(0));
context.assertEquals(1, event.result().body().getJsonArray(INFO).getInteger(0));
context.assertEquals(1, event.result().body().getJsonArray(INFO).getInteger(1));
async.complete();
});
});
});
}
@Test
public void getQueues(TestContext context) {
Async asyncEnqueue = context.async(100);
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
for (int i = 0; i < 100; i++) {
eventBusSend(buildEnqueueOperation("queue" + i, "testItem"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
asyncEnqueue.countDown();
});
}
asyncEnqueue.awaitSuccess();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 100);
Async async = context.async();
eventBusSend(buildGetQueuesOperation(), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
JsonArray queuesArray = message.result().body().getJsonObject(VALUE).getJsonArray("queues");
context.assertEquals(100, queuesArray.size());
for (int i = 0; i < 100; i++) {
context.assertTrue(queuesArray.contains("queue"+i), "item queue" + i + " expected to be in result");
}
async.complete();
});
}
@Test
public void getQueuesCount(TestContext context) {
Async asyncEnqueue = context.async(100);
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
for (int i = 0; i < 100; i++) {
eventBusSend(buildEnqueueOperation("queue" + i, "testItem"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
asyncEnqueue.countDown();
});
}
asyncEnqueue.awaitSuccess();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 100);
Async async = context.async();
eventBusSend(buildGetQueuesCountOperation(), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertEquals(100L, message.result().body().getLong(VALUE));
async.complete();
});
}
@Test
public void getQueueItemsCount(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
String queue = "queue_1";
for (int i = 0; i < 100; i++) {
jedis.rpush(getQueuesRedisKeyPrefix() + queue, "testItem"+i);
}
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
context.assertEquals(100L, jedis.llen(getQueuesRedisKeyPrefix() + queue));
eventBusSend(buildGetQueueItemsCountOperation(queue), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertEquals(100L, message.result().body().getLong(VALUE));
async.complete();
});
}
@Test
public void deleteAllQueueItems(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
final String queue = "queue1";
eventBusSend(buildEnqueueOperation(queue, "some_val"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
eventBusSend(buildDeleteAllQueueItemsOperation(queue), message1 -> {
context.assertEquals(OK, message1.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
async.complete();
});
});
}
@Test
public void addQueueItem(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
eventBusSend(buildAddQueueItemOperation("queue2", "fooBar"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
context.assertEquals("fooBar", jedis.lindex(getQueuesRedisKeyPrefix() + "queue2", 0));
async.complete();
});
}
@Test
public void addQueueItemWithLegacyOperationName(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
JsonObject op = new JsonObject();
op.put(OPERATION, "addItem");
op.put(PAYLOAD, new JsonObject().put(QUEUENAME, "queue2").put("buffer", "fooBar"));
eventBusSend(op, message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
context.assertEquals("fooBar", jedis.lindex(getQueuesRedisKeyPrefix() + "queue2", 0));
async.complete();
});
}
@Test
public void getQueueItemsWithQueueSizeInformation(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
eventBusSend(buildAddQueueItemOperation("queue2", "fooBar"), message -> {
eventBusSend(buildAddQueueItemOperation("queue2", "fooBar2"), message1 -> {
eventBusSend(buildAddQueueItemOperation("queue2", "fooBar3"), message2 -> {
context.assertEquals(OK, message2.result().body().getString(STATUS));
eventBusSend(buildGetQueueItemsOperation("queue2", "2"), event -> {
context.assertEquals(OK, event.result().body().getString(STATUS));
context.assertEquals(2, event.result().body().getJsonArray(VALUE).size());
context.assertEquals(2, event.result().body().getJsonArray(INFO).getInteger(0));
context.assertEquals(3, event.result().body().getJsonArray(INFO).getInteger(1));
async.complete();
});
});
});
});
}
@Test
public void getQueueItem(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix(), 0);
eventBusSend(buildGetQueueItemOperation("queue1", 0), message -> {
context.assertEquals(ERROR, message.result().body().getString(STATUS));
context.assertNull(message.result().body().getString(VALUE));
eventBusSend(buildAddQueueItemOperation("queue1", "fooBar"), message1 -> {
context.assertEquals(OK, message1.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
context.assertEquals("fooBar", jedis.lindex(getQueuesRedisKeyPrefix() + "queue1", 0));
eventBusSend(buildGetQueueItemOperation("queue1", 0), message2 -> {
context.assertEquals(OK, message2.result().body().getString(STATUS));
context.assertEquals("fooBar", message2.result().body().getString("value"));
async.complete();
});
});
});
}
@Test
public void replaceQueueItem(TestContext context) {
Async async = context.async();
flushAll();
eventBusSend(buildAddQueueItemOperation("queue1", "foo"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
context.assertEquals("foo", jedis.lindex(getQueuesRedisKeyPrefix() + "queue1", 0));
eventBusSend(buildReplaceQueueItemOperation("queue1", 0, "bar"), message1 -> {
context.assertEquals(OK, message1.result().body().getString(STATUS));
context.assertEquals("bar", jedis.lindex(getQueuesRedisKeyPrefix() + "queue1", 0));
async.complete();
});
});
}
@Test
public void replaceQueueItemWithLegacyOperationName(TestContext context) {
Async async = context.async();
flushAll();
eventBusSend(buildAddQueueItemOperation("queue1", "foo"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix(), 1);
context.assertEquals("foo", jedis.lindex(getQueuesRedisKeyPrefix() + "queue1", 0));
JsonObject op = new JsonObject();
op.put(OPERATION, "replaceItem");
op.put(PAYLOAD, new JsonObject().put(QUEUENAME, "queue1").put("index", 0).put("buffer", "bar"));
eventBusSend(op, message1 -> {
context.assertEquals(OK, message1.result().body().getString(STATUS));
context.assertEquals("bar", jedis.lindex(getQueuesRedisKeyPrefix() + "queue1", 0));
async.complete();
});
});
}
@Test
public void deleteQueueItem(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getQueuesRedisKeyPrefix() + "queue1", 0);
eventBusSend(buildDeleteQueueItemOperation("queue1", 0), message -> {
context.assertEquals(ERROR, message.result().body().getString(STATUS));
eventBusSend(buildAddQueueItemOperation("queue1", "foo"), message2 -> {
context.assertEquals(OK, message2.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix() + "queue1", 1);
eventBusSend(buildDeleteQueueItemOperation("queue1", 0), message3 -> {
context.assertEquals(OK, message3.result().body().getString(STATUS));
assertKeyCount(context, getQueuesRedisKeyPrefix() + "queue1", 0);
async.complete();
});
});
});
}
@Test
public void getAllLocks(TestContext context) {
Async async = context.async();
flushAll();
eventBusSend(buildGetAllLocksOperation(), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
JsonArray locksArray = message.result().body().getJsonObject(VALUE).getJsonArray("locks");
context.assertNotNull(locksArray, "locks array should not be null");
context.assertEquals(0, locksArray.size(), "locks array should be empty");
eventBusSend(buildPutLockOperation("testLock", "geronimo"), message2 -> {
context.assertEquals(OK, message2.result().body().getString(STATUS));
context.assertTrue(jedis.hexists(getLocksRedisKey(), "testLock"));
eventBusSend(buildGetAllLocksOperation(), message3 -> {
context.assertEquals(OK, message3.result().body().getString(STATUS));
JsonArray locksArray1 = message3.result().body().getJsonObject(VALUE).getJsonArray("locks");
context.assertNotNull(locksArray1, "locks array should not be null");
context.assertTrue(locksArray1.size() > 0, "locks array should not be empty");
if(locksArray1.size() > 0) {
String result = locksArray1.getString(0);
context.assertTrue(result.matches("testLock.*"));
}
async.complete();
});
});
});
}
@Test
public void putLock(TestContext context) {
Async async = context.async();
flushAll();
eventBusSend(buildPutLockOperation("queue1", "someuser"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertTrue(jedis.hexists(getLocksRedisKey(), "queue1"));
assertLockContent(context, "queue1", "someuser");
async.complete();
});
}
@Test
public void putLockMissingRequestedBy(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getLocksRedisKey(), 0);
context.assertFalse(jedis.hexists(getLocksRedisKey(), "queue1"));
eventBusSend(buildOperation(QueueOperation.putLock, new JsonObject().put(QUEUENAME, "queue1")), message -> {
context.assertEquals(ERROR, message.result().body().getString(STATUS));
context.assertEquals("Property '"+REQUESTED_BY+"' missing", message.result().body().getString(MESSAGE));
assertKeyCount(context, getLocksRedisKey(), 0);
context.assertFalse(jedis.hexists(getLocksRedisKey(), "queue1"));
async.complete();
});
}
@Test
public void getLock(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getLocksRedisKey(), 0);
eventBusSend(buildPutLockOperation("testLock1", "geronimo"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertTrue(jedis.hexists(getLocksRedisKey(), "testLock1"));
assertKeyCount(context, getLocksRedisKey(), 1);
eventBusSend(buildGetLockOperation("testLock1"), message1 -> {
context.assertEquals(OK, message1.result().body().getString(STATUS));
context.assertTrue(jedis.hexists(getLocksRedisKey(), "testLock1"));
assertLockContent(context, "testLock1", "geronimo");
async.complete();
});
});
}
@Test
public void getNotExistingLock(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getLocksRedisKey(), 0);
eventBusSend(buildGetLockOperation("notExistingLock"), message -> {
context.assertEquals(NO_SUCH_LOCK, message.result().body().getString(STATUS));
assertKeyCount(context, getLocksRedisKey(), 0);
context.assertFalse(jedis.hexists(getLocksRedisKey(), "notExistingLock"));
async.complete();
});
}
@Test
public void testIgnoreCaseInOperationName(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getLocksRedisKey(), 0);
JsonObject op = new JsonObject();
op.put(OPERATION, "GeTLOcK");
op.put(PAYLOAD, new JsonObject().put(QUEUENAME, "notExistingLock"));
eventBusSend(op, message -> {
context.assertEquals(NO_SUCH_LOCK, message.result().body().getString(STATUS));
assertKeyCount(context, getLocksRedisKey(), 0);
context.assertFalse(jedis.hexists(getLocksRedisKey(), "notExistingLock"));
async.complete();
});
}
@Test
public void deleteNotExistingLock(TestContext context) {
Async async = context.async();
flushAll();
eventBusSend(buildDeleteLockOperation("testLock1"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertFalse(jedis.hexists(getLocksRedisKey(), "testLock1"));
async.complete();
});
}
@Test
public void deleteExistingLock(TestContext context) {
Async async = context.async();
flushAll();
assertKeyCount(context, getLocksRedisKey(), 0);
eventBusSend(buildPutLockOperation("testLock1", "someuser"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertTrue(jedis.hexists(getLocksRedisKey(), "testLock1"));
assertKeyCount(context, getLocksRedisKey(), 1);
eventBusSend(buildDeleteLockOperation("testLock1"), message1 -> {
context.assertEquals(OK, message1.result().body().getString(STATUS));
context.assertFalse(jedis.hexists(getLocksRedisKey(), "testLock1"));
assertKeyCount(context, getLocksRedisKey(), 0);
async.complete();
});
});
}
@Test
public void checkLimit(TestContext context) {
Async async = context.async();
flushAll();
for (int i = 0; i < 250; i++) {
jedis.rpush(getQueuesRedisKeyPrefix() + "testLock1", "testItem"+i);
}
eventBusSend(buildGetQueueItemsOperation("testLock1", "178"), message -> {
context.assertEquals(OK, message.result().body().getString(STATUS));
context.assertEquals(178, message.result().body().getJsonArray(VALUE).size());
context.assertEquals(178, message.result().body().getJsonArray(INFO).getInteger(0));
context.assertEquals(250, message.result().body().getJsonArray(INFO).getInteger(1));
async.complete();
});
}
}