Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f00ed2a

Browse files
Unit tests for EVAL, EVALSHA, DUMP, RESTORE, _unserialize, and _prefix
1 parent 0ca8a1d commit f00ed2a

File tree

2 files changed

+248
-12
lines changed

2 files changed

+248
-12
lines changed

common.h

+1-12
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,9 @@ typedef enum _REDIS_REPLY_TYPE {
3131
TYPE_MULTIBULK = '*'
3232
} REDIS_REPLY_TYPE;
3333

34-
/*#define REDIS_REPLY_LINE 0
35-
#define REDIS_REPLY_ERR 1
36-
#define REDIS_REPLY_BULK 2
37-
#define REDIS_REPLY_MULTIBULK 3
38-
39-
#define REDIS_REPLY_LINE_CHR '+'
40-
#define REDIS_REPLY_ERR_CHR '-'
41-
#define REDIS_REPLY_BULK_CHR '$'
42-
#define REDIS_REPLY_MULTIBULK_CHR '*'
43-
*/
44-
4534
/* options */
4635
#define REDIS_OPT_SERIALIZER 1
47-
#define REDIS_OPT_PREFIX 2
36+
#define REDIS_OPT_PREFIX 2
4837

4938
/* serializers */
5039
#define REDIS_SERIALIZER_NONE 0

tests/TestRedis.php

