diff options
Diffstat (limited to 'ThirdParty/tolua_runtime/luajit-2.1/src/x64/test/test_str_comp.lua')
-rw-r--r-- | ThirdParty/tolua_runtime/luajit-2.1/src/x64/test/test_str_comp.lua | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/ThirdParty/tolua_runtime/luajit-2.1/src/x64/test/test_str_comp.lua b/ThirdParty/tolua_runtime/luajit-2.1/src/x64/test/test_str_comp.lua new file mode 100644 index 0000000..3a5c3e6 --- /dev/null +++ b/ThirdParty/tolua_runtime/luajit-2.1/src/x64/test/test_str_comp.lua @@ -0,0 +1,67 @@ +--[[ + Given two content-idental string s1, s2, test if they end up to be the + same string object. The purpose of this test is to make sure hash function + do not accidently include extraneous bytes before and after the string in + question. +]] + +local ffi = require("ffi") +local C = ffi.C + +ffi.cdef[[ + void free(void*); + char* malloc(size_t); + void *memset(void*, int, size_t); + void *memcpy(void*, void*, size_t); + long time(void*); + void srandom(unsigned); + long random(void); +]] + + +local function test_equal(len_min, len_max) + -- source string is wrapped by 16-byte-junk both before and after the + -- string + local x = C.random() + local l = len_min + x % (len_max - len_min); + local buf_len = tonumber(l + 16 * 2) + + local src_buf = C.malloc(buf_len) + for i = 0, buf_len - 1 do + src_buf[i] = C.random() % 255 + end + + -- dest string is the clone of the source string, but it is sandwiched + -- by different junk bytes + local dest_buf = C.malloc(buf_len) + C.memset(dest_buf, 0x5a, buf_len) + + local ofst = 8 + (C.random() % 8) + C.memcpy(dest_buf + ofst, src_buf + 16, l); + + local str1 = ffi.string(src_buf + 16, l) + local str2 = ffi.string(dest_buf + ofst, l) + + C.free(src_buf) + C.free(dest_buf) + + if str1 ~= str2 then + -- Oops, look like hash function mistakenly include extraneous bytes + -- close to the string + return 1 -- wtf + end +end + +--local lens = {1, 4, 16, 128, 1024} +local lens = {128, 1024} +local iter = 1000 + +for i = 1, #lens - 1 do + for j = 1, iter do + if test_equal(lens[i], lens[i+1]) ~= nil then + os.exit(1) + end + end +end + +os.exit(0) |