#include <stdlib.h>
#include <ctype.h>
#include <string.h>
+#include <stdbool.h>
#include "../../redismodule/include/redismodule.h"
#ifdef __UT__
#define OBJ_OP_IE (1<<4) /* OP if equal old value */
#define OBJ_OP_NE (1<<5) /* OP if not equal old value */
+int getKeyType(RedisModuleCtx *ctx, RedisModuleString *key_str)
+{
+ RedisModuleKey *key = RedisModule_OpenKey(ctx, key_str, REDISMODULE_READ);
+ int type = RedisModule_KeyType(key);
+ RedisModule_CloseKey(key);
+ return type;
+}
+
+bool replyContentsEqualString(RedisModuleCallReply *reply, RedisModuleString *expected_value)
+{
+ size_t replylen = 0, expectedlen = 0;
+ const char *expectedval = RedisModule_StringPtrLen(expected_value, &expectedlen);
+ const char *replyval = RedisModule_CallReplyStringPtr(reply, &replylen);
+ return replyval &&
+ expectedlen == replylen &&
+ !strncmp(expectedval, replyval, replylen);
+}
+
+typedef struct _SetParams {
+ RedisModuleString **key_val_pairs;
+ size_t length;
+} SetParams;
+
+typedef struct _PubParams {
+ RedisModuleString **channel_msg_pairs;
+ size_t length;
+} PubParams;
+
+typedef struct _DelParams {
+ RedisModuleString **keys;
+ size_t length;
+} DelParams;
+
+void multiPubCommand(RedisModuleCtx *ctx, PubParams* pubParams)
+{
+ RedisModuleCallReply *reply = NULL;
+ for (unsigned int i = 0 ; i < pubParams->length ; i += 2) {
+ reply = RedisModule_Call(ctx, "PUBLISH", "v", pubParams->channel_msg_pairs + i, 2);
+ RedisModule_FreeCallReply(reply);
+ }
+}
int setStringGenericCommand(RedisModuleCtx *ctx, RedisModuleString **argv,
int argc, const int flag)
return REDISMODULE_OK;
}
-int setPubStringGenericCommand(RedisModuleCtx *ctx, RedisModuleString **argv,
- int argc, const int flag)
+int setPubStringCommon(RedisModuleCtx *ctx, SetParams* setParamsPtr, PubParams* pubParamsPtr)
{
- RedisModuleString *oldvalstr = NULL, *channel = NULL, *message = NULL;
- RedisModuleCallReply *reply = NULL;
-
- if (flag == OBJ_OP_NO) {
- if (argc < 5 || (argc % 2) == 0)
- return RedisModule_WrongArity(ctx);
- else {
- channel = argv[argc-2];
- message = argv[argc-1];
- }
- } else if (flag == OBJ_OP_XX || flag == OBJ_OP_NX) {
- if (argc != 5)
- return RedisModule_WrongArity(ctx);
- else {
- channel = argv[3];
- message = argv[4];
- }
+ RedisModuleCallReply *setReply;
+ setReply = RedisModule_Call(ctx, "MSET", "v!", setParamsPtr->key_val_pairs, setParamsPtr->length);
+ ASSERT_NOERROR(setReply)
+ int replytype = RedisModule_CallReplyType(setReply);
+ if (replytype == REDISMODULE_REPLY_NULL) {
+ RedisModule_ReplyWithNull(ctx);
} else {
- if (argc != 6)
- return RedisModule_WrongArity(ctx);
- else {
- oldvalstr = argv[3];
- channel = argv[4];
- message = argv[5];
- }
+ multiPubCommand(ctx, pubParamsPtr);
+ RedisModule_ReplyWithCallReply(ctx, setReply);
}
+ RedisModule_FreeCallReply(setReply);
+ return REDISMODULE_OK;
+}
- /*Check if key type is string*/
- RedisModuleKey *key = RedisModule_OpenKey(ctx,argv[1],
- REDISMODULE_READ);
- int type = RedisModule_KeyType(key);
- RedisModule_CloseKey(key);
+int SetPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
+{
+ if (argc < 5 || (argc % 2) == 0)
+ return RedisModule_WrongArity(ctx);
- if (flag != OBJ_OP_NO) {
- if (type == REDISMODULE_KEYTYPE_EMPTY) {
- if (flag == OBJ_OP_IE || flag == OBJ_OP_XX){
- return RedisModule_ReplyWithNull(ctx);
- }
- } else if (flag == OBJ_OP_NX) {
- return RedisModule_ReplyWithNull(ctx);
- } else if (type != REDISMODULE_KEYTYPE_STRING) {
- return RedisModule_ReplyWithError(ctx,REDISMODULE_ERRORMSG_WRONGTYPE);
- }
- }
+ SetParams setParams = {
+ .key_val_pairs = argv + 1,
+ .length = argc - 3
+ };
+ PubParams pubParams = {
+ .channel_msg_pairs = argv + argc - 2,
+ .length = 2
+ };
- if (flag == OBJ_OP_IE || flag == OBJ_OP_NE) {
- /*Get the value*/
- reply = RedisModule_Call(ctx, "GET", "s", argv[1]);
- ASSERT_NOERROR(reply)
- size_t curlen = 0, oldvallen = 0;
- const char *oldval = RedisModule_StringPtrLen(oldvalstr, &oldvallen);
- const char *curval = RedisModule_CallReplyStringPtr(reply, &curlen);
- if (((flag == OBJ_OP_IE) &&
- (!curval || (oldvallen != curlen) || strncmp(oldval, curval, curlen)))
- ||
- ((flag == OBJ_OP_NE) && curval && (oldvallen == curlen) &&
- !strncmp(oldval, curval, curlen))) {
- RedisModule_FreeCallReply(reply);
- return RedisModule_ReplyWithNull(ctx);
- }
- RedisModule_FreeCallReply(reply);
- }
+ return setPubStringCommon(ctx, &setParams, &pubParams);
+}
+int SetMPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
+{
+ if (argc < 7 || (argc % 2) == 0)
+ return RedisModule_WrongArity(ctx);
- /* Prepare the arguments for the command. */
- int i, j=0, cmdargc=argc-3;
- RedisModuleString *cmdargv[cmdargc];
- for (i = 1; i < argc-2; i++) {
- if ((flag == OBJ_OP_IE || flag == OBJ_OP_NE) && (i == 3))
- continue;
- cmdargv[j++] = argv[i];
+ long long setPairsCount, pubPairsCount;
+ RedisModule_StringToLongLong(argv[1], &setPairsCount);
+ RedisModule_StringToLongLong(argv[2], &pubPairsCount);
+ if (setPairsCount < 1 || pubPairsCount < 1)
+ return RedisModule_ReplyWithError(ctx, "ERR SET_PAIR_COUNT and PUB_PAIR_COUNT must be greater than zero");
+
+ long long setLen, pubLen;
+ setLen = 2*setPairsCount;
+ pubLen = 2*pubPairsCount;
+ if (setLen + pubLen + 3 != argc)
+ return RedisModule_ReplyWithError(ctx, "ERR SET_PAIR_COUNT or PUB_PAIR_COUNT do not match the total pair count");
+
+ SetParams setParams = {
+ .key_val_pairs = argv + 3,
+ .length = setLen
+ };
+ PubParams pubParams = {
+ .channel_msg_pairs = argv + 3 + setParams.length,
+ .length = pubLen
+ };
+
+ return setPubStringCommon(ctx, &setParams, &pubParams);
+}
+
+int setIENEPubStringCommon(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, int flag)
+{
+ if (argc < 6 || (argc % 2) != 0)
+ return RedisModule_WrongArity(ctx);
+
+ SetParams setParams = {
+ .key_val_pairs = argv + 1,
+ .length = 2
+ };
+ PubParams pubParams = {
+ .channel_msg_pairs = argv + 4,
+ .length = argc - 4
+ };
+ RedisModuleString *key = setParams.key_val_pairs[0];
+ RedisModuleString *oldvalstr = argv[3];
+
+ int type = getKeyType(ctx, key);
+ if (flag == OBJ_OP_IE && type == REDISMODULE_KEYTYPE_EMPTY) {
+ return RedisModule_ReplyWithNull(ctx);
+ } else if (type != REDISMODULE_KEYTYPE_STRING && type != REDISMODULE_KEYTYPE_EMPTY) {
+ return RedisModule_ReplyWithError(ctx, REDISMODULE_ERRORMSG_WRONGTYPE);
}
- /* Call the command and pass back the reply. */
- reply = RedisModule_Call(ctx, "MSET", "v!", cmdargv, j);
+ RedisModuleCallReply *reply = RedisModule_Call(ctx, "GET", "s", key);
ASSERT_NOERROR(reply)
- int replytype = RedisModule_CallReplyType(reply);
- if (replytype == REDISMODULE_REPLY_NULL) {
- RedisModule_ReplyWithNull(ctx);
- }
- else {
- cmdargc = 2;
- cmdargv[0] = channel;
- cmdargv[1] = message;
- RedisModuleCallReply *pubreply = RedisModule_Call(ctx, "PUBLISH", "v", cmdargv, cmdargc);
- RedisModule_FreeCallReply(pubreply);
- RedisModule_ReplyWithCallReply(ctx, reply);
+ bool is_equal = replyContentsEqualString(reply, oldvalstr);
+ RedisModule_FreeCallReply(reply);
+ if ((flag == OBJ_OP_IE && !is_equal) ||
+ (flag == OBJ_OP_NE && is_equal)) {
+ return RedisModule_ReplyWithNull(ctx);
}
- RedisModule_FreeCallReply(reply);
- return REDISMODULE_OK;
+ return setPubStringCommon(ctx, &setParams, &pubParams);
}
-int SetPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
+int SetNEPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
- return setPubStringGenericCommand(ctx, argv, argc, OBJ_OP_NO);
+ return setIENEPubStringCommon(ctx, argv, argc, OBJ_OP_NE);
}
int SetIEPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
- return setPubStringGenericCommand(ctx, argv, argc, OBJ_OP_IE);
+ return setIENEPubStringCommon(ctx, argv, argc, OBJ_OP_IE);
}
-int SetNEPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
+int setXXNXPubStringCommon(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, int flag)
{
- return setPubStringGenericCommand(ctx, argv, argc, OBJ_OP_NE);
+ if (argc < 5 || (argc % 2) == 0)
+ return RedisModule_WrongArity(ctx);
+
+ SetParams setParams = {
+ .key_val_pairs = argv + 1,
+ .length = 2
+ };
+ PubParams pubParams = {
+ .channel_msg_pairs = argv + 3,
+ .length = argc - 3
+ };
+ RedisModuleString *key = setParams.key_val_pairs[0];
+
+ int type = getKeyType(ctx, key);
+ if ((flag == OBJ_OP_XX && type == REDISMODULE_KEYTYPE_EMPTY) ||
+ (flag == OBJ_OP_NX && type == REDISMODULE_KEYTYPE_STRING)) {
+ return RedisModule_ReplyWithNull(ctx);
+ } else if (type != REDISMODULE_KEYTYPE_STRING && type != REDISMODULE_KEYTYPE_EMPTY) {
+ RedisModule_ReplyWithError(ctx, REDISMODULE_ERRORMSG_WRONGTYPE);
+ return REDISMODULE_OK;
+ }
+
+ return setPubStringCommon(ctx, &setParams, &pubParams);
}
int SetNXPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
- return setPubStringGenericCommand(ctx, argv, argc, OBJ_OP_NX);
+ return setXXNXPubStringCommon(ctx, argv, argc, OBJ_OP_NX);
}
int SetXXPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
- return setPubStringGenericCommand(ctx, argv, argc, OBJ_OP_XX);
+ return setXXNXPubStringCommon(ctx, argv, argc, OBJ_OP_XX);
}
-int delPubStringGenericCommand(RedisModuleCtx *ctx, RedisModuleString **argv,
- int argc, const int flag)
+int delPubStringCommon(RedisModuleCtx *ctx, DelParams *delParamsPtr, PubParams *pubParamsPtr)
{
- RedisModuleString *oldvalstr = NULL, *channel = NULL, *message = NULL;
- RedisModuleCallReply *reply = NULL;
-
- if (flag == OBJ_OP_NO) {
- if (argc < 4)
- return RedisModule_WrongArity(ctx);
- else {
- channel = argv[argc-2];
- message = argv[argc-1];
- }
- } else {
- if (argc != 5)
- return RedisModule_WrongArity(ctx);
- else {
- oldvalstr = argv[2];
- channel = argv[3];
- message = argv[4];
- }
- }
-
- if (flag != OBJ_OP_NO) {
- /*Check if key type is string*/
- RedisModuleKey *key = RedisModule_OpenKey(ctx,argv[1],
- REDISMODULE_READ);
- int type = RedisModule_KeyType(key);
- RedisModule_CloseKey(key);
-
- if (type == REDISMODULE_KEYTYPE_EMPTY) {
- return RedisModule_ReplyWithLongLong(ctx, 0);
- } else if (type != REDISMODULE_KEYTYPE_STRING) {
- return RedisModule_ReplyWithError(ctx,REDISMODULE_ERRORMSG_WRONGTYPE);
- }
- }
-
- if (flag == OBJ_OP_IE || flag == OBJ_OP_NE) {
- /*Get the value*/
- reply = RedisModule_Call(ctx, "GET", "s", argv[1]);
- ASSERT_NOERROR(reply)
- size_t curlen = 0, oldvallen = 0;
- const char *oldval = RedisModule_StringPtrLen(oldvalstr, &oldvallen);
- const char *curval = RedisModule_CallReplyStringPtr(reply, &curlen);
- if (((flag == OBJ_OP_IE) &&
- (!curval || (oldvallen != curlen) || strncmp(oldval, curval, curlen)))
- ||
- ((flag == OBJ_OP_NE) && curval && (oldvallen == curlen) &&
- !strncmp(oldval, curval, curlen))) {
- RedisModule_FreeCallReply(reply);
- return RedisModule_ReplyWithLongLong(ctx, 0);
- }
- RedisModule_FreeCallReply(reply);
- }
-
-
- /* Prepare the arguments for the command. */
- int i, j=0, cmdargc=argc-3;
- RedisModuleString *cmdargv[cmdargc];
- for (i = 1; i < argc-2; i++) {
- if ((flag == OBJ_OP_IE || flag == OBJ_OP_NE) && (i == 2))
- continue;
- cmdargv[j++] = argv[i];
- }
-
- /* Call the command and pass back the reply. */
- reply = RedisModule_Call(ctx, "UNLINK", "v!", cmdargv, j);
+ RedisModuleCallReply *reply = RedisModule_Call(ctx, "UNLINK", "v!", delParamsPtr->keys, delParamsPtr->length);
ASSERT_NOERROR(reply)
int replytype = RedisModule_CallReplyType(reply);
if (replytype == REDISMODULE_REPLY_NULL) {
RedisModule_ReplyWithNull(ctx);
- }
- else if (RedisModule_CallReplyInteger(reply) == 0) {
+ } else if (RedisModule_CallReplyInteger(reply) == 0) {
RedisModule_ReplyWithCallReply(ctx, reply);
} else {
- cmdargc = 2;
- cmdargv[0] = channel;
- cmdargv[1] = message;
- RedisModuleCallReply *pubreply = RedisModule_Call(ctx, "PUBLISH", "v", cmdargv, cmdargc);
- RedisModule_FreeCallReply(pubreply);
RedisModule_ReplyWithCallReply(ctx, reply);
+ multiPubCommand(ctx, pubParamsPtr);
}
-
RedisModule_FreeCallReply(reply);
return REDISMODULE_OK;
}
int DelPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
- return delPubStringGenericCommand(ctx, argv, argc, OBJ_OP_NO);
+ if (argc < 4)
+ return RedisModule_WrongArity(ctx);
+
+ DelParams delParams = {
+ .keys = argv + 1,
+ .length = argc - 3
+ };
+ PubParams pubParams = {
+ .channel_msg_pairs = argv + 1 + delParams.length,
+ .length = 2
+ };
+
+ return delPubStringCommon(ctx, &delParams, &pubParams);
+}
+
+int DelMPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
+{
+ if (argc < 6)
+ return RedisModule_WrongArity(ctx);
+
+ long long delCount, pubPairsCount;
+ RedisModule_StringToLongLong(argv[1], &delCount);
+ RedisModule_StringToLongLong(argv[2], &pubPairsCount);
+ if (delCount < 1 || pubPairsCount < 1)
+ return RedisModule_ReplyWithError(ctx, "ERR DEL_COUNT and PUB_PAIR_COUNT must be greater than zero");
+
+ long long delLen, pubLen;
+ delLen = delCount;
+ pubLen = 2*pubPairsCount;
+ if (delLen + pubLen + 3 != argc)
+ return RedisModule_ReplyWithError(ctx, "ERR DEL_COUNT or PUB_PAIR_COUNT do not match the total pair count");
+
+ DelParams delParams = {
+ .keys = argv + 3,
+ .length = delLen
+ };
+ PubParams pubParams = {
+ .channel_msg_pairs = argv + 3 + delParams.length,
+ .length = pubLen
+ };
+
+ return delPubStringCommon(ctx, &delParams, &pubParams);
+}
+
+int delIENEPubStringCommon(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, int flag)
+{
+ if (argc < 5 || (argc % 2) == 0)
+ return RedisModule_WrongArity(ctx);
+
+ DelParams delParams = {
+ .keys = argv + 1,
+ .length = 1
+ };
+ PubParams pubParams = {
+ .channel_msg_pairs = argv + 3,
+ .length = argc - 3
+ };
+ RedisModuleString *key = argv[1];
+ RedisModuleString *oldvalstr = argv[2];
+
+ int type = getKeyType(ctx, key);
+ if (type == REDISMODULE_KEYTYPE_EMPTY) {
+ return RedisModule_ReplyWithLongLong(ctx, 0);
+ } else if (type != REDISMODULE_KEYTYPE_STRING) {
+ return RedisModule_ReplyWithError(ctx, REDISMODULE_ERRORMSG_WRONGTYPE);
+ }
+
+ RedisModuleCallReply *reply = RedisModule_Call(ctx, "GET", "s", key);
+ ASSERT_NOERROR(reply)
+ bool is_equal = replyContentsEqualString(reply, oldvalstr);
+ RedisModule_FreeCallReply(reply);
+ if ((flag == OBJ_OP_IE && !is_equal) ||
+ (flag == OBJ_OP_NE && is_equal)) {
+ return RedisModule_ReplyWithLongLong(ctx, 0);
+ }
+
+ return delPubStringCommon(ctx, &delParams, &pubParams);
}
int DelIEPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
- return delPubStringGenericCommand(ctx, argv, argc, OBJ_OP_IE);
+ return delIENEPubStringCommon(ctx, argv, argc, OBJ_OP_IE);
}
int DelNEPub_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
- return delPubStringGenericCommand(ctx, argv, argc, OBJ_OP_NE);
+ return delIENEPubStringCommon(ctx, argv, argc, OBJ_OP_NE);
}
/* This function must be present on each Redis module. It is used in order to
SetPub_RedisCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
+ if (RedisModule_CreateCommand(ctx,"msetmpub",
+ SetMPub_RedisCommand,"write deny-oom pubsub",1,1,1) == REDISMODULE_ERR)
+ return REDISMODULE_ERR;
+
if (RedisModule_CreateCommand(ctx,"setiepub",
SetIEPub_RedisCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
DelPub_RedisCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
+ if (RedisModule_CreateCommand(ctx,"delmpub",
+ DelMPub_RedisCommand,"write deny-oom pubsub",1,1,1) == REDISMODULE_ERR)
+ return REDISMODULE_ERR;
+
if (RedisModule_CreateCommand(ctx,"deliepub",
DelIEPub_RedisCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
mock().setData("RedisModule_String_same", 1);
mock().setData("RedisModule_CallReplyType_null", 1);
- mock().expectOneCall("RedisModule_CloseKey");
int ret = SetPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
delete []redisStrVec;
}
+TEST(exstring, setmpub)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[11]);
+
+ for (int i = 0 ; i < 11 ; ++i)
+ redisStrVec[i] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_OpenKey_have", 1);
+ mock().setData("RedisModule_KeyType_str", 1);
+ mock().setData("RedisModule_String_same", 1);
+ mock().setData("RedisModule_CallReplyType_null", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 2);
+ mock().setData("RedisModule_StringToLongLongCall_2", 2);
+
+ int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 11);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+ mock().checkExpectations();
+ delete []redisStrVec;
+}
+
TEST(exstring, setxxpub)
{
RedisModuleCtx ctx;
{
RedisModuleCtx ctx;
int ret = 0;
- ret = setPubStringGenericCommand(&ctx, 0, 2, OBJ_OP_NO);
+
+ ret = SetPub_RedisCommand(&ctx, 0, 2);
CHECK_EQUAL(ret, REDISMODULE_ERR);
ret = 0;
- ret = setPubStringGenericCommand(&ctx, 0, 8, OBJ_OP_NO);
+ ret = SetPub_RedisCommand(&ctx, 0, 8);
CHECK_EQUAL(ret, REDISMODULE_ERR);
ret = 0;
- ret = setPubStringGenericCommand(&ctx, 0, 3, OBJ_OP_XX);
+ ret = SetMPub_RedisCommand(&ctx, 0, 2);
CHECK_EQUAL(ret, REDISMODULE_ERR);
ret = 0;
- ret = setPubStringGenericCommand(&ctx, 0, 6, OBJ_OP_NX);
+ ret = SetMPub_RedisCommand(&ctx, 0, 8);
CHECK_EQUAL(ret, REDISMODULE_ERR);
ret = 0;
- ret = setPubStringGenericCommand(&ctx, 0, 4, OBJ_OP_IE);
+ ret = SetXXPub_RedisCommand(&ctx, 0, 3);
CHECK_EQUAL(ret, REDISMODULE_ERR);
ret = 0;
- ret = setPubStringGenericCommand(&ctx, 0, 8, OBJ_OP_NE);
+ ret = SetXXPub_RedisCommand(&ctx, 0, 6);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ ret = 0;
+ ret = SetNXPub_RedisCommand(&ctx, 0, 3);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ ret = 0;
+ ret = SetNXPub_RedisCommand(&ctx, 0, 6);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ ret = 0;
+ ret = SetIEPub_RedisCommand(&ctx, 0, 4);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ ret = 0;
+ ret = SetIEPub_RedisCommand(&ctx, 0, 9);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ ret = 0;
+ ret = SetNEPub_RedisCommand(&ctx, 0, 4);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ ret = 0;
+ ret = SetNEPub_RedisCommand(&ctx, 0, 9);
CHECK_EQUAL(ret, REDISMODULE_ERR);
}
mock().setData("RedisModule_KeyType_empty", 1);
mock().setData("RedisModule_CallReplyType_null", 1);
- mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
+ int ret = SetPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
mock().setData("RedisModule_KeyType_empty", 1);
mock().setData("RedisModule_CallReplyType_str", 1);
- mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
+ int ret = SetPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
}
+TEST(exstring, setmpub_command_no_key_replynull)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[9]);
+
+ redisStrVec[0] = (RedisModuleString *)0;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)2;
+ redisStrVec[3] = (RedisModuleString *)3;
+ redisStrVec[4] = (RedisModuleString *)4;
+ redisStrVec[5] = (RedisModuleString *)5;
+ redisStrVec[6] = (RedisModuleString *)6;
+ redisStrVec[7] = (RedisModuleString *)7;
+ redisStrVec[8] = (RedisModuleString *)8;
+
+ mock().setData("RedisModule_KeyType_empty", 1);
+ mock().setData("RedisModule_CallReplyType_null", 1);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 2);
+
+ int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 9);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+ mock().checkExpectations();
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(1, mock().getData("MSET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_FreeCallReply").getIntValue());
+
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, setmpub_command_negative_key_val_count)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[7]);
+
+ redisStrVec[0] = (RedisModuleString *)0;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)2;
+ redisStrVec[3] = (RedisModuleString *)3;
+ redisStrVec[4] = (RedisModuleString *)4;
+ redisStrVec[5] = (RedisModuleString *)5;
+ redisStrVec[6] = (RedisModuleString *)6;
+
+ mock().setData("RedisModule_KeyType_empty", 1);
+ mock().setData("RedisModule_CallReplyType_str", 1);
+ mock().setData("RedisModule_StringToLongLongCall_1", -1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 1);
+
+ int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 7);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+ mock().checkExpectations();
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("MSET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithError").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_FreeCallReply").getIntValue());
+
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, setmpub_command_negative_chan_msg_count)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[7]);
+
+ redisStrVec[0] = (RedisModuleString *)0;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)2;
+ redisStrVec[3] = (RedisModuleString *)3;
+ redisStrVec[4] = (RedisModuleString *)4;
+ redisStrVec[5] = (RedisModuleString *)5;
+ redisStrVec[6] = (RedisModuleString *)6;
+
+ mock().setData("RedisModule_KeyType_empty", 1);
+ mock().setData("RedisModule_CallReplyType_str", 1);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", -1);
+
+ int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 7);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+ mock().checkExpectations();
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("MSET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithError").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_FreeCallReply").getIntValue());
+
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, setmpub_command_invalid_total_count)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[7]);
+
+ redisStrVec[0] = (RedisModuleString *)0;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)2;
+ redisStrVec[3] = (RedisModuleString *)3;
+ redisStrVec[4] = (RedisModuleString *)4;
+ redisStrVec[5] = (RedisModuleString *)5;
+ redisStrVec[6] = (RedisModuleString *)6;
+
+ mock().setData("RedisModule_KeyType_empty", 1);
+ mock().setData("RedisModule_CallReplyType_str", 1);
+ mock().setData("RedisModule_StringToLongLongCall_1", 100);
+ mock().setData("RedisModule_StringToLongLongCall_2", 100);
+
+ int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 7);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+ mock().checkExpectations();
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("MSET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithError").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_FreeCallReply").getIntValue());
+
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, setmpub_command_set)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[7]);
+
+ redisStrVec[0] = (RedisModuleString *)0;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)2;
+ redisStrVec[3] = (RedisModuleString *)3;
+ redisStrVec[4] = (RedisModuleString *)4;
+ redisStrVec[5] = (RedisModuleString *)5;
+ redisStrVec[6] = (RedisModuleString *)6;
+
+ mock().setData("RedisModule_KeyType_empty", 1);
+ mock().setData("RedisModule_CallReplyType_str", 1);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 1);
+
+ int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 7);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+ mock().checkExpectations();
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(1, mock().getData("MSET").getIntValue());
+ CHECK_EQUAL(1, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(2, mock().getData("RedisModule_FreeCallReply").getIntValue());
+
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, setmpub_command_set_multipub)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[9]);
+
+ redisStrVec[0] = (RedisModuleString *)0;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)2;
+ redisStrVec[3] = (RedisModuleString *)3;
+ redisStrVec[4] = (RedisModuleString *)4;
+ redisStrVec[5] = (RedisModuleString *)5;
+ redisStrVec[6] = (RedisModuleString *)6;
+ redisStrVec[7] = (RedisModuleString *)7;
+ redisStrVec[8] = (RedisModuleString *)8;
+
+ mock().setData("RedisModule_KeyType_empty", 1);
+ mock().setData("RedisModule_CallReplyType_str", 1);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 2);
+
+ int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 9);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+ mock().checkExpectations();
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(1, mock().getData("MSET").getIntValue());
+ CHECK_EQUAL(2, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(3, mock().getData("RedisModule_FreeCallReply").getIntValue());
+
+ delete []redisStrVec;
+
+}
+
TEST(exstring, setxxpub_command_has_no_key)
{
RedisModuleCtx ctx;
mock().setData("RedisModule_CallReplyType_null", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_XX);
+ int ret = SetXXPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_KeyType_set", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_XX);
+ int ret = SetXXPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_CallReplyType_str", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_XX);
+ int ret = SetXXPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_CallReplyType_null", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NX);
+ int ret = SetNXPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_CallReplyType_str", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NX);
+ int ret = SetNXPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_CallReplyType_str", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_IE);
+ int ret = SetIEPub_RedisCommand(&ctx, redisStrVec, 6);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_String_nosame", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_IE);
+ int ret = SetIEPub_RedisCommand(&ctx, redisStrVec, 6);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_CallReplyType_null", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_IE);
+ int ret = SetIEPub_RedisCommand(&ctx, redisStrVec, 6);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_CallReplyType_str", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_IE);
+ int ret = SetIEPub_RedisCommand(&ctx, redisStrVec, 6);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_String_nosame", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_NE);
+ int ret = SetNEPub_RedisCommand(&ctx, redisStrVec, 6);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_CallReplyType_str", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_NE);
+ int ret = SetNEPub_RedisCommand(&ctx, redisStrVec, 6);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
mock().setData("RedisModule_String_nosame", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_NE);
+ int ret = SetNEPub_RedisCommand(&ctx, redisStrVec, 6);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
delete []redisStrVec;
}
+TEST(exstring, delmpub)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = new (RedisModuleString*[8]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+ redisStrVec[6] = (RedisModuleString *)1;
+ redisStrVec[7] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_OpenKey_have", 1);
+ mock().setData("RedisModule_KeyType_str", 1);
+ mock().setData("RedisModule_String_same", 1);
+ mock().setData("RedisModule_CallReplyType_null", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 2);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 8);
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+
+ delete []redisStrVec;
+}
+
TEST(exstring, deliepub)
{
RedisModuleCtx ctx;
{
RedisModuleCtx ctx;
int ret = 0;
- ret = delPubStringGenericCommand(&ctx, 0, 2, OBJ_OP_NO);
+ ret = DelPub_RedisCommand(&ctx, 0, 2);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ ret = 0;
+ ret = DelMPub_RedisCommand(&ctx, 0, 5);
CHECK_EQUAL(ret, REDISMODULE_ERR);
ret = 0;
- ret = delPubStringGenericCommand(&ctx, 0, 4, OBJ_OP_IE);
+ ret = DelIEPub_RedisCommand(&ctx, 0, 4);
CHECK_EQUAL(ret, REDISMODULE_ERR);
ret = 0;
- ret = delPubStringGenericCommand(&ctx, 0, 8, OBJ_OP_NE);
+ ret = DelNEPub_RedisCommand(&ctx, 0, 8);
CHECK_EQUAL(ret, REDISMODULE_ERR);
}
mock().setData("RedisModule_CallReplyType_inter", 1);
mock().setData("RedisModule_Call_Return_Null", 0);
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
+ int ret = DelPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, 0);
CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
CHECK_EQUAL(mock().getData("UNLINK").getIntValue(), 1);
mock().setData("RedisModule_CallReplyInteger", 0);
mock().setData("RedisModule_CallReplyType_err", 1);
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
+ int ret = DelPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_ERR);
CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
CHECK_EQUAL(mock().getData("UNLINK").getIntValue(), 1);
mock().setData("RedisModule_CallReplyInteger", 0);
mock().setData("RedisModule_CallReplyType_inter", 1);
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
+ int ret = DelPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, 0);
CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
CHECK_EQUAL(mock().getData("UNLINK").getIntValue(), 1);
}
+TEST(exstring, delmpub_command_reply_null)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[6]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_Call_Return_Null", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 1);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 6);
+ CHECK_EQUAL(ret, 0);
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(1, mock().getData("UNLINK").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_ReplyWithCallReply").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_FreeCallReply").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithError").getIntValue());
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, delmpub_command_reply_error)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[6]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_CallReplyInteger", 0);
+ mock().setData("RedisModule_CallReplyType_err", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 1);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 6);
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+ CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
+ CHECK_EQUAL(mock().getData("UNLINK").getIntValue(), 1);
+ CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
+ CHECK_EQUAL(mock().getData("RedisModule_ReplyWithCallReply").getIntValue(), 1);
+ CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 1);
+ CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 0);
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, delmpub_command_has_no_key)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[6]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_CallReplyInteger", 0);
+ mock().setData("RedisModule_CallReplyType_inter", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 1);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 6);
+ CHECK_EQUAL(ret, 0);
+ CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
+ CHECK_EQUAL(mock().getData("UNLINK").getIntValue(), 1);
+ CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
+ CHECK_EQUAL(mock().getData("RedisModule_ReplyWithCallReply").getIntValue(), 1);
+ CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 1);
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, delmpub_command_key_deleted)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[6]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_CallReplyInteger", 1);
+ mock().setData("RedisModule_CallReplyType_inter", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 1);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 6);
+ CHECK_EQUAL(ret, 0);
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(1, mock().getData("UNLINK").getIntValue());
+ CHECK_EQUAL(1, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithCallReply").getIntValue());
+ CHECK_EQUAL(2, mock().getData("RedisModule_FreeCallReply").getIntValue());
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, delmpub_command_key_deleted_multi_pub)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[10]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+ redisStrVec[6] = (RedisModuleString *)1;
+ redisStrVec[7] = (RedisModuleString *)1;
+ redisStrVec[8] = (RedisModuleString *)1;
+ redisStrVec[9] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_CallReplyInteger", 1);
+ mock().setData("RedisModule_CallReplyType_inter", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 3);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 10);
+ CHECK_EQUAL(0, ret);
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(1, mock().getData("UNLINK").getIntValue());
+ CHECK_EQUAL(3, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithCallReply").getIntValue());
+ CHECK_EQUAL(4, mock().getData("RedisModule_FreeCallReply").getIntValue());
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, delmpub_command_negative_del_count)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[6]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_CallReplyInteger", 1);
+ mock().setData("RedisModule_CallReplyType_inter", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", -1);
+ mock().setData("RedisModule_StringToLongLongCall_2", 1);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 6);
+ CHECK_EQUAL(0, ret);
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("UNLINK").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithError").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_FreeCallReply").getIntValue());
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, delmpub_command_negative_chan_msg_count)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[6]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_CallReplyInteger", 1);
+ mock().setData("RedisModule_CallReplyType_inter", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 1);
+ mock().setData("RedisModule_StringToLongLongCall_2", -1);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 6);
+ CHECK_EQUAL(0, ret);
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("UNLINK").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithError").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_FreeCallReply").getIntValue());
+ delete []redisStrVec;
+
+}
+
+TEST(exstring, delmpub_command_invalid_total_count)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString **redisStrVec = new (RedisModuleString*[6]);
+
+ redisStrVec[0] = (RedisModuleString *)1;
+ redisStrVec[1] = (RedisModuleString *)1;
+ redisStrVec[2] = (RedisModuleString *)1;
+ redisStrVec[3] = (RedisModuleString *)1;
+ redisStrVec[4] = (RedisModuleString *)1;
+ redisStrVec[5] = (RedisModuleString *)1;
+
+ mock().setData("RedisModule_CallReplyInteger", 1);
+ mock().setData("RedisModule_CallReplyType_inter", 1);
+ mock().setData("RedisModule_StringToLongLongCallCount", 0);
+ mock().setData("RedisModule_StringToLongLongCall_1", 100);
+ mock().setData("RedisModule_StringToLongLongCall_2", 100);
+
+ int ret = DelMPub_RedisCommand(&ctx, redisStrVec, 6);
+ CHECK_EQUAL(0, ret);
+ CHECK_EQUAL(0, mock().getData("GET").getIntValue());
+ CHECK_EQUAL(0, mock().getData("UNLINK").getIntValue());
+ CHECK_EQUAL(0, mock().getData("PUBLISH").getIntValue());
+ CHECK_EQUAL(1, mock().getData("RedisModule_ReplyWithError").getIntValue());
+ CHECK_EQUAL(0, mock().getData("RedisModule_FreeCallReply").getIntValue());
+ delete []redisStrVec;
+
+}
+
TEST(exstring, deliepub_command_has_no_key)
{
RedisModuleCtx ctx;
mock().setData("RedisModule_KeyType_empty", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_IE);
+ int ret = DelIEPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, 0);
CHECK_EQUAL(mock().getData("RedisModule_ReplyWithLongLong").getIntValue(), 0);
CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
mock().setData("RedisModule_OpenKey_have", 1);
mock().setData("RedisModule_KeyType_set", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_IE);
+ int ret = DelIEPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 1);
mock().setData("RedisModule_KeyType_str", 1);
mock().setData("RedisModule_String_nosame", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_IE);
+ int ret = DelIEPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 0);
mock().setData("RedisModule_String_same", 1);
mock().setData("RedisModule_CallReplyType_null", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_IE);
+ int ret = DelIEPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 0);
mock().setData("RedisModule_CallReplyType_str", 1);
mock().setData("RedisModule_CallReplyInteger", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_IE);
+ int ret = DelIEPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 0);
mock().setData("RedisModule_String_same", 1);
mock().setData("RedisModule_CallReplyType_str", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NE);
+ int ret = DelNEPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 0);
mock().setData("RedisModule_CallReplyType_str", 1);
mock().setData("RedisModule_CallReplyInteger", 1);
mock().expectOneCall("RedisModule_CloseKey");
- int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NE);
+ int ret = DelNEPub_RedisCommand(&ctx, redisStrVec, 5);
CHECK_EQUAL(ret, REDISMODULE_OK);
mock().checkExpectations();
CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 0);