+247
Original file line numberDiff line numberDiff line change
@@ -2884,6 +2884,253 @@ private function checkSerializer($mode) {
28842884
$this->assertTrue($this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE) === TRUE); // set ok
28852885
$this->assertTrue($this->redis->getOption(Redis::OPT_SERIALIZER) === Redis::SERIALIZER_NONE); // get ok
28862886
}
2887+
2888+
public function testDumpRestore() {
2889+
$this->redis->del('foo');
2890+
$this->redis->del('bar');
2891+
2892+
$this->redis->set('foo', 'this-is-foo');
2893+
$this->redis->set('bar', 'this-is-bar');
2894+
2895+
$d_foo = $this->redis->dump('foo');
2896+
$d_bar = $this->redis->dump('bar');
2897+
2898+
$this->redis->del('foo');
2899+
$this->redis->del('bar');
2900+
2901+
// Assert returns from restore
2902+
$this->assertTrue($this->redis->restore('foo', 0, $d_bar));
2903+
$this->assertTrue($this->redis->restore('bar', 0, $d_foo));
2904+
2905+
// Now check that the keys have switched
2906+
$this->assertTrue($this->redis->get('foo') == 'this-is-bar');
2907+
$this->assertTrue($this->redis->get('bar') == 'this-is-foo');
2908+
2909+
$this->redis->del('foo');
2910+
$this->redis->del('bar');
2911+
}
2912+
2913+
public function testGetLastError() {
2914+
// We shouldn't have any errors now
2915+
$this->assertTrue($this->redis->getLastError() == NULL);
2916+
2917+
// Throw some invalid lua at redis
2918+
$this->redis->eval("not-a-lua-script");
2919+
2920+
// Now we should have an error
2921+
$this->assertTrue(strlen($this->redis->getLastError()) > 0);
2922+
}
2923+
2924+
// Helper function to compare nested results -- from the php.net array_diff page, I believe
2925+
private function array_diff_recursive($aArray1, $aArray2) {
2926+
$aReturn = array();
2927+
2928+
foreach ($aArray1 as $mKey => $mValue) {
2929+
if (array_key_exists($mKey, $aArray2)) {
2930+
if (is_array($mValue)) {
2931+
$aRecursiveDiff = $this->array_diff_recursive($mValue, $aArray2[$mKey]);
2932+
if (count($aRecursiveDiff)) {
2933+
$aReturn[$mKey] = $aRecursiveDiff;
2934+
}
2935+
} else {
2936+
if ($mValue != $aArray2[$mKey]) {
2937+
$aReturn[$mKey] = $mValue;
2938+
}
2939+
}
2940+
} else {
2941+
$aReturn[$mKey] = $mValue;
2942+
}
2943+
}
2944+
2945+
return $aReturn;
2946+
}
2947+
2948+
public function testScript() {
2949+
// Flush any scripts we have
2950+
$this->assertTrue($this->redis->script('flush'));
2951+
2952+
// Silly scripts to test against
2953+
$s1_src = 'return 1';
2954+
$s1_sha = sha1($s1_src);
2955+
$s2_src = 'return 2';
2956+
$s2_sha = sha1($s2_src);
2957+
$s3_src = 'return 3';
2958+
$s3_sha = sha1($s3_src);
2959+
2960+
// None should exist
2961+
$result = $this->redis->script('exists', $s1_sha, $s2_sha, $s3_sha);
2962+
$this->assertTrue(is_array($result) && count($result) == 3);
2963+
$this->assertTrue(count(array_filter($result)) == 0);
2964+
2965+
// Load them up
2966+
$this->assertTrue($this->redis->script('load', $s1_src) == $s1_sha);
2967+
$this->assertTrue($this->redis->script('load', $s2_src) == $s2_sha);
2968+
$this->assertTrue($this->redis->script('load', $s3_src) == $s3_sha);
2969+
2970+
// They should all exist
2971+
$result = $this->redis->script('exists', $s1_sha, $s2_sha, $s3_sha);
2972+
$this->assertTrue(count(array_filter($result)) == 3);
2973+
}
2974+
2975+
public function testEval() {
2976+
// Basic single line response tests
2977+
$this->assertTrue(1 == $this->redis->eval('return 1'));
2978+
$this->assertTrue(1.55 == $this->redis->eval("return '1.55'"));
2979+
$this->assertTrue("hello, world" == $this->redis->eval("return 'hello, world'"));
2980+
2981+
/*
2982+
* Keys to be incorporated into lua results
2983+
*/
2984+
2985+
// Make a list
2986+
$this->redis->del('mylist');
2987+
$this->redis->rpush('mylist', 'a');
2988+
$this->redis->rpush('mylist', 'b');
2989+
$this->redis->rpush('mylist', 'c');
2990+
2991+
// Make a set
2992+
$this->redis->del('myset');
2993+
$this->redis->sadd('myset', 'd');
2994+
$this->redis->sadd('myset', 'e');
2995+
$this->redis->sadd('myset', 'f');
2996+
2997+
// Basic keys
2998+
$this->redis->del('key1');
2999+
$this->redis->set('key1', 'hello, world');
3000+
$this->redis->del('key2');
3001+
$this->redis->set('key2', 'hello again!');
3002+
3003+
// Use a script to return our list, and verify its response
3004+
$list = $this->redis->eval("return redis.call('lrange', 'mylist', 0, -1)");
3005+
$this->assertTrue($list === Array('a','b','c'));
3006+
3007+
// Use a script to return our set
3008+
$set = $this->redis->eval("return redis.call('smembers', 'myset')");
3009+
$this->assertTrue($set == Array('d','e','f'));
3010+
3011+
// Test an empty MULTI BULK response
3012+
$empty_resp = $this->redis->eval("return redis.call('lrange', 'not-any-kind-of-set', 0, -1)");
3013+
$this->assertTrue(is_array($empty_resp) && empty($empty_resp));
3014+
3015+
// Now test a nested reply
3016+
$nested_script = "
3017+
return {
3018+
1,2,3, {
3019+
redis.call('get', 'key1'),
3020+
redis.call('get', 'key2'),
3021+
redis.call('lrange', 'not-any-kind-of-list', 0, -1),
3022+
{
3023+
redis.call('smembers','myset'),
3024+
redis.call('lrange', 'mylist', 0, -1)
3025+
}
3026+
}
3027+
}
3028+
";
3029+
3030+
$expected = Array(
3031+
1, 2, 3, Array(
3032+
'hello, world',
3033+
'hello again!',
3034+
Array(),
3035+
Array(
3036+
Array('d','e','f'),
3037+
Array('a','b','c')
3038+
)
3039+
)
3040+
);
3041+
3042+
// Now run our script, and check our values against each other
3043+
$eval_result = $this->redis->eval($nested_script);
3044+
$this->assertTrue(count($this->array_diff_recursive($eval_result, $expected)) == 0);
3045+
3046+
/*
3047+
* KEYS/ARGV
3048+
*/
3049+
3050+
$args_script = "return {KEYS[1],KEYS[2],KEYS[3],ARGV[1],ARGV[2],ARGV[3]}";
3051+
$args_args = Array('k1','k2','k3','v1','v2','v3');
3052+
$args_result = $this->redis->eval($args_script, $args_args, 3);
3053+
$this->assertTrue($args_result === $args_args);
3054+
3055+
// turn on key prefixing
3056+
$this->redis->setOption(Redis::OPT_PREFIX, 'prefix:');
3057+
$args_result = $this->redis->eval($args_script, $args_args, 3);
3058+
3059+
// Make sure our first three are prefixed
3060+
for($i=0;$i<count($args_result);$i++) {
3061+
if($i<3) {
3062+
// Should be prefixed
3063+
$this->assertTrue($args_result[$i] == 'prefix:' . $args_args[$i]);
3064+
} else {
3065+
// Should not be prefixed
3066+
$this->assertTrue($args_result[$i] == $args_args[$i]);
3067+
}
3068+
}
3069+
}
3070+
3071+
public function testEvalSHA() {
3072+
// Flush any loaded scripts
3073+
$this->redis->script('flush');
3074+
3075+
// Non existant script (but proper sha1), and a random (not) sha1 string
3076+
$this->assertFalse($this->redis->evalsha(sha1(uniqid())));
3077+
$this->assertFalse($this->redis->evalsha('some-random-data'));
3078+
3079+
// Load a script
3080+
$cb = uniqid();
3081+
$scr = "local cb='$cb' return 1";
3082+
$sha = sha1($scr);
3083+
3084+
// Run it when it doesn't exist, run it with eval, and then run it with sha1
3085+
$this->assertTrue(false == $this->redis->evalsha($scr));
3086+
$this->assertTrue(1 == $this->redis->eval($scr));
3087+
$this->assertTrue(1 == $this->redis->evalsha($sha));
3088+
}
3089+
3090+
public function testUnserialize() {
3091+
$vals = Array(
3092+
1,1.5,'one',Array('this','is','an','array')
3093+
);
3094+
3095+
foreach(Array(Redis::SERIALIZER_PHP, Redis::SERIALIZER_IGBINARY) as $mode) {
3096+
$vals_enc = Array();
3097+
3098+
// Pass them through redis so they're serialized
3099+
foreach($vals as $key => $val) {
3100+
$this->redis->setOption(Redis::OPT_SERIALIZER, $mode);
3101+
3102+
$key = "key" . ++$key;
3103+
$this->redis->del($key);
3104+
$this->redis->set($key, $val);
3105+
3106+
// Clear serializer, get serialized value
3107+
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE);
3108+
$vals_enc[] = $this->redis->get($key);
3109+
}
3110+
3111+
// Run through our array comparing values
3112+
for($i=0;$i<count($vals);$i++) {
3113+
// reset serializer
3114+
$this->redis->setOption(Redis::OPT_SERIALIZER, $mode);
3115+
$this->assertTrue($vals[$i] == $this->redis->_unserialize($vals_enc[$i]));
3116+
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE);
3117+
}
3118+
}
3119+
}
3120+
3121+
public function testPrefix() {
3122+
// no prefix
3123+
$this->redis->setOption(Redis::OPT_PREFIX, '');
3124+
$this->assertTrue('key' == $this->redis->_prefix('key'));
3125+
3126+
// with a prefix
3127+
$this->redis->setOption(Redis::OPT_PREFIX, 'some-prefix:');
3128+
$this->assertTrue('some-prefix:key' == $this->redis->_prefix('key'));
3129+
3130+
// Clear prefix
3131+
$this->redis->setOption(Redis::OPT_PREFIX, '');
3132+
3133+
}
28873134
}
28883135

28893136
TestSuite::run("Redis_Test");

0 commit comments

Comments
 (0)