kunit: test: add the concept of expectations

Add support for expectations, which allow properties to be specified and
then verified in tests.

Signed-off-by: Brendan Higgins <brendanhiggins@google.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
Brendan Higgins 2019-09-23 02:02:35 -07:00 committed by Shuah Khan
parent 6b229e593f
commit 73cda7bb8b
2 changed files with 898 additions and 0 deletions

View File

@ -9,6 +9,8 @@
#ifndef _KUNIT_TEST_H
#define _KUNIT_TEST_H
#include <kunit/assert.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>
@ -372,4 +374,838 @@ void __printf(3, 4) kunit_printk(const char *level,
#define kunit_err(test, fmt, ...) \
kunit_printk(KERN_ERR, test, fmt, ##__VA_ARGS__)
/**
* KUNIT_SUCCEED() - A no-op expectation. Only exists for code clarity.
* @test: The test context object.
*
* The opposite of KUNIT_FAIL(), it is an expectation that cannot fail. In other
* words, it does nothing and only exists for code clarity. See
* KUNIT_EXPECT_TRUE() for more information.
*/
#define KUNIT_SUCCEED(test) do {} while (0)
void kunit_do_assertion(struct kunit *test,
struct kunit_assert *assert,
bool pass,
const char *fmt, ...);
#define KUNIT_ASSERTION(test, pass, assert_class, INITIALIZER, fmt, ...) do { \
struct assert_class __assertion = INITIALIZER; \
kunit_do_assertion(test, \
&__assertion.assert, \
pass, \
fmt, \
##__VA_ARGS__); \
} while (0)
#define KUNIT_FAIL_ASSERTION(test, assert_type, fmt, ...) \
KUNIT_ASSERTION(test, \
false, \
kunit_fail_assert, \
KUNIT_INIT_FAIL_ASSERT_STRUCT(test, assert_type), \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_FAIL() - Always causes a test to fail when evaluated.
* @test: The test context object.
* @fmt: an informational message to be printed when the assertion is made.
* @...: string format arguments.
*
* The opposite of KUNIT_SUCCEED(), it is an expectation that always fails. In
* other words, it always results in a failed expectation, and consequently
* always causes the test case to fail when evaluated. See KUNIT_EXPECT_TRUE()
* for more information.
*/
#define KUNIT_FAIL(test, fmt, ...) \
KUNIT_FAIL_ASSERTION(test, \
KUNIT_EXPECTATION, \
fmt, \
##__VA_ARGS__)
#define KUNIT_UNARY_ASSERTION(test, \
assert_type, \
condition, \
expected_true, \
fmt, \
...) \
KUNIT_ASSERTION(test, \
!!(condition) == !!expected_true, \
kunit_unary_assert, \
KUNIT_INIT_UNARY_ASSERT_STRUCT(test, \
assert_type, \
#condition, \
expected_true), \
fmt, \
##__VA_ARGS__)
#define KUNIT_TRUE_MSG_ASSERTION(test, assert_type, condition, fmt, ...) \
KUNIT_UNARY_ASSERTION(test, \
assert_type, \
condition, \
true, \
fmt, \
##__VA_ARGS__)
#define KUNIT_TRUE_ASSERTION(test, assert_type, condition) \
KUNIT_TRUE_MSG_ASSERTION(test, assert_type, condition, NULL)
#define KUNIT_FALSE_MSG_ASSERTION(test, assert_type, condition, fmt, ...) \
KUNIT_UNARY_ASSERTION(test, \
assert_type, \
condition, \
false, \
fmt, \
##__VA_ARGS__)
#define KUNIT_FALSE_ASSERTION(test, assert_type, condition) \
KUNIT_FALSE_MSG_ASSERTION(test, assert_type, condition, NULL)
/*
* A factory macro for defining the assertions and expectations for the basic
* comparisons defined for the built in types.
*
* Unfortunately, there is no common type that all types can be promoted to for
* which all the binary operators behave the same way as for the actual types
* (for example, there is no type that long long and unsigned long long can
* both be cast to where the comparison result is preserved for all values). So
* the best we can do is do the comparison in the original types and then coerce
* everything to long long for printing; this way, the comparison behaves
* correctly and the printed out value usually makes sense without
* interpretation, but can always be interpreted to figure out the actual
* value.
*/
#define KUNIT_BASE_BINARY_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, \
op, \
right, \
fmt, \
...) \
do { \
typeof(left) __left = (left); \
typeof(right) __right = (right); \
((void)__typecheck(__left, __right)); \
\
KUNIT_ASSERTION(test, \
__left op __right, \
assert_class, \
ASSERT_CLASS_INIT(test, \
assert_type, \
#op, \
#left, \
__left, \
#right, \
__right), \
fmt, \
##__VA_ARGS__); \
} while (0)
#define KUNIT_BASE_EQ_MSG_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_BINARY_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, ==, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BASE_NE_MSG_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_BINARY_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, !=, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BASE_LT_MSG_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_BINARY_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, <, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BASE_LE_MSG_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_BINARY_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, <=, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BASE_GT_MSG_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_BINARY_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, >, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BASE_GE_MSG_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_BINARY_ASSERTION(test, \
assert_class, \
ASSERT_CLASS_INIT, \
assert_type, \
left, >=, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_EQ_MSG_ASSERTION(test, assert_type, left, right, fmt, ...)\
KUNIT_BASE_EQ_MSG_ASSERTION(test, \
kunit_binary_assert, \
KUNIT_INIT_BINARY_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_EQ_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_EQ_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_PTR_EQ_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_EQ_MSG_ASSERTION(test, \
kunit_binary_ptr_assert, \
KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_PTR_EQ_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_PTR_EQ_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_NE_MSG_ASSERTION(test, assert_type, left, right, fmt, ...)\
KUNIT_BASE_NE_MSG_ASSERTION(test, \
kunit_binary_assert, \
KUNIT_INIT_BINARY_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_NE_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_NE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_PTR_NE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_NE_MSG_ASSERTION(test, \
kunit_binary_ptr_assert, \
KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_PTR_NE_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_PTR_NE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_LT_MSG_ASSERTION(test, assert_type, left, right, fmt, ...)\
KUNIT_BASE_LT_MSG_ASSERTION(test, \
kunit_binary_assert, \
KUNIT_INIT_BINARY_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_LT_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_LT_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_PTR_LT_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_LT_MSG_ASSERTION(test, \
kunit_binary_ptr_assert, \
KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_PTR_LT_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_PTR_LT_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_LE_MSG_ASSERTION(test, assert_type, left, right, fmt, ...)\
KUNIT_BASE_LE_MSG_ASSERTION(test, \
kunit_binary_assert, \
KUNIT_INIT_BINARY_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_LE_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_LE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_PTR_LE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_LE_MSG_ASSERTION(test, \
kunit_binary_ptr_assert, \
KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_PTR_LE_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_PTR_LE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_GT_MSG_ASSERTION(test, assert_type, left, right, fmt, ...)\
KUNIT_BASE_GT_MSG_ASSERTION(test, \
kunit_binary_assert, \
KUNIT_INIT_BINARY_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_GT_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_GT_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_PTR_GT_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_GT_MSG_ASSERTION(test, \
kunit_binary_ptr_assert, \
KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_PTR_GT_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_PTR_GT_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_GE_MSG_ASSERTION(test, assert_type, left, right, fmt, ...)\
KUNIT_BASE_GE_MSG_ASSERTION(test, \
kunit_binary_assert, \
KUNIT_INIT_BINARY_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_GE_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_GE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_PTR_GE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BASE_GE_MSG_ASSERTION(test, \
kunit_binary_ptr_assert, \
KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT, \
assert_type, \
left, \
right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_PTR_GE_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_PTR_GE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_STR_ASSERTION(test, \
assert_type, \
left, \
op, \
right, \
fmt, \
...) \
do { \
typeof(left) __left = (left); \
typeof(right) __right = (right); \
\
KUNIT_ASSERTION(test, \
strcmp(__left, __right) op 0, \
kunit_binary_str_assert, \
KUNIT_INIT_BINARY_ASSERT_STRUCT(test, \
assert_type, \
#op, \
#left, \
__left, \
#right, \
__right), \
fmt, \
##__VA_ARGS__); \
} while (0)
#define KUNIT_BINARY_STR_EQ_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BINARY_STR_ASSERTION(test, \
assert_type, \
left, ==, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_STR_EQ_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_STR_EQ_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_BINARY_STR_NE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
fmt, \
...) \
KUNIT_BINARY_STR_ASSERTION(test, \
assert_type, \
left, !=, right, \
fmt, \
##__VA_ARGS__)
#define KUNIT_BINARY_STR_NE_ASSERTION(test, assert_type, left, right) \
KUNIT_BINARY_STR_NE_MSG_ASSERTION(test, \
assert_type, \
left, \
right, \
NULL)
#define KUNIT_PTR_NOT_ERR_OR_NULL_MSG_ASSERTION(test, \
assert_type, \
ptr, \
fmt, \
...) \
do { \
typeof(ptr) __ptr = (ptr); \
\
KUNIT_ASSERTION(test, \
!IS_ERR_OR_NULL(__ptr), \
kunit_ptr_not_err_assert, \
KUNIT_INIT_PTR_NOT_ERR_STRUCT(test, \
assert_type, \
#ptr, \
__ptr), \
fmt, \
##__VA_ARGS__); \
} while (0)
#define KUNIT_PTR_NOT_ERR_OR_NULL_ASSERTION(test, assert_type, ptr) \
KUNIT_PTR_NOT_ERR_OR_NULL_MSG_ASSERTION(test, \
assert_type, \
ptr, \
NULL)
/**
* KUNIT_EXPECT_TRUE() - Causes a test failure when the expression is not true.
* @test: The test context object.
* @condition: an arbitrary boolean expression. The test fails when this does
* not evaluate to true.
*
* This and expectations of the form `KUNIT_EXPECT_*` will cause the test case
* to fail when the specified condition is not met; however, it will not prevent
* the test case from continuing to run; this is otherwise known as an
* *expectation failure*.
*/
#define KUNIT_EXPECT_TRUE(test, condition) \
KUNIT_TRUE_ASSERTION(test, KUNIT_EXPECTATION, condition)
#define KUNIT_EXPECT_TRUE_MSG(test, condition, fmt, ...) \
KUNIT_TRUE_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
condition, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_FALSE() - Makes a test failure when the expression is not false.
* @test: The test context object.
* @condition: an arbitrary boolean expression. The test fails when this does
* not evaluate to false.
*
* Sets an expectation that @condition evaluates to false. See
* KUNIT_EXPECT_TRUE() for more information.
*/
#define KUNIT_EXPECT_FALSE(test, condition) \
KUNIT_FALSE_ASSERTION(test, KUNIT_EXPECTATION, condition)
#define KUNIT_EXPECT_FALSE_MSG(test, condition, fmt, ...) \
KUNIT_FALSE_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
condition, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_EQ() - Sets an expectation that @left and @right are equal.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a primitive C type.
* @right: an arbitrary expression that evaluates to a primitive C type.
*
* Sets an expectation that the values that @left and @right evaluate to are
* equal. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, (@left) == (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_EQ(test, left, right) \
KUNIT_BINARY_EQ_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_EQ_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_EQ_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_PTR_EQ() - Expects that pointers @left and @right are equal.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a pointer.
* @right: an arbitrary expression that evaluates to a pointer.
*
* Sets an expectation that the values that @left and @right evaluate to are
* equal. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, (@left) == (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_PTR_EQ(test, left, right) \
KUNIT_BINARY_PTR_EQ_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right)
#define KUNIT_EXPECT_PTR_EQ_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_PTR_EQ_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_NE() - An expectation that @left and @right are not equal.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a primitive C type.
* @right: an arbitrary expression that evaluates to a primitive C type.
*
* Sets an expectation that the values that @left and @right evaluate to are not
* equal. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, (@left) != (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_NE(test, left, right) \
KUNIT_BINARY_NE_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_NE_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_NE_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_PTR_NE() - Expects that pointers @left and @right are not equal.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a pointer.
* @right: an arbitrary expression that evaluates to a pointer.
*
* Sets an expectation that the values that @left and @right evaluate to are not
* equal. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, (@left) != (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_PTR_NE(test, left, right) \
KUNIT_BINARY_PTR_NE_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right)
#define KUNIT_EXPECT_PTR_NE_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_PTR_NE_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_LT() - An expectation that @left is less than @right.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a primitive C type.
* @right: an arbitrary expression that evaluates to a primitive C type.
*
* Sets an expectation that the value that @left evaluates to is less than the
* value that @right evaluates to. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, (@left) < (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_LT(test, left, right) \
KUNIT_BINARY_LT_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_LT_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_LT_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_LE() - Expects that @left is less than or equal to @right.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a primitive C type.
* @right: an arbitrary expression that evaluates to a primitive C type.
*
* Sets an expectation that the value that @left evaluates to is less than or
* equal to the value that @right evaluates to. Semantically this is equivalent
* to KUNIT_EXPECT_TRUE(@test, (@left) <= (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_LE(test, left, right) \
KUNIT_BINARY_LE_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_LE_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_LE_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_GT() - An expectation that @left is greater than @right.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a primitive C type.
* @right: an arbitrary expression that evaluates to a primitive C type.
*
* Sets an expectation that the value that @left evaluates to is greater than
* the value that @right evaluates to. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, (@left) > (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_GT(test, left, right) \
KUNIT_BINARY_GT_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_GT_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_GT_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_GE() - Expects that @left is greater than or equal to @right.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a primitive C type.
* @right: an arbitrary expression that evaluates to a primitive C type.
*
* Sets an expectation that the value that @left evaluates to is greater than
* the value that @right evaluates to. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, (@left) >= (@right)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_GE(test, left, right) \
KUNIT_BINARY_GE_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_GE_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_GE_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_STREQ() - Expects that strings @left and @right are equal.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a null terminated string.
* @right: an arbitrary expression that evaluates to a null terminated string.
*
* Sets an expectation that the values that @left and @right evaluate to are
* equal. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, !strcmp((@left), (@right))). See KUNIT_EXPECT_TRUE()
* for more information.
*/
#define KUNIT_EXPECT_STREQ(test, left, right) \
KUNIT_BINARY_STR_EQ_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_STREQ_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_STR_EQ_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_STRNEQ() - Expects that strings @left and @right are not equal.
* @test: The test context object.
* @left: an arbitrary expression that evaluates to a null terminated string.
* @right: an arbitrary expression that evaluates to a null terminated string.
*
* Sets an expectation that the values that @left and @right evaluate to are
* not equal. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, strcmp((@left), (@right))). See KUNIT_EXPECT_TRUE()
* for more information.
*/
#define KUNIT_EXPECT_STRNEQ(test, left, right) \
KUNIT_BINARY_STR_NE_ASSERTION(test, KUNIT_EXPECTATION, left, right)
#define KUNIT_EXPECT_STRNEQ_MSG(test, left, right, fmt, ...) \
KUNIT_BINARY_STR_NE_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
left, \
right, \
fmt, \
##__VA_ARGS__)
/**
* KUNIT_EXPECT_NOT_ERR_OR_NULL() - Expects that @ptr is not null and not err.
* @test: The test context object.
* @ptr: an arbitrary pointer.
*
* Sets an expectation that the value that @ptr evaluates to is not null and not
* an errno stored in a pointer. This is semantically equivalent to
* KUNIT_EXPECT_TRUE(@test, !IS_ERR_OR_NULL(@ptr)). See KUNIT_EXPECT_TRUE() for
* more information.
*/
#define KUNIT_EXPECT_NOT_ERR_OR_NULL(test, ptr) \
KUNIT_PTR_NOT_ERR_OR_NULL_ASSERTION(test, KUNIT_EXPECTATION, ptr)
#define KUNIT_EXPECT_NOT_ERR_OR_NULL_MSG(test, ptr, fmt, ...) \
KUNIT_PTR_NOT_ERR_OR_NULL_MSG_ASSERTION(test, \
KUNIT_EXPECTATION, \
ptr, \
fmt, \
##__VA_ARGS__)
#endif /* _KUNIT_TEST_H */

View File

@ -120,6 +120,68 @@ static void kunit_print_test_case_ok_not_ok(struct kunit_case *test_case,
test_case->name);
}
static void kunit_print_string_stream(struct kunit *test,
struct string_stream *stream)
{
struct string_stream_fragment *fragment;
char *buf;
buf = string_stream_get_string(stream);
if (!buf) {
kunit_err(test,
"Could not allocate buffer, dumping stream:\n");
list_for_each_entry(fragment, &stream->fragments, node) {
kunit_err(test, fragment->fragment);
}
kunit_err(test, "\n");
} else {
kunit_err(test, buf);
kunit_kfree(test, buf);
}
}
static void kunit_fail(struct kunit *test, struct kunit_assert *assert)
{
struct string_stream *stream;
kunit_set_failure(test);
stream = alloc_string_stream(test, GFP_KERNEL);
if (!stream) {
WARN(true,
"Could not allocate stream to print failed assertion in %s:%d\n",
assert->file,
assert->line);
return;
}
assert->format(assert, stream);
kunit_print_string_stream(test, stream);
WARN_ON(string_stream_destroy(stream));
}
void kunit_do_assertion(struct kunit *test,
struct kunit_assert *assert,
bool pass,
const char *fmt, ...)
{
va_list args;
if (pass)
return;
va_start(args, fmt);
assert->message.fmt = fmt;
assert->message.va = &args;
kunit_fail(test, assert);
va_end(args);
}
void kunit_init_test(struct kunit *test, const char *name)
{
spin_lock_init(&test->lock);