Skip to content

Commit

Permalink
kunit: mock: add basic matchers and actions
Browse files Browse the repository at this point in the history
Add basic matchers and actions needed for any kind of mocking to be
useful; these matchers and actions are how expectations for mocks are
described: what calls the mocks are expected to receive, and what the
mock should do under those circumstances.

Co-developed-by: Daniel Latypov <dlatypov@google.com>
Signed-off-by: Daniel Latypov <dlatypov@google.com>
Signed-off-by: Brendan Higgins <brendanhiggins@google.com>
  • Loading branch information
bjh83 authored and intel-lab-lkp committed Sep 18, 2020
1 parent 0eab019 commit 32db033
Show file tree
Hide file tree
Showing 3 changed files with 494 additions and 0 deletions.
222 changes: 222 additions & 0 deletions include/kunit/mock.h
Expand Up @@ -123,4 +123,226 @@ struct mock_expectation *mock_add_matcher(struct mock *mock,
struct mock_param_matcher *matchers[],
int len);

#define CONVERT_TO_ACTUAL_TYPE(type, ptr) (*((type *) ptr))

/**
* DOC: Built In Matchers
*
* These are the matchers that can be used when matching arguments in
* :c:func:`KUNIT_EXPECT_CALL` (more can be defined manually).
*
* For example, there's a matcher that matches any arguments:
*
* .. code-block:: c
*
* struct mock_param_matcher *any(struct kunit *test);
*
* There are matchers for integers based on the binary condition:
*
* * eq: equals to
* * ne: not equal to
* * lt: less than
* * le: less than or equal to
* * gt: greater than
* * ge: greater than or equal to
*
* .. code-block:: c
*
* struct mock_param_matcher *kunit_int_eq(struct kunit *test, int expected);
* struct mock_param_matcher *kunit_int_ne(struct kunit *test, int expected);
* struct mock_param_matcher *kunit_int_lt(struct kunit *test, int expected);
* struct mock_param_matcher *kunit_int_le(struct kunit *test, int expected);
* struct mock_param_matcher *kunit_int_gt(struct kunit *test, int expected);
* struct mock_param_matcher *kunit_int_ge(struct kunit *test, int expected);
*
* For a detailed list, please see
* ``include/linux/mock.h``.
*/

/* Matches any argument */
struct mock_param_matcher *kunit_any(struct kunit *test);

/*
* Matches different types of integers, the argument is compared to the
* `expected` field, based on the comparison defined.
*/
struct mock_param_matcher *kunit_u8_eq(struct kunit *test, u8 expected);
struct mock_param_matcher *kunit_u8_ne(struct kunit *test, u8 expected);
struct mock_param_matcher *kunit_u8_le(struct kunit *test, u8 expected);
struct mock_param_matcher *kunit_u8_lt(struct kunit *test, u8 expected);
struct mock_param_matcher *kunit_u8_ge(struct kunit *test, u8 expected);
struct mock_param_matcher *kunit_u8_gt(struct kunit *test, u8 expected);

struct mock_param_matcher *kunit_u16_eq(struct kunit *test, u16 expected);
struct mock_param_matcher *kunit_u16_ne(struct kunit *test, u16 expected);
struct mock_param_matcher *kunit_u16_le(struct kunit *test, u16 expected);
struct mock_param_matcher *kunit_u16_lt(struct kunit *test, u16 expected);
struct mock_param_matcher *kunit_u16_ge(struct kunit *test, u16 expected);
struct mock_param_matcher *kunit_u16_gt(struct kunit *test, u16 expected);

struct mock_param_matcher *kunit_u32_eq(struct kunit *test, u32 expected);
struct mock_param_matcher *kunit_u32_ne(struct kunit *test, u32 expected);
struct mock_param_matcher *kunit_u32_le(struct kunit *test, u32 expected);
struct mock_param_matcher *kunit_u32_lt(struct kunit *test, u32 expected);
struct mock_param_matcher *kunit_u32_ge(struct kunit *test, u32 expected);
struct mock_param_matcher *kunit_u32_gt(struct kunit *test, u32 expected);

struct mock_param_matcher *kunit_u64_eq(struct kunit *test, u64 expected);
struct mock_param_matcher *kunit_u64_ne(struct kunit *test, u64 expected);
struct mock_param_matcher *kunit_u64_le(struct kunit *test, u64 expected);
struct mock_param_matcher *kunit_u64_lt(struct kunit *test, u64 expected);
struct mock_param_matcher *kunit_u64_ge(struct kunit *test, u64 expected);
struct mock_param_matcher *kunit_u64_gt(struct kunit *test, u64 expected);

