summaryrefslogtreecommitdiff
path: root/tests/support/util.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/support/util.tcl')
-rw-r--r--tests/support/util.tcl71
1 files changed, 71 insertions, 0 deletions
diff --git a/tests/support/util.tcl b/tests/support/util.tcl
index 3feb1e961..d97743665 100644
--- a/tests/support/util.tcl
+++ b/tests/support/util.tcl
@@ -907,3 +907,74 @@ proc delete_lines_with_pattern {filename tmpfilename pattern} {
close $fh_out
file rename -force $tmpfilename $filename
}
+
+# The following functions and variables are used only when running large-memory
+# tests. We avoid defining them when not running large-memory tests because the
+# global variables takes up lots of memory.
+proc init_large_mem_vars {} {
+ if {![info exists ::str500]} {
+ set ::str500 [string repeat x 500000000] ;# 500mb
+ set ::str500_len [string length $::str500]
+ }
+}
+
+# Utility function to write big argument into redis client connection
+proc write_big_bulk {size {prefix ""} {skip_read no}} {
+ init_large_mem_vars
+
+ assert {[string length prefix] <= $size}
+ r write "\$$size\r\n"
+ r write $prefix
+ incr size -[string length $prefix]
+ while {$size >= 500000000} {
+ r write $::str500
+ incr size -500000000
+ }
+ if {$size > 0} {
+ r write [string repeat x $size]
+ }
+ r write "\r\n"
+ if {!$skip_read} {
+ r flush
+ r read
+ }
+}
+
+# Utility to read big bulk response (work around Tcl limitations)
+proc read_big_bulk {code {compare no} {prefix ""}} {
+ init_large_mem_vars
+
+ r readraw 1
+ set resp_len [uplevel 1 $code] ;# get the first line of the RESP response
+ assert_equal [string range $resp_len 0 0] "$"
+ set resp_len [string range $resp_len 1 end]
+ set prefix_len [string length $prefix]
+ if {$compare} {
+ assert {$prefix_len <= $resp_len}
+ assert {$prefix_len <= $::str500_len}
+ }
+
+ set remaining $resp_len
+ while {$remaining > 0} {
+ set l $remaining
+ if {$l > $::str500_len} {set l $::str500_len} ; # can't read more than 2gb at a time, so read 500mb so we can easily verify read data
+ set read_data [r rawread $l]
+ set nbytes [string length $read_data]
+ if {$compare} {
+ set comp_len $nbytes
+ # Compare prefix part
+ if {$remaining == $resp_len} {
+ assert_equal $prefix [string range $read_data 0 [expr $prefix_len - 1]]
+ set read_data [string range $read_data $prefix_len $nbytes]
+ incr comp_len -$prefix_len
+ }
+ # Compare rest of data, evaluate and then assert to avoid huge print in case of failure
+ set data_equal [expr {$read_data == [string range $::str500 0 [expr $comp_len - 1]]}]
+ assert $data_equal
+ }
+ incr remaining -$nbytes
+ }
+ assert_equal [r rawread 2] "\r\n"
+ r readraw 0
+ return $resp_len
+}