From: Brendan Higgins <brendanhiggins@google.com> To: frowand.list@gmail.com, gregkh@linuxfoundation.org, jpoimboe@redhat.com, keescook@google.com, kieran.bingham@ideasonboard.com, mcgrof@kernel.org, peterz@infradead.org, robh@kernel.org, sboyd@kernel.org, shuah@kernel.org, tytso@mit.edu, yamada.masahiro@socionext.com Cc: devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org, kunit-dev@googlegroups.com, linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-nvdimm@lists.01.org, linux-um@lists.infradead.org, Alexander.Levin@microsoft.com, Tim.Bird@sony.com, amir73il@gmail.com, dan.carpenter@oracle.com, daniel@ffwll.ch, jdike@addtoit.com, joel@jms.id.au, julia.lawall@lip6.fr, khilman@baylibre.com, knut.omang@oracle.com, logang@deltatee.com, mpe@ellerman.id.au, pmladek@suse.com, rdunlap@infradead.org, richard@nod.at, rientjes@google.com, rostedt@goodmis.org, wfg@linux.intel.com, Avinash Kondareddy <akndr41@gmail.com>, Brendan Higgins <brendanhiggins@google.com> Subject: [PATCH v14 12/18] kunit: test: add tests for KUnit managed resources Date: Tue, 20 Aug 2019 16:20:40 -0700 [thread overview] Message-ID: <20190820232046.50175-13-brendanhiggins@google.com> (raw) In-Reply-To: <20190820232046.50175-1-brendanhiggins@google.com> From: Avinash Kondareddy <akndr41@gmail.com> Add unit tests for KUnit managed resources. KUnit managed resources (struct kunit_resource) are resources that are automatically cleaned up at the end of a KUnit test, similar to the concept of devm_* managed resources. Signed-off-by: Avinash Kondareddy <akndr41@gmail.com> 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> --- kunit/test-test.c | 228 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) diff --git a/kunit/test-test.c b/kunit/test-test.c index e0ab4bd546eac..5ebe059d16e25 100644 --- a/kunit/test-test.c +++ b/kunit/test-test.c @@ -101,3 +101,231 @@ static struct kunit_suite kunit_try_catch_test_suite = { .test_cases = kunit_try_catch_test_cases, }; kunit_test_suite(kunit_try_catch_test_suite); + +/* + * Context for testing test managed resources + * is_resource_initialized is used to test arbitrary resources + */ +struct kunit_test_resource_context { + struct kunit test; + bool is_resource_initialized; + int allocate_order[2]; + int free_order[2]; +}; + +static int fake_resource_init(struct kunit_resource *res, void *context) +{ + struct kunit_test_resource_context *ctx = context; + + res->allocation = &ctx->is_resource_initialized; + ctx->is_resource_initialized = true; + return 0; +} + +static void fake_resource_free(struct kunit_resource *res) +{ + bool *is_resource_initialized = res->allocation; + + *is_resource_initialized = false; +} + +static void kunit_resource_test_init_resources(struct kunit *test) +{ + struct kunit_test_resource_context *ctx = test->priv; + + kunit_init_test(&ctx->test, "testing_test_init_test"); + + KUNIT_EXPECT_TRUE(test, list_empty(&ctx->test.resources)); +} + +static void kunit_resource_test_alloc_resource(struct kunit *test) +{ + struct kunit_test_resource_context *ctx = test->priv; + struct kunit_resource *res; + kunit_resource_free_t free = fake_resource_free; + + res = kunit_alloc_and_get_resource(&ctx->test, + fake_resource_init, + fake_resource_free, + GFP_KERNEL, + ctx); + + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, res); + KUNIT_EXPECT_PTR_EQ(test, + &ctx->is_resource_initialized, + (bool *) res->allocation); + KUNIT_EXPECT_TRUE(test, list_is_last(&res->node, &ctx->test.resources)); + KUNIT_EXPECT_PTR_EQ(test, free, res->free); +} + +static void kunit_resource_test_destroy_resource(struct kunit *test) +{ + struct kunit_test_resource_context *ctx = test->priv; + struct kunit_resource *res = kunit_alloc_and_get_resource( + &ctx->test, + fake_resource_init, + fake_resource_free, + GFP_KERNEL, + ctx); + + KUNIT_ASSERT_FALSE(test, + kunit_resource_destroy(&ctx->test, + kunit_resource_instance_match, + res->free, + res->allocation)); + + KUNIT_EXPECT_FALSE(test, ctx->is_resource_initialized); + KUNIT_EXPECT_TRUE(test, list_empty(&ctx->test.resources)); +} + +static void kunit_resource_test_cleanup_resources(struct kunit *test) +{ + int i; + struct kunit_test_resource_context *ctx = test->priv; + struct kunit_resource *resources[5]; + + for (i = 0; i < ARRAY_SIZE(resources); i++) { + resources[i] = kunit_alloc_and_get_resource(&ctx->test, + fake_resource_init, + fake_resource_free, + GFP_KERNEL, + ctx); + } + + kunit_cleanup(&ctx->test); + + KUNIT_EXPECT_TRUE(test, list_empty(&ctx->test.resources)); +} + +static void kunit_resource_test_mark_order(int order_array[], + size_t order_size, + int key) +{ + int i; + + for (i = 0; i < order_size && order_array[i]; i++) + ; + + order_array[i] = key; +} + +#define KUNIT_RESOURCE_TEST_MARK_ORDER(ctx, order_field, key) \ + kunit_resource_test_mark_order(ctx->order_field, \ + ARRAY_SIZE(ctx->order_field), \ + key) + +static int fake_resource_2_init(struct kunit_resource *res, void *context) +{ + struct kunit_test_resource_context *ctx = context; + + KUNIT_RESOURCE_TEST_MARK_ORDER(ctx, allocate_order, 2); + + res->allocation = ctx; + + return 0; +} + +static void fake_resource_2_free(struct kunit_resource *res) +{ + struct kunit_test_resource_context *ctx = res->allocation; + + KUNIT_RESOURCE_TEST_MARK_ORDER(ctx, free_order, 2); +} + +static int fake_resource_1_init(struct kunit_resource *res, void *context) +{ + struct kunit_test_resource_context *ctx = context; + + kunit_alloc_and_get_resource(&ctx->test, + fake_resource_2_init, + fake_resource_2_free, + GFP_KERNEL, + ctx); + + KUNIT_RESOURCE_TEST_MARK_ORDER(ctx, allocate_order, 1); + + res->allocation = ctx; + + return 0; +} + +static void fake_resource_1_free(struct kunit_resource *res) +{ + struct kunit_test_resource_context *ctx = res->allocation; + + KUNIT_RESOURCE_TEST_MARK_ORDER(ctx, free_order, 1); +} + +/* + * TODO(brendanhiggins@google.com): replace the arrays that keep track of the + * order of allocation and freeing with strict mocks using the IN_SEQUENCE macro + * to assert allocation and freeing order when the feature becomes available. + */ +static void kunit_resource_test_proper_free_ordering(struct kunit *test) +{ + struct kunit_test_resource_context *ctx = test->priv; + + /* fake_resource_1 allocates a fake_resource_2 in its init. */ + kunit_alloc_and_get_resource(&ctx->test, + fake_resource_1_init, + fake_resource_1_free, + GFP_KERNEL, + ctx); + + /* + * Since fake_resource_2_init calls KUNIT_RESOURCE_TEST_MARK_ORDER + * before returning to fake_resource_1_init, it should be the first to + * put its key in the allocate_order array. + */ + KUNIT_EXPECT_EQ(test, ctx->allocate_order[0], 2); + KUNIT_EXPECT_EQ(test, ctx->allocate_order[1], 1); + + kunit_cleanup(&ctx->test); + + /* + * Because fake_resource_2 finishes allocation before fake_resource_1, + * fake_resource_1 should be freed first since it could depend on + * fake_resource_2. + */ + KUNIT_EXPECT_EQ(test, ctx->free_order[0], 1); + KUNIT_EXPECT_EQ(test, ctx->free_order[1], 2); +} + +static int kunit_resource_test_init(struct kunit *test) +{ + struct kunit_test_resource_context *ctx = + kzalloc(sizeof(*ctx), GFP_KERNEL); + + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); + + test->priv = ctx; + + kunit_init_test(&ctx->test, "test_test_context"); + + return 0; +} + +static void kunit_resource_test_exit(struct kunit *test) +{ + struct kunit_test_resource_context *ctx = test->priv; + + kunit_cleanup(&ctx->test); + kfree(ctx); +} + +static struct kunit_case kunit_resource_test_cases[] = { + KUNIT_CASE(kunit_resource_test_init_resources), + KUNIT_CASE(kunit_resource_test_alloc_resource), + KUNIT_CASE(kunit_resource_test_destroy_resource), + KUNIT_CASE(kunit_resource_test_cleanup_resources), + KUNIT_CASE(kunit_resource_test_proper_free_ordering), + {} +}; + +static struct kunit_suite kunit_resource_test_suite = { + .name = "kunit-resource-test", + .init = kunit_resource_test_init, + .exit = kunit_resource_test_exit, + .test_cases = kunit_resource_test_cases, +}; +kunit_test_suite(kunit_resource_test_suite); -- 2.23.0.rc1.153.gdeed80330f-goog
next prev parent reply other threads:[~2019-08-20 23:22 UTC|newest] Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-20 23:20 [PATCH v14 00/18] kunit: introduce KUnit, the Linux kernel unit testing framework Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 01/18] kunit: test: add KUnit test runner core Brendan Higgins 2019-08-23 15:33 ` shuah 2019-08-23 16:48 ` Brendan Higgins 2019-08-23 17:05 ` shuah 2019-08-23 17:27 ` Brendan Higgins 2019-08-23 17:34 ` shuah 2019-08-23 17:54 ` Brendan Higgins 2019-08-23 18:32 ` shuah 2019-08-23 18:56 ` Brendan Higgins 2019-08-23 19:04 ` shuah 2019-08-23 19:20 ` Brendan Higgins 2019-08-23 19:43 ` shuah 2019-08-20 23:20 ` [PATCH v14 02/18] kunit: test: add test resource management API Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 03/18] kunit: test: add string_stream a std::stream like string builder Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 04/18] kunit: test: add assertion printing library Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 05/18] kunit: test: add the concept of expectations Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 06/18] kbuild: enable building KUnit Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 07/18] kunit: test: add initial tests Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 08/18] objtool: add kunit_try_catch_throw to the noreturn list Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 09/18] kunit: test: add support for test abort Brendan Higgins 2019-08-23 15:36 ` shuah 2019-08-23 16:56 ` Brendan Higgins 2019-08-23 17:07 ` shuah 2019-08-23 17:29 ` Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 10/18] kunit: test: add tests for kunit " Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 11/18] kunit: test: add the concept of assertions Brendan Higgins 2019-08-20 23:20 ` Brendan Higgins [this message] 2019-08-20 23:20 ` [PATCH v14 13/18] kunit: tool: add Python wrappers for running KUnit tests Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 14/18] kunit: defconfig: add defconfigs for building " Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 15/18] Documentation: kunit: add documentation for KUnit Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 16/18] MAINTAINERS: add entry for KUnit the unit testing framework Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 17/18] kernel/sysctl-test: Add null pointer test for sysctl.c:proc_dointvec() Brendan Higgins 2019-08-20 23:20 ` [PATCH v14 18/18] MAINTAINERS: add proc sysctl KUnit test to PROC SYSCTL section Brendan Higgins
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190820232046.50175-13-brendanhiggins@google.com \ --to=brendanhiggins@google.com \ --cc=Alexander.Levin@microsoft.com \ --cc=Tim.Bird@sony.com \ --cc=akndr41@gmail.com \ --cc=amir73il@gmail.com \ --cc=dan.carpenter@oracle.com \ --cc=daniel@ffwll.ch \ --cc=devicetree@vger.kernel.org \ --cc=dri-devel@lists.freedesktop.org \ --cc=frowand.list@gmail.com \ --cc=gregkh@linuxfoundation.org \ --cc=jdike@addtoit.com \ --cc=joel@jms.id.au \ --cc=jpoimboe@redhat.com \ --cc=julia.lawall@lip6.fr \ --cc=keescook@google.com \ --cc=khilman@baylibre.com \ --cc=kieran.bingham@ideasonboard.com \ --cc=knut.omang@oracle.com \ --cc=kunit-dev@googlegroups.com \ --cc=linux-doc@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kbuild@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-kselftest@vger.kernel.org \ --cc=linux-nvdimm@lists.01.org \ --cc=linux-um@lists.infradead.org \ --cc=logang@deltatee.com \ --cc=mcgrof@kernel.org \ --cc=mpe@ellerman.id.au \ --cc=peterz@infradead.org \ --cc=pmladek@suse.com \ --cc=rdunlap@infradead.org \ --cc=richard@nod.at \ --cc=rientjes@google.com \ --cc=robh@kernel.org \ --cc=rostedt@goodmis.org \ --cc=sboyd@kernel.org \ --cc=shuah@kernel.org \ --cc=tytso@mit.edu \ --cc=wfg@linux.intel.com \ --cc=yamada.masahiro@socionext.com \ --subject='Re: [PATCH v14 12/18] kunit: test: add tests for KUnit managed resources' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).