summaryrefslogtreecommitdiff
path: root/src/modules/testmodule.c
diff options
context:
space:
mode:
authorDvir Volk <dvirsky@gmail.com>2017-11-27 16:29:55 +0200
committerDvir Volk <dvirsky@gmail.com>2018-02-14 21:38:58 +0200
commit2136035e47c5c50aec07270e0c87a9e5cd5e243d (patch)
treef577f2d9e24ec7e0ad379a3f3993a71bae784338 /src/modules/testmodule.c
parent4f2d279dd704ebf0e9ebab85bc74269b523eda8a (diff)
downloadredis-2136035e47c5c50aec07270e0c87a9e5cd5e243d.tar.gz
finished implementation of notifications. Tests unfinished
Diffstat (limited to 'src/modules/testmodule.c')
-rw-r--r--src/modules/testmodule.c89
1 files changed, 88 insertions, 1 deletions
diff --git a/src/modules/testmodule.c b/src/modules/testmodule.c
index 956b24179..e360866f9 100644
--- a/src/modules/testmodule.c
+++ b/src/modules/testmodule.c
@@ -30,6 +30,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#define REDISMODULE_EXPERIMENTAL_API
#include "../redismodule.h"
#include <string.h>
@@ -153,6 +154,80 @@ int TestUnlink(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
}
+int NotifyCallback(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key) {
+ // Increment a counter on the notifications
+ RedisModule_Log(ctx, "notice", "Got event type %d, event %s, key %s\n", type, event, RedisModule_StringPtrLen(key, NULL));
+
+ RedisModule_Call(ctx, "HINCRBY", "csc", "notifications", key, "1");
+ return REDISMODULE_OK;
+}
+
+/* TEST.NOTIFICATIONS -- Test Keyspace Notifications. */
+int TestNotifications(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
+ REDISMODULE_NOT_USED(argv);
+ REDISMODULE_NOT_USED(argc);
+
+#define FAIL(msg, ...) \
+ { \
+ RedisModule_Log(ctx, "warning", "Failed NOTIFY Test. Reason: " #msg, \
+ ##__VA_ARGS__); \
+ goto err; \
+ }
+ RedisModule_Call(ctx, "FLUSHDB", "");
+
+ RedisModule_Call(ctx, "SET", "cc", "foo", "bar");
+ RedisModule_Call(ctx, "SET", "cc", "foo", "baz");
+ RedisModule_Call(ctx, "SADD", "cc", "bar", "x");
+ RedisModule_Call(ctx, "SADD", "cc", "bar", "y");
+
+ RedisModule_Call(ctx, "HSET", "ccc", "baz", "x", "y");
+ // LPUSH should be ignored and not increment any counters
+ RedisModule_Call(ctx, "LPUSH", "cc", "l", "y");
+ RedisModule_Call(ctx, "LPUSH", "cc", "l", "y");
+
+ size_t sz;
+ const char *rep;
+ RedisModuleCallReply *r =
+ RedisModule_Call(ctx, "HGET", "cc", "notifications", "foo");
+ if (r == NULL || RedisModule_CallReplyType(r) != REDISMODULE_REPLY_STRING) {
+ FAIL("Wrong or no reply for foo");
+ } else {
+ rep = RedisModule_CallReplyStringPtr(r, &sz);
+ if (sz != 1 || *rep != '2') {
+ FAIL("Got reply '%s'. expected '2'",
+ RedisModule_CallReplyStringPtr(r, NULL));
+ }
+ }
+
+ r = RedisModule_Call(ctx, "HGET", "cc", "notifications", "bar");
+ if (r == NULL || RedisModule_CallReplyType(r) != REDISMODULE_REPLY_STRING) {
+ FAIL("Wrong or no reply for bar");
+ } else {
+ rep = RedisModule_CallReplyStringPtr(r, &sz);
+ if (sz != 1 || *rep != '2') {
+ FAIL("Got reply '%s'. expected '2'", rep);
+ }
+ }
+
+ r = RedisModule_Call(ctx, "HGET", "cc", "notifications", "baz");
+ if (r == NULL || RedisModule_CallReplyType(r) != REDISMODULE_REPLY_STRING) {
+ FAIL("Wrong or no reply for baz");
+ } else {
+ rep = RedisModule_CallReplyStringPtr(r, &sz);
+ if (sz != 1 || *rep != '1') {
+ FAIL("Got reply '%.*s'. expected '1'", sz, rep);
+ }
+ }
+ r = RedisModule_Call(ctx, "HGET", "cc", "notifications", "l");
+ if (r == NULL || RedisModule_CallReplyType(r) != REDISMODULE_REPLY_NULL) {
+ FAIL("Wrong reply for l");
+ }
+
+ return RedisModule_ReplyWithSimpleString(ctx, "OK");
+err:
+ return RedisModule_ReplyWithSimpleString(ctx, "ERR");
+}
+
/* TEST.CTXFLAGS -- Test GetContextFlags. */
int TestCtxFlags(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argc);
@@ -162,7 +237,7 @@ int TestCtxFlags(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
int ok = 1;
const char *errString = NULL;
-
+ #undef FAIL
#define FAIL(msg) \
{ \
ok = 0; \
@@ -310,6 +385,9 @@ int TestIt(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
T("test.string.printf", "cc", "foo", "bar");
if (!TestAssertStringReply(ctx,reply,"Got 3 args. argv[1]: foo, argv[2]: bar",38)) goto fail;
+ T("test.notify", "");
+ if (!TestAssertStringReply(ctx,reply,"OK",2)) goto fail;
+
RedisModule_ReplyWithSimpleString(ctx,"ALL TESTS PASSED");
return REDISMODULE_OK;
@@ -354,5 +432,14 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
TestIt,"readonly",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
+ RedisModule_SubscribeToKeyspaceEvents(ctx,
+ REDISMODULE_NOTIFY_HASH |
+ REDISMODULE_NOTIFY_SET |
+ REDISMODULE_NOTIFY_STRING,
+ NotifyCallback);
+ if (RedisModule_CreateCommand(ctx,"test.notify",
+ TestNotifications,"write deny-oom",1,1,1) == REDISMODULE_ERR)
+ return REDISMODULE_ERR;
+
return REDISMODULE_OK;
}