kunit: mock: add ability to mock functions with void context Adds ability to mock functions with a void* context object. Change-Id: I1e2f6ba92809d9160b4d5b40f36f7423d3164e32 Signed-off-by: Brendan Higgins <brendanhiggins@google.com>
diff --git a/include/test/mock.h b/include/test/mock.h index 8910957..86df5e9 100644 --- a/include/test/mock.h +++ b/include/test/mock.h
@@ -371,6 +371,24 @@ static inline bool is_naggy_mock(struct mock *mock) struct MOCK(struct_name) *MOCK_INIT_ID(struct_name)( \ struct test *test) +#define DECLARE_VOID_CLASS_MOCK_HANDLE_INDEX_INTERNAL(name, \ + handle_index, \ + return_type, \ + param_types...) \ + DECLARE_MOCK_COMMON(name, \ + handle_index, \ + return_type, \ + param_types) + +#define DECLARE_VOID_CLASS_MOCK_HANDLE_INDEX(name, \ + handle_index, \ + return_type, \ + param_types...) \ + DECLARE_VOID_CLASS_MOCK_HANDLE_INDEX_INTERNAL(name, \ + handle_index, \ + return_type, \ + param_types) + /** * CONSTRUCT_MOCK() * @struct_name: name of the class @@ -621,6 +639,41 @@ static inline bool is_naggy_mock(struct mock *mock) return mock_obj; \ } +struct MOCK(void) { + struct mock ctrl; + void *trgt; +}; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" +static inline struct mock *from_void_ptr_to_mock(const void *ptr) +{ + struct MOCK(void) *mock_void_ptr = ptr; + + return mock_get_ctrl(mock_void_ptr); +} +#pragma GCC diagnostic pop + +#define DEFINE_VOID_CLASS_MOCK_HANDLE_INDEX_INTERNAL(name, \ + handle_index, \ + return_type, \ + param_types...) \ + DEFINE_MOCK_COMMON(name, \ + handle_index, \ + from_void_ptr_to_mock, \ + return_type, \ + param_types) +#define DEFINE_VOID_CLASS_MOCK_HANDLE_INDEX(name, \ + handle_index, \ + return_type, \ + param_types...) \ + DEFINE_VOID_CLASS_MOCK_HANDLE_INDEX_INTERNAL(name, \ + handle_index, \ + return_type, \ + param_types) + +DECLARE_STRUCT_CLASS_MOCK_INIT(void); + #define CONVERT_TO_ACTUAL_TYPE(type, ptr) (*((type *) ptr)) /**
diff --git a/test/mock-macro-test.c b/test/mock-macro-test.c index 48d9478..d675d1d 100644 --- a/test/mock-macro-test.c +++ b/test/mock-macro-test.c
@@ -39,8 +39,19 @@ static int test_struct_init(struct MOCK(test_struct) *mock_test_struct) DEFINE_STRUCT_CLASS_MOCK_INIT(test_struct, test_struct_init); +DECLARE_VOID_CLASS_MOCK_HANDLE_INDEX(METHOD(test_void_ptr_func), + HANDLE_INDEX(0), + RETURNS(int), + PARAMS(void*, int)); + +DEFINE_VOID_CLASS_MOCK_HANDLE_INDEX(METHOD(test_void_ptr_func), + HANDLE_INDEX(0), + RETURNS(int), + PARAMS(void*, int)); + struct mock_macro_context { struct MOCK(test_struct) *mock_test_struct; + struct MOCK(void) *mock_void_ptr; }; #define TO_STR_INTERNAL(...) #__VA_ARGS__ @@ -176,6 +187,19 @@ static void mock_macro_test_generated_method_code_works(struct test *test) test_struct->non_first_slot_param(5, test_struct); } +static void mock_macro_test_generated_method_void_code_works(struct test *test) +{ + struct mock_macro_context *ctx = test->priv; + struct MOCK(void) *mock_void_ptr = ctx->mock_void_ptr; + struct mock_expectation *handle; + + handle = EXPECT_CALL(test_void_ptr_func(mock_get_ctrl(mock_void_ptr), + int_eq(test, 3))); + handle->action = int_return(test, 0); + + test_void_ptr_func(mock_void_ptr, 3); +} + static int mock_macro_test_init(struct test *test) { struct mock_macro_context *ctx; @@ -189,6 +213,10 @@ static int mock_macro_test_init(struct test *test) if (!ctx->mock_test_struct) return -EINVAL; + ctx->mock_void_ptr = CONSTRUCT_MOCK(void, test); + if (!ctx->mock_void_ptr) + return -EINVAL; + return 0; } @@ -201,6 +229,7 @@ static struct test_case mock_macro_test_cases[] = { TEST_CASE(mock_macro_param_list_from_types_basic), TEST_CASE(mock_macro_arg_names_from_types), TEST_CASE(mock_macro_test_generated_method_code_works), + TEST_CASE(mock_macro_test_generated_method_void_code_works), {}, };
diff --git a/test/mock.c b/test/mock.c index f55f488..25bf6fe 100644 --- a/test/mock.c +++ b/test/mock.c
@@ -1,5 +1,14 @@ #include <test/mock.h> +static int mock_void_ptr_init(struct MOCK(void) *mock_void_ptr) +{ + mock_void_ptr->trgt = mock_void_ptr; + + return 0; +} + +DEFINE_STRUCT_CLASS_MOCK_INIT(void, mock_void_ptr_init); + static bool mock_match_params(struct mock_matcher *matcher, struct test_stream *stream, const void **params,