Software /
code /
prosody
Annotate
spec/util_debug_spec.lua @ 12026:f3b09b8445b3
MUC: Return a friendly textual error when trying to speak without voice
I spend several minutes confused over where the bug was until I
remembered I had set myself as visitor in the previous debug session.
This would have helped.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 08 Dec 2021 16:40:51 +0100 |
parent | 11177:37dc2a6144d1 |
rev | line source |
---|---|
11177
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); |