spec/util_debug_spec.lua
author Kim Alvefur <zash@zash.se>
Mon, 12 Dec 2022 07:03:31 +0100
branch0.11
changeset 12802 c4b1b5cbc20b
parent 11181 37dc2a6144d1
permissions -rw-r--r--
Tag 0.11.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11181
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local dbg = require "util.debug";
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
describe("util.debug", function ()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
	describe("traceback()", function ()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
		it("works", function ()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
			local tb = dbg.traceback();
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
			assert.is_string(tb);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
		end);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
	end);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
	describe("get_traceback_table()", function ()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
		it("works", function ()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
			local count = 0;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
			-- MUST stay in sync with the line numbers of these functions:
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
			local f1_defined, f3_defined = 43, 15;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
			local function f3(f3_param) --luacheck: ignore 212/f3_param
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
				count = count + 1;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
				for i = 1, 2 do
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
					local tb = dbg.get_traceback_table(i == 1 and coroutine.running() or nil, 0);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
					assert.is_table(tb);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
					--print(dbg.traceback(), "\n\n\n", require "util.serialization".serialize(tb, { fatal = false, unquoted = true}));
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
					local found_f1, found_f3;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
					for _, frame in ipairs(tb) do
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
						if frame.info.linedefined == f1_defined then
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
							assert.equal(0, #frame.locals);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
							assert.equal("f2", frame.upvalues[1].name);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
							assert.equal("f1_upvalue", frame.upvalues[2].name);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
							found_f1 = true;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
						elseif frame.info.linedefined == f3_defined then
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
							assert.equal("f3_param", frame.locals[1].name);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
							found_f3 = true;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
						end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
					end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
					assert.is_true(found_f1);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
					assert.is_true(found_f3);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
				end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
			end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
			local function f2()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
				local f2_local = "hello";
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
				return f3(f2_local);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
			end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
			local f1_upvalue = "upvalue1";
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
			local function f1()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
				f2(f1_upvalue);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
			end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
			-- ok/err are caught and re-thrown so that
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
			-- busted gets to handle them in its own way
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
			local ok, err;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
			local function hook()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
				debug.sethook();
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
				ok, err = pcall(f1);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
			end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
			-- Test the traceback is correct in various
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
			-- types of caller environments
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
			-- From a Lua hook
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
			debug.sethook(hook, "crl", 1);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
			local a = string.sub("abcdef", 3, 4);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
			assert.equal("cd", a);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
			debug.sethook();
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
			assert.equal(1, count);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
			if not ok then
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
				error(err);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
			end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
			ok, err = nil, nil;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
			-- From a signal handler (C hook)
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
			require "util.signal".signal("SIGUSR1", hook);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
			require "util.signal".raise("SIGUSR1");
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
			assert.equal(2, count);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
			if not ok then
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
				error(err);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
			end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
			ok, err = nil, nil;
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
			-- Inside a coroutine
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
			local co = coroutine.create(function ()
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
				hook();
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
			end);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
			coroutine.resume(co);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
			if not ok then
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
				error(err);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
			end
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
			assert.equal(3, count);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
		end);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
	end);
37dc2a6144d1 util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
end);