TEST basic_test_sadd_srem(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *data = UNSIGN("my data"); long datalen = strlen((char *)data); unsigned char *data2 = UNSIGN("other data2"); long data2len = strlen((char *)data2); unsigned char *datas[2] = {data, data2}; long dataslen[2] = {datalen, data2len}; long count; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_srem, RL_OK, db, key, keylen, 1, datas, dataslen, &count); RL_BALANCED(); EXPECT_LONG(count, 1); RL_CALL_VERBOSE(rl_srem, RL_OK, db, key, keylen, 2, datas, dataslen, &count); RL_BALANCED(); EXPECT_LONG(count, 1); RL_CALL_VERBOSE(rl_key_get, RL_NOT_FOUND, db, key, keylen, NULL, NULL, NULL, NULL, NULL); rl_close(db); PASS(); }
TEST test_hash_oom() { INIT(); RL_CALL_VERBOSE(rl_hset, RL_OK, db, key, keylen, UNSIGN("field"), 5, UNSIGN("value"), 5, NULL, 0); RL_CALL_VERBOSE(rl_hset, RL_OK, db, key, keylen, UNSIGN("field2"), 6, UNSIGN("value2"), 6, NULL, 0); OOM(); }
TEST test_zset_oom() { INIT(); RL_CALL_VERBOSE(rl_zadd, RL_OK, db, key, keylen, 1.23, UNSIGN("a"), 1); RL_CALL_VERBOSE(rl_zadd, RL_OK, db, key, keylen, 4.5, UNSIGN("b"), 1); OOM(); }
TEST test_list_oom() { INIT(); unsigned char *values[2] = {UNSIGN("b"), UNSIGN("a")}; long valueslen[2] = {1, 1}; RL_CALL_VERBOSE(rl_push, RL_OK, db, key, keylen, 1, 0, 2, values, valueslen, NULL); OOM(); }
TEST test_string() { INIT(); RL_CALL_VERBOSE(rl_set, RL_OK, db, key, keylen, UNSIGN("asd"), 3, 0, 0); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x00\x80\x00\x00\x00\x03\x61sd\x06\x00\xa4\xed\x80\xcb:7\x89\xd7"), 19, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST test_hash() { INIT(); RL_CALL_VERBOSE(rl_hset, RL_OK, db, key, keylen, UNSIGN("field"), 5, UNSIGN("value"), 5, NULL, 0); RL_CALL_VERBOSE(rl_hset, RL_OK, db, key, keylen, UNSIGN("field2"), 6, UNSIGN("value2"), 6, NULL, 0); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x04\x80\x00\x00\x00\x02\x80\x00\x00\x00\x05\x66\x69\x65\x6c\x64\x80\x00\x00\x00\x05\x76\x61\x6c\x75\x65\x80\x00\x00\x00\x06\x66\x69\x65\x6c\x64\x32\x80\x00\x00\x00\x06\x76\x61\x6c\x75\x65\x32\x06\x00\x74\xaf\xd2\x25\x1d\x50\x0c\xee"), 58, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST test_zset() { INIT(); RL_CALL_VERBOSE(rl_zadd, RL_OK, db, key, keylen, 1.23, UNSIGN("a"), 1); RL_CALL_VERBOSE(rl_zadd, RL_OK, db, key, keylen, 4.5, UNSIGN("b"), 1); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x03\x80\x00\x00\x00\x02\x80\x00\x00\x00\x01\x61\x08\x31\x2e\x32\x33\x30\x30\x30\x30\x80\x00\x00\x00\x01\x62\x08\x34\x2e\x35\x30\x30\x30\x30\x30\x06\x00\x62\xf2\xc1\x8b\x73\x18\x51\xe6"), 46, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST test_list() { INIT(); unsigned char *values[2] = {UNSIGN("b"), UNSIGN("a")}; long valueslen[2] = {1, 1}; RL_CALL_VERBOSE(rl_push, RL_OK, db, key, keylen, 1, 0, 2, values, valueslen, NULL); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x01\x80\x00\x00\x00\x02\x80\x00\x00\x00\x01\x62\x80\x00\x00\x00\x01\x61\x06\x00\x94\x46\xb5\x94\x1e\x1e_K"), 28, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
int test_hyperloglog_add_count() { int retval; unsigned char *str = NULL; long strlen = -1, card = -1; unsigned char *argv[] = {UNSIGN("a"), UNSIGN("b"), UNSIGN("c")}; long argvlen[] = {1, 1, 1}; RL_CALL_VERBOSE(rl_str_pfadd, 1, NULL, 0, 3, argv, argvlen, &str, &strlen); RL_CALL_VERBOSE(rl_str_pfcount, 0, 1, &str, &strlen, &card, NULL, NULL); EXPECT_LONG(card, 3); free(str); PASS(); }
TEST test_set() { INIT(); unsigned char *values[2] = {UNSIGN("b"), UNSIGN("a")}; long valueslen[2] = {1, 1}; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, values, valueslen, NULL); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x02\x80\x00\x00\x00\x02\x80\x00\x00\x00\x01\x61\x80\x00\x00\x00\x01\x62\x06\x00\xbb\x8c\x8c\xcf\x86{ \xfd"), 28, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST test_string() { int retval; rlite *db = NULL; unsigned char *key = UNSIGN("mykey"), *testvalue; long keylen = 5, testvaluelen; RL_CALL_VERBOSE(rl_open, RL_OK, ":memory:", &db, RLITE_OPEN_READWRITE | RLITE_OPEN_CREATE); RL_CALL_VERBOSE(rl_set, RL_OK, db, key, keylen, UNSIGN("asd"), 3, 0, 0); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x00\x80\x00\x00\x00\x03\x61sd\x06\x00\xa4\xed\x80\xcb:7\x89\xd7"), 19, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST basic_test_sadd_sunionstore(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *key2 = UNSIGN("my key2"); long key2len = strlen((char *)key2); unsigned char *target = UNSIGN("my target"); long targetlen = strlen((char *)target); unsigned char *datas[2] = {UNSIGN("my data"), UNSIGN("my data2")}; long dataslen[2] = {strlen((char *)datas[0]), strlen((char *)datas[1]) }; unsigned char *datas2[3] = {UNSIGN("other data2"), UNSIGN("yet another data"), UNSIGN("my data")}; long datas2len[3] = {strlen((char *)datas2[0]), strlen((char *)datas2[1]), strlen((char *)datas2[2])}; unsigned char *keys[2] = {key, key2}; long keyslen[2] = {keylen, key2len}; unsigned char **datasunion; long *datasunionlen, datasc, i; long added; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key2, key2len, 3, datas2, datas2len, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sunionstore, RL_OK, db, target, targetlen, 2, keys, keyslen, &added); EXPECT_LONG(added, 4); datasc = added; RL_CALL_VERBOSE(rl_srandmembers, RL_OK, db, target, targetlen, 0, &datasc, &datasunion, &datasunionlen); #define ASSERT_IN_4(s, l)\ if (!IS_EQUAL(s, l, datasunion[0], datasunionlen[0]) &&\ !IS_EQUAL(s, l, datasunion[1], datasunionlen[1]) &&\ !IS_EQUAL(s, l, datasunion[2], datasunionlen[2]) &&\ !IS_EQUAL(s, l, datasunion[3], datasunionlen[3])\ ) {\ fprintf(stderr, "Expected union to contains \"%s\" (%ld) on line %d\n", datas[0], dataslen[0], __LINE__);\ FAIL();\ } ASSERT_IN_4(datas[0], dataslen[0]); ASSERT_IN_4(datas[1], dataslen[1]); ASSERT_IN_4(datas2[0], datas2len[0]); ASSERT_IN_4(datas2[1], datas2len[1]); for (i = 0; i < datasc; i++) { rl_free(datasunion[i]); } rl_free(datasunion); rl_free(datasunionlen); rl_close(db); PASS(); }
TEST basic_test_lrange(int _commit) { int retval; rlite *db = NULL; unsigned char *value = malloc(sizeof(unsigned char) * 2); RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); value[1] = 0; RL_CALL_VERBOSE(create, RL_OK, db, key, keylen, 10, _commit, 1); RL_CALL_VERBOSE(test_lrange, RL_OK, db, key, keylen, 0, -1, 0, 10); RL_CALL_VERBOSE(test_lrange, RL_OK, db, key, keylen, -100, 100, 0, 10); RL_CALL_VERBOSE(test_lrange, RL_OK, db, key, keylen, -1, -1, 9, 10); RL_CALL_VERBOSE(test_lrange, RL_OK, db, key, keylen, -1, 100, 9, 10); RL_CALL_VERBOSE(test_lrange, RL_OK, db, key, keylen, -1, 0, 0, 0); RL_CALL_VERBOSE(test_lrange, RL_OK, db, key, keylen, 0, -1000, 0, 0); RL_CALL_VERBOSE(test_lrange, RL_OK, db, key, keylen, -5, -4, 5, 7); free(value); rl_close(db); PASS(); }
TEST test_zset() { int retval; rlite *db = NULL; unsigned char *key = UNSIGN("mykey"), *testvalue; long keylen = 5, testvaluelen; RL_CALL_VERBOSE(rl_open, RL_OK, ":memory:", &db, RLITE_OPEN_READWRITE | RLITE_OPEN_CREATE); RL_CALL_VERBOSE(rl_zadd, RL_OK, db, key, keylen, 1.23, UNSIGN("a"), 1); RL_CALL_VERBOSE(rl_zadd, RL_OK, db, key, keylen, 4.5, UNSIGN("b"), 1); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x03\x80\x00\x00\x00\x02\x80\x00\x00\x00\x01\x61\x08\x31\x2e\x32\x33\x30\x30\x30\x30\x80\x00\x00\x00\x01\x62\x08\x34\x2e\x35\x30\x30\x30\x30\x30\x06\x00\x62\xf2\xc1\x8b\x73\x18\x51\xe6"), 46, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST basic_test_rpush_lpop(int maxsize, int _commit) { int retval; rlite *db = NULL; unsigned char *value = malloc(sizeof(unsigned char) * 2); RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *testvalue; long testvaluelen; value[1] = 0; int i; RL_CALL_VERBOSE(create, RL_OK, db, key, keylen, maxsize, _commit, 0); for (i = maxsize - 1; i >= 0; i--) { value[0] = i % CHAR_MAX; RL_CALL_VERBOSE(rl_pop, RL_OK, db, key, keylen, &testvalue, &testvaluelen, 1); EXPECT_BYTES(value, 2, testvalue, testvaluelen); rl_free(testvalue); RL_BALANCED(); } free(value); rl_close(db); PASS(); }
TEST basic_test_ltrim(int _commit) { int retval; unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); long i, size; unsigned char **values; long *valueslen; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); RL_CALL_VERBOSE(create, RL_OK, db, key, keylen, 200, _commit, 1); RL_CALL_VERBOSE(rl_ltrim, RL_OK, db, key, keylen, 50, -50); RL_BALANCED(); RL_CALL_VERBOSE(rl_lrange, RL_OK, db, key, keylen, 0, -1, &size, &values, &valueslen); EXPECT_LONG(size, 101); for (i = 0; i < size; i++) { EXPECT_LONG(valueslen[i], 2); EXPECT_INT(values[i][0], ((50 + i) % CHAR_MAX)); EXPECT_INT(values[i][1], 0); rl_free(values[i]); } rl_free(values); rl_free(valueslen); RL_CALL_VERBOSE(rl_ltrim, RL_DELETED, db, key, keylen, 1, 0); RL_BALANCED(); rl_close(db); PASS(); }
TEST basic_test_lpushx(int _commit) { int retval; rlite *db = NULL; unsigned char *value = malloc(sizeof(unsigned char) * 2); RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); value[1] = 0; long size; RL_CALL_VERBOSE(rl_push, RL_NOT_FOUND, db, key, keylen, 0, 1, 1, &key, &keylen, NULL); RL_CALL_VERBOSE(rl_llen, RL_NOT_FOUND, db, key, keylen, &size); RL_CALL_VERBOSE(create, RL_OK, db, key, keylen, 1, _commit, 1); RL_CALL_VERBOSE(rl_push, RL_OK, db, key, keylen, 0, 1, 1, &key, &keylen, NULL); RL_CALL_VERBOSE(rl_llen, RL_OK, db, key, keylen, &size); EXPECT_LONG(size, 2); free(value); rl_close(db); PASS(); }
TEST test_set() { int retval; rlite *db = NULL; unsigned char *key = UNSIGN("mykey"), *testvalue; long keylen = 5, testvaluelen; RL_CALL_VERBOSE(rl_open, RL_OK, ":memory:", &db, RLITE_OPEN_READWRITE | RLITE_OPEN_CREATE); unsigned char *values[2] = {UNSIGN("b"), UNSIGN("a")}; long valueslen[2] = {1, 1}; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, values, valueslen, NULL); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x02\x80\x00\x00\x00\x02\x80\x00\x00\x00\x01\x61\x80\x00\x00\x00\x01\x62\x06\x00\xbb\x8c\x8c\xcf\x86{ \xfd"), 28, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST basic_test_sadd_smove(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *key2 = UNSIGN("my key2"); long key2len = strlen((char *)key2); unsigned char *data = UNSIGN("my data"); long datalen = strlen((char *)data); unsigned char *data2 = UNSIGN("other data2"); long data2len = strlen((char *)data2); unsigned char *datas[2] = {data, data2}; long dataslen[2] = {datalen, data2len}; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_smove, RL_NOT_FOUND, db, key, keylen, key2, key2len, (unsigned char *)"new data", 8); RL_BALANCED(); RL_CALL_VERBOSE(rl_smove, RL_OK, db, key, keylen, key2, key2len, data, datalen); RL_BALANCED(); RL_CALL_VERBOSE(rl_sismember, RL_NOT_FOUND, db, key, keylen, data, datalen); RL_CALL_VERBOSE(rl_sismember, RL_FOUND, db, key2, key2len, data, datalen); RL_CALL_VERBOSE(rl_smove, RL_OK, db, key, keylen, key2, key2len, data2, data2len); RL_BALANCED(); RL_CALL_VERBOSE(rl_sismember, RL_NOT_FOUND, db, key, keylen, data2, data2len); RL_CALL_VERBOSE(rl_sismember, RL_FOUND, db, key2, key2len, data2, data2len); RL_CALL_VERBOSE(rl_smove, RL_NOT_FOUND, db, key, keylen, key2, key2len, data, datalen); RL_CALL_VERBOSE(rl_key_get, RL_NOT_FOUND, db, key, keylen, NULL, NULL, NULL, NULL, NULL); rl_close(db); PASS(); }
TEST basic_test_sadd_sunionstore_empty(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *key2 = UNSIGN("my key2"); long key2len = strlen((char *)key2); long added; RL_CALL_VERBOSE(rl_sunionstore, RL_OK, db, key, keylen, 1, &key2, &key2len, &added); RL_BALANCED(); EXPECT_LONG(added, 0); RL_CALL_VERBOSE(rl_key_get, RL_NOT_FOUND, db, key, keylen, NULL, NULL, NULL, NULL, NULL); rl_close(db); PASS(); }
TEST basic_test_sadd_sinter(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *key2 = UNSIGN("my key2"); long key2len = strlen((char *)key2); unsigned char *data = UNSIGN("my data"); long datalen = strlen((char *)data); unsigned char *data2 = UNSIGN("other data2"); long data2len = strlen((char *)data2); unsigned char *keys[2] = {key, key2}; long keyslen[2] = {keylen, key2len}; unsigned char *datas[2] = {data, data2}; long dataslen[2] = {datalen, data2len}; unsigned char **datasdiff; long *datasdifflen, datasc, i; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key2, key2len, 1, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sinter, RL_OK, db, 2, keys, keyslen, &datasc, &datasdiff, &datasdifflen); EXPECT_LONG(datasc, 1); EXPECT_BYTES(data, datalen, datasdiff[0], datasdifflen[0]); for (i = 0; i < datasc; i++) { rl_free(datasdiff[i]); } rl_free(datasdiff); rl_free(datasdifflen); rl_close(db); PASS(); }
TEST basic_test_sadd_spop(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *data = UNSIGN("my data"); long datalen = strlen((char *)data); unsigned char *data2 = UNSIGN("other data2"); long data2len = strlen((char *)data2); unsigned char *datas[2] = {data, data2}; long dataslen[2] = {datalen, data2len}; unsigned char *datapop, *datapop2; long datapoplen, datapoplen2; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_spop, RL_OK, db, key, keylen, &datapop, &datapoplen); RL_CALL_VERBOSE(rl_spop, RL_OK, db, key, keylen, &datapop2, &datapoplen2); RL_CALL_VERBOSE(rl_spop, RL_NOT_FOUND, db, key, keylen, NULL, NULL); if (!(datapoplen == datalen && memcmp(datapop, data, datalen) == 0 && datapoplen2 == data2len && memcmp(datapop2, data2, data2len) == 0) && !(datapoplen == data2len && memcmp(datapop, data2, data2len) == 0 && datapoplen2 == datalen && memcmp(datapop2, data, datalen) == 0)) { fprintf(stderr, "unexpected pop elements on line %d\n", __LINE__); FAIL(); } rl_free(datapop); rl_free(datapop2); RL_CALL_VERBOSE(rl_key_get, RL_NOT_FOUND, db, key, keylen, NULL, NULL, NULL, NULL, NULL); rl_close(db); PASS(); }
TEST basic_test_sadd_smembers(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *data = UNSIGN("my data"); long datalen = strlen((char *)data); unsigned char *data2 = UNSIGN("other data2"); long data2len = strlen((char *)data2); unsigned char *datas[2] = {data, data2}; long dataslen[2] = {datalen, data2len}; unsigned char *testdata; long testdatalen; int i; rl_set_iterator *iterator; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_smembers, RL_OK, db, &iterator, key, keylen); i = 0; while ((retval = rl_set_iterator_next(iterator, &testdata, &testdatalen)) == RL_OK) { if (i++ == 1) { EXPECT_BYTES(data, datalen, testdata, testdatalen); } else { EXPECT_BYTES(data2, data2len, testdata, testdatalen); } rl_free(testdata); } EXPECT_INT(retval, RL_END); rl_close(db); PASS(); }
TEST basic_test_sadd_sdiffstore(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *target = UNSIGN("my target"); long targetlen = strlen((char *)target); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *key2 = UNSIGN("my key2"); long key2len = strlen((char *)key2); unsigned char *data = UNSIGN("my data"); long datalen = strlen((char *)data); unsigned char *data2 = UNSIGN("other data2"); long data2len = strlen((char *)data2); unsigned char *keys[2] = {key, key2}; long keyslen[2] = {keylen, key2len}; unsigned char *datas[2] = {data, data2}; long dataslen[2] = {datalen, data2len}; unsigned char *datapop; long datapoplen, size; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key2, key2len, 1, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sdiffstore, RL_OK, db, target, targetlen, 2, keys, keyslen, &size); RL_BALANCED(); EXPECT_LONG(size, 1); RL_CALL_VERBOSE(rl_spop, RL_OK, db, target, targetlen, &datapop, &datapoplen); EXPECT_BYTES(datapop, datapoplen, data2, data2len); rl_free(datapop); rl_close(db); PASS(); }
TEST basic_test_lpush_linsert(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); // note that LPUSH reverses the order unsigned char *values[3] = {UNSIGN("CC"), UNSIGN("BB"), UNSIGN("AA")}; long valueslen[3] = {2, 2, 2}; long size; unsigned char *testvalue; long testvaluelen; RL_CALL_VERBOSE(rl_push, RL_OK, db, key, keylen, 1, 1, 3, values, valueslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_linsert, RL_OK, db, key, keylen, 1, UNSIGN("AA"), 2, UNSIGN("AB"), 2, &size); RL_BALANCED(); EXPECT_LONG(size, 4); RL_CALL_VERBOSE(rl_lindex, RL_OK, db, key, keylen, 1, &testvalue, &testvaluelen); EXPECT_STR("AB", testvalue, testvaluelen); rl_free(testvalue); RL_CALL_VERBOSE(rl_linsert, RL_NOT_FOUND, db, key, keylen, 1, UNSIGN("PP"), 2, UNSIGN("AB"), 2, NULL); RL_BALANCED(); size = 0; RL_CALL_VERBOSE(rl_llen, RL_OK, db, key, keylen, &size); EXPECT_LONG(size, 4); RL_CALL_VERBOSE(rl_linsert, RL_NOT_FOUND, db, UNSIGN("non existent key"), 10, 1, UNSIGN("PP"), 2, UNSIGN("AB"), 2, NULL); rl_close(db); PASS(); }
TEST basic_test_lset(int maxsize, int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *value = UNSIGN("my value"), *testvalue; long valuelen = strlen((char *)value), testvaluelen; RL_CALL_VERBOSE(create, RL_OK, db, key, keylen, maxsize, _commit, 1); RL_CALL_VERBOSE(rl_lset, RL_INVALID_PARAMETERS, db, key, keylen, maxsize, value, valuelen); RL_BALANCED(); RL_CALL_VERBOSE(rl_lset, RL_OK, db, key, keylen, -1, value, valuelen); RL_BALANCED(); RL_CALL_VERBOSE(rl_lindex, RL_OK, db, key, keylen, -1, &testvalue, &testvaluelen); EXPECT_BYTES(value, valuelen, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST test_hash() { int retval; rlite *db = NULL; unsigned char *key = UNSIGN("mykey"), *testvalue; long keylen = 5, testvaluelen; RL_CALL_VERBOSE(rl_open, RL_OK, ":memory:", &db, RLITE_OPEN_READWRITE | RLITE_OPEN_CREATE); RL_CALL_VERBOSE(rl_hset, RL_OK, db, key, keylen, UNSIGN("field"), 5, UNSIGN("value"), 5, NULL, 0); RL_CALL_VERBOSE(rl_hset, RL_OK, db, key, keylen, UNSIGN("field2"), 6, UNSIGN("value2"), 6, NULL, 0); RL_CALL_VERBOSE(rl_dump, RL_OK, db, key, keylen, &testvalue, &testvaluelen); EXPECT_BYTES(UNSIGN("\x04\x80\x00\x00\x00\x02\x80\x00\x00\x00\x05\x66\x69\x65\x6c\x64\x80\x00\x00\x00\x05\x76\x61\x6c\x75\x65\x80\x00\x00\x00\x06\x66\x69\x65\x6c\x64\x32\x80\x00\x00\x00\x06\x76\x61\x6c\x75\x65\x32\x06\x00\x74\xaf\xd2\x25\x1d\x50\x0c\xee"), 58, testvalue, testvaluelen); rl_free(testvalue); rl_close(db); PASS(); }
TEST basic_test_sadd_sunion(int _commit) { int retval; rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); unsigned char *key2 = UNSIGN("my key2"); long key2len = strlen((char *)key2); unsigned char *datas[2] = {UNSIGN("my data"), UNSIGN("my data2")}; long dataslen[2] = {strlen((char *)datas[0]), strlen((char *)datas[1]) }; unsigned char *datas2[3] = {UNSIGN("other data2"), UNSIGN("yet another data"), UNSIGN("my data")}; long datas2len[3] = {strlen((char *)datas2[0]), strlen((char *)datas2[1]), strlen((char *)datas2[2])}; unsigned char *keys[2] = {key, key2}; long keyslen[2] = {keylen, key2len}; unsigned char **datasunion; long *datasunionlen, datasc, i; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, 2, datas, dataslen, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key2, key2len, 3, datas2, datas2len, NULL); RL_BALANCED(); RL_CALL_VERBOSE(rl_sunion, RL_OK, db, 2, keys, keyslen, &datasc, &datasunion, &datasunionlen); EXPECT_LONG(datasc, 4); EXPECT_BYTES(datas[1], dataslen[1], datasunion[0], datasunionlen[0]); EXPECT_BYTES(datas[0], dataslen[0], datasunion[1], datasunionlen[1]); EXPECT_BYTES(datas2[1], datas2len[1], datasunion[2], datasunionlen[2]); EXPECT_BYTES(datas2[0], datas2len[0], datasunion[3], datasunionlen[3]); for (i = 0; i < datasc; i++) { rl_free(datasunion[i]); } rl_free(datasunion); rl_free(datasunionlen); rl_close(db); PASS(); }
int test_hyperloglog_add_merge() { int retval; unsigned char *str = NULL, *str2 = NULL, *str3; long strlen = -1, strlen2, strlen3, card = -1; unsigned char *argv[] = {UNSIGN("a"), UNSIGN("b"), UNSIGN("c")}; long argvlen[] = {1, 1, 1}; unsigned char *argv2[] = {UNSIGN("aa"), UNSIGN("ba"), UNSIGN("ca")}; long argvlen2[] = {2, 2, 2}; RL_CALL_VERBOSE(rl_str_pfadd, 1, NULL, 0, 3, argv, argvlen, &str, &strlen); RL_CALL_VERBOSE(rl_str_pfadd, 1, NULL, 0, 3, argv2, argvlen2, &str2, &strlen2); unsigned char *strs[] = {str, str2}; long strslen[] = {strlen, strlen2}; RL_CALL_VERBOSE(rl_str_pfmerge, 0, 2, strs, strslen, &str3, &strlen3); RL_CALL_VERBOSE(rl_str_pfcount, 0, 1, &str3, &strlen3, &card, NULL, NULL); EXPECT_LONG(card, 6); free(str); free(str2); free(str3); PASS(); }
TEST fuzzy_test_srandmembers_unique(long size, int _commit) { int retval; unsigned char **elements = malloc(sizeof(unsigned char *) * size); long *elementslen = malloc(sizeof(long) * size); int *results = malloc(sizeof(int) * size); long i, j; for (i = 0; i < size; i++) { elementslen[i] = ((float)rand() / RAND_MAX) * 10 + 5; elements[i] = malloc(sizeof(unsigned char) * elementslen[i]); for (j = 0; j < elementslen[i]; j++) { elements[i][j] = rand() % CHAR_MAX; } j++; } rlite *db = NULL; RL_CALL_VERBOSE(setup_db, RL_OK, &db, _commit, 1); unsigned char *key = UNSIGN("my key"); long keylen = strlen((char *)key); long added; RL_CALL_VERBOSE(rl_sadd, RL_OK, db, key, keylen, size, elements, elementslen, &added); EXPECT_LONG(added, size); RL_BALANCED(); long memberc = 1; unsigned char **members = NULL; long *memberslen = NULL; RL_CALL_VERBOSE(rl_srandmembers, RL_OK, db, key, keylen, 0, &memberc, &members, &memberslen); for (i = 0; i < memberc; i++) { if (indexOf(size, elements, elementslen, members[i], memberslen[i]) == -1) { fprintf(stderr, "randmembers result not found in elements, got 0x"); for (j = 0; j < memberslen[i]; j++) { fprintf(stderr, "%2x", members[i][j]); } fprintf(stderr, " on line %d\n", __LINE__); FAIL(); } rl_free(members[i]); } rl_free(memberslen); rl_free(members); memberc = size * 2; members = NULL; memberslen = NULL; RL_CALL_VERBOSE(rl_srandmembers, RL_OK, db, key, keylen, 0, &memberc, &members, &memberslen); EXPECT_LONG(size, memberc); for (i = 0; i < size; i++) { results[i] = 0; } for (i = 0; i < memberc; i++) { j = indexOf(size, elements, elementslen, members[i], memberslen[i]); if (j == -1) { fprintf(stderr, "randmembers result not found in elements, got 0x"); for (j = 0; j < memberslen[i]; j++) { fprintf(stderr, "%2x", members[i][j]); } fprintf(stderr, " on line %d\n", __LINE__); FAIL(); } if (results[j] > 0) { fprintf(stderr, "got repeated result on line %d\n", __LINE__); FAIL(); } results[j]++; rl_free(members[i]); } rl_free(memberslen); rl_free(members); memberc = size * 2; members = NULL; memberslen = NULL; RL_CALL_VERBOSE(rl_srandmembers, RL_OK, db, key, keylen, 1, &memberc, &members, &memberslen); EXPECT_LONG(memberc, size * 2); for (i = 0; i < size; i++) { results[i] = 0; } for (i = 0; i < memberc; i++) { j = indexOf(size, elements, elementslen, members[i], memberslen[i]); if (j == -1) { fprintf(stderr, "randmembers result not found in elements, got 0x"); for (j = 0; j < memberslen[i]; j++) { fprintf(stderr, "%2x", members[i][j]); } fprintf(stderr, " on line %d\n", __LINE__); FAIL(); } results[j]++; rl_free(members[i]); } rl_free(memberslen); rl_free(members); for (i = 0; i < size; i++) { free(elements[i]); } free(elements); free(results); free(elementslen); rl_close(db); PASS(); }