Skip to content

Commit 92a8a6f

Browse files
committed
Fix utils.strip_luatest_trace
* Strip uselss `...` and `eval` lines. * Scan the stack trace backwards so as to skip `[C]`, `...`, and `eval` lines that were called by luatest internal files, not vice versa. * Don't strip lines related to luatest test files (from luatest/test), even though they match the luatest internal file pattern, because we do want to see stack traces when we test luatest. Needed for #396
1 parent 8254673 commit 92a8a6f

File tree

3 files changed

+67
-5
lines changed

3 files changed

+67
-5
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
- Fix reporting of an assertion failure in `Server:exec()` in case verbose
2121
error serialization is enabled in Tarantool (gh-376).
2222
- Added `assert_items_exclude`.
23+
- Strip useless `...` lines from error trace.
2324

2425
## 1.0.1
2526

luatest/utils.lua

+29-5
Original file line numberDiff line numberDiff line change
@@ -61,23 +61,47 @@ end
6161

6262
-- Check if line of stack trace comes from inside luatest.
6363
local function is_luatest_internal_line(s)
64-
return s:find('[/\\]luatest[/\\]') or s:find('bin[/\\]luatest')
64+
if s:find('bin[/\\]luatest') then
65+
return true
66+
end
67+
if s:find('[/\\]luatest[/\\]') then
68+
-- Do not strip lines originating from luatest test files because
69+
-- we want to see stack traces when we test luatest.
70+
return not s:find('[/\\]luatest[/\\]test[/\\]')
71+
end
72+
return false
6573
end
6674

6775
function utils.strip_luatest_trace(trace)
6876
local lines = trace:split('\n')
69-
local result = {lines[1]} -- always keep 1st line
77+
78+
-- Scan the stack trace backwards (from caller to callee) and strip all
79+
-- frames related to luatest, as well as `[C]:`, `...`, `eval:` frames
80+
-- called by them because they don't change context.
81+
local result = {}
7082
local keep = true
71-
for i = 2, table.maxn(lines) do
83+
for i = table.maxn(lines), 2, -1 do
7284
local line = lines[i]
73-
-- `[C]:` lines don't change context
74-
if not line:find('^%s+%[C%]:') then
85+
if not (line:find('^%s+%[C%]:') or
86+
line:find('^%s+%.%.%.$') or
87+
line:find('^%s+eval:')) then
7588
keep = not is_luatest_internal_line(line)
7689
end
7790
if keep then
7891
table.insert(result, line)
7992
end
8093
end
94+
95+
-- Always keep the 1st line because it's the header ('stack traceback:').
96+
table.insert(result, lines[1])
97+
98+
-- Since we scanned the stack trace backwards, we need to reverse
99+
-- the result.
100+
for i = 1, math.floor(#result / 2) do
101+
local v = result[#result - i + 1]
102+
result[#result - i + 1] = result[i]
103+
result[i] = v
104+
end
81105
return table.concat(result, '\n')
82106
end
83107

test/luaunit/utility_test.lua

+37
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,43 @@ function g.test_stripStackTrace()
847847
[[stack traceback:
848848
luaunit2/example_with_luaunit.lua:124: in function 'test1_withFailure']]
849849
)
850+
851+
t.assert_equals(subject([[stack traceback:
852+
/tmp/luatest/luatest/utils.lua:55: in function 'luatest_error'
853+
/tmp/luatest/luatest/assertions.lua:66: in function 'failure'
854+
/tmp/luatest/luatest/assertions.lua:71: in function 'fail_fmt'
855+
/tmp/luatest/luatest/assertions.lua:341: in function 'assert_le'
856+
/tmp/luatest/test/example_test.lua:37: in function 'check'
857+
/tmp/luatest/test/example_test.lua:40: in function </tmp/luatest/test/example_test.lua:34>
858+
[C]: in function 'xpcall'
859+
eval:9: in main chunk
860+
[C]: at 0x5da8d110ced6
861+
/tmp/luatest/luatest/server.lua:745: in function 'exec'
862+
/tmp/luatest/test/example_test.lua:34: in function 'test.test_fail_server'
863+
/tmp/luatest/luatest/runner.lua:472: in function </tmp/luatest/luatest/runner.lua:471>
864+
[C]: in function 'xpcall'
865+
/tmp/luatest/luatest/runner.lua:471: in function 'super'
866+
/tmp/luatest/luatest/capturing.lua:106: in function 'protected_call'
867+
/tmp/luatest/luatest/runner.lua:559: in function 'super'
868+
/tmp/luatest/luatest/hooks.lua:290: in function 'invoke_test_function'
869+
/tmp/luatest/luatest/runner.lua:554: in function 'super'
870+
...
871+
[C]: in function 'xpcall'
872+
/tmp/luatest/luatest/utils.lua:39: in function 'run_tests'
873+
/tmp/luatest/luatest/runner.lua:381: in function </tmp/luatest/luatest/runner.lua:366>
874+
[C]: in function 'xpcall'
875+
/tmp/luatest/luatest/capturing.lua:74: in function </tmp/luatest/luatest/capturing.lua:72>
876+
[C]: in function 'xpcall'
877+
/tmp/luatest/luatest/runner.lua:55: in function 'fn'
878+
.../vlad/src/tarantool/luatest/luatest/sandboxed_runner.lua:14: in function 'run'
879+
/tmp/luatest/luatest/cli_entrypoint.lua:4: in function </tmp/luatest/luatest/cli_entrypoint.lua:3>
880+
/tmp/luatest/bin/luatest:5: in main chunk]]
881+
),
882+
[[stack traceback:
883+
/tmp/luatest/test/example_test.lua:37: in function 'check'
884+
/tmp/luatest/test/example_test.lua:40: in function </tmp/luatest/test/example_test.lua:34>
885+
/tmp/luatest/test/example_test.lua:34: in function 'test.test_fail_server']]
886+
)
850887
end
851888

852889
function g.test_eps_value()

0 commit comments

Comments
 (0)