Add refactored nget commands and UT
[ric-plt/dbaas.git] / redismodule / tst / src / exstrings_test.cpp
index 2d540d5..d239eea 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2019 Nokia.
+ * Copyright (c) 2018-2020 Nokia.
  *
  *   Licensed under the Apache License, Version 2.0 (the "License");
  *   you may not use this file except in compliance with the License.
  *   limitations under the License.
  */
 
-#include <string>
-#include <map>
-#include <list>
-#include <set>
-#include <vector>
-#include <syslog.h>
-
-
-//#include <stdio.h>
-//#include <stdlib.h>
-//#include <ctype.h>
+/*
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+ */
 
 
 extern "C" {
@@ -41,6 +34,11 @@ extern "C" {
 #define OBJ_OP_IE (1<<4)     /* OP if equal old value */
 #define OBJ_OP_NE (1<<5)     /* OP if not equal old value */
 
+typedef struct RedisModuleBlockedClientArgs {
+    RedisModuleBlockedClient *bc;
+    RedisModuleString **argv;
+    int argc;
+} RedisModuleBlockedClientArgs;
 
 TEST_GROUP(exstring)
 {
@@ -83,6 +81,7 @@ TEST(exstring, setie)
 
     int ret = SetIE_RedisCommand(&ctx, redisStrVec,  4);
     CHECK_EQUAL(ret, 0);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
     delete []redisStrVec;
 }
 
@@ -101,6 +100,7 @@ TEST(exstring, setne)
     mock().setData("RedisModule_String_same", 1);
     int ret = SetNE_RedisCommand(&ctx,redisStrVec, 4);
     CHECK_EQUAL(ret, 0);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
     delete []redisStrVec;
 }
 
@@ -261,6 +261,7 @@ TEST(exstring, delie)
     int ret = DelIE_RedisCommand(&ctx, redisStrVec,  3);
     CHECK_EQUAL(ret, 0);
     mock().checkExpectations();
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
     delete []redisStrVec;
 }
 
@@ -280,6 +281,7 @@ TEST(exstring, delne)
     int ret = DelNE_RedisCommand(&ctx,redisStrVec, 3);
     CHECK_EQUAL(ret, 0);
     mock().checkExpectations();
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
     delete []redisStrVec;
 }
 
@@ -441,200 +443,249 @@ TEST(exstring, delne_command_key_string_nosame_reply)
 
 }
 
-TEST(exstring, setpub)
+TEST(exstring, setpub_command_parameter_number_incorrect)
 {
     RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[5]);
+    int ret = 0;
 
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-    redisStrVec[2] = (RedisModuleString *)1;
-    redisStrVec[3] = (RedisModuleString *)1;
-    redisStrVec[4] = (RedisModuleString *)1;
+    ret = SetPub_RedisCommand(&ctx, 0, 2);
+    CHECK_EQUAL(ret, REDISMODULE_ERR);
 
-    mock().setData("RedisModule_OpenKey_have", 1);
-    mock().setData("RedisModule_KeyType_str", 1);
-    mock().setData("RedisModule_String_same", 1);
-    mock().setData("RedisModule_CallReplyType_null", 1);
+    ret = 0;
+    ret = SetPub_RedisCommand(&ctx, 0, 8);
+    CHECK_EQUAL(ret, REDISMODULE_ERR);
 
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = SetPub_RedisCommand(&ctx, redisStrVec,  5);
-    CHECK_EQUAL(ret, REDISMODULE_OK);
-    mock().checkExpectations();
-    delete []redisStrVec;
-}
+    ret = 0;
+    ret = SetMPub_RedisCommand(&ctx, 0, 2);
+    CHECK_EQUAL(ret, REDISMODULE_ERR);
 
-TEST(exstring, setxxpub)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[5]);
+    ret = 0;
+    ret = SetMPub_RedisCommand(&ctx, 0, 8);
+    CHECK_EQUAL(ret, REDISMODULE_ERR);
 
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-    redisStrVec[2] = (RedisModuleString *)1;
-    redisStrVec[3] = (RedisModuleString *)1;
-    redisStrVec[4] = (RedisModuleString *)1;
+    ret = 0;
+    ret = SetXXPub_RedisCommand(&ctx, 0, 3);
+    CHECK_EQUAL(ret, REDISMODULE_ERR);
 
