diff options
author | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-05-02 14:21:48 +0200 |
---|---|---|
committer | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-05-05 17:01:34 +0200 |
commit | 77540aa31694aa1e14d41f60a0452e49a2fed86a (patch) | |
tree | e0a49f7c6a73a17cfb10fccae8d848685b4f9ac2 /test.c | |
parent | df203bc328fb4ff9d19c591b8ec31f62d5ef9dae (diff) |
Add function to retrieve formatted reply
This is done by only truncating the read buffer once a full reply has
been read. The buffer is no longer truncated halfway through reading a
reply. In addition: pass offset/length of protocol and content via the
read tasks.
Diffstat (limited to 'test.c')
-rw-r--r-- | test.c | 95 |
1 files changed, 94 insertions, 1 deletions
@@ -331,6 +331,98 @@ static void test_reply_reader(void) { test_cond(ret == REDIS_ERR && reply == NULL); } +static void *test_create_string(const redisReadTask *task, char *str, size_t len) { + redisReader *r = (redisReader*)task->privdata; + const char *roff = r->buf+r->roff; + ((void)str); ((void)len); + + assert(task->plen > 0); + assert(task->clen > 0); + switch(task->type) { + case REDIS_REPLY_STATUS: + assert(strncmp("+status\r\n", roff+task->poff, task->plen) == 0); + assert(strncmp("status", roff+task->coff, task->clen) == 0); + break; + case REDIS_REPLY_ERROR: + assert(strncmp("-error\r\n", roff+task->poff, task->plen) == 0); + assert(strncmp("error", roff+task->coff, task->clen) == 0); + break; + case REDIS_REPLY_STRING: /* bulk */ + assert(strncmp("$4\r\nbulk\r\n", roff+task->poff, task->plen) == 0); + assert(strncmp("bulk", roff+task->coff, task->clen) == 0); + break; + default: + assert(NULL); + } + return (void*)1; +} + +static void *test_create_array(const redisReadTask *task, int len) { + redisReader *r = (redisReader*)task->privdata; + const char *roff = r->buf+r->roff; + ((void)len); + + assert(task->plen > 0); + assert(task->clen == 0); + assert(strncmp("*5\r\n", roff+task->poff, task->plen) == 0); + return (void*)1; +} + +static void *test_create_integer(const redisReadTask *task, long long value) { + redisReader *r = (redisReader*)task->privdata; + const char *roff = r->buf+r->roff; + ((void)value); + + assert(task->plen > 0); + assert(task->clen > 0); + assert(strncmp(":1234\r\n", roff+task->poff, task->plen) == 0); + assert(strncmp("1234", roff+task->coff, task->clen) == 0); + return (void*)1; +} + +static void *test_create_nil(const redisReadTask *task) { + redisReader *r = (redisReader*)task->privdata; + const char *roff = r->buf+r->roff; + + assert(task->plen > 0); + assert(task->clen == 0); + assert(strncmp("$-1\r\n", roff+task->poff, task->plen) == 0); + return (void*)1; +} + +static redisReplyObjectFunctions test_reader_fn = { + test_create_string, + test_create_array, + test_create_integer, + test_create_nil, + NULL +}; + +static void test_reader_functions(void) { + redisReader *reader; + const char *input; + int ret; + void *obj; + + input = + "*5\r\n" + "$-1\r\n" + ":1234\r\n" + "+status\r\n" + "-error\r\n" + "$4\r\nbulk\r\n"; + + test("Custom object functions in reply reader: "); + reader = redisReaderCreate(); + reader->fn = &test_reader_fn; + reader->privdata = reader; + + redisReaderFeed(reader,input,strlen(input)); + ret = redisReaderGetReply(reader,&obj); + test_cond(ret == REDIS_OK && obj == (void*)1); + redisReaderFree(reader); +} + static void test_throughput(void) { int i, num; long long t1, t2; @@ -513,8 +605,9 @@ int main(int argc, char **argv) { signal(SIGPIPE, SIG_IGN); test_format_commands(); - test_blocking_connection(); test_reply_reader(); + test_reader_functions(); + test_blocking_connection(); // test_nonblocking_connection(); test_throughput(); cleanup(); |