diff options
Diffstat (limited to '3rdparty/luv/tests/test-leaks.lua')
-rw-r--r-- | 3rdparty/luv/tests/test-leaks.lua | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/3rdparty/luv/tests/test-leaks.lua b/3rdparty/luv/tests/test-leaks.lua new file mode 100644 index 00000000000..06c6e49a0cf --- /dev/null +++ b/3rdparty/luv/tests/test-leaks.lua @@ -0,0 +1,186 @@ +return require('lib/tap')(function (test) + + local function bench(uv, p, count, fn) + collectgarbage() + local before + local notify = count / 8 + for i = 1, count do + fn() + if i % notify == 0 then + uv.run() + collectgarbage() + local now = uv.resident_set_memory() + if not before then before = now end + p(i, now) + end + end + uv.run() + collectgarbage() + local after = uv.resident_set_memory() + p{ + before = before, + after = after, + } + assert(after < before * 1.5) + end + + test("fs-write", function (print, p, expect, uv) + bench(uv, p, 0x7000, function () + local path = "_test_" + local fd = assert(uv.fs_open(path, "w", 438)) + uv.fs_write(fd, "Hello World\n", -1) + uv.fs_write(fd, {"with\n", "more\n", "lines\n"}, -1) + uv.fs_close(fd) + uv.fs_unlink(path) + end) + end) + + test("lots-o-timers", function (print, p, expect, uv) + bench(uv, p, 0x10000, function () + local timer = uv.new_timer() + uv.close(timer) + end) + end) + + test("lots-o-timers with canceled callbacks", function (print, p, expect, uv) + bench(uv, p, 0x10000, function () + local timer = uv.new_timer() + uv.timer_start(timer, 100, 100, function () + end) + uv.timer_stop(timer) + uv.close(timer, function () + end) + uv.run() + end) + end) + + test("lots-o-timers with real timeouts", function (print, p, expect, uv) + bench(uv, p, 0x500, function () + local timer = uv.new_timer() + uv.timer_start(timer, 10, 0, expect(function () + uv.timer_stop(timer) + uv.close(timer, function () + end) + end)) + end) + end) + + test("reading file async", function (print, p, expect, uv) + local mode = tonumber("644", 8) + bench(uv, p, 0x500, function () + local onOpen, onStat, onRead, onClose + local fd, stat + + onOpen = expect(function (err, result) + assert(not err, err) + fd = result + uv.fs_fstat(fd, onStat) + end) + + onStat = expect(function (err, result) + assert(not err, err) + stat = result + uv.fs_read(fd, stat.size, 0, onRead) + end) + + onRead = expect(function (err, data) + assert(not err, err) + assert(#data == stat.size) + uv.fs_close(fd, onClose) + end) + + onClose = expect(function (err) + assert(not err, err) + end) + + assert(uv.fs_open("README.md", "r", mode, onOpen)) + end) + end) + + test("reading file sync", function (print, p, expect, uv) + local mode = tonumber("644", 8) + bench(uv, p, 0x2000, function () + local fd = assert(uv.fs_open("README.md", "r", mode)) + local stat = assert(uv.fs_fstat(fd)) + local data = assert(uv.fs_read(fd, stat.size, 0)) + assert(#data == stat.size) + assert(uv.fs_close(fd)) + end) + end) + + test("invalid file", function (print, p, expect, uv) + local mode = tonumber("644", 8) + bench(uv, p, 0x1500, function () + local req = uv.fs_open("BAD_FILE", "r", mode, expect(function (err, fd) + assert(not fd) + assert(err) + end)) + end) + end) + + test("invalid file sync", function (print, p, expect, uv) + local mode = tonumber("644", 8) + bench(uv, p, 0x20000, function () + local fd, err = uv.fs_open("BAD_FILE", "r", mode) + assert(not fd) + assert(err) + end) + end) + + test("invalid spawn args", function (print, p, expect, uv) + -- Regression test for #73 + bench(uv, p, 0x10000, function () + local ret, err = pcall(function () + return uv.spawn("ls", { + args = {"-l", "-h"}, + stdio = {0, 1, 2}, + env = {"EXTRA=true"}, + gid = false, -- Should be integer + }) + end) + assert(not ret) + assert(err) + end) + end) + + test("stream writing with string and array", function (print, p, expect, uv) + local port = 0 + local server = uv.new_tcp() + local data + local count = 0x800 + server:unref() + server:bind("127.0.0.1", port) + server:listen(128, expect(function (err) + assert(not err, err) + local client = uv.new_tcp() + server:accept(client) + client:write(data) + client:read_start(expect(function (err, data) + assert(not err, err) + assert(data) + client:close() + end)) + end, count)) + local address = server:getsockname() + bench(uv, p, count, function () + data = string.rep("Hello", 500) + local socket = uv.new_tcp() + socket:connect(address.ip, address.port, expect(function (err) + assert(not err, err) + socket:read_start(expect(function (err, chunk) + assert(not err, err) + assert(chunk) + local data = {} + for i = 0, 100 do + data[i + 1] = string.rep(string.char(i), 100) + end + socket:write(data) + socket:close() + end)) + end)) + uv.run() + end) + server:close() + end) + +end) |