From patchwork Thu May 12 18:35:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Latypov X-Patchwork-Id: 12848030 X-Patchwork-Delegate: brendanhiggins@google.com 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 3827FC433EF for ; Thu, 12 May 2022 18:35:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1357708AbiELSfu (ORCPT ); Thu, 12 May 2022 14:35:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1357709AbiELSft (ORCPT ); Thu, 12 May 2022 14:35:49 -0400 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 55D9715FCD for ; Thu, 12 May 2022 11:35:48 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2f7ee6bc6ddso52506437b3.1 for ; Thu, 12 May 2022 11:35:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=SidjaeLltkRbDBELlZ8bKr9H1JAqOBDWVEO14927GyI=; b=A2ERi4ku4zhqWOlWCPybWStRNXTkdG2DtBVymreb4ROsX6VEWjLvpqBPK/kqWbNFur uRZNIMsq4WzDmlA7mba5ERI+xP5xQCd80dAXqfWtMjVW9GdnyE6guCgcB7whpp1uZSLV Ol1JbLqgCv3ZNzGoDBVE8Y7tCy7JGQE+XgKZDCLZJVW55EhF3L48iaK4UfVZTgeqGy8O pR7vbLKm4kR6FBr9GwFlljJr2x5Q6mS1/U+KDrlsPcLciikBC89y/A+szG6sSNJYZJc9 QFEh08T9cImGFyEAEy2hmaA8LEUqSWpgyX0sNaNOMBQvFMGMfz0IpSQqxksNsoq2xRst JmXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=SidjaeLltkRbDBELlZ8bKr9H1JAqOBDWVEO14927GyI=; b=B0ioZTfd2OdJ5MRWpKNmz1a99UCBuXT+IwIqM0YsD7w5luPb5DGs/FxnmhC/LlLMI6 99mywm/I8aTMVZmF6QTc25W1jCBdggBXDJZ1wDuEvsTjea145K7T21zENUYp/oCs+V+Z 1jBBiEL1uiKqYOzoRwsnLMWkduyRWeJS0exmrph0xiK4H1INREBnogd+tHUJsrqsPtET QOTJfWDCzsa6K6/CCLUolKjWSNQ3L9cjSjJrc7sdhPjG3uyzpwL0P3jK2UqaUacrhqrs gDKt/HDbz4rmVhVINI6dQsWGUFfmKV/xNQ2ZJnzbq0AR9qfTLOauJj9nyK/9rcW8938l 2emA== X-Gm-Message-State: AOAM532z1r1vgggDo9ClBlJuADe2/Upv1ogKRK6sIqpG5ycvDKQWqGfF Cp6DUamfmzfAyoMjPZYOmamaTRStHvVhTg== X-Google-Smtp-Source: ABdhPJzFPdg5t/6kjhor0OfRDTgulq0Sj2XKyFGTWJULnP0zF9fQ4IpZFh0HjIToRf+B2L2cUvDeYiM751dOzQ== X-Received: from dlatypov.svl.corp.google.com ([2620:15c:2cd:202:648d:cdc5:d51:4873]) (user=dlatypov job=sendgmr) by 2002:a25:33d6:0:b0:64a:9d22:f005 with SMTP id z205-20020a2533d6000000b0064a9d22f005mr1172243ybz.54.1652380547371; Thu, 12 May 2022 11:35:47 -0700 (PDT) Date: Thu, 12 May 2022 11:35:36 -0700 Message-Id: <20220512183538.3787321-1-dlatypov@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.36.0.550.gb090851708-goog Subject: [PATCH v2 1/3] kunit: tool: remove dead parse_crash_in_log() logic From: Daniel Latypov To: brendanhiggins@google.com, davidgow@google.com Cc: linux-kernel@vger.kernel.org, kunit-dev@googlegroups.com, linux-kselftest@vger.kernel.org, skhan@linuxfoundation.org, Daniel Latypov Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org This logic depends on the kernel logging a message containing 'kunit test case crashed', but there is no corresponding logic to do so. This is likely a relic of the revision process KUnit initially went through when being upstreamed. Delete it given 1) it's been missing for years and likely won't get implemented 2) the parser has been moving to be a more general KTAP parser, kunit-only magic like this isn't how we'd want to implement it. Signed-off-by: Daniel Latypov Reviewed-by: David Gow Reviewed-by: Brendan Higgins --- v1 -> v2: rebase onto -kselftest/kunit branch, no changes --- tools/testing/kunit/kunit_parser.py | 21 ------ tools/testing/kunit/kunit_tool_test.py | 17 ++--- .../test_data/test_is_test_passed-crash.log | 70 ------------------- 3 files changed, 4 insertions(+), 104 deletions(-) delete mode 100644 tools/testing/kunit/test_data/test_is_test_passed-crash.log base-commit: 9660209d9418f2295d31fea0d32e313e9b2c1200 diff --git a/tools/testing/kunit/kunit_parser.py b/tools/testing/kunit/kunit_parser.py index e16331a5bec4..c8c0df56cc51 100644 --- a/tools/testing/kunit/kunit_parser.py +++ b/tools/testing/kunit/kunit_parser.py @@ -475,26 +475,6 @@ def parse_diagnostic(lines: LineStream) -> List[str]: log.append(lines.pop()) return log -DIAGNOSTIC_CRASH_MESSAGE = re.compile(r'^# .*?: kunit test case crashed!$') - -def parse_crash_in_log(test: Test) -> bool: - """ - Iterate through the lines of the log to parse for crash message. - If crash message found, set status to crashed and return True. - Otherwise return False. - - Parameters: - test - Test object for current test being parsed - - Return: - True if crash message found in log - """ - for line in test.log: - if DIAGNOSTIC_CRASH_MESSAGE.match(line): - test.status = TestStatus.TEST_CRASHED - return True - return False - # Printing helper methods: @@ -682,7 +662,6 @@ def bubble_up_test_results(test: Test) -> None: Parameters: test - Test object for current test being parsed """ - parse_crash_in_log(test) subtests = test.subtests counts = test.counts status = test.status diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py index aebda46bcad8..b417eceeda74 100755 --- a/tools/testing/kunit/kunit_tool_test.py +++ b/tools/testing/kunit/kunit_tool_test.py @@ -230,15 +230,6 @@ class KUnitParserTest(unittest.TestCase): print_mock.stop() self.assertEqual(0, len(result.subtests)) - def test_crashed_test(self): - crashed_log = test_data_path('test_is_test_passed-crash.log') - with open(crashed_log) as file: - result = kunit_parser.parse_run_tests( - file.readlines()) - self.assertEqual( - kunit_parser.TestStatus.TEST_CRASHED, - result.status) - def test_skipped_test(self): skipped_log = test_data_path('test_skip_tests.log') with open(skipped_log) as file: @@ -478,10 +469,10 @@ class KUnitJsonTest(unittest.TestCase): result["sub_groups"][1]["test_cases"][0]) def test_crashed_test_json(self): - result = self._json_for('test_is_test_passed-crash.log') + result = self._json_for('test_kernel_panic_interrupt.log') self.assertEqual( - {'name': 'example_simple_test', 'status': 'ERROR'}, - result["sub_groups"][1]["test_cases"][0]) + {'name': '', 'status': 'ERROR'}, + result["sub_groups"][2]["test_cases"][1]) def test_skipped_test_json(self): result = self._json_for('test_skip_tests.log') @@ -562,7 +553,7 @@ class KUnitMainTest(unittest.TestCase): def test_exec_no_tests(self): self.linux_source_mock.run_kernel = mock.Mock(return_value=['TAP version 14', '1..0']) with self.assertRaises(SystemExit) as e: - kunit.main(['run'], self.linux_source_mock) + kunit.main(['run'], self.linux_source_mock) self.linux_source_mock.run_kernel.assert_called_once_with( args=None, build_dir='.kunit', filter_glob='', timeout=300) self.print_mock.assert_any_call(StrContains(' 0 tests run!')) diff --git a/tools/testing/kunit/test_data/test_is_test_passed-crash.log b/tools/testing/kunit/test_data/test_is_test_passed-crash.log deleted file mode 100644 index 4d97f6708c4a..000000000000 --- a/tools/testing/kunit/test_data/test_is_test_passed-crash.log +++ /dev/null @@ -1,70 +0,0 @@ -printk: console [tty0] enabled -printk: console [mc-1] enabled -TAP version 14 -1..2 - # Subtest: sysctl_test - 1..8 - # sysctl_test_dointvec_null_tbl_data: sysctl_test_dointvec_null_tbl_data passed - ok 1 - sysctl_test_dointvec_null_tbl_data - # sysctl_test_dointvec_table_maxlen_unset: sysctl_test_dointvec_table_maxlen_unset passed - ok 2 - sysctl_test_dointvec_table_maxlen_unset - # sysctl_test_dointvec_table_len_is_zero: sysctl_test_dointvec_table_len_is_zero passed - ok 3 - sysctl_test_dointvec_table_len_is_zero - # sysctl_test_dointvec_table_read_but_position_set: sysctl_test_dointvec_table_read_but_position_set passed - ok 4 - sysctl_test_dointvec_table_read_but_position_set - # sysctl_test_dointvec_happy_single_positive: sysctl_test_dointvec_happy_single_positive passed - ok 5 - sysctl_test_dointvec_happy_single_positive - # sysctl_test_dointvec_happy_single_negative: sysctl_test_dointvec_happy_single_negative passed - ok 6 - sysctl_test_dointvec_happy_single_negative - # sysctl_test_dointvec_single_less_int_min: sysctl_test_dointvec_single_less_int_min passed - ok 7 - sysctl_test_dointvec_single_less_int_min - # sysctl_test_dointvec_single_greater_int_max: sysctl_test_dointvec_single_greater_int_max passed - ok 8 - sysctl_test_dointvec_single_greater_int_max -kunit sysctl_test: all tests passed -ok 1 - sysctl_test - # Subtest: example - 1..2 -init_suite - # example_simple_test: initializing -Stack: - 6016f7db 6f81bd30 6f81bdd0 60021450 - 6024b0e8 60021440 60018bbe 16f81bdc0 - 00000001 6f81bd30 6f81bd20 6f81bdd0 -Call Trace: - [<6016f7db>] ? kunit_try_run_case+0xab/0xf0 - [<60021450>] ? set_signals+0x0/0x60 - [<60021440>] ? get_signals+0x0/0x10 - [<60018bbe>] ? kunit_um_run_try_catch+0x5e/0xc0 - [<60021450>] ? set_signals+0x0/0x60 - [<60021440>] ? get_signals+0x0/0x10 - [<60018bb3>] ? kunit_um_run_try_catch+0x53/0xc0 - [<6016f321>] ? kunit_run_case_catch_errors+0x121/0x1a0 - [<60018b60>] ? kunit_um_run_try_catch+0x0/0xc0 - [<600189e0>] ? kunit_um_throw+0x0/0x180 - [<6016f730>] ? kunit_try_run_case+0x0/0xf0 - [<6016f600>] ? kunit_catch_run_case+0x0/0x130 - [<6016edd0>] ? kunit_vprintk+0x0/0x30 - [<6016ece0>] ? kunit_fail+0x0/0x40 - [<6016eca0>] ? kunit_abort+0x0/0x40 - [<6016ed20>] ? kunit_printk_emit+0x0/0xb0 - [<6016f200>] ? kunit_run_case_catch_errors+0x0/0x1a0 - [<6016f46e>] ? kunit_run_tests+0xce/0x260 - [<6005b390>] ? unregister_console+0x0/0x190 - [<60175b70>] ? suite_kunit_initexample_test_suite+0x0/0x20 - [<60001cbb>] ? do_one_initcall+0x0/0x197 - [<60001d47>] ? do_one_initcall+0x8c/0x197 - [<6005cd20>] ? irq_to_desc+0x0/0x30 - [<60002005>] ? kernel_init_freeable+0x1b3/0x272 - [<6005c5ec>] ? printk+0x0/0x9b - [<601c0086>] ? kernel_init+0x26/0x160 - [<60014442>] ? new_thread_handler+0x82/0xc0 - - # example_simple_test: kunit test case crashed! - # example_simple_test: example_simple_test failed - not ok 1 - example_simple_test - # example_mock_test: initializing - # example_mock_test: example_mock_test passed - ok 2 - example_mock_test -kunit example: one or more tests failed -not ok 2 - example -List of all partitions: From patchwork Thu May 12 18:35:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Latypov X-Patchwork-Id: 12848031 X-Patchwork-Delegate: brendanhiggins@google.com 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 30844C4332F for ; Thu, 12 May 2022 18:35:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1357718AbiELSfx (ORCPT ); Thu, 12 May 2022 14:35:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43368 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1357715AbiELSfv (ORCPT ); Thu, 12 May 2022 14:35:51 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3933615FCD for ; Thu, 12 May 2022 11:35:50 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id b11-20020a5b008b000000b00624ea481d55so5279937ybp.19 for ; Thu, 12 May 2022 11:35:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=JGiQqPbzZI43Exh1pGQSCZMsidLcFHDmUJ9SQCHRjpQ=; b=TOEnTKWHTsN8Xkd5ifzGE7jvO9Btwk9Kqsf5YLpMp4cgR8zpxKNk7j0GOVKsVualvK NA/kXhsrvncY07DiA5K9adK63sAElgwgamxWTD9qN2h1qLP3KAo6Avu/qTQBDqQBlceD u9aVk3JdE5bmHPjFh18f9NFUSXN4QqZCeqm+RvVa0BiPfYefXWuqlspXCFPWUfltZpUq xW9hfEIEo9XsINrjhhkOjk0aCJsvA32euf1X6xY6mJrNtNzJbJ3P7Tghuw1bSmWvYASE ZKtoMRlKmMAtBTI9+i/yplwCpoipHZqYFYxON8axNP+b06Ow/dxvz2bXzKAz6bE858YM nYNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=JGiQqPbzZI43Exh1pGQSCZMsidLcFHDmUJ9SQCHRjpQ=; b=Py2NtBZ4bjumnJZjjO4wlmwmduYIb1cMNf+cVqSojia/Tqe7lnB9gChwasarXXHPtM CB+e/PEDsr9IA5ut1TWFDiUVV+JiBb6FfDMtsTJmijOabAhJt3hdSE7yNybUc+UiEZ4b wzSNg3DywTSq3DCkkIpGsbvSKPkLjM+FXu92CXyDUPF4cqeoGonWT5/aDcwzi9c4uLOy O+DMJenuBhD/S0o4HHmgmSyAtewj0wF1q66K/0vAy9bhLpON0upKHYuzKQK2nJo/Ggyn ZgbZWXx1s54U4HCE4dCr425qb5F0aKBWCsI2i9xM69ER0X0KjE3CR5ObegsYivsZ0ysD ujFQ== X-Gm-Message-State: AOAM530+4JzEHhEB/J1Yhe1vIptYw9sFoRMrAHLWc1ccDGl6cn2MSWhY KhJzMEmbdNDxYksQeRTfZ6+ZIrfeaSGpBQ== X-Google-Smtp-Source: ABdhPJyRK46hxvfj/rDOehwb6CSzdEFN91lo67wAnd2VOsNNdFm5yiKXWO5EPr5DQWn3fiOfQNuD0//5cicCtg== X-Received: from dlatypov.svl.corp.google.com ([2620:15c:2cd:202:648d:cdc5:d51:4873]) (user=dlatypov job=sendgmr) by 2002:a25:4094:0:b0:64a:86ea:ff02 with SMTP id n142-20020a254094000000b0064a86eaff02mr1228468yba.592.1652380549482; Thu, 12 May 2022 11:35:49 -0700 (PDT) Date: Thu, 12 May 2022 11:35:37 -0700 In-Reply-To: <20220512183538.3787321-1-dlatypov@google.com> Message-Id: <20220512183538.3787321-2-dlatypov@google.com> Mime-Version: 1.0 References: <20220512183538.3787321-1-dlatypov@google.com> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog Subject: [PATCH v2 2/3] kunit: tool: make parser stop overwriting status of suites w/ no_tests From: Daniel Latypov To: brendanhiggins@google.com, davidgow@google.com Cc: linux-kernel@vger.kernel.org, kunit-dev@googlegroups.com, linux-kselftest@vger.kernel.org, skhan@linuxfoundation.org, Daniel Latypov Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org Consider this invocation $ ./tools/testing/kunit/kunit.py parse < parent_test = parse_test_header(lines, test) where we have special handling when we see "# Subtest" and we ignore the explicit reported "not ok 1" status! Also, NO_TESTS at a suite-level only results in a non-zero status code where then there's only one suite atm. This change is the minimal one to make sure we don't overwrite it. Signed-off-by: Daniel Latypov Reviewed-by: David Gow Reviewed-by: Brendan Higgins --- v1 -> v2: rebase onto -kselftest/kunit branch, no changes --- tools/testing/kunit/kunit_parser.py | 7 +++++-- .../test_data/test_is_test_passed-no_tests_no_plan.log | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/testing/kunit/kunit_parser.py b/tools/testing/kunit/kunit_parser.py index c8c0df56cc51..9f5a73f36c2d 100644 --- a/tools/testing/kunit/kunit_parser.py +++ b/tools/testing/kunit/kunit_parser.py @@ -775,8 +775,11 @@ def parse_test(lines: LineStream, expected_num: int, log: List[str]) -> Test: # Check for there being no tests if parent_test and len(subtests) == 0: - test.status = TestStatus.NO_TESTS - test.add_error('0 tests run!') + # Don't override a bad status if this test had one reported. + # Assumption: no subtests means CRASHED is from Test.__init__() + if test.status in (TestStatus.TEST_CRASHED, TestStatus.SUCCESS): + test.status = TestStatus.NO_TESTS + test.add_error('0 tests run!') # Add statuses to TestCounts attribute in Test object bubble_up_test_results(test) diff --git a/tools/testing/kunit/test_data/test_is_test_passed-no_tests_no_plan.log b/tools/testing/kunit/test_data/test_is_test_passed-no_tests_no_plan.log index dd873c981108..4f81876ee6f1 100644 --- a/tools/testing/kunit/test_data/test_is_test_passed-no_tests_no_plan.log +++ b/tools/testing/kunit/test_data/test_is_test_passed-no_tests_no_plan.log @@ -3,5 +3,5 @@ TAP version 14 # Subtest: suite 1..1 # Subtest: case - ok 1 - case # SKIP + ok 1 - case ok 1 - suite From patchwork Thu May 12 18:35:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Latypov X-Patchwork-Id: 12848032 X-Patchwork-Delegate: brendanhiggins@google.com 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 E6F90C433F5 for ; Thu, 12 May 2022 18:35:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1357715AbiELSfz (ORCPT ); Thu, 12 May 2022 14:35:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1357723AbiELSfx (ORCPT ); Thu, 12 May 2022 14:35:53 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3F5561EAE2 for ; Thu, 12 May 2022 11:35:52 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id r14-20020a25844e000000b00648bdf7491bso5330520ybm.1 for ; Thu, 12 May 2022 11:35:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=2enWvaqrdYbCiB3VbP1vtMoCf+yvavsfo9hN39o4ARU=; b=osSgR96Irq0ZXTGAx3528oBnX2l8VQha+YDW9a1K8M6JzfuN/5Hw061dtBi9fv3LzU CZitgNW0WdsfFySDTvrzC44fPPgdZimFxJuIOTw29puXw16JHtIF9fZN6bc9Y03zH6SU mS3dUC5UwuHyVs5neSK46S+MUlFgBPzHnWPiGkyOk/L6P8gNoo+/dDYQqbRnt3NMZQQU K0TtfI5mwe3UwmpvJxkrGucNv3Q+z8L4rRr+JZu4CHVODYt/TVQ26cG0T2TZeUgCy02c AliND4yzRBKo0I2LbgBxWgnh4l0U37OoKJeBaKNm381r2a9m8htp7Sfk+t4xmieNWrVp Ffyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=2enWvaqrdYbCiB3VbP1vtMoCf+yvavsfo9hN39o4ARU=; b=iQBbgWcnukN9md1m5HUuJNHZ3THO9LDhwnLu/7yfNivDoj5w5QAZQ+qKX/Oi+ZAhMY yoj2HC3CftF8pfXc5CRYLRbRzH/15hwQZPIKB0O8TtVz0CZgfdzhya9k2CLz5/zEOP7X KA8dEf8hkyvqp26ps3NsYEGc1Iv+ddQ7+lmQ0QOFCWb1WKYmvKSq2FXBm0vol4yysp1x aEqJ6l6Y7VmJ2KlfAyRTocFl04UeIHxttBaGe71Wt5jnfmckHnx4eQ4SC3Z67sLtvViG iC+TQO20qBIDsQWJ2j24WqaCM9vSf9XMLqGpQOgK5aw9s29qggOUDolGhRa+UWUk/wxs yKIQ== X-Gm-Message-State: AOAM530S1T78cbf4tnbw7eFqBSNUEHe/m6YNQl64ZexO016pHYrI3HOE cf0AkZgqWI485lP8sR/qWZd5oamIS7S38w== X-Google-Smtp-Source: ABdhPJwnyRj2IOHbbkYsRi3JUd6TluH/OeIflbIOyZvh62YNtEDnq+6dZINlUgXLZcd7F/0aimR3R8Yxo298rw== X-Received: from dlatypov.svl.corp.google.com ([2620:15c:2cd:202:648d:cdc5:d51:4873]) (user=dlatypov job=sendgmr) by 2002:a25:48c8:0:b0:648:be07:a758 with SMTP id v191-20020a2548c8000000b00648be07a758mr1210783yba.346.1652380551466; Thu, 12 May 2022 11:35:51 -0700 (PDT) Date: Thu, 12 May 2022 11:35:38 -0700 In-Reply-To: <20220512183538.3787321-1-dlatypov@google.com> Message-Id: <20220512183538.3787321-3-dlatypov@google.com> Mime-Version: 1.0 References: <20220512183538.3787321-1-dlatypov@google.com> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog Subject: [PATCH v2 3/3] kunit: tool: minor cosmetic cleanups in kunit_parser.py From: Daniel Latypov To: brendanhiggins@google.com, davidgow@google.com Cc: linux-kernel@vger.kernel.org, kunit-dev@googlegroups.com, linux-kselftest@vger.kernel.org, skhan@linuxfoundation.org, Daniel Latypov Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org There should be no behavioral changes from this patch. This patch removes redundant comment text, inlines a function used in only one place, and other such minor tweaks. Signed-off-by: Daniel Latypov Reviewed-by: David Gow Reviewed-by: Brendan Higgins --- v1 -> v2: rebase onto -kselftest/kunit branch, minor merge conflict (a nearby comment got reworded) --- tools/testing/kunit/kunit_parser.py | 71 +++++++---------------------- 1 file changed, 17 insertions(+), 54 deletions(-) diff --git a/tools/testing/kunit/kunit_parser.py b/tools/testing/kunit/kunit_parser.py index 9f5a73f36c2d..98264177b0bd 100644 --- a/tools/testing/kunit/kunit_parser.py +++ b/tools/testing/kunit/kunit_parser.py @@ -46,10 +46,8 @@ class Test(object): def __str__(self) -> str: """Returns string representation of a Test class object.""" - return ('Test(' + str(self.status) + ', ' + self.name + - ', ' + str(self.expected_count) + ', ' + - str(self.subtests) + ', ' + str(self.log) + ', ' + - str(self.counts) + ')') + return (f'Test({self.status}, {self.name}, {self.expected_count}, ' + f'{self.subtests}, {self.log}, {self.counts})') def __repr__(self) -> str: """Returns string representation of a Test class object.""" @@ -58,7 +56,7 @@ class Test(object): def add_error(self, error_message: str) -> None: """Records an error that occurred while parsing this test.""" self.counts.errors += 1 - print_error('Test ' + self.name + ': ' + error_message) + print_with_timestamp(red('[ERROR]') + f' Test: {self.name}: {error_message}') class TestStatus(Enum): """An enumeration class to represent the status of a test.""" @@ -92,8 +90,7 @@ class TestCounts: self.errors = 0 def __str__(self) -> str: - """Returns the string representation of a TestCounts object. - """ + """Returns the string representation of a TestCounts object.""" statuses = [('passed', self.passed), ('failed', self.failed), ('crashed', self.crashed), ('skipped', self.skipped), ('errors', self.errors)] @@ -130,30 +127,19 @@ class TestCounts: if self.total() == 0: return TestStatus.NO_TESTS elif self.crashed: - # If one of the subtests crash, the expected status - # of the Test is crashed. + # Crashes should take priority. return TestStatus.TEST_CRASHED elif self.failed: - # Otherwise if one of the subtests fail, the - # expected status of the Test is failed. return TestStatus.FAILURE elif self.passed: - # Otherwise if one of the subtests pass, the - # expected status of the Test is passed. + # No failures or crashes, looks good! return TestStatus.SUCCESS else: - # Finally, if none of the subtests have failed, - # crashed, or passed, the expected status of the - # Test is skipped. + # We have only skipped tests. return TestStatus.SKIPPED def add_status(self, status: TestStatus) -> None: - """ - Increments count of inputted status. - - Parameters: - status - status to be added to the TestCounts object - """ + """Increments the count for `status`.""" if status == TestStatus.SUCCESS: self.passed += 1 elif status == TestStatus.FAILURE: @@ -283,11 +269,9 @@ def check_version(version_num: int, accepted_versions: List[int], test - Test object for current test being parsed """ if version_num < min(accepted_versions): - test.add_error(version_type + - ' version lower than expected!') + test.add_error(f'{version_type} version lower than expected!') elif version_num > max(accepted_versions): - test.add_error( - version_type + ' version higher than expected!') + test.add_error(f'{version_type} version higer than expected!') def parse_ktap_header(lines: LineStream, test: Test) -> bool: """ @@ -440,8 +424,7 @@ def parse_test_result(lines: LineStream, test: Test, # Check test num num = int(match.group(2)) if num != expected_num: - test.add_error('Expected test number ' + - str(expected_num) + ' but found ' + str(num)) + test.add_error(f'Expected test number {expected_num} but found {num}') # Set status of test object status = match.group(1) @@ -529,7 +512,7 @@ def format_test_divider(message: str, len_message: int) -> str: # calculate number of dashes for each side of the divider len_1 = int(difference / 2) len_2 = difference - len_1 - return ('=' * len_1) + ' ' + message + ' ' + ('=' * len_2) + return ('=' * len_1) + f' {message} ' + ('=' * len_2) def print_test_header(test: Test) -> None: """ @@ -545,20 +528,13 @@ def print_test_header(test: Test) -> None: message = test.name if test.expected_count: if test.expected_count == 1: - message += (' (' + str(test.expected_count) + - ' subtest)') + message += ' (1 subtest)' else: - message += (' (' + str(test.expected_count) + - ' subtests)') + message += f' ({test.expected_count} subtests)' print_with_timestamp(format_test_divider(message, len(message))) def print_log(log: Iterable[str]) -> None: - """ - Prints all strings in saved log for test in yellow. - - Parameters: - log - Iterable object with all strings saved in log for test - """ + """Prints all strings in saved log for test in yellow.""" for m in log: print_with_timestamp(yellow(m)) @@ -635,20 +611,7 @@ def print_summary_line(test: Test) -> None: color = yellow else: color = red - counts = test.counts - print_with_timestamp(color('Testing complete. ' + str(counts))) - -def print_error(error_message: str) -> None: - """ - Prints error message with error format. - - Example: - "[ERROR] Test example: missing test plan!" - - Parameters: - error_message - message describing error - """ - print_with_timestamp(red('[ERROR] ') + error_message) + print_with_timestamp(color(f'Testing complete. {test.counts}')) # Other methods: @@ -794,7 +757,7 @@ def parse_test(lines: LineStream, expected_num: int, log: List[str]) -> Test: def parse_run_tests(kernel_output: Iterable[str]) -> Test: """ Using kernel output, extract KTAP lines, parse the lines for test - results and print condensed test results and summary line . + results and print condensed test results and summary line. Parameters: kernel_output - Iterable object contains lines of kernel output