-    mock().setData("RedisModule_OpenKey_have", 1);
-    mock().setData("RedisModule_KeyType_str", 1);
-    mock().setData("RedisModule_String_same", 1);
-    mock().setData("RedisModule_CallReplyType_null", 1);
+    ret = 0;
+    ret = SetXXPub_RedisCommand(&ctx, 0, 6);
+    CHECK_EQUAL(ret, REDISMODULE_ERR);
 
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = SetXXPub_RedisCommand(&ctx, redisStrVec,  5);
-    CHECK_EQUAL(ret, REDISMODULE_OK);
-    mock().checkExpectations();
-    delete []redisStrVec;
+    ret = 0;
+    ret = SetNXPub_RedisCommand(&ctx, 0, 3);
+    CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+    ret = 0;
+    ret = SetNXMPub_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 = SetIEMPub_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);
 }
 
-TEST(exstring, setnxpub)
+TEST(exstring, setpub_command_no_key_replystr)
 {
     RedisModuleCtx ctx;
     RedisModuleString ** redisStrVec = new (RedisModuleString*[5]);
 
-    redisStrVec[0] = (RedisModuleString *)1;
+    redisStrVec[0] = (RedisModuleString *)0;
     redisStrVec[1] = (RedisModuleString *)1;
-    redisStrVec[2] = (RedisModuleString *)1;
-    redisStrVec[3] = (RedisModuleString *)1;
-    redisStrVec[4] = (RedisModuleString *)1;
+    redisStrVec[2] = (RedisModuleString *)2;
+    redisStrVec[3] = (RedisModuleString *)3;
+    redisStrVec[4] = (RedisModuleString *)4;
 
-    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_KeyType_empty", 1);
+    mock().setData("RedisModule_CallReplyType_str", 1);
 
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = SetNXPub_RedisCommand(&ctx, redisStrVec,  5);
+    int ret = SetPub_RedisCommand(&ctx, redisStrVec, 5);
     CHECK_EQUAL(ret, REDISMODULE_OK);
     mock().checkExpectations();
+    CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
+    CHECK_EQUAL(mock().getData("MSET").getIntValue(), 1);
+    CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 1);
+    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 2);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
+
     delete []redisStrVec;
+
 }
 
-TEST(exstring, setiepub)
+TEST(exstring, setmpub_command_negative_key_val_count)
 {
     RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[6]);
+    RedisModuleString ** redisStrVec = new (RedisModuleString*[7]);
 
-    redisStrVec[0] = (RedisModuleString *)1;
+    redisStrVec[0] = (RedisModuleString *)0;
     redisStrVec[1] = (RedisModuleString *)1;
-    redisStrVec[2] = (RedisModuleString *)1;
-    redisStrVec[3] = (RedisModuleString *)1;
-    redisStrVec[4] = (RedisModuleString *)1;
-    redisStrVec[5] = (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_OpenKey_have", 1);
-    mock().setData("RedisModule_KeyType_str", 1);
-    mock().setData("RedisModule_String_same", 1);
-    mock().setData("RedisModule_CallReplyType_null", 1);
+    mock().setData("RedisModule_KeyType_empty", 1);
+    mock().setData("RedisModule_CallReplyType_str", 1);
+    mock().setData("RedisModule_StringToLongLongCall_1", -1);
+    mock().setData("RedisModule_StringToLongLongCall_2", 1);
 
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = SetIEPub_RedisCommand(&ctx, redisStrVec,  6);
+    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());
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
+
     delete []redisStrVec;
+
 }
 
-TEST(exstring, setnepub)
+TEST(exstring, setmpub_command_negative_chan_msg_count)
 {
     RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[6]);
+    RedisModuleString ** redisStrVec = new (RedisModuleString*[7]);
 
-    redisStrVec[0] = (RedisModuleString *)1;
+    redisStrVec[0] = (RedisModuleString *)0;
     redisStrVec[1] = (RedisModuleString *)1;
-    redisStrVec[2] = (RedisModuleString *)1;
-    redisStrVec[3] = (RedisModuleString *)1;
-    redisStrVec[4] = (RedisModuleString *)1;
-    redisStrVec[5] = (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_OpenKey_have", 1);
-    mock().setData("RedisModule_KeyType_str", 1);
-    mock().setData("RedisModule_String_same", 1);
-    mock().setData("RedisModule_CallReplyType_null", 1);
+    mock().setData("RedisModule_KeyType_empty", 1);
+    mock().setData("RedisModule_CallReplyType_str", 1);
+    mock().setData("RedisModule_StringToLongLongCall_1", 1);
+    mock().setData("RedisModule_StringToLongLongCall_2", -1);
 
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = SetNEPub_RedisCommand(&ctx, redisStrVec,  6);
+    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());
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
+
     delete []redisStrVec;
