From bd4ec5705906642268d93561985f216f07dc2ba7 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 18 May 2010 20:12:03 +0200 Subject: [PATCH] minimalistic test suite... --- Makefile | 13 +++++-- test.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 test.c diff --git a/Makefile b/Makefile index ee73a1a..815227c 100644 --- a/Makefile +++ b/Makefile @@ -15,24 +15,33 @@ CCOPT= $(CFLAGS) $(CCLINK) $(ARCH) $(PROF) DEBUG?= -g -rdynamic -ggdb OBJ = anet.o hiredis.o sds.o example.o +TESTOBJ = anet.o hiredis.o sds.o test.o PRGNAME = hiredis-example +TESTNAME = hiredis-test -all: hiredis-example +all: hiredis-example hiredis-test # Deps (use make dep to generate this) anet.o: anet.c fmacros.h anet.h +example.o: example.c hiredis.h sds.h +test.o: test.c hiredis.h sds.h hiredis.o: hiredis.c hiredis.h sds.h anet.h sds.o: sds.c sds.h +hiredis.o: hiredis.c hiredis.h sds.h anet.h hiredis-example: $(OBJ) $(CC) -o $(PRGNAME) $(CCOPT) $(DEBUG) $(OBJ) +hiredis-test: $(TESTOBJ) + $(CC) -o $(TESTNAME) $(CCOPT) $(DEBUG) $(TESTOBJ) + ./hiredis-test + .c.o: $(CC) -c $(CFLAGS) $(DEBUG) $(COMPILE_TIME) $< clean: - rm -rf $(PRGNAME) *.o *.gcda *.gcno *.gcov + rm -rf $(PRGNAME) $(TESTNAME) *.o *.gcda *.gcno *.gcov dep: $(CC) -MM *.c diff --git a/test.c b/test.c new file mode 100644 index 0000000..759eff1 --- /dev/null +++ b/test.c @@ -0,0 +1,104 @@ +#include +#include +#include + +#include "hiredis.h" + +/* The following line is our testing "framework" :) */ +#define test_cond(_c) if(_c) printf("PASSED\n"); else {printf("FAILED\n"); fails++;} + +int main(void) { + int fd; + int fails = 0; + redisReply *reply; + + reply = redisConnect(&fd, "127.0.0.1", 6379); + if (reply != NULL) { + printf("Connection error: %s", reply->reply); + exit(1); + } + + /* test 1 */ + printf("\n#1 Is able to deliver commands: "); + reply = redisCommand(fd,"PING"); + test_cond(reply->type == REDIS_REPLY_STRING && + strcasecmp(reply->reply,"pong") == 0) + + /* Switch to DB 9 for testing, now that we know we can chat. */ + reply = redisCommand(fd,"SELECT 9"); + freeReplyObject(reply); + + /* Make sure the DB is emtpy */ + reply = redisCommand(fd,"DBSIZE"); + if (reply->type != REDIS_REPLY_INTEGER || + reply->integer != 0) { + printf("Sorry DB 9 is not empty, test can not continue\n"); + exit(1); + } else { + printf("DB 9 is empty... test can continue\n"); + } + freeReplyObject(reply); + + /* test 2 */ + printf("#2 Is a able to send commands verbatim: "); + reply = redisCommand(fd,"SET foo bar"); + test_cond (reply->type == REDIS_REPLY_STRING && + strcasecmp(reply->reply,"ok") == 0) + freeReplyObject(reply); + + /* test 3 */ + printf("#3 %%s String interpolation works: "); + reply = redisCommand(fd,"SET %s %s","foo","hello world"); + freeReplyObject(reply); + reply = redisCommand(fd,"GET foo"); + test_cond(reply->type == REDIS_REPLY_STRING && + strcmp(reply->reply,"hello world") == 0); + freeReplyObject(reply); + + /* test 4 & 5 */ + printf("#4 %%b String interpolation works: "); + reply = redisCommand(fd,"SET %b %b","foo",3,"hello\x00world",11); + freeReplyObject(reply); + reply = redisCommand(fd,"GET foo"); + test_cond(reply->type == REDIS_REPLY_STRING && + memcmp(reply->reply,"hello\x00world",11) == 0) + + printf("#5 binary reply length is correct: "); + test_cond(sdslen(reply->reply) == 11) + freeReplyObject(reply); + + /* test 6 */ + printf("#6 can parse nil replies: "); + reply = redisCommand(fd,"GET nokey"); + test_cond(reply->type == REDIS_REPLY_NIL) + freeReplyObject(reply); + + /* test 7 */ + printf("#7 can parse integer replies: "); + reply = redisCommand(fd,"INCR mycounter"); + test_cond(reply->type == REDIS_REPLY_INTEGER && reply->integer == 1) + freeReplyObject(reply); + + /* test 8 */ + printf("#8 can parse multi bulk replies: "); + freeReplyObject(redisCommand(fd,"LPUSH mylist foo")); + freeReplyObject(redisCommand(fd,"LPUSH mylist bar")); + reply = redisCommand(fd,"LRANGE mylist 0 -1"); + test_cond(reply->type == REDIS_REPLY_ARRAY && + reply->elements == 2 && + !memcmp(reply->element[0]->reply,"bar",3) && + !memcmp(reply->element[1]->reply,"foo",3)) + freeReplyObject(reply); + + /* Clean DB 9 */ + reply = redisCommand(fd,"FLUSHDB"); + freeReplyObject(reply); + + if (fails == 0) { + printf("ALL TESTS PASSED\n"); + } else { + printf("*** %d TESTS FAILED ***\n", fails); + } + + return 0; +}