1start_server {tags {"protocol"}} { 2 test "Handle an empty query" { 3 reconnect 4 r write "\r\n" 5 r flush 6 assert_equal "PONG" [r ping] 7 } 8 9 test "Negative multibulk length" { 10 reconnect 11 r write "*-10\r\n" 12 r flush 13 assert_equal PONG [r ping] 14 } 15 16 test "Out of range multibulk length" { 17 reconnect 18 r write "*20000000\r\n" 19 r flush 20 assert_error "*invalid multibulk length*" {r read} 21 } 22 23 test "Wrong multibulk payload header" { 24 reconnect 25 r write "*3\r\n\$3\r\nSET\r\n\$1\r\nx\r\nfooz\r\n" 26 r flush 27 assert_error "*expected '$', got 'f'*" {r read} 28 } 29 30 test "Negative multibulk payload length" { 31 reconnect 32 r write "*3\r\n\$3\r\nSET\r\n\$1\r\nx\r\n\$-10\r\n" 33 r flush 34 assert_error "*invalid bulk length*" {r read} 35 } 36 37 test "Out of range multibulk payload length" { 38 reconnect 39 r write "*3\r\n\$3\r\nSET\r\n\$1\r\nx\r\n\$2000000000\r\n" 40 r flush 41 assert_error "*invalid bulk length*" {r read} 42 } 43 44 test "Non-number multibulk payload length" { 45 reconnect 46 r write "*3\r\n\$3\r\nSET\r\n\$1\r\nx\r\n\$blabla\r\n" 47 r flush 48 assert_error "*invalid bulk length*" {r read} 49 } 50 51 test "Multi bulk request not followed by bulk arguments" { 52 reconnect 53 r write "*1\r\nfoo\r\n" 54 r flush 55 assert_error "*expected '$', got 'f'*" {r read} 56 } 57 58 test "Generic wrong number of args" { 59 reconnect 60 assert_error "*wrong*arguments*ping*" {r ping x y z} 61 } 62 63 test "Unbalanced number of quotes" { 64 reconnect 65 r write "set \"\"\"test-key\"\"\" test-value\r\n" 66 r write "ping\r\n" 67 r flush 68 assert_error "*unbalanced*" {r read} 69 } 70 71 set c 0 72 foreach seq [list "\x00" "*\x00" "$\x00"] { 73 incr c 74 test "Protocol desync regression test #$c" { 75 set s [socket [srv 0 host] [srv 0 port]] 76 puts -nonewline $s $seq 77 set payload [string repeat A 1024]"\n" 78 set test_start [clock seconds] 79 set test_time_limit 30 80 while 1 { 81 if {[catch { 82 puts -nonewline $s payload 83 flush $s 84 incr payload_size [string length $payload] 85 }]} { 86 set retval [gets $s] 87 close $s 88 break 89 } else { 90 set elapsed [expr {[clock seconds]-$test_start}] 91 if {$elapsed > $test_time_limit} { 92 close $s 93 error "assertion:Redis did not closed connection after protocol desync" 94 } 95 } 96 } 97 set retval 98 } {*Protocol error*} 99 } 100 unset c 101} 102 103start_server {tags {"regression"}} { 104 test "Regression for a crash with blocking ops and pipelining" { 105 set rd [redis_deferring_client] 106 set fd [r channel] 107 set proto "*3\r\n\$5\r\nBLPOP\r\n\$6\r\nnolist\r\n\$1\r\n0\r\n" 108 puts -nonewline $fd $proto$proto 109 flush $fd 110 set res {} 111 112 $rd rpush nolist a 113 $rd read 114 $rd rpush nolist a 115 $rd read 116 } 117} 118