From patchwork Wed Feb 22 18:27:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Rae Moar X-Patchwork-Id: 656155 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AE71DC636D6 for ; Wed, 22 Feb 2023 18:27:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231835AbjBVS1q (ORCPT ); Wed, 22 Feb 2023 13:27:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60930 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229515AbjBVS1p (ORCPT ); Wed, 22 Feb 2023 13:27:45 -0500 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5BCE3A878 for ; Wed, 22 Feb 2023 10:27:43 -0800 (PST) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-536eace862cso46903977b3.16 for ; Wed, 22 Feb 2023 10:27:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1677090463; h=content-transfer-encoding:cc:to:from:subject:message-id :mime-version:date:from:to:cc:subject:date:message-id:reply-to; bh=/ECEz/+b65D8RZ8bM86UASeK3RrWrrS5RnSaZwV8Aew=; b=AgmMM7BMAyeEwaW+48Be0D9gac3TMDOHMWcDO7+zLMtyHX+7Z8Yb6rX84Pi+cPiqCu lKIxHDjW1G+WYvGjGXRW3+0sxcv/zNlwv5sEmnWGfmldfdjgdi8VyPt3nzEttNWezEXR HHpIJ3Wy4IxLt73ooZXxZ/B4PRBVonGngSvSdlATbnurVb8TiMdXKOhi7ZnQy0KBsUgk QJLH6fB0QbGO9Zthqj6Maj17PQWrTUnXTjJXamvaWCWcXDuH0LCHFkwiPgHSQISMABMo 0dngXcIs/cvOK+y771eChnh7LvBbgnWrScY6YKlN8okHBvvx2/GnnPCl6xZrLbSB5NUI XgzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677090463; h=content-transfer-encoding:cc:to:from:subject:message-id :mime-version:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=/ECEz/+b65D8RZ8bM86UASeK3RrWrrS5RnSaZwV8Aew=; b=7z10p/+lTqTKM66djRw8QJKHrOUewMb0IT8hAmOahrwWyX/7CKu5Q+OheOcnqlAB2U LK07N9hsKN9J+/c2VZx/C++2iD2DDtwpIlmUwT/1XcrWsWXKYUmZ9ngdbD1d9pdbXLM7 dQWRnV38tqq/0XB1dwIL/JCaNx3mbL5JMESqsfttujqEukIUJNRLc+kk4hnrBKzHwwOI huu4Z0TlGEtIVe+h3ENiV4h0OpvDQ0O0i54k2w/+6EeRWV2QtGY/pP1j+JA+8SUW8Uko g5R4VLwurtCzvXjCDNDhiqGy0jEf7UObX0sbfy/Ifx571x6rEiDTChhL15VP34Je2+Rt WAfQ== X-Gm-Message-State: AO0yUKW3BohoTRiueT33lc32gG5gRtzdyOamXvVB1kMcxMHIiCv8T74W tnIvnDz7mYAbWA3qEAzLJNtFMuyzDg== X-Google-Smtp-Source: AK7set9UWQHkv2LUpJiGAJqnpUB7r7YUh6QfonRA2PX1lLmv/mNzzbBMhmVyDmX1AVnwi44AAtHI4ePG3g== X-Received: from rmoar-specialist.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:45d3]) (user=rmoar job=sendgmr) by 2002:a81:61d4:0:b0:52e:e6ed:30ac with SMTP id v203-20020a8161d4000000b0052ee6ed30acmr519461ywb.556.1677090463033; Wed, 22 Feb 2023 10:27:43 -0800 (PST) Date: Wed, 22 Feb 2023 18:27:38 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.39.2.637.g21b0678d19-goog Message-ID: <20230222182740.254087-1-rmoar@google.com> Subject: [PATCH v2 1/3] kunit: fix bug in debugfs logs of parameterized tests From: Rae Moar To: brendanhiggins@google.com, davidgow@google.com, dlatypov@google.com Cc: skhan@linuxfoundation.org, kunit-dev@googlegroups.com, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Rae Moar Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org Fix bug in debugfs logs that causes individual parameterized results to not appear because the log is reinitialized (cleared) when each parameter is run. Ensure these results appear in the debugfs logs and increase log size to allow for the size of parameterized results. As a result, append lines to the log directly rather than using an intermediate variable that can cause stack size warnings due to the increased log size. Here is the debugfs log of ext4_inode_test which uses parameterized tests before the fix: KTAP version 1 # Subtest: ext4_inode_test 1..1 # Totals: pass:16 fail:0 skip:0 total:16 ok 1 ext4_inode_test As you can see, this log does not include any of the individual parametrized results. After (in combination with the next two fixes to remove extra empty line and ensure KTAP valid format): KTAP version 1 1..1 KTAP version 1 # Subtest: ext4_inode_test 1..1 KTAP version 1 # Subtest: inode_test_xtimestamp_decoding ok 1 1901-12-13 Lower bound of 32bit < 0 timestamp, no extra bits … (the rest of the individual parameterized tests) ok 16 2446-05-10 Upper bound of 32bit >=0 timestamp. All extra # inode_test_xtimestamp_decoding: pass:16 fail:0 skip:0 total:16 ok 1 inode_test_xtimestamp_decoding # Totals: pass:16 fail:0 skip:0 total:16 ok 1 ext4_inode_test Signed-off-by: Rae Moar Reviewed-by: David Gow --- Changes from v1 -> v2: - Remove the use of the line variable in kunit_log_append that was causing stack size warnings. - Add before and after to the commit message. include/kunit/test.h | 2 +- lib/kunit/test.c | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) base-commit: 82649c7c0da431d147a75c6ae768ee42c1053f53 diff --git a/include/kunit/test.h b/include/kunit/test.h index 08d3559dd703..0668d29f3453 100644 --- a/include/kunit/test.h +++ b/include/kunit/test.h @@ -34,7 +34,7 @@ DECLARE_STATIC_KEY_FALSE(kunit_running); struct kunit; /* Size of log associated with test. */ -#define KUNIT_LOG_SIZE 512 +#define KUNIT_LOG_SIZE 1500 /* Maximum size of parameter description string. */ #define KUNIT_PARAM_DESC_SIZE 128 diff --git a/lib/kunit/test.c b/lib/kunit/test.c index c9e15bb60058..c406aa07d875 100644 --- a/lib/kunit/test.c +++ b/lib/kunit/test.c @@ -114,22 +114,26 @@ static void kunit_print_test_stats(struct kunit *test, */ void kunit_log_append(char *log, const char *fmt, ...) { - char line[KUNIT_LOG_SIZE]; va_list args; - int len_left; + int len, log_len, len_left; if (!log) return; - len_left = KUNIT_LOG_SIZE - strlen(log) - 1; + log_len = strlen(log); + len_left = KUNIT_LOG_SIZE - log_len - 1; if (len_left <= 0) return; + /* Evaluate length of line to add to log */ va_start(args, fmt); - vsnprintf(line, sizeof(line), fmt, args); + len = vsnprintf(NULL, 0, fmt, args); va_end(args); - strncat(log, line, len_left); + /* Print formatted line to the log */ + va_start(args, fmt); + vsnprintf(log + log_len, min(len, len_left), fmt, args); + va_end(args); } EXPORT_SYMBOL_GPL(kunit_log_append); @@ -437,7 +441,6 @@ static void kunit_run_case_catch_errors(struct kunit_suite *suite, struct kunit_try_catch_context context; struct kunit_try_catch *try_catch; - kunit_init_test(test, test_case->name, test_case->log); try_catch = &test->try_catch; kunit_try_catch_init(try_catch, @@ -533,6 +536,8 @@ int kunit_run_tests(struct kunit_suite *suite) struct kunit_result_stats param_stats = { 0 }; test_case->status = KUNIT_SKIPPED; + kunit_init_test(&test, test_case->name, test_case->log); + if (!test_case->generate_params) { /* Non-parameterised test. */ kunit_run_case_catch_errors(suite, test_case, &test); From patchwork Wed Feb 22 18:27:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rae Moar X-Patchwork-Id: 655849 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C6383C64EC7 for ; Wed, 22 Feb 2023 18:27:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232127AbjBVS1s (ORCPT ); Wed, 22 Feb 2023 13:27:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232114AbjBVS1r (ORCPT ); Wed, 22 Feb 2023 13:27:47 -0500 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA2763A878 for ; Wed, 22 Feb 2023 10:27:45 -0800 (PST) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-536e8d6d9ceso52159407b3.12 for ; Wed, 22 Feb 2023 10:27:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1677090465; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=HEsXaJ/BmtRM1h8LKXkgldxjS4A8ATj9p4wwTNADwEY=; b=Ve+ZD02zHsXEI17UKVYpl6yb85DnWCCrPiUxqWYLSVkdZ2IYEErSnksjqrJpxiV/kh cWhkpntc0StOjwUow3u/8ihVgVdmJPo58WzytiXyW5c/L0q4nkx8dJrJ/byC4ijNbcTa yjWGrfM0v7MMhOnI2dEuNCzNb4wNuPRC4eU5dJB7I45kcO1+ZQrwnAqIOcN9jdkspaNn O37fBcjMABfxLDbgz/oE4DoMpKKf8cCuylVNS4NE+1Qc5om/EvsCrNukZvl/wbFP4e5p E5ovZntulinLjXg0HfxpiJy8Jp+KmQ7qBvSn5daJi1uDUSfLmpb8zNPBW1LtgVDOzUyF T9Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677090465; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HEsXaJ/BmtRM1h8LKXkgldxjS4A8ATj9p4wwTNADwEY=; b=fXfz0DJ6vjF5LWGBlp6D07WKXRRYDCTLRM3b7k2enJeZWNdnznT/VZTGHxeskSLqzD AhhGhblbXU2lhUMuVQBZNS2/hkzJOaB3fKvYk0U0N1L6eo6EYknes851KsBsDatC3Jsp T5/Mr47L9vJdInLYnRQ8eAnVexCyrf8PsPtQC1uQnyH5UdcBzSKBr0XCPTqUr3Nyyhog IzLvqbJrVLakdDq1g9QpeHr1WAGMamP1bVm30yI0BK6cR6RoOwLpCwntkyYp9P07e7iw ggd7llrYN48HPZBz7TGQE4EVDyOvvruio6ZkoQ9BHV69NF5jXagIyRMvlBBIAKf8bhJ5 HDSQ== X-Gm-Message-State: AO0yUKV1PMI1CSzJD4dMR46pDcWdAOqCAqrEiE0wrWESn40RDkW6jvMg V99CVokgdcVt+6ySsxRSRUHtZ5Axwg== X-Google-Smtp-Source: AK7set93R2asmBbd0F48XMArEIndL/iKkrb1ztKBeofHDUyqy5vBnqhZ6yZqo+54MPCk9HNHeiTR63y6Jw== X-Received: from rmoar-specialist.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:45d3]) (user=rmoar job=sendgmr) by 2002:a5b:6cf:0:b0:a03:da3f:3e65 with SMTP id r15-20020a5b06cf000000b00a03da3f3e65mr469778ybq.6.1677090465183; Wed, 22 Feb 2023 10:27:45 -0800 (PST) Date: Wed, 22 Feb 2023 18:27:39 +0000 In-Reply-To: <20230222182740.254087-1-rmoar@google.com> Mime-Version: 1.0 References: <20230222182740.254087-1-rmoar@google.com> X-Mailer: git-send-email 2.39.2.637.g21b0678d19-goog Message-ID: <20230222182740.254087-2-rmoar@google.com> Subject: [PATCH v2 2/3] kunit: fix bug in the order of lines in debugfs logs From: Rae Moar To: brendanhiggins@google.com, davidgow@google.com, dlatypov@google.com Cc: skhan@linuxfoundation.org, kunit-dev@googlegroups.com, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Rae Moar Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org Fix bug in debugfs logs that causes an incorrect order of lines in the debugfs log. Currently, the test counts lines that show the number of tests passed, failed, and skipped, as well as any suite diagnostic lines, appear prior to the individual results, which is a bug. Ensure the order of printing for the debugfs log is correct. Additionally, add a KTAP header to so the debugfs logs can be valid KTAP. This is an example of the kunit_status debugfs log prior to these fixes: KTAP version 1 # Subtest: kunit_status 1..2 # kunit_status: pass:2 fail:0 skip:0 total:2 # Totals: pass:2 fail:0 skip:0 total:2 ok 1 kunit_status_set_failure_test ok 2 kunit_status_mark_skipped_test ok 1 kunit_status Note the two lines with stats are out of order. This is the same debugfs log after the fixes (in combination with the third patch to remove the extra line): KTAP version 1 1..1 KTAP version 1 # Subtest: kunit_status 1..2 ok 1 kunit_status_set_failure_test ok 2 kunit_status_mark_skipped_test # kunit_status: pass:2 fail:0 skip:0 total:2 # Totals: pass:2 fail:0 skip:0 total:2 ok 1 kunit_status Signed-off-by: Rae Moar --- Changes from v1 -> v2: - Add KTAP header. - Ensure test result number is 1. - Add before and after results to the commit message. lib/kunit/debugfs.c | 14 ++++++++++++-- lib/kunit/test.c | 21 ++++++++++++++------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/kunit/debugfs.c b/lib/kunit/debugfs.c index de0ee2e03ed6..b08bb1fba106 100644 --- a/lib/kunit/debugfs.c +++ b/lib/kunit/debugfs.c @@ -55,14 +55,24 @@ static int debugfs_print_results(struct seq_file *seq, void *v) enum kunit_status success = kunit_suite_has_succeeded(suite); struct kunit_case *test_case; - if (!suite || !suite->log) + if (!suite) return 0; - seq_printf(seq, "%s", suite->log); + /* Print KTAP header so the debugfs log can be parsed as valid KTAP. */ + seq_puts(seq, "KTAP version 1\n"); + seq_puts(seq, "1..1\n"); + + /* Print suite header because it is not stored in the test logs. */ + seq_puts(seq, KUNIT_SUBTEST_INDENT "KTAP version 1\n"); + seq_printf(seq, KUNIT_SUBTEST_INDENT "# Subtest: %s\n", suite->name); + seq_printf(seq, KUNIT_SUBTEST_INDENT "1..%zd\n", kunit_suite_num_test_cases(suite)); kunit_suite_for_each_test_case(suite, test_case) debugfs_print_result(seq, suite, test_case); + if (suite->log) + seq_printf(seq, "%s", suite->log); + seq_printf(seq, "%s %d %s\n", kunit_status_to_ok_not_ok(success), 1, suite->name); return 0; diff --git a/lib/kunit/test.c b/lib/kunit/test.c index c406aa07d875..fb6b39cca0ae 100644 --- a/lib/kunit/test.c +++ b/lib/kunit/test.c @@ -151,10 +151,18 @@ EXPORT_SYMBOL_GPL(kunit_suite_num_test_cases); static void kunit_print_suite_start(struct kunit_suite *suite) { - kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "KTAP version 1\n"); - kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "# Subtest: %s", + /* + * We do not log the test suite header as doing so would + * mean debugfs display would consist of the test suite + * header prior to individual test results. + * Hence directly printk the suite status, and we will + * separately seq_printf() the suite header for the debugfs + * representation. + */ + pr_info(KUNIT_SUBTEST_INDENT "KTAP version 1\n"); + pr_info(KUNIT_SUBTEST_INDENT "# Subtest: %s\n", suite->name); - kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "1..%zd", + pr_info(KUNIT_SUBTEST_INDENT "1..%zd\n", kunit_suite_num_test_cases(suite)); } @@ -171,10 +179,9 @@ static void kunit_print_ok_not_ok(void *test_or_suite, /* * We do not log the test suite results as doing so would - * mean debugfs display would consist of the test suite - * description and status prior to individual test results. - * Hence directly printk the suite status, and we will - * separately seq_printf() the suite status for the debugfs + * mean debugfs display would consist of an incorrect test + * number. Hence directly printk the suite result, and we will + * separately seq_printf() the suite results for the debugfs * representation. */ if (suite) From patchwork Wed Feb 22 18:27:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Rae Moar X-Patchwork-Id: 656154 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 11F77C636D6 for ; Wed, 22 Feb 2023 18:27:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231415AbjBVS14 (ORCPT ); Wed, 22 Feb 2023 13:27:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232118AbjBVS1v (ORCPT ); Wed, 22 Feb 2023 13:27:51 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8E6721BC9 for ; Wed, 22 Feb 2023 10:27:48 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-536bfec4a66so80593737b3.5 for ; Wed, 22 Feb 2023 10:27:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1677090468; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=rf3BcpYRnNocfULVZrlv+SsLV8IiqQH10bFhbtuKzq8=; b=slKBtTJP9E56Rj0B06ol2b9pwSpOno6v2BR47w5yY4N3nMvUd/BbJ76E0SBCnKTUa2 nJB9+6E53RVrzrEsIZYVtZbylanhHqGo1jucsLRuR6Pys6/LATui6Bz5uwqYQUOa1JA3 AY8HGbpDPoEAtDaxkOXcZEWN+Qk7d5fOe70WuI3VKYFczy4sjkLpeRbqZsC0aRUptuzP 3pNPr+jPZ+kWF36sJoyx5BUtQgkUrr18s+4MJwoYOmkjuko54SjNT8TCnKBJCdRO3iga vlC+vXomp+c5skqhfwo3nXAuDL3QVFdlyRbWOqfVm4dvHQ2tTdCYuxjIf4zmdiLiI/UV I5zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677090468; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=rf3BcpYRnNocfULVZrlv+SsLV8IiqQH10bFhbtuKzq8=; b=4Tw4PxJZLx6sc6scDWFE8Zhf7ufT1TPxj/I7rHZjOkDRUxSaxB0EDw17Om+14ZTQnP FrS/oJbiuOl6kWB6NS5smcRD0b+nJ2vF42sJV1G9ftwC8qO1BRN8I5Vfx+4UgyZ4Z2fj 0Kce27GWIb6rWSBfUtQZBB+BY4PrEN9nxSaqRNDjLVCdMVtkq4uGodPWSUJTETSD76bk hvbNj9OkmYb39Z8m1wEIwfcEG7dcoyAK74LGW4ZsyU9smAadv3Dj0F9KZ1GEif2I/Ucg BfqIMrWSYMV6aZ3lyF/xC+HKZiLFbV1iLFi6iOGZrDF4nrq0en2xwt7aWCyijpwJtzdn iLnQ== X-Gm-Message-State: AO0yUKWDuCB0ZqyNvjEEW6AYvJ0G+hwgPpMmgsJzxX+GKhJlZiFdGLCl BD1ECYJfwjdF6bkgnTbuS+xiDieVuw== X-Google-Smtp-Source: AK7set+up8SZo9f1D1JYAm0RClpHObD3m1kW1D63qwRaI2gtNXdko+2KfGPc07xygYlmBfWccxarOhk1yA== X-Received: from rmoar-specialist.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:45d3]) (user=rmoar job=sendgmr) by 2002:a5b:d48:0:b0:995:c60:38ca with SMTP id f8-20020a5b0d48000000b009950c6038camr876065ybr.3.1677090467798; Wed, 22 Feb 2023 10:27:47 -0800 (PST) Date: Wed, 22 Feb 2023 18:27:40 +0000 In-Reply-To: <20230222182740.254087-1-rmoar@google.com> Mime-Version: 1.0 References: <20230222182740.254087-1-rmoar@google.com> X-Mailer: git-send-email 2.39.2.637.g21b0678d19-goog Message-ID: <20230222182740.254087-3-rmoar@google.com> Subject: [PATCH v2 3/3] kunit: fix bug of extra newline characters in debugfs logs From: Rae Moar To: brendanhiggins@google.com, davidgow@google.com, dlatypov@google.com Cc: skhan@linuxfoundation.org, kunit-dev@googlegroups.com, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Rae Moar Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org Fix bug of the extra newline characters in debugfs logs. When a line is added to debugfs with a newline character at the end, an extra line appears in the debugfs log. This is due to a discrepancy between how the lines are printed and how they are added to the logs. Remove this discrepancy by checking if the a newline character is present before adding a newline character to the log. This should closely match the printk behavior. Add kunit_log_newline_test to provide test coverage for this issue. (Also, move kunit_log_test above suite definition to remove the unnecessary declaration prior to the suite definition) As an example, say we add these two lines to the log: kunit_log(..., “KTAP version 1\n”); kunit_log(..., “1..1”); The debugfs log before this fix: KTAP version 1 1..1 The debugfs log after this fix: KTAP version 1 1..1 Signed-off-by: Rae Moar --- Changes from v1 -> v2: - Changed the way extra newlines are removed. Instead of removing extra newline characters, add a newline if one is not present. This is a bit cleaner. - Add before and after results to the commit message. - Note: I looked into using KERN_CONT to match the printk behavior to vsnprintf but this could cause issues with KTAP printing on the same line as interrupting kernel messages. I also looked at adding KERN_CONT functionality to kunit_log and I did get this to work but it was a bit messy because it required a few calls to kunit_log_newline in kunit_run_tests. If this is very desired functionality, happy to add this to version 3. include/kunit/test.h | 9 ++++++++- lib/kunit/kunit-test.c | 35 +++++++++++++++++++++++------------ lib/kunit/test.c | 14 ++++++++++++++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/include/kunit/test.h b/include/kunit/test.h index 0668d29f3453..3031ad29718b 100644 --- a/include/kunit/test.h +++ b/include/kunit/test.h @@ -375,6 +375,13 @@ static inline void *kunit_kcalloc(struct kunit *test, size_t n, size_t size, gfp void kunit_cleanup(struct kunit *test); +/** + * kunit_log_newline() - Add newline to the end of log if not already + * present at the end of the log. + * @log: The log to add the newline to. + */ +void kunit_log_newline(char *log); + void __printf(2, 3) kunit_log_append(char *log, const char *fmt, ...); /** @@ -420,7 +427,7 @@ void __printf(2, 3) kunit_log_append(char *log, const char *fmt, ...); #define kunit_log(lvl, test_or_suite, fmt, ...) \ do { \ printk(lvl fmt, ##__VA_ARGS__); \ - kunit_log_append((test_or_suite)->log, fmt "\n", \ + kunit_log_append((test_or_suite)->log, fmt, \ ##__VA_ARGS__); \ } while (0) diff --git a/lib/kunit/kunit-test.c b/lib/kunit/kunit-test.c index 4df0335d0d06..b63595d3e241 100644 --- a/lib/kunit/kunit-test.c +++ b/lib/kunit/kunit-test.c @@ -443,18 +443,6 @@ static struct kunit_suite kunit_resource_test_suite = { .test_cases = kunit_resource_test_cases, }; -static void kunit_log_test(struct kunit *test); - -static struct kunit_case kunit_log_test_cases[] = { - KUNIT_CASE(kunit_log_test), - {} -}; - -static struct kunit_suite kunit_log_test_suite = { - .name = "kunit-log-test", - .test_cases = kunit_log_test_cases, -}; - static void kunit_log_test(struct kunit *test) { struct kunit_suite suite; @@ -481,6 +469,29 @@ static void kunit_log_test(struct kunit *test) #endif } +static void kunit_log_newline_test(struct kunit *test) +{ + kunit_info(test, "Add newline\n"); + if (test->log) { + KUNIT_ASSERT_NOT_NULL_MSG(test, strstr(test->log, "Add newline\n"), + "Missing log line, full log:\n%s", test->log); + KUNIT_EXPECT_NULL(test, strstr(test->log, "Add newline\n\n")); + } else { + kunit_skip(test, "only useful when debugfs is enabled"); + } +} + +static struct kunit_case kunit_log_test_cases[] = { + KUNIT_CASE(kunit_log_test), + KUNIT_CASE(kunit_log_newline_test), + {} +}; + +static struct kunit_suite kunit_log_test_suite = { + .name = "kunit-log-test", + .test_cases = kunit_log_test_cases, +}; + static void kunit_status_set_failure_test(struct kunit *test) { struct kunit fake; diff --git a/lib/kunit/test.c b/lib/kunit/test.c index fb6b39cca0ae..1ea981392af3 100644 --- a/lib/kunit/test.c +++ b/lib/kunit/test.c @@ -108,6 +108,17 @@ static void kunit_print_test_stats(struct kunit *test, stats.total); } +void kunit_log_newline(char *log) +{ + int log_len, len_left; + + log_len = strlen(log); + len_left = KUNIT_LOG_SIZE - log_len - 1; + + if (log_len > 0 && log[log_len - 1] != '\n') + strncat(log, "\n", len_left); +} + /* * Append formatted message to log, size of which is limited to * KUNIT_LOG_SIZE bytes (including null terminating byte). @@ -134,6 +145,9 @@ void kunit_log_append(char *log, const char *fmt, ...) va_start(args, fmt); vsnprintf(log + log_len, min(len, len_left), fmt, args); va_end(args); + + /* Add newline to end of log if not already present. */ + kunit_log_newline(log); } EXPORT_SYMBOL_GPL(kunit_log_append);