summaryrefslogtreecommitdiff
path: root/test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test.c')
-rw-r--r--test.c95
1 files changed, 94 insertions, 1 deletions
diff --git a/test.c b/test.c
index c00a473..d166669 100644
--- a/test.c
+++ b/test.c
@@ -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();