Skip to content

Commit

Permalink
Adding valgrind to rdb-cli tests (#31)
Browse files Browse the repository at this point in the history
Extend tests that execute rdb-cli the option to run as well with valgrind.
  • Loading branch information
moticless authored Nov 13, 2023
1 parent c67456d commit dd1f828
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 53 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ If you just wish to get a basic understanding of the library's functionality:

To see cool internal state printouts of the parser, set env-var `LIBRDB_DEBUG_DATA` beforehand:

% export LIBRDB_DEBUG_DATA=1
% make example
% LIBRDB_DEBUG_DATA=1 make example

To build and run tests, you need to have cmocka unit testing framework installed:

Expand Down
2 changes: 1 addition & 1 deletion api/librdb-ext-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ typedef enum {

_LIBRDB_API RdbxReaderFile *RDBX_createReaderFile(RdbParser *parser, const char *filename);

_LIBRDB_API RdbxReaderFileDesc *RDBX_createReaderFileDesc(RdbParser *p, int fd, int closeWhenDone);
_LIBRDB_API RdbxReaderFileDesc *RDBX_createReaderFileDesc(RdbParser *p, int fd, int fdCloseWhenDone);

/****************************************************************
* Create RDB to JSON Handlers
Expand Down
2 changes: 1 addition & 1 deletion runtests
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ if [[ ${VALGRIND} -ne 0 ]]; then
--leak-resolution=high \
--error-exitcode=1 \
--log-file=test/log/valgrind.log \
./test/test_static_lib $REDIS_FOLDER $SPECIFIC_TEST $SPECIFIC_TEST_GROUP && exit 0
./test/test_static_lib -v $REDIS_FOLDER $SPECIFIC_TEST $SPECIFIC_TEST_GROUP && exit 0

sed -n -e '/SUMMARY:/,$p' ./test/log/valgrind.log | tail -n 20
echo -en "\n(Entire log available at: ./test/log/valgrind.log)\n"
Expand Down
9 changes: 6 additions & 3 deletions src/ext/readerFileDesc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@

struct RdbxReaderFileDesc {
RdbParser *parser;
int fdCloseWhenDone;
int fd;
};

static void deleteReaderFileDesc(RdbParser *p, void *rdata) {
if (!rdata) return;

RdbxReaderFileDesc *readerData = (RdbxReaderFileDesc *) rdata;
close(readerData->fd);
if (readerData->fdCloseWhenDone)
close(readerData->fd);
RDB_free(p, readerData);
}

Expand All @@ -28,10 +30,11 @@ static RdbStatus readFileDesc(void *data, void *buf, size_t len) {
return RDB_STATUS_OK;
}

RdbxReaderFileDesc *RDBX_createReaderFileDesc(RdbParser *p, int fd, int closeWhenDone) {
RdbxReaderFileDesc *RDBX_createReaderFileDesc(RdbParser *p, int fd, int fdCloseWhenDone) {
RdbxReaderFileDesc *ctx = (RdbxReaderFileDesc *) RDB_alloc(p, sizeof(RdbxReaderFileDesc));
ctx->parser = p;
ctx->fd = fd;
RDB_createReaderRdb(p, readFileDesc, ctx, (closeWhenDone) ? deleteReaderFileDesc : NULL);
ctx->fdCloseWhenDone = fdCloseWhenDone;
RDB_createReaderRdb(p, readFileDesc, ctx, deleteReaderFileDesc);
return ctx;
}
66 changes: 58 additions & 8 deletions test/test_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,22 @@
#include "test_common.h"

/* Live Redis server for some of the tests (Optional) */
#define MAX_NUM_REDIS_INST 2
int currRedisInst = -1;
#define MAX_NUM_REDIS_INST 2

#define RDB_CLI_VALGRIND_LOG_FILE "test/log/rdb-cli-valgrind.log"
#define RDB_CLI_CMD "./bin/rdb-cli"
#define RDB_CLI_VALGRIND_CMD "/usr/bin/valgrind --track-origins=yes --leak-check=full --leak-resolution=high --error-exitcode=1 --log-file="RDB_CLI_VALGRIND_LOG_FILE" "RDB_CLI_CMD

int useValgrind = 0;
int currRedisInst = -1;
redisContext *redisServersStack[MAX_NUM_REDIS_INST] = {0};
int redisPort[MAX_NUM_REDIS_INST]= {0};
pid_t redisPID[MAX_NUM_REDIS_INST] = {0};
const char *redisInstallFolder = NULL;
char redisVer[10];
int redisVersionInit, redisVerMajor, redisVerMinor;
int redisPort[MAX_NUM_REDIS_INST]= {0};
pid_t redisPID[MAX_NUM_REDIS_INST] = {0};
const char *redisInstallFolder = NULL;
char redisVer[10];
int redisVersionInit, redisVerMajor, redisVerMinor;

void checkValgrindLog(const char *filename);

const char *getTargetRedisVersion(int *major, int *minor) {
/* must be called only after setupRedisServer() */
Expand All @@ -35,18 +43,34 @@ const char *getTargetRedisVersion(int *major, int *minor) {
}

void runSystemCmd(const char *cmdFormat, ...) {
char cmd[1024];
char cmd[2048];
va_list args;
static int setup = 0;

/* setup env-var, specifically $RDB_CLI_CMD, that might be used by the command */
if (!setup) {
setenv("RDB_CLI_CMD", (useValgrind) ? RDB_CLI_VALGRIND_CMD : RDB_CLI_CMD, 1);
setup = 1;
}

va_start(args, cmdFormat);
vsnprintf(cmd, sizeof(cmd)-1, cmdFormat, args);
va_end(args);

/* remove any valgrind log file leftover from previous test */
if (useValgrind) remove(RDB_CLI_VALGRIND_LOG_FILE);

//printf ("runSystemCmd(): %s\n", cmd);
int res = system(cmd);
if (res) {
printf("\nFailed to run command: %s\n", cmd);
assert_true(0);
}

/* Confirm no errors when running 'rdb-cli' with 'valgrind'. Note: We check valgrind
* log due to potential issues with '--error-exitcode=1' and pipelines ('|'). */
if (useValgrind && strstr(cmd, "$RDB_CLI_CMD"))
checkValgrindLog(RDB_CLI_VALGRIND_LOG_FILE);
}

char *readFile(const char *filename, size_t *length, char *ignoredCh) {
Expand Down Expand Up @@ -412,6 +436,32 @@ int getRedisPort(void) {
assert_true(currRedisInst>=0);
return redisPort[currRedisInst];
}

void setValgrind() {
useValgrind = 1;
}

void checkValgrindLog(const char *filename) {
const char *expectedSummary = "ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)\n";
char buffer[512];
FILE *file;

if ( (file = fopen(filename, "r")) == NULL) return;

/* Read the file line by line until the end */
while (fgets(buffer, sizeof(buffer), file) != NULL);
fclose(file);

/* summary string appear at the last line, after "==<PID>==" and a space */
char *spaceAt = strchr(buffer, ' ');
if ((spaceAt == NULL) || (strcmp(spaceAt+1, expectedSummary) != 0)) {
char *f = readFile(filename, NULL, NULL);
printf ("rdb-cli failure:\n%s", f);
free(f);
assert_true(0);
}
}

/* Redis OSS does not support restoring module auxiliary data. This feature
* is currently available only in Redis Enterprise. There are plans to bring
* this functionality to Redis OSS in the near future. */
Expand Down
1 change: 1 addition & 0 deletions test/test_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ void assert_json_equal(const char *f1, const char *f2, int ignoreListOrder);
/* Test against Redis Server */
void setRedisInstallFolder(const char *path);
int getRedisPort(void);
void setValgrind();
void setupRedisServer(const char *extraArgs);
const char *getTargetRedisVersion(int *major, int *minor); /* call only after setupRedisServer() */
void teardownRedisServer(void);
Expand Down
5 changes: 4 additions & 1 deletion test/test_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,8 @@ int main(int argc, char *argv[]) {
" -h, --help Show this help message\n"
" -f, --redis-folder <folder> Specify the Redis folder to use for the tests\n"
" -g, --test-group <group-prefix> Selected test group to run\n"
" -t, --test <filter> Selected test to run";
" -t, --test <filter> Selected test to run\n"
" -v, --valgrind Run tests under valgrind";



Expand All @@ -185,6 +186,8 @@ int main(int argc, char *argv[]) {
runGroupPrefix = argv[++i];
} else if ((strcmp(argv[i], "-t") == 0 || strcmp(argv[i], "--test") == 0) && i+1 < argc) {
testFilter = argv[++i];
} else if ((strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--valgrind") == 0)) {
setValgrind();
} else {
printf("Invalid argument: %s\n%s\n", argv[i], USAGE);
exit(EXIT_FAILURE);
Expand Down
85 changes: 48 additions & 37 deletions test/test_rdb_cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ static void test_rdb_cli_resp_common(const char *rdbfile) {
RDB_deleteParser(parser);

/* rdb-cli RDB to RESP and stream toward Redis Server */
runSystemCmd("./bin/rdb-cli %s redis -h %s -p %d", rdbfile, "127.0.0.1", getRedisPort());
runSystemCmd("$RDB_CLI_CMD %s redis -h %s -p %d", rdbfile, "127.0.0.1", getRedisPort());

/* DUMP-RDB from Redis */
sendRedisCmd("SAVE", REDIS_REPLY_STATUS, NULL);
Expand All @@ -62,7 +62,7 @@ static void test_rdb_cli_resp_common(const char *rdbfile) {

static void test_rdb_cli_json(void **state) {
UNUSED(state);
runSystemCmd("./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb json -f -o ./test/tmp/out.json > /dev/null ");
runSystemCmd("$RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb json -f -o ./test/tmp/out.json > /dev/null ");
assert_json_equal(DUMP_FOLDER("multiple_lists_strings_no_aux.json"), "./test/tmp/out.json", 0);
}

Expand All @@ -74,65 +74,76 @@ static void test_rdb_cli_resp_to_redis(void **state) {
static void test_rdb_cli_filter_db(void **state) {
UNUSED(state);
/* -d/--dbnum 0 (found x but not y or z) */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_dbs.rdb -d 0 json -f | grep x > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_dbs.rdb --dbnum 0 json -f | grep y && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_dbs.rdb --dbnum 0 json -f | grep z && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_dbs.rdb -d 0 json -f > ./test/tmp/rdb_cli_filter_db1.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_db1.json | grep x > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_db1.json | grep y && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_db1.json | grep z && exit 1 || exit 0 > /dev/null ");
/* -D/--no-dbnum 0 (found y and z but not x) */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_dbs.rdb -D 0 json -f | grep x && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_dbs.rdb --no-dbnum 0 json -f | grep y > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_dbs.rdb --no-dbnum 0 json -f | grep z > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_dbs.rdb --no-dbnum 0 json -f > ./test/tmp/rdb_cli_filter_db2.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_db2.json | grep x && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_db2.json | grep y > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_db2.json | grep z > /dev/null ");
}

static void test_rdb_cli_filter_key(void **state) {
UNUSED(state);
/* -k/--key (found string2 but not mylist1 or lzf_compressed) */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -k string2 json -f | grep string2 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -k string2 json -f | grep mylist1 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -k string2 json -f | grep lzf_compressed && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb -k string2 json -f > ./test/tmp/rdb_cli_filter_key1.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_key1.json | grep string2 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_key1.json | grep mylist1 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_key1.json | grep lzf_compressed && exit 1 || exit 0 > /dev/null ");
/* -K/--no-key (found mylist1 or lzf_compressed but not string2) */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -K string2 json -f | grep string2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -K string2 json -f | grep mylist1 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -K string2 json -f | grep lzf_compressed > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb -K string2 json -f > ./test/tmp/rdb_cli_filter_key2.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_key2.json | grep string2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_key2.json | grep mylist1 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_key2.json | grep lzf_compressed > /dev/null ");
}

static void test_rdb_cli_filter_invalid_input(void **state) {
UNUSED(state);
/* invalid regex */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/single_key.rdb -k \"[*x\" json | grep \"Unmatched \\[\" > /dev/null");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/single_key.rdb -k \"[*x\" json | grep \"Unmatched \\[\" > /dev/null");
}

static void test_rdb_cli_filter_type(void **state) {
UNUSED(state);
/* -t/--type */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --type str json -f | grep string2 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --type str json -f | grep lzf_compressed > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --type str json -f | grep string1 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -t str json -f | grep mylist1 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -t str json -f | grep mylist2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -t str json -f | grep mylist3 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb --type str json -f > ./test/tmp/rdb_cli_filter_type1.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type1.json | grep string2 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type1.json | grep lzf_compressed > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type1.json | grep string1 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb -t str json -f > ./test/tmp/rdb_cli_filter_type2.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type2.json | grep mylist1 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type2.json | grep mylist2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type2.json | grep mylist3 && exit 1 || exit 0 > /dev/null ");

/* -T/--no-type */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --no-type str json -f | grep mylist1 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --no-type str json -f | grep mylist2 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --no-type str json -f | grep mylist3 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -T str json -f | grep string2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -T str json -f | grep lzf_compressed && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -T str json -f | grep string1 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb --no-type str json -f > ./test/tmp/rdb_cli_filter_type3.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type3.json | grep mylist1 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type3.json | grep mylist2 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type3.json | grep mylist3 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb -T str json -f > ./test/tmp/rdb_cli_filter_type4.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type4.json | grep string2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type4.json | grep lzf_compressed && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_type4.json | grep string1 && exit 1 || exit 0 > /dev/null ");
}

static void test_rdb_cli_filter_mix(void **state) {
UNUSED(state);
/* Combine 'type' and 'key' filters */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --type str --key string json -f | grep string2 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb --type str --key string json -f | grep string1 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -t str -k string json -f | grep lzf_compressed && exit 1 || exit 0 > /dev/null");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -t str -k string json -f | grep list1 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -t str -k string json -f | grep list2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" ./bin/rdb-cli ./test/dumps/multiple_lists_strings.rdb -t str -k string json -f | grep list3 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb --type str --key string json -f > ./test/tmp/rdb_cli_filter_mix1.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_mix1.json | grep string2 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_mix1.json | grep string1 > /dev/null ");
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/multiple_lists_strings.rdb -t str -k string json -f > ./test/tmp/rdb_cli_filter_mix2.json ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_mix2.json | grep lzf_compressed && exit 1 || exit 0 > /dev/null");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_mix2.json | grep list1 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_mix2.json | grep list2 && exit 1 || exit 0 > /dev/null ");
runSystemCmd(" cat ./test/tmp/rdb_cli_filter_mix2.json | grep list3 && exit 1 || exit 0 > /dev/null ");
}

static void test_rdb_cli_input_fd_reader(void **state) {
UNUSED(state);
runSystemCmd(" cat ./test/dumps/single_key.rdb | ./bin/rdb-cli - json | grep xxx > /dev/null ");
runSystemCmd(" cat ./test/dumps/single_key.rdb | $RDB_CLI_CMD - json | grep xxx > /dev/null ");
}

static void test_rdb_cli_redis_auth(void **state) {
Expand All @@ -141,12 +152,12 @@ static void test_rdb_cli_redis_auth(void **state) {
setupRedisServer("--requirepass abc");

/* auth custom command */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/single_key.rdb redis -a 2 auth abc -p %d > /dev/null ", getRedisPort());
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/single_key.rdb redis -a 2 auth abc -p %d > /dev/null ", getRedisPort());

/* auth pwd */
sendRedisCmd("FLUSHALL", REDIS_REPLY_ERROR, NULL); /* expected to fail */
sendRedisCmd("AUTH abc", REDIS_REPLY_STATUS, NULL); /* now expected to succeed */
runSystemCmd(" ./bin/rdb-cli ./test/dumps/single_key.rdb redis --password abc -p %d > /dev/null ", getRedisPort());
runSystemCmd(" $RDB_CLI_CMD ./test/dumps/single_key.rdb redis --password abc -p %d > /dev/null ", getRedisPort());

/* auth user */
int major;
Expand All @@ -157,7 +168,7 @@ static void test_rdb_cli_redis_auth(void **state) {
REDIS_REPLY_STATUS, NULL);
sendRedisCmd("FLUSHALL", REDIS_REPLY_STATUS, NULL);
runSystemCmd(
" ./bin/rdb-cli ./test/dumps/single_key.rdb redis -P newpwd -u newuser -p %d > /dev/null ",
" $RDB_CLI_CMD ./test/dumps/single_key.rdb redis -P newpwd -u newuser -p %d > /dev/null ",
getRedisPort());
}

Expand Down

0 comments on commit dd1f828

Please sign in to comment.