Received: by 2002:ac0:8845:0:0:0:0:0 with SMTP id g63csp354440img; Thu, 28 Feb 2019 00:07:56 -0800 (PST) X-Google-Smtp-Source: AHgI3Ia1UbWrr40pFrKy6fjDyrC/AfKMBLdi9wsHBVMkQ5IL5zJoCn2ky5uxdz/IAdEqmUBlElaG X-Received: by 2002:a17:902:b087:: with SMTP id p7mr6673556plr.56.1551341275931; Thu, 28 Feb 2019 00:07:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551341275; cv=none; d=google.com; s=arc-20160816; b=C6U+iz4A8W+M8u1vsVmFQU3tnSLA1LQjG8u8XbnSdmvVnKhEp2u0malJPJxguAXUku w1bBPvYH+CY/oHW6eM13PFSfwSQMGFlAk+kwKdy6OoPJEfFheCZR/UdjUbzDYHTToo5L r6uwh+Ue84q1xh5WwGUSTqpKSMrOovxeSR81icvZN6NyojRKujOSGiVTPOrg/nwIhlOE st7HXoukGCMwvR2U0gkKIuJx7/XkPcfmH+1BDwyTd0QtV0Ed9XkKQDYdszCJLFJsrgdN ungmxD7thtumHP1EVPFmzApxNURveHjA/qXl/t5kwlnTd0dQfw5tY39hNVV1ZKxIUatt T3/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=g4OeSZtDovplvAQyNL3HshW6Hp84vdZiJpd1r1wdKWc=; b=rFOkttlWrdPQ/JqoI/ke4QlaShjRj5xPxFMrPcBX95LNw4CvNZH624hxPPy/YYhNeA bEMVxS8Cc7fyyDwcPjkAG8DF30jYdQjIZ8kdlUKYulQ9szARUO+Hk4YRuDoIbsfYVrPT K/ozSIqFSXpwxn0hKIcD+Xb+DRxKIw0km1J/TKQQtCbQcsSF1TbD96P/dw/fwgISGdaI LkwipHNaeTQx9yWgNrgPjbWoxMG/ZBphnhhK5tg6rn/vRr3qMculOmKuTkwLZPC/iZj6 H9UNuqO6ryrio54sdB53HraIn3SY4kSIG8bySrpzNS75aTHDB+A+ayCOJfo8VbOaIsrt v7Sw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="FeIlB/Mn"; 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 d16si16977374pll.236.2019.02.28.00.07.40; Thu, 28 Feb 2019 00:07:55 -0800 (PST) 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="FeIlB/Mn"; 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 S1731739AbfB1Hms (ORCPT + 99 others); Thu, 28 Feb 2019 02:42:48 -0500 Received: from mail-ot1-f68.google.com ([209.85.210.68]:38962 "EHLO mail-ot1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730866AbfB1Hmr (ORCPT ); Thu, 28 Feb 2019 02:42:47 -0500 Received: by mail-ot1-f68.google.com with SMTP id e15so7256547otk.6 for ; Wed, 27 Feb 2019 23:42:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=g4OeSZtDovplvAQyNL3HshW6Hp84vdZiJpd1r1wdKWc=; b=FeIlB/Mn8jaREKiu5kiqBg/dbvuj8HgMH+lSWw8Vkrnqi9BSVBkGxRUDpd4R3x2Hxn nEs26yUTb0INthoZ7OPJF7xyjLhQoc8nskZq6+hTUaDj45sKHW19Hb5BihtjAH64hAry 8LUpAfYCYBvX6qB63rJHUthNjZBoQatbgrwadEgSKppCjGgd2JK2CEv7LMe9CRnXV7jK I5gGotilARxUB3vHsuHpYf1OACL+yFwrr10EkJOnJwBHQCkHVR6GjmuuUopgAo07sCdM HRvpw5mCjFM+IA0ynfBKbDddS0pl2W/5I3HD4d4Mzka92er9pEy61i0/4tZEC3onf5Pn 7dQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=g4OeSZtDovplvAQyNL3HshW6Hp84vdZiJpd1r1wdKWc=; b=rfgiRs3xBPWUgq6fjYid1AbkYx+GwUFT1ne65eVNmAMRI6qjr5mQLwkYOAoIWUhpLL 45ZQ6OBTkqCibVGZaYrpYn1scW8VMFBKnHY71cF2lyLxujG/h4CQ3rcsUthUoihdIRxY fXGFMBYnBKM/ZxyMcpdvm/tzQ846QbFDetWvh22kFxaWYigxeg/Vfhq1UZczwRVi56WU sT65fyuGlxhj0TQcdjSxasRNT6V8704fdNLZhENAt5wKGfFUHdj8pgs3HTVZrhkGjZGR /dPfpYLL3XBB2V+roKZ2kGlSRRGocBPpCMqgpOp72qkL/SUaouk1jkZSlR30HDKH/K2t Y9qA== X-Gm-Message-State: AHQUAubj3Hmqrfi8S3fI0Z7HhXoebeAGrZABxVo436xn8Udfx7PSkfIG rUUg47Hd0WzACD1LBUhkv7ga5n8rhnp19DZvp905Rg== X-Received: by 2002:a9d:ec7:: with SMTP id 65mr3323688otj.230.1551339765252; Wed, 27 Feb 2019 23:42:45 -0800 (PST) MIME-Version: 1.0 References: <20190214213729.21702-1-brendanhiggins@google.com> <20190214213729.21702-9-brendanhiggins@google.com> <0124ed28-466c-e954-ddde-495419630a9f@gmail.com> In-Reply-To: <0124ed28-466c-e954-ddde-495419630a9f@gmail.com> From: Brendan Higgins Date: Wed, 27 Feb 2019 23:42:33 -0800 Message-ID: Subject: Re: [RFC v4 08/17] kunit: test: add support for test abort To: Frank Rowand Cc: Kees Cook , Luis Chamberlain , shuah@kernel.org, Rob Herring , Kieran Bingham , Greg KH , Joel Stanley , Michael Ellerman , Joe Perches , brakmo@fb.com, Steven Rostedt , "Bird, Timothy" , Kevin Hilman , Julia Lawall , linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com, Linux Kernel Mailing List , Jeff Dike , Richard Weinberger , linux-um@lists.infradead.org, Daniel Vetter , dri-devel , Dan Williams , linux-nvdimm , Knut Omang , devicetree , Petr Mladek , Sasha Levin , Amir Goldstein , dan.carpenter@oracle.com, wfg@linux.intel.com 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 On Tue, Feb 19, 2019 at 10:44 PM Frank Rowand wrote: > > On 2/19/19 7:39 PM, Brendan Higgins wrote: > > On Mon, Feb 18, 2019 at 11:52 AM Frank Rowand wrote: > >> > >> On 2/14/19 1:37 PM, Brendan Higgins wrote: > >>> Add support for aborting/bailing out of test cases. Needed for > >>> implementing assertions. > >>> > >>> Signed-off-by: Brendan Higgins > >>> --- > >>> Changes Since Last Version > >>> - This patch is new introducing a new cross-architecture way to abort > >>> out of a test case (needed for KUNIT_ASSERT_*, see next patch for > >>> details). > >>> - On a side note, this is not a complete replacement for the UML abort > >>> mechanism, but covers the majority of necessary functionality. UML > >>> architecture specific featurs have been dropped from the initial > >>> patchset. > >>> --- > >>> include/kunit/test.h | 24 +++++ > >>> kunit/Makefile | 3 +- > >>> kunit/test-test.c | 127 ++++++++++++++++++++++++++ > >>> kunit/test.c | 208 +++++++++++++++++++++++++++++++++++++++++-- > >>> 4 files changed, 353 insertions(+), 9 deletions(-) > >>> create mode 100644 kunit/test-test.c > >> > >> < snip > > >> > >>> diff --git a/kunit/test.c b/kunit/test.c > >>> index d18c50d5ed671..6e5244642ab07 100644 > >>> --- a/kunit/test.c > >>> +++ b/kunit/test.c > >>> @@ -6,9 +6,9 @@ > >>> * Author: Brendan Higgins > >>> */ > >>> > >>> -#include > >>> #include > >>> -#include > >>> +#include > >>> +#include > >>> #include > >>> > >>> static bool kunit_get_success(struct kunit *test) > >>> @@ -32,6 +32,27 @@ static void kunit_set_success(struct kunit *test, bool success) > >>> spin_unlock_irqrestore(&test->lock, flags); > >>> } > >>> > >>> +static bool kunit_get_death_test(struct kunit *test) > >>> +{ > >>> + unsigned long flags; > >>> + bool death_test; > >>> + > >>> + spin_lock_irqsave(&test->lock, flags); > >>> + death_test = test->death_test; > >>> + spin_unlock_irqrestore(&test->lock, flags); > >>> + > >>> + return death_test; > >>> +} > >>> + > >>> +static void kunit_set_death_test(struct kunit *test, bool death_test) > >>> +{ > >>> + unsigned long flags; > >>> + > >>> + spin_lock_irqsave(&test->lock, flags); > >>> + test->death_test = death_test; > >>> + spin_unlock_irqrestore(&test->lock, flags); > >>> +} > >>> + > >>> static int kunit_vprintk_emit(const struct kunit *test, > >>> int level, > >>> const char *fmt, > >>> @@ -70,13 +91,29 @@ static void kunit_fail(struct kunit *test, struct kunit_stream *stream) > >>> stream->commit(stream); > >>> } > >>> > >>> +static void __noreturn kunit_abort(struct kunit *test) > >>> +{ > >>> + kunit_set_death_test(test, true); > >>> + > >>> + test->try_catch.throw(&test->try_catch); > >>> + > >>> + /* > >>> + * Throw could not abort from test. > >>> + */ > >>> + kunit_err(test, "Throw could not abort from test!"); > >>> + show_stack(NULL, NULL); > >>> + BUG(); > >> > >> kunit_abort() is what will be call as the result of an assert failure. > > > > Yep. Does that need clarified somewhere. > >> > >> BUG(), which is a panic, which is crashing the system is not acceptable > >> in the Linux kernel. You will just annoy Linus if you submit this. > > > > Sorry, I thought this was an acceptable use case since, a) this should > > never be compiled in a production kernel, b) we are in a pretty bad, > > unpredictable state if we get here and keep going. I think you might > > have said elsewhere that you think "a" is not valid? In any case, I > > can replace this with a WARN, would that be acceptable? > > A WARN may or may not make sense, depending on the context. It may > be sufficient to simply report a test failure (as in the old version > of case (2) below. > > Answers to "a)" and "b)": > > a) it might be in a production kernel Sorry for a possibly stupid question, how might it be so? Why would someone intentionally build unit tests into a production kernel? > > a') it is not acceptable in my development kernel either Fair enough. > > b) No. You don't crash a developer's kernel either unless it is > required to avoid data corruption. Alright, I thought that was one of those cases, but I am not going to push the point. Also, in case it wasn't clear, the path where BUG() gets called only happens if there is a bug in KUnit itself, not just because a test case fails catastrophically. > > b') And you can not do replacements like: > > (1) in of_unittest_check_tree_linkage() > > ----- old ----- > > if (!of_root) > return; > > ----- new ----- > > KUNIT_ASSERT_NOT_ERR_OR_NULL(test, of_root); > > (2) in of_unittest_property_string() > > ----- old ----- > > /* of_property_read_string_index() tests */ > rc = of_property_read_string_index(np, "string-property", 0, strings); > unittest(rc == 0 && !strcmp(strings[0], "foobar"), "of_property_read_string_index() failure; rc=%i\n", rc); > > ----- new ----- > > /* of_property_read_string_index() tests */ > rc = of_property_read_string_index(np, "string-property", 0, strings); > KUNIT_ASSERT_EQ(test, rc, 0); > KUNIT_EXPECT_STREQ(test, strings[0], "foobar"); > > > If a test fails, that is no reason to abort testing. The remainder of the unit > tests can still run. There may be cascading failures, but that is ok. Sure, that's what I am trying to do. I don't see how (1) changes anything, a failed KUNIT_ASSERT_* only bails on the current test case, it does not quit the entire test suite let alone crash the kernel. In case it wasn't clear above, > >>> + test->try_catch.throw(&test->try_catch); should never, ever return. The only time it would, would be if KUnit was very broken. This should never actually happen, even if the assertion that called it was violated. KUNIT_ASSERT_* just says, "this is a prerequisite property for this test case"; if it is violated, the test case should fail and bail because the preconditions for the test case cannot be satisfied. Nevertheless, other tests cases will still run.