+
 }
 
-TEST(exstring, setpub_command_parameter_number_incorrect)
+TEST(exstring, setmpub_command_invalid_total_count)
 {
     RedisModuleCtx ctx;
-    int ret = 0;
-    ret = setPubStringGenericCommand(&ctx, 0, 2, OBJ_OP_NO);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
+    RedisModuleString ** redisStrVec = new (RedisModuleString*[7]);
 
-    ret = 0;
-    ret = setPubStringGenericCommand(&ctx, 0, 8, OBJ_OP_NO);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
+    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;
 
-    ret = 0;
-    ret = setPubStringGenericCommand(&ctx, 0, 3, OBJ_OP_XX);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
+    mock().setData("RedisModule_KeyType_empty", 1);
+    mock().setData("RedisModule_CallReplyType_str", 1);
+    mock().setData("RedisModule_StringToLongLongCall_1", 100);
+    mock().setData("RedisModule_StringToLongLongCall_2", 100);
 
-    ret = 0;
-    ret = setPubStringGenericCommand(&ctx, 0, 6, OBJ_OP_NX);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
+    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());
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
-    ret = 0;
-    ret = setPubStringGenericCommand(&ctx, 0, 4, OBJ_OP_IE);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
+    delete []redisStrVec;
 
-    ret = 0;
-    ret = setPubStringGenericCommand(&ctx, 0, 8, OBJ_OP_NE);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
 }
 
-TEST(exstring, setpub_command_no_key_replynull)
+TEST(exstring, setmpub_command_set)
 {
     RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[5]);
+    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_null", 1);
+    mock().setData("RedisModule_CallReplyType_str", 1);
+    mock().setData("RedisModule_StringToLongLongCall_1", 1);
+    mock().setData("RedisModule_StringToLongLongCall_2", 1);
 
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
+    int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 7);
     CHECK_EQUAL(ret, REDISMODULE_OK);
     mock().checkExpectations();
-    CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
-    CHECK_EQUAL(mock().getData("MSET").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
-    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 1);
+    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());
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
 }
 
-TEST(exstring, setpub_command_no_key_replystr)
+TEST(exstring, setmpub_command_set_multipub)
 {
     RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[5]);
+    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);
 
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = setPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
+    int ret = SetMPub_RedisCommand(&ctx, redisStrVec, 9);
     CHECK_EQUAL(ret, REDISMODULE_OK);
     mock().checkExpectations();
-    CHECK_EQUAL(mock().getData("GET").getIntValue(), 0);
-    CHECK_EQUAL(mock().getData("MSET").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 2);
+    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());
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -655,7 +706,7 @@ TEST(exstring, setxxpub_command_has_no_key)
     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();
@@ -664,6 +715,7 @@ TEST(exstring, setxxpub_command_has_no_key)
     CHECK_EQUAL(mock().getData("MSET").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 0);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -683,7 +735,7 @@ TEST(exstring, setxxpub_command_parameter_has_key_set)
     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();
@@ -692,6 +744,7 @@ TEST(exstring, setxxpub_command_parameter_has_key_set)
     CHECK_EQUAL(mock().getData("MSET").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 0);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -712,7 +765,7 @@ TEST(exstring, setxxpub_command_has_key_string)
     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();
@@ -721,6 +774,7 @@ TEST(exstring, setxxpub_command_has_key_string)
     CHECK_EQUAL(mock().getData("MSET").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 2);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -742,7 +796,7 @@ TEST(exstring, setnxpub_command_has_key_string)
     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();
@@ -751,6 +805,7 @@ TEST(exstring, setnxpub_command_has_key_string)
     CHECK_EQUAL(mock().getData("MSET").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 0);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -771,7 +826,7 @@ TEST(exstring, setnxpub_command_has_no_key)
     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();
@@ -780,6 +835,7 @@ TEST(exstring, setnxpub_command_has_no_key)
     CHECK_EQUAL(mock().getData("MSET").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 2);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -803,7 +859,7 @@ TEST(exstring, setiepub_command_has_no_key)
     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();
@@ -812,6 +868,7 @@ TEST(exstring, setiepub_command_has_no_key)
     CHECK_EQUAL(mock().getData("MSET").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 0);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -835,7 +892,7 @@ TEST(exstring, setiepub_command_key_string_nosame)
     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();
