Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp14633imm; Tue, 16 Oct 2018 16:55:40 -0700 (PDT) X-Google-Smtp-Source: ACcGV600+Aoa+rELS9o7lea0EqrGlM4BzaXq/OX7xWydy0vStd3LrTiBovInKkf8SRwy38E4zg42 X-Received: by 2002:aa7:850d:: with SMTP id v13-v6mr24562301pfn.83.1539734140920; Tue, 16 Oct 2018 16:55:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539734140; cv=none; d=google.com; s=arc-20160816; b=cgZ3lfwwhSMNQ8WxY6UH9uE/dg7D/mKGpajrmawDUtKTjcSq3dM4dYQuVeeBUBl746 52EOG4ziFbReoz+qmzeUYu/EJO9zU3fI4qdtSY49Wwm3T/LB2+sMUjAoFlYfwGOXcajq JxZgwgEzeMqei5d326gyeigINDiqGxHGTAjoctORCy6XcI+1Wu2wBfMKETJiCOPL9Bs/ 7Hsq1JqtRZAtIjoQU1wvOJL6PqSGBB5gQB1ZxFLoAK23MBPOOljy3VUKGTuqu3ULd96M 2ylRYBBhDnMaeb27jRc0Ie6fWZ7ABfZh5Hp+I7vlKA5+pxBE1qnwQ16PcxVK/qlCi+Vx EfiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=JQQypJJAnP+qflEUqHeoEbsw+NOpA25x72IRPpWFfJA=; b=HQBlRvv94/04SGstIYJuPl/lGaqwTIAIDZvyHA+4bGk406VCHC8497R3BQS6vTx1So SJVtsHohyD5TyYkGrWfiiznLGE6aFo2CAlLTn0yjDqXNvXzJaSjohQ8oF6jfCLAEAWlC q4YH6a8Ljzk10HvDnsVlVp5CJQWs63WTvMEATRlUGU5VEofLSHJVohx2bReay/6LxzVG dMMchQj/dz1m7tcFAV0zKqkN1doLEhrBy1HT/NloTW+34kAmOzkgmABFv4nspME0Mva8 ylpMLkFm/yQnziehgpxYd/GQTiAqXVT4veBxd5/wO1SnevLvrzJnQayO4syxgbbID7uQ sPsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=S8sUC5H0; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g16-v6si14752976pgi.329.2018.10.16.16.55.25; Tue, 16 Oct 2018 16:55:40 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=S8sUC5H0; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727829AbeJQHr0 (ORCPT + 99 others); Wed, 17 Oct 2018 03:47:26 -0400 Received: from mail-it1-f201.google.com ([209.85.166.201]:39638 "EHLO mail-it1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727088AbeJQHrZ (ORCPT ); Wed, 17 Oct 2018 03:47:25 -0400 Received: by mail-it1-f201.google.com with SMTP id h62-v6so258963itb.4 for ; Tue, 16 Oct 2018 16:54:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=JQQypJJAnP+qflEUqHeoEbsw+NOpA25x72IRPpWFfJA=; b=S8sUC5H0lz/9D9UvlvG5pDq8orOH5Gw7jK5Rn1lGsaYiVb8o+UYMu0DYMc40ewW3OG AfFWdGKpnlA53/s7mR+yqgKCmp4SA9qjvuQfZjRGqqw7T4qkGmC5VP+ViGez9hSx/4xu XtdqiAerQCxKR/Npt6f3+wTvILEVLuF2Uqpdz00GxYige47tiD9WIDSe/HJPU54FPqYT d5fQ0IAUGLMAqp6cGP1j+4+UemlZPAruB4NcPwC11cH/DrPipLKusIK2I7M+2Y9M30CS b9IjhWWSfhuG/o3uVuYgkefYl25nnW6nytosnUypbP7LsCWaJFOT4TC2OykloUkQd6mq j9hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=JQQypJJAnP+qflEUqHeoEbsw+NOpA25x72IRPpWFfJA=; b=i8lyN7HGLJR+mKWgicSiTctoPwLSkMOlPb2VZNWo7ILHzWb3LBsRa3tmm9ZRCWqxA6 /ZqR3hIoSNIrm0oT61/xnUkHn7hmXfRM6GQFPnxmUEl5stmt62TCo/dYGx27H/ZtcZ/D x2dtv0k7d/3JD9/DAuh8vuQqQFjvtpLJFCmBU6itLfld2uA+a6AjITJ+DXl4rdHXDqh5 fqAgtobZjhVKoYn/6dsXWcK9xsL0CLXRTfZPSggaX5jZRNQ9NyN34WLcspRaoj8Rx0zQ j50/Gu8oGt3jGitPffI1upWoDqhCh1VRpiswFr+SL4E+5m4UXCGmKOuubsN0bkGyJpXm OqjQ== X-Gm-Message-State: ABuFfohj+9060VYakYlomeMmk/zrUHfmqsQBR9MfmSyqecmV7qluUALP DQ4bm6ZwCoZu46rq2Lv/C9mUHTu2VzBx0CFY/B0/rg== X-Received: by 2002:a24:7f05:: with SMTP id r5-v6mr17839290itc.2.1539734075686; Tue, 16 Oct 2018 16:54:35 -0700 (PDT) Date: Tue, 16 Oct 2018 16:51:09 -0700 In-Reply-To: <20181016235120.138227-1-brendanhiggins@google.com> Message-Id: <20181016235120.138227-21-brendanhiggins@google.com> Mime-Version: 1.0 References: <20181016235120.138227-1-brendanhiggins@google.com> X-Mailer: git-send-email 2.19.1.331.ge82ca0e54c-goog Subject: [RFC v1 20/31] kunit: mock: add ability to mock functions with void context From: Brendan Higgins To: gregkh@linuxfoundation.org, keescook@google.com, mcgrof@kernel.org, shuah@kernel.org Cc: joel@jms.id.au, mpe@ellerman.id.au, joe@perches.com, brakmo@fb.com, rostedt@goodmis.org, Tim.Bird@sony.com, khilman@baylibre.com, julia.lawall@lip6.fr, linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com, linux-kernel@vger.kernel.org, jdike@addtoit.com, richard@nod.at, linux-um@lists.infradead.org, Brendan Higgins Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adds ability to mock functions with a void* context object. Signed-off-by: Brendan Higgins --- include/kunit/mock.h | 53 +++++++++++++++++++++++++++++++++++++++++ kunit/mock-macro-test.c | 30 +++++++++++++++++++++++ kunit/mock.c | 9 +++++++ 3 files changed, 92 insertions(+) diff --git a/include/kunit/mock.h b/include/kunit/mock.h index 8d155b27a257a..89e95b3fcf09e 100644 --- a/include/kunit/mock.h +++ b/include/kunit/mock.h @@ -381,6 +381,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 @@ -631,6 +649,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/kunit/mock-macro-test.c b/kunit/mock-macro-test.c index 84d9d3f484366..0f95105ec032a 100644 --- a/kunit/mock-macro-test.c +++ b/kunit/mock-macro-test.c @@ -48,8 +48,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__ @@ -195,6 +206,20 @@ 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 = TEST_EXPECT_CALL(test_void_ptr_func( + mock_get_ctrl(mock_void_ptr), + test_int_eq(test, 3))); + handle->action = test_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; @@ -208,6 +233,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; } @@ -220,6 +249,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/kunit/mock.c b/kunit/mock.c index 314cebb54e236..7a9fcf6ae4a55 100644 --- a/kunit/mock.c +++ b/kunit/mock.c @@ -8,6 +8,15 @@ #include +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, -- 2.19.1.331.ge82ca0e54c-goog