Skip to content

Commit 027d67b

Browse files
committed
Fix interception of luatest errors in assertions
* Never intercept assertion failures with t.assert_error() and others, because this may hide unexpected assertion failures. * Unwrap luatest errors (class = LuatestError, status = error). This is required for assertions to work on errors wrapped by Server:exec() - see the next commit. Needed for #396
1 parent 92a8a6f commit 027d67b

File tree

5 files changed

+48
-9
lines changed

5 files changed

+48
-9
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
error serialization is enabled in Tarantool (gh-376).
2222
- Added `assert_items_exclude`.
2323
- Strip useless `...` lines from error trace.
24+
- Make `assert_error_*` ignore errors raised by assertion failures.
2425

2526
## 1.0.1
2627

luatest/assertions.lua

+23-5
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,30 @@ local function pcall_check_trace(level, fn, ...)
164164
return ok, err
165165
end
166166

167+
--
168+
-- Wrapper around pcall that:
169+
-- * checks the stack trace for box errors;
170+
-- * unwraps the error if it was wrapped by luatest (e.g. by Server:exec());
171+
-- * re-raises the error if it was raised by a luatest assertion failure.
172+
--
173+
local function pcall_wrapper(level, fn, ...)
174+
local ok, err = pcall_check_trace(level + 1, fn, ...)
175+
if not ok and utils.is_luatest_error(err) then
176+
if err.status == 'error' then
177+
err = err.message
178+
else
179+
error(err)
180+
end
181+
end
182+
return ok, err
183+
end
184+
167185
--- Check that calling fn raises an error.
168186
--
169187
-- @func fn
170188
-- @param ... arguments for function
171189
function M.assert_error(fn, ...)
172-
local ok, err = pcall_check_trace(2, fn, ...)
190+
local ok, err = pcall_wrapper(2, fn, ...)
173191
if ok then
174192
failure("Expected an error when calling function but no error generated", nil, 2)
175193
end
@@ -565,7 +583,7 @@ function M.assert_str_matches(value, pattern, start, final, message)
565583
end
566584

567585
local function _assert_error_msg_equals(stripFileAndLine, expectedMsg, func, ...)
568-
local no_error, error_msg = pcall_check_trace(3, func, ...)
586+
local no_error, error_msg = pcall_wrapper(3, func, ...)
569587
if no_error then
570588
local failure_message = string.format(
571589
'Function successfully returned: %s\nExpected error: %s',
@@ -631,7 +649,7 @@ end
631649
-- @func fn
632650
-- @param ... arguments for function
633651
function M.assert_error_msg_contains(expected_partial, fn, ...)
634-
local no_error, error_msg = pcall_check_trace(2, fn, ...)
652+
local no_error, error_msg = pcall_wrapper(2, fn, ...)
635653
log.info('Assert error message %s contains %s', error_msg, expected_partial)
636654
if no_error then
637655
local failure_message = string.format(
@@ -654,7 +672,7 @@ end
654672
-- @func fn
655673
-- @param ... arguments for function
656674
function M.assert_error_msg_matches(pattern, fn, ...)
657-
local no_error, error_msg = pcall_check_trace(2, fn, ...)
675+
local no_error, error_msg = pcall_wrapper(2, fn, ...)
658676
if no_error then
659677
local failure_message = string.format(
660678
'Function successfully returned: %s\nExpected error matching: %s',
@@ -694,7 +712,7 @@ end
694712
-- @func fn
695713
-- @param ... arguments for function
696714
function M.assert_error_covers(expected, fn, ...)
697-
local ok, actual = pcall_check_trace(2, fn, ...)
715+
local ok, actual = pcall_wrapper(2, fn, ...)
698716
if ok then
699717
fail_fmt(2, nil,
700718
'Function successfully returned: %s\nExpected error: %s',

test/helpers/general.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
local t = require('luatest')
22
local Runner = require('luatest.runner')
3-
local utils = require('luatest.utils')
43

54
local helper = {}
65

@@ -11,8 +10,9 @@ function helper.run_suite(load_tests, args)
1110
end
1211

1312
function helper.assert_failure(...)
14-
local err = t.assert_error(...)
15-
t.assert(utils.is_luatest_error(err), err)
13+
local ok, err = pcall(...)
14+
t.assert_not(ok)
15+
t.assert_covers(err, {class = 'LuatestError', status = 'fail'})
1616
return err
1717
end
1818

test/luaunit/assertions_error_test.lua

+20
Original file line numberDiff line numberDiff line change
@@ -276,3 +276,23 @@ function g.test_error_trace_check()
276276
assert_failure_contains('Unexpected error trace, expected:',
277277
t.assert_error, f_check_trace, 1)
278278
end
279+
280+
function g.test_luatest_error()
281+
local function raise(err)
282+
error({class = 'LuatestError', status = 'error', message = err})
283+
end
284+
t.assert_error(raise, 'foo')
285+
t.assert_error_msg_equals('foo', raise, 'foo')
286+
t.assert_error_msg_contains('foo', raise, 'foobar')
287+
t.assert_error_covers({foo = 'bar'}, raise, {foo = 'bar', fuzz = 'buzz'})
288+
289+
local msg = 'expected: a value evaluating to true, actual: false'
290+
assert_failure_equals(msg, t.assert_error,
291+
t.assert, false)
292+
assert_failure_equals(msg, t.assert_error_msg_equals, 'foo',
293+
t.assert, false)
294+
assert_failure_equals(msg, t.assert_error_msg_contains, 'foo',
295+
t.assert, false)
296+
assert_failure_equals(msg, t.assert_error_covers, {foo = 'bar'},
297+
t.assert, false)
298+
end

test/server_test.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ g.test_net_box_exec = function()
216216

217217
do
218218
local _l_fn, fn = l(), function() require('luatest').assert(false) end
219-
local err = t.assert_error(
219+
local err = helper.assert_failure(
220220
exec, fn
221221
)
222222
t.assert(utils.is_luatest_error(err), err)

0 commit comments

Comments
 (0)