@@ -844,37 +901,7 @@ TEST(exstring, setiepub_command_key_string_nosame)
     CHECK_EQUAL(mock().getData("MSET").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 1);
-
-    delete []redisStrVec;
-
-}
-
-TEST(exstring, setiepub_command_key_same_string_replynull)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[6]);
-
-    redisStrVec[0] = (RedisModuleString *)0;
-    redisStrVec[1] = (RedisModuleString *)1;
-    redisStrVec[2] = (RedisModuleString *)2;
-    redisStrVec[3] = (RedisModuleString *)3;
-    redisStrVec[4] = (RedisModuleString *)4;
-    redisStrVec[5] = (RedisModuleString *)5;
-
-    mock().setData("RedisModule_KeyType_str", 1);
-    mock().setData("RedisModule_String_same", 1);
-    mock().setData("RedisModule_CallReplyType_null", 1);
-
-    mock().expectOneCall("RedisModule_CloseKey");
-    int ret = setPubStringGenericCommand(&ctx, redisStrVec, 6, OBJ_OP_IE);
-
-    CHECK_EQUAL(ret, REDISMODULE_OK);
-    mock().checkExpectations();
-    CHECK_EQUAL(mock().getData("GET").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("MSET").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_ReplyWithNull").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 0);
-    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 2);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -897,7 +924,7 @@ TEST(exstring, setiepub_command_key_same_string_reply)
     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();
@@ -906,6 +933,7 @@ TEST(exstring, setiepub_command_key_same_string_reply)
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("RedisModule_ReplyWithCallReply").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 3);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -928,7 +956,7 @@ TEST(exstring, setnepub_command_has_no_key)
     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();
@@ -937,6 +965,7 @@ TEST(exstring, setnepub_command_has_no_key)
     CHECK_EQUAL(mock().getData("PUBLISH").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("RedisModule_ReplyWithCallReply").getIntValue(), 1);
     CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 3);
+    CHECK_EQUAL(mock().getData("RedisModule_AutoMemory").getIntValue(),1);
 
     delete []redisStrVec;
 
@@ -959,7 +988,7 @@ TEST(exstring, setnepub_command_key_string_same_reply)
     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();
@@ -991,7 +1020,7 @@ TEST(exstring, setnepub_command_key_string_nosame_reply)
     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();
@@ -1026,6 +1055,34 @@ TEST(exstring, delpub)
     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;
@@ -1049,6 +1106,29 @@ TEST(exstring, deliepub)
     delete []redisStrVec;
 }
 
+TEST(exstring, deliempub)
+{
+    RedisModuleCtx ctx;
+    RedisModuleString ** redisStrVec = new (RedisModuleString*[5]);
+
+    redisStrVec[0] = (RedisModuleString *)1;
+    redisStrVec[1] = (RedisModuleString *)1;
+    redisStrVec[2] = (RedisModuleString *)1;
+    redisStrVec[3] = (RedisModuleString *)1;
+    redisStrVec[4] = (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().expectOneCall("RedisModule_CloseKey");
+    int ret = DelIEMPub_RedisCommand(&ctx, redisStrVec,  5);
+    CHECK_EQUAL(ret, REDISMODULE_OK);
+    mock().checkExpectations();
+    delete []redisStrVec;
+}
+
 TEST(exstring, delnepub)
 {
     RedisModuleCtx ctx;
@@ -1076,15 +1156,23 @@ TEST(exstring, delpub_command_parameter_number_incorrect)
 {
     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 = DelIEPub_RedisCommand(&ctx, 0, 4);
     CHECK_EQUAL(ret, REDISMODULE_ERR);
 
     ret = 0;
-    ret = delPubStringGenericCommand(&ctx, 0, 4, OBJ_OP_IE);
+    ret = DelIEMPub_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);
 }
 
@@ -1102,7 +1190,7 @@ TEST(exstring, delpub_command_reply_null)
     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);
@@ -1127,13 +1215,13 @@ TEST(exstring, delpub_command_reply_error)
     mock().setData("RedisModule_CallReplyInteger", 0);
     mock().setData("RedisModule_CallReplyType_err", 1);
 