struct mock_param_matcher *kunit_char_eq(struct kunit *test, char expected);
struct mock_param_matcher *kunit_char_ne(struct kunit *test, char expected);
struct mock_param_matcher *kunit_char_le(struct kunit *test, char expected);
struct mock_param_matcher *kunit_char_lt(struct kunit *test, char expected);
struct mock_param_matcher *kunit_char_ge(struct kunit *test, char expected);
struct mock_param_matcher *kunit_char_gt(struct kunit *test, char expected);

struct mock_param_matcher *kunit_uchar_eq(struct kunit *test,
unsigned char expected);
struct mock_param_matcher *kunit_uchar_ne(struct kunit *test,
unsigned char expected);
struct mock_param_matcher *kunit_uchar_le(struct kunit *test,
unsigned char expected);
struct mock_param_matcher *kunit_uchar_lt(struct kunit *test,
unsigned char expected);
struct mock_param_matcher *kunit_uchar_ge(struct kunit *test,
unsigned char expected);
struct mock_param_matcher *kunit_uchar_gt(struct kunit *test,
unsigned char expected);

struct mock_param_matcher *kunit_schar_eq(struct kunit *test,
signed char expected);
struct mock_param_matcher *kunit_schar_ne(struct kunit *test,
signed char expected);
struct mock_param_matcher *kunit_schar_le(struct kunit *test,
signed char expected);
struct mock_param_matcher *kunit_schar_lt(struct kunit *test,
signed char expected);
struct mock_param_matcher *kunit_schar_ge(struct kunit *test,
signed char expected);
struct mock_param_matcher *kunit_schar_gt(struct kunit *test,
signed char expected);

struct mock_param_matcher *kunit_short_eq(struct kunit *test, short expected);
struct mock_param_matcher *kunit_short_ne(struct kunit *test, short expected);
struct mock_param_matcher *kunit_short_le(struct kunit *test, short expected);
struct mock_param_matcher *kunit_short_lt(struct kunit *test, short expected);
struct mock_param_matcher *kunit_short_ge(struct kunit *test, short expected);
struct mock_param_matcher *kunit_short_gt(struct kunit *test, short expected);

struct mock_param_matcher *kunit_ushort_eq(struct kunit *test,
unsigned short expected);
struct mock_param_matcher *kunit_ushort_ne(struct kunit *test,
unsigned short expected);
struct mock_param_matcher *kunit_ushort_le(struct kunit *test,
unsigned short expected);
struct mock_param_matcher *kunit_ushort_lt(struct kunit *test,
unsigned short expected);
struct mock_param_matcher *kunit_ushort_ge(struct kunit *test,
unsigned short expected);
struct mock_param_matcher *kunit_ushort_gt(struct kunit *test,
unsigned short expected);

struct mock_param_matcher *kunit_int_eq(struct kunit *test, int expected);
struct mock_param_matcher *kunit_int_ne(struct kunit *test, int expected);
struct mock_param_matcher *kunit_int_lt(struct kunit *test, int expected);
struct mock_param_matcher *kunit_int_le(struct kunit *test, int expected);
struct mock_param_matcher *kunit_int_gt(struct kunit *test, int expected);
struct mock_param_matcher *kunit_int_ge(struct kunit *test, int expected);

struct mock_param_matcher *kunit_uint_eq(struct kunit *test,
unsigned int expected);
struct mock_param_matcher *kunit_uint_ne(struct kunit *test,
unsigned int expected);
struct mock_param_matcher *kunit_uint_lt(struct kunit *test,
unsigned int expected);
struct mock_param_matcher *kunit_uint_le(struct kunit *test,
unsigned int expected);
struct mock_param_matcher *kunit_uint_gt(struct kunit *test,
unsigned int expected);
struct mock_param_matcher *kunit_uint_ge(struct kunit *test,
unsigned int expected);

struct mock_param_matcher *kunit_long_eq(struct kunit *test, long expected);
struct mock_param_matcher *kunit_long_ne(struct kunit *test, long expected);
struct mock_param_matcher *kunit_long_le(struct kunit *test, long expected);
struct mock_param_matcher *kunit_long_lt(struct kunit *test, long expected);
struct mock_param_matcher *kunit_long_ge(struct kunit *test, long expected);
struct mock_param_matcher *kunit_long_gt(struct kunit *test, long expected);

