summaryrefslogtreecommitdiff
path: root/ThirdParty/tolua_runtime/luajit-2.1/src/x64/test/test_str_comp.lua
diff options
context:
space:
mode:
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.lua67
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)