-    int ret = delPubStringGenericCommand(&ctx, redisStrVec, 5, OBJ_OP_NO);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
+    int ret = DelPub_RedisCommand(&ctx, redisStrVec, 5);
+    CHECK_EQUAL(ret, REDISMODULE_OK);
     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_FreeCallReply").getIntValue(), 0);
     CHECK_EQUAL(mock().getData("RedisModule_ReplyWithError").getIntValue(), 0);
     delete []redisStrVec;
 
@@ -1152,7 +1240,7 @@ TEST(exstring, delpub_command_has_no_key)
     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);
@@ -1163,6 +1251,243 @@ TEST(exstring, delpub_command_has_no_key)
 
 }
 
+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_OK);
+    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(), 0);
+    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;
@@ -1176,7 +1501,7 @@ TEST(exstring, deliepub_command_has_no_key)
     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);
@@ -1202,7 +1527,7 @@ TEST(exstring, deliepub_command_has_key_set)
     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);
@@ -1230,7 +1555,7 @@ TEST(exstring, deliepub_command_key_string_nosame)
     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);
@@ -1260,7 +1585,7 @@ TEST(exstring, deliepub_command_same_string_replynull)
     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);
@@ -1291,7 +1616,7 @@ TEST(exstring, deliepub_command_same_string_reply)
     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);
@@ -1321,7 +1646,7 @@ TEST(exstring, delnepub_command_same_string_reply)
     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);
@@ -1352,7 +1677,7 @@ TEST(exstring, delnepub_command_nosame_string_reply)
     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);
@@ -1364,100 +1689,3 @@ TEST(exstring, delnepub_command_nosame_string_reply)
 
     delete []redisStrVec;
 }
-
-TEST(exstring, nget_command_parameter_number_incorrect)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[2]);
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-
-    int ret = NGet_RedisCommand(&ctx, redisStrVec,  3);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
-
-    delete []redisStrVec;
-}
-
-TEST(exstring, nget_command_zero_item)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[2]);
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-
-    mock().setData("RedisModule_CallReplyLength", 0);
-    int ret = NGet_RedisCommand(&ctx, redisStrVec,  2);
-    CHECK_EQUAL(ret, REDISMODULE_OK);
-    CHECK_EQUAL(mock().getData("KEYS").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_ReplyWithCallReply").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 1);
-
-    delete []redisStrVec;
-}
-
-TEST(exstring, nget_command_none_zero_items)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[2]);
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-
-    mock().setData("RedisModule_CallReplyLength", 3);
-    int ret = NGet_RedisCommand(&ctx, redisStrVec,  2);
-    CHECK_EQUAL(ret, REDISMODULE_OK);
-    CHECK_EQUAL(mock().getData("KEYS").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("MGET").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_ReplyWithArray").getIntValue(), 3*2);
-    CHECK_EQUAL(mock().getData("RedisModule_ReplyWithString").getIntValue(), 3*2);
-    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 2);
-
-    delete []redisStrVec;
-}
-
-TEST(exstring, ndel_command_parameter_parameter_number_incorrect)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[2]);
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-
-    int ret = NDel_RedisCommand(&ctx, redisStrVec,  3);
-    CHECK_EQUAL(ret, REDISMODULE_ERR);
-
-    delete []redisStrVec;
-}
-
-TEST(exstring, ndel_command_zero_item)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[2]);
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-
-    mock().setData("RedisModule_CallReplyLength", 0);
-    int ret = NDel_RedisCommand(&ctx, redisStrVec,  2);
-    CHECK_EQUAL(ret, REDISMODULE_OK);
-    CHECK_EQUAL(mock().getData("KEYS").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_ReplyWithLongLong").getIntValue(), 0);
-    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 1);
-
-    delete []redisStrVec;
-}
-
-TEST(exstring, ndel_command_none_zero_items)
-{
-    RedisModuleCtx ctx;
-    RedisModuleString ** redisStrVec = new (RedisModuleString*[2]);
-    redisStrVec[0] = (RedisModuleString *)1;
-    redisStrVec[1] = (RedisModuleString *)1;
-
-    mock().setData("RedisModule_CallReplyLength", 3);
-    int ret = NDel_RedisCommand(&ctx, redisStrVec,  2);
-    CHECK_EQUAL(ret, REDISMODULE_OK);
-    CHECK_EQUAL(mock().getData("KEYS").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("UNLINK").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_ReplyWithCallReply").getIntValue(), 1);
-    CHECK_EQUAL(mock().getData("RedisModule_FreeCallReply").getIntValue(), 2);
-
-    delete []redisStrVec;
-}