struct mock_param_matcher *kunit_ulong_eq(struct kunit *test,
unsigned long expected);
struct mock_param_matcher *kunit_ulong_ne(struct kunit *test,
unsigned long expected);
struct mock_param_matcher *kunit_ulong_le(struct kunit *test,
unsigned long expected);
struct mock_param_matcher *kunit_ulong_lt(struct kunit *test,
unsigned long expected);
struct mock_param_matcher *kunit_ulong_ge(struct kunit *test,
unsigned long expected);
struct mock_param_matcher *kunit_ulong_gt(struct kunit *test,
unsigned long expected);

struct mock_param_matcher *kunit_longlong_eq(struct kunit *test,
long long expected);
struct mock_param_matcher *kunit_longlong_ne(struct kunit *test,
long long expected);
struct mock_param_matcher *kunit_longlong_le(struct kunit *test,
long long expected);
struct mock_param_matcher *kunit_longlong_lt(struct kunit *test,
long long expected);
struct mock_param_matcher *kunit_longlong_ge(struct kunit *test,
long long expected);
struct mock_param_matcher *kunit_longlong_gt(struct kunit *test,
long long expected);

struct mock_param_matcher *kunit_ulonglong_eq(struct kunit *test,
unsigned long long expected);
struct mock_param_matcher *kunit_ulonglong_ne(struct kunit *test,
unsigned long long expected);
struct mock_param_matcher *kunit_ulonglong_le(struct kunit *test,
unsigned long long expected);
struct mock_param_matcher *kunit_ulonglong_lt(struct kunit *test,
unsigned long long expected);
struct mock_param_matcher *kunit_ulonglong_ge(struct kunit *test,
unsigned long long expected);
struct mock_param_matcher *kunit_ulonglong_gt(struct kunit *test,
unsigned long long expected);

/* Matches pointers. */
struct mock_param_matcher *kunit_ptr_eq(struct kunit *test, void *expected);
struct mock_param_matcher *kunit_ptr_ne(struct kunit *test, void *expected);
struct mock_param_matcher *kunit_ptr_lt(struct kunit *test, void *expected);
struct mock_param_matcher *kunit_ptr_le(struct kunit *test, void *expected);
struct mock_param_matcher *kunit_ptr_gt(struct kunit *test, void *expected);
struct mock_param_matcher *kunit_ptr_ge(struct kunit *test, void *expected);

/* Matches memory sections and strings. */
struct mock_param_matcher *kunit_memeq(struct kunit *test,
const void *buf,
size_t size);
struct mock_param_matcher *kunit_streq(struct kunit *test, const char *str);

struct mock_action *kunit_u8_return(struct kunit *test, u8 ret);
struct mock_action *kunit_u16_return(struct kunit *test, u16 ret);
struct mock_action *kunit_u32_return(struct kunit *test, u32 ret);
struct mock_action *kunit_u64_return(struct kunit *test, u64 ret);
struct mock_action *kunit_char_return(struct kunit *test, char ret);
struct mock_action *kunit_uchar_return(struct kunit *test, unsigned char ret);
struct mock_action *kunit_schar_return(struct kunit *test, signed char ret);
struct mock_action *kunit_short_return(struct kunit *test, short ret);
struct mock_action *kunit_ushort_return(struct kunit *test, unsigned short ret);
struct mock_action *kunit_int_return(struct kunit *test, int ret);
struct mock_action *kunit_uint_return(struct kunit *test, unsigned int ret);
struct mock_action *kunit_long_return(struct kunit *test, long ret);
struct mock_action *kunit_ulong_return(struct kunit *test, unsigned long ret);
struct mock_action *kunit_longlong_return(struct kunit *test, long long ret);
struct mock_action *kunit_ulonglong_return(struct kunit *test,
unsigned long long ret);
struct mock_action *kunit_ptr_return(struct kunit *test, void *ret);

#endif /* _KUNIT_MOCK_H */
1 change: 1 addition & 0 deletions lib/kunit/Makefile
Expand Up @@ -2,6 +2,7 @@ obj-$(CONFIG_KUNIT) += kunit.o

kunit-objs += test.o \
mock.o \
common-mocks.o \
string-stream.o \
assert.o \
kunit-stream.o \
Expand Down

0 comments on commit 32db033

Please sign in to comment.