mirror of
https://github.com/fluencelabs/redis
synced 2025-04-25 18:42:13 +00:00
commit
d044e33c20
16
runtest-moduleapi
Executable file
16
runtest-moduleapi
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
TCL_VERSIONS="8.5 8.6"
|
||||||
|
TCLSH=""
|
||||||
|
|
||||||
|
for VERSION in $TCL_VERSIONS; do
|
||||||
|
TCL=`which tclsh$VERSION 2>/dev/null` && TCLSH=$TCL
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z $TCLSH ]
|
||||||
|
then
|
||||||
|
echo "You need tcl 8.5 or newer in order to run the Redis test"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
make -C tests/modules && \
|
||||||
|
$TCLSH tests/test_helper.tcl --single unit/moduleapi/commandfilter "${@}"
|
@ -753,6 +753,7 @@ void RM_SetModuleAttribs(RedisModuleCtx *ctx, const char *name, int ver, int api
|
|||||||
module->usedby = listCreate();
|
module->usedby = listCreate();
|
||||||
module->using = listCreate();
|
module->using = listCreate();
|
||||||
module->filters = listCreate();
|
module->filters = listCreate();
|
||||||
|
module->in_call = 0;
|
||||||
ctx->module = module;
|
ctx->module = module;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ endif
|
|||||||
|
|
||||||
.SUFFIXES: .c .so .xo .o
|
.SUFFIXES: .c .so .xo .o
|
||||||
|
|
||||||
all: helloworld.so hellotype.so helloblock.so testmodule.so hellocluster.so hellotimer.so hellodict.so hellofilter.so
|
all: helloworld.so hellotype.so helloblock.so testmodule.so hellocluster.so hellotimer.so hellodict.so
|
||||||
|
|
||||||
.c.xo:
|
.c.xo:
|
||||||
$(CC) -I. $(CFLAGS) $(SHOBJ_CFLAGS) -fPIC -c $< -o $@
|
$(CC) -I. $(CFLAGS) $(SHOBJ_CFLAGS) -fPIC -c $< -o $@
|
||||||
@ -47,11 +47,6 @@ hellodict.xo: ../redismodule.h
|
|||||||
|
|
||||||
hellodict.so: hellodict.xo
|
hellodict.so: hellodict.xo
|
||||||
|
|
||||||
hellofilter.xo: ../redismodule.h
|
|
||||||
|
|
||||||
hellofilter.so: hellofilter.xo
|
|
||||||
$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
|
|
||||||
|
|
||||||
testmodule.xo: ../redismodule.h
|
testmodule.xo: ../redismodule.h
|
||||||
|
|
||||||
testmodule.so: testmodule.xo
|
testmodule.so: testmodule.xo
|
||||||
|
24
tests/modules/Makefile
Normal file
24
tests/modules/Makefile
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
# find the OS
|
||||||
|
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
|
||||||
|
|
||||||
|
# Compile flags for linux / osx
|
||||||
|
ifeq ($(uname_S),Linux)
|
||||||
|
SHOBJ_CFLAGS ?= -W -Wall -fno-common -g -ggdb -std=c99 -O2
|
||||||
|
SHOBJ_LDFLAGS ?= -shared
|
||||||
|
else
|
||||||
|
SHOBJ_CFLAGS ?= -W -Wall -dynamic -fno-common -g -ggdb -std=c99 -O2
|
||||||
|
SHOBJ_LDFLAGS ?= -bundle -undefined dynamic_lookup
|
||||||
|
endif
|
||||||
|
|
||||||
|
.SUFFIXES: .c .so .xo .o
|
||||||
|
|
||||||
|
all: commandfilter.so
|
||||||
|
|
||||||
|
.c.xo:
|
||||||
|
$(CC) -I../../src $(CFLAGS) $(SHOBJ_CFLAGS) -fPIC -c $< -o $@
|
||||||
|
|
||||||
|
commandfilter.xo: ../../src/redismodule.h
|
||||||
|
|
||||||
|
commandfilter.so: commandfilter.xo
|
||||||
|
$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
|
@ -1,18 +1,18 @@
|
|||||||
#define REDISMODULE_EXPERIMENTAL_API
|
#define REDISMODULE_EXPERIMENTAL_API
|
||||||
#include "../redismodule.h"
|
#include "redismodule.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static RedisModuleString *log_key_name;
|
static RedisModuleString *log_key_name;
|
||||||
|
|
||||||
static const char log_command_name[] = "hellofilter.log";
|
static const char log_command_name[] = "commandfilter.log";
|
||||||
static const char ping_command_name[] = "hellofilter.ping";
|
static const char ping_command_name[] = "commandfilter.ping";
|
||||||
static const char unregister_command_name[] = "hellofilter.unregister";
|
static const char unregister_command_name[] = "commandfilter.unregister";
|
||||||
static int in_log_command = 0;
|
static int in_log_command = 0;
|
||||||
|
|
||||||
static RedisModuleCommandFilter *filter = NULL;
|
static RedisModuleCommandFilter *filter = NULL;
|
||||||
|
|
||||||
int HelloFilter_UnregisterCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
int CommandFilter_UnregisterCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
||||||
{
|
{
|
||||||
(void) argc;
|
(void) argc;
|
||||||
(void) argv;
|
(void) argv;
|
||||||
@ -23,7 +23,7 @@ int HelloFilter_UnregisterCommand(RedisModuleCtx *ctx, RedisModuleString **argv,
|
|||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HelloFilter_PingCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
int CommandFilter_PingCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
||||||
{
|
{
|
||||||
(void) argc;
|
(void) argc;
|
||||||
(void) argv;
|
(void) argv;
|
||||||
@ -39,7 +39,7 @@ int HelloFilter_PingCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int a
|
|||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HelloFilter_LogCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
int CommandFilter_LogCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
||||||
{
|
{
|
||||||
RedisModuleString *s = RedisModule_CreateString(ctx, "", 0);
|
RedisModuleString *s = RedisModule_CreateString(ctx, "", 0);
|
||||||
|
|
||||||
@ -74,9 +74,9 @@ int HelloFilter_LogCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int ar
|
|||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HelloFilter_CommandFilter(RedisModuleCommandFilterCtx *filter)
|
void CommandFilter_CommandFilter(RedisModuleCommandFilterCtx *filter)
|
||||||
{
|
{
|
||||||
if (in_log_command) return; /* don't process our own RM_Call() from HelloFilter_LogCommand() */
|
if (in_log_command) return; /* don't process our own RM_Call() from CommandFilter_LogCommand() */
|
||||||
|
|
||||||
/* Fun manipulations:
|
/* Fun manipulations:
|
||||||
* - Remove @delme
|
* - Remove @delme
|
||||||
@ -117,7 +117,7 @@ void HelloFilter_CommandFilter(RedisModuleCommandFilterCtx *filter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
||||||
if (RedisModule_Init(ctx,"hellofilter",1,REDISMODULE_APIVER_1)
|
if (RedisModule_Init(ctx,"commandfilter",1,REDISMODULE_APIVER_1)
|
||||||
== REDISMODULE_ERR) return REDISMODULE_ERR;
|
== REDISMODULE_ERR) return REDISMODULE_ERR;
|
||||||
|
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
@ -130,18 +130,18 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
|||||||
RedisModule_StringToLongLong(argv[1], &noself);
|
RedisModule_StringToLongLong(argv[1], &noself);
|
||||||
|
|
||||||
if (RedisModule_CreateCommand(ctx,log_command_name,
|
if (RedisModule_CreateCommand(ctx,log_command_name,
|
||||||
HelloFilter_LogCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
|
CommandFilter_LogCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
|
||||||
return REDISMODULE_ERR;
|
return REDISMODULE_ERR;
|
||||||
|
|
||||||
if (RedisModule_CreateCommand(ctx,ping_command_name,
|
if (RedisModule_CreateCommand(ctx,ping_command_name,
|
||||||
HelloFilter_PingCommand,"deny-oom",1,1,1) == REDISMODULE_ERR)
|
CommandFilter_PingCommand,"deny-oom",1,1,1) == REDISMODULE_ERR)
|
||||||
return REDISMODULE_ERR;
|
return REDISMODULE_ERR;
|
||||||
|
|
||||||
if (RedisModule_CreateCommand(ctx,unregister_command_name,
|
if (RedisModule_CreateCommand(ctx,unregister_command_name,
|
||||||
HelloFilter_UnregisterCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
|
CommandFilter_UnregisterCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
|
||||||
return REDISMODULE_ERR;
|
return REDISMODULE_ERR;
|
||||||
|
|
||||||
if ((filter = RedisModule_RegisterCommandFilter(ctx, HelloFilter_CommandFilter,
|
if ((filter = RedisModule_RegisterCommandFilter(ctx, CommandFilter_CommandFilter,
|
||||||
noself ? REDISMODULE_CMDFILTER_NOSELF : 0))
|
noself ? REDISMODULE_CMDFILTER_NOSELF : 0))
|
||||||
== NULL) return REDISMODULE_ERR;
|
== NULL) return REDISMODULE_ERR;
|
||||||
|
|
@ -63,7 +63,6 @@ set ::all_tests {
|
|||||||
unit/lazyfree
|
unit/lazyfree
|
||||||
unit/wait
|
unit/wait
|
||||||
unit/pendingquerybuf
|
unit/pendingquerybuf
|
||||||
modules/commandfilter
|
|
||||||
}
|
}
|
||||||
# Index to the next test to run in the ::all_tests list.
|
# Index to the next test to run in the ::all_tests list.
|
||||||
set ::next_test 0
|
set ::next_test 0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
set testmodule [file normalize src/modules/hellofilter.so]
|
set testmodule [file normalize tests/modules/commandfilter.so]
|
||||||
|
|
||||||
start_server {tags {"modules"}} {
|
start_server {tags {"modules"}} {
|
||||||
r module load $testmodule log-key 0
|
r module load $testmodule log-key 0
|
||||||
@ -27,7 +27,7 @@ start_server {tags {"modules"}} {
|
|||||||
|
|
||||||
test {Command Filter applies on RM_Call() commands} {
|
test {Command Filter applies on RM_Call() commands} {
|
||||||
r del log-key
|
r del log-key
|
||||||
r hellofilter.ping
|
r commandfilter.ping
|
||||||
r lrange log-key 0 -1
|
r lrange log-key 0 -1
|
||||||
} "{ping @log}"
|
} "{ping @log}"
|
||||||
|
|
||||||
@ -39,13 +39,13 @@ start_server {tags {"modules"}} {
|
|||||||
|
|
||||||
test {Command Filter applies on Lua redis.call() that calls a module} {
|
test {Command Filter applies on Lua redis.call() that calls a module} {
|
||||||
r del log-key
|
r del log-key
|
||||||
r eval "redis.call('hellofilter.ping')" 0
|
r eval "redis.call('commandfilter.ping')" 0
|
||||||
r lrange log-key 0 -1
|
r lrange log-key 0 -1
|
||||||
} "{ping @log}"
|
} "{ping @log}"
|
||||||
|
|
||||||
test {Command Filter is unregistered implicitly on module unload} {
|
test {Command Filter is unregistered implicitly on module unload} {
|
||||||
r del log-key
|
r del log-key
|
||||||
r module unload hellofilter
|
r module unload commandfilter
|
||||||
r set mykey @log
|
r set mykey @log
|
||||||
r lrange log-key 0 -1
|
r lrange log-key 0 -1
|
||||||
} {}
|
} {}
|
||||||
@ -59,14 +59,14 @@ start_server {tags {"modules"}} {
|
|||||||
assert_equal "{set mykey @log}" [r lrange log-key 0 -1]
|
assert_equal "{set mykey @log}" [r lrange log-key 0 -1]
|
||||||
|
|
||||||
# Unregister
|
# Unregister
|
||||||
r hellofilter.unregister
|
r commandfilter.unregister
|
||||||
r del log-key
|
r del log-key
|
||||||
|
|
||||||
r set mykey @log
|
r set mykey @log
|
||||||
r lrange log-key 0 -1
|
r lrange log-key 0 -1
|
||||||
} {}
|
} {}
|
||||||
|
|
||||||
r module unload hellofilter
|
r module unload commandfilter
|
||||||
r module load $testmodule log-key 1
|
r module load $testmodule log-key 1
|
||||||
|
|
||||||
test {Command Filter REDISMODULE_CMDFILTER_NOSELF works as expected} {
|
test {Command Filter REDISMODULE_CMDFILTER_NOSELF works as expected} {
|
||||||
@ -74,10 +74,10 @@ start_server {tags {"modules"}} {
|
|||||||
assert_equal "{set mykey @log}" [r lrange log-key 0 -1]
|
assert_equal "{set mykey @log}" [r lrange log-key 0 -1]
|
||||||
|
|
||||||
r del log-key
|
r del log-key
|
||||||
r hellofilter.ping
|
r commandfilter.ping
|
||||||
assert_equal {} [r lrange log-key 0 -1]
|
assert_equal {} [r lrange log-key 0 -1]
|
||||||
|
|
||||||
r eval "redis.call('hellofilter.ping')" 0
|
r eval "redis.call('commandfilter.ping')" 0
|
||||||
assert_equal {} [r lrange log-key 0 -1]
|
assert_equal {} [r lrange log-key 0 -1]
|
||||||
}
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user