Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp1243280pxb; Fri, 21 Jan 2022 13:11:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJwlsWgywTrJjvGVvA8qPBq1UWglwlixVw50/9jy/2zbCs756Bkwpa2JjfO7oC/rhSkSwGZd X-Received: by 2002:a17:902:6807:b0:14b:3020:1db6 with SMTP id h7-20020a170902680700b0014b30201db6mr637560plk.109.1642799489618; Fri, 21 Jan 2022 13:11:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642799489; cv=none; d=google.com; s=arc-20160816; b=tQ+gBdYtnMw96Ax8a5mrUAZAcyytZQIcAdEo3Mvs0dlJv4dML6eKYniZByJUyhzxHg H1A0JLon2hVeLaSpRKKK8IU1O9HEgdfIc9atFeyNRUIAUgZ/bNyG8BcBsP0SbxHFFsZc r3eg8L+BErYC4Y7yzQEftdyZP1TFKwxoK2A6YmM+fNWoREAezYeFGxpByUTLRNTTPIB8 Ezr/FKN94qxbBf/rihvhlzzl59yOhf/MJrTFw5MYnkI9KlwK6bO3gF752+MTdaia8oxT muPJP5XmM2p/3oSAOiULfYLXnYQVd7vP0bAgTNhs/WwB6NZy8v6zgAP9L3pwUna4kGvN ow2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=wXedjPA/g0d5fwBmS5yesJEwHUKsb9qj6umHUF7IzOs=; b=YC1Vr9ec4LQ8IARas0umLenYN8+U26HQW0fvHADbZ5gRnAFzHjaa6/GJAMSsZ10rBE fETwB+pxk5tAbc14cKcUEO61jVP8oQMalUfLGlAFOtmXSow7cP+woR+eSkdDOW/G9vPc fVgdZRvU+0VM+P5k0g/p7iPgZxCjzzvXPP1Itdmrm+kWf3KsuHd/S2Qj9sDB9uTCVFST BPkKHCC7qIiOfh0MBtQmoM79n2RuGlVXvbeFccAiuZQFMIrpwYQeS8LndYSCJNLRNW1F Yqw4xvoIBTjTIycFWMYYuvwrkITuBhnfepl89Sx49QORaYR6KkFoAASzOZ8BvyT8gDfp DvCQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=dqJ+1OZa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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. [23.128.96.18]) by mx.google.com with ESMTP id j6si1256303pld.55.2022.01.21.13.11.18; Fri, 21 Jan 2022 13:11:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=dqJ+1OZa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S1359249AbiATIbC (ORCPT + 99 others); Thu, 20 Jan 2022 03:31:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33822 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1359238AbiATIaa (ORCPT ); Thu, 20 Jan 2022 03:30:30 -0500 Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B6134C06175B for ; Thu, 20 Jan 2022 00:30:29 -0800 (PST) Received: by mail-wm1-x333.google.com with SMTP id e9-20020a05600c4e4900b0034d23cae3f0so11876289wmq.2 for ; Thu, 20 Jan 2022 00:30:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=wXedjPA/g0d5fwBmS5yesJEwHUKsb9qj6umHUF7IzOs=; b=dqJ+1OZaOizvZwHF8PGNtXy8Nq55gAekvHaEHYOCK/oaoVf9ow+zA9vLERR7KXaw4G tQAXXqM1ICIFN0/Okp6W6BkvzDEXaQnstSDJ3L+shGqaCZ+FHhstKrlK5FRpvoXjyJbE 91iGl7CpCaB4MRXXlh7iYvOIXlAKgHKKxhet3sCzf6wiCidEMdc6YOTlfnmdBRrgjVzb 6RIEmKTM3PHHRdD4n3LhroMPlVu/EmfUevCeL/PrnPRpRWn7QYsqwAhFTDk5O3rxpnvb S0RcIawvC9RsAF6ANAEwKxGgOiS+DB9aHUuHHsg+Vndx8Njw9jVOcqPjELhI/MCv4RfX ZMJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=wXedjPA/g0d5fwBmS5yesJEwHUKsb9qj6umHUF7IzOs=; b=FSSScgZmu+GcP+btBCbL6qwAwFHs8lFqS6umF3qKtDB1T9/bJvqRFMMida0WxHKsPl bWWfXYlsZl8s6qPK5K0OWofFdoHO14DovPdgDK9zQUjI9M9AihFbbk5rX3n2YzzlvSF/ EIRJYf7JdgUtskdCVdVO+/L9dUqz41MZcDDJGtZGlhYzqb+lTQZFiHiV2OGpfHrozLsx 92rRvVIBJ/ULUDGYFFj/rXfOY/WQDnLlUAWWQYKACaEq5cZmaQBYNmaFSbt8qXrcD9AC szMl7ioVsJo5UHbeJCQpXKTbWB1bx2QSAUf+MH9VDLMbI0p2gAjOyNGZEtsrFohXlV7s 7wTQ== X-Gm-Message-State: AOAM531hLio7O5twmadO5/q1VImcygWbQ6enjFw+bzxxbsMhT0ku5sjl G+k5iucpJkVckD0a69ix+6JAbGEpj8QbrGeuMx8pEg== X-Received: by 2002:a05:600c:1e19:: with SMTP id ay25mr7640548wmb.131.1642667427972; Thu, 20 Jan 2022 00:30:27 -0800 (PST) MIME-Version: 1.0 References: <20220118190922.1557074-1-dlatypov@google.com> <20220118190922.1557074-5-dlatypov@google.com> In-Reply-To: <20220118190922.1557074-5-dlatypov@google.com> From: David Gow Date: Thu, 20 Jan 2022 16:30:16 +0800 Message-ID: Subject: Re: [PATCH 5/5] kunit: tool: simplify code since build_dir can't be None To: Daniel Latypov Cc: Brendan Higgins , Linux Kernel Mailing List , KUnit Development , "open list:KERNEL SELFTEST FRAMEWORK" , Shuah Khan Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 19, 2022 at 3:09 AM Daniel Latypov wrote: > > --build_dir is set to a default of '.kunit' since commit ddbd60c779b4 > ("kunit: use --build_dir=.kunit as default"), but even before then it > was explicitly set to ''. > > So outside of one unit test, there was no way for the build_dir to be > ever be None, and we can simplify code by fixing the unit test and > enforcing that via updated type annotations. > > E.g. this lets us drop `get_file_path()` since it's now exactly > equivalent to os.path.join(). > > Note: there's some `if build_dir` checks that also fail if build_dir is > explicitly set to '' that just guard against passing "O=" to make. > But running `make O=` works just fine, so drop these checks. > > Signed-off-by: Daniel Latypov > --- Looks good to me. Passing "--build_dir=" to KUnit didn't work before, as well, as "" is not considered a valid path. You've got to specify --build-dir=. to get anything useful to happen. Reviewed-by: David Gow -- David > tools/testing/kunit/kunit_json.py | 8 ++-- > tools/testing/kunit/kunit_kernel.py | 51 ++++++++++---------------- > tools/testing/kunit/kunit_tool_test.py | 2 +- > 3 files changed, 24 insertions(+), 37 deletions(-) > > diff --git a/tools/testing/kunit/kunit_json.py b/tools/testing/kunit/kunit_json.py > index 61091878f51e..24d103049bca 100644 > --- a/tools/testing/kunit/kunit_json.py > +++ b/tools/testing/kunit/kunit_json.py > @@ -12,12 +12,11 @@ import os > import kunit_parser > > from kunit_parser import Test, TestStatus > -from typing import Any, Dict, Optional > +from typing import Any, Dict > > JsonObj = Dict[str, Any] > > -def _get_group_json(test: Test, def_config: str, > - build_dir: Optional[str]) -> JsonObj: > +def _get_group_json(test: Test, def_config: str, build_dir: str) -> JsonObj: > sub_groups = [] # List[JsonObj] > test_cases = [] # List[JsonObj] > > @@ -50,8 +49,7 @@ def _get_group_json(test: Test, def_config: str, > } > return test_group > > -def get_json_result(test: Test, def_config: str, > - build_dir: Optional[str]) -> str: > +def get_json_result(test: Test, def_config: str, build_dir: str) -> str: > test_group = _get_group_json(test, def_config, build_dir) > test_group["name"] = "KUnit Test Group" > return json.dumps(test_group, indent=4) > diff --git a/tools/testing/kunit/kunit_kernel.py b/tools/testing/kunit/kunit_kernel.py > index 44bbe54f25f1..fe159e7ff697 100644 > --- a/tools/testing/kunit/kunit_kernel.py > +++ b/tools/testing/kunit/kunit_kernel.py > @@ -28,11 +28,6 @@ OUTFILE_PATH = 'test.log' > ABS_TOOL_PATH = os.path.abspath(os.path.dirname(__file__)) > QEMU_CONFIGS_DIR = os.path.join(ABS_TOOL_PATH, 'qemu_configs') > > -def get_file_path(build_dir, default): > - if build_dir: > - default = os.path.join(build_dir, default) > - return default > - > class ConfigError(Exception): > """Represents an error trying to configure the Linux kernel.""" > > @@ -59,17 +54,15 @@ class LinuxSourceTreeOperations(object): > def make_arch_qemuconfig(self, kconfig: kunit_config.Kconfig) -> None: > pass > > - def make_allyesconfig(self, build_dir, make_options) -> None: > + def make_allyesconfig(self, build_dir: str, make_options) -> None: > raise ConfigError('Only the "um" arch is supported for alltests') > > - def make_olddefconfig(self, build_dir, make_options) -> None: > - command = ['make', 'ARCH=' + self._linux_arch, 'olddefconfig'] > + def make_olddefconfig(self, build_dir: str, make_options) -> None: > + command = ['make', 'ARCH=' + self._linux_arch, 'O=' + build_dir, 'olddefconfig'] > if self._cross_compile: > command += ['CROSS_COMPILE=' + self._cross_compile] > if make_options: > command.extend(make_options) > - if build_dir: > - command += ['O=' + build_dir] > print('Populating config with:\n$', ' '.join(command)) > try: > subprocess.check_output(command, stderr=subprocess.STDOUT) > @@ -78,14 +71,12 @@ class LinuxSourceTreeOperations(object): > except subprocess.CalledProcessError as e: > raise ConfigError(e.output.decode()) > > - def make(self, jobs, build_dir, make_options) -> None: > - command = ['make', 'ARCH=' + self._linux_arch, '--jobs=' + str(jobs)] > + def make(self, jobs, build_dir: str, make_options) -> None: > + command = ['make', 'ARCH=' + self._linux_arch, 'O=' + build_dir, '--jobs=' + str(jobs)] > if make_options: > command.extend(make_options) > if self._cross_compile: > command += ['CROSS_COMPILE=' + self._cross_compile] > - if build_dir: > - command += ['O=' + build_dir] > print('Building with:\n$', ' '.join(command)) > try: > proc = subprocess.Popen(command, > @@ -143,14 +134,12 @@ class LinuxSourceTreeOperationsUml(LinuxSourceTreeOperations): > def __init__(self, cross_compile=None): > super().__init__(linux_arch='um', cross_compile=cross_compile) > > - def make_allyesconfig(self, build_dir, make_options) -> None: > + def make_allyesconfig(self, build_dir: str, make_options) -> None: > kunit_parser.print_with_timestamp( > 'Enabling all CONFIGs for UML...') > - command = ['make', 'ARCH=um', 'allyesconfig'] > + command = ['make', 'ARCH=um', 'O=' + build_dir, 'allyesconfig'] > if make_options: > command.extend(make_options) > - if build_dir: > - command += ['O=' + build_dir] > process = subprocess.Popen( > command, > stdout=subprocess.DEVNULL, > @@ -167,24 +156,24 @@ class LinuxSourceTreeOperationsUml(LinuxSourceTreeOperations): > > def start(self, params: List[str], build_dir: str) -> subprocess.Popen: > """Runs the Linux UML binary. Must be named 'linux'.""" > - linux_bin = get_file_path(build_dir, 'linux') > + linux_bin = os.path.join(build_dir, 'linux') > return subprocess.Popen([linux_bin] + params, > stdin=subprocess.PIPE, > stdout=subprocess.PIPE, > stderr=subprocess.STDOUT, > text=True, errors='backslashreplace') > > -def get_kconfig_path(build_dir) -> str: > - return get_file_path(build_dir, KCONFIG_PATH) > +def get_kconfig_path(build_dir: str) -> str: > + return os.path.join(build_dir, KCONFIG_PATH) > > -def get_kunitconfig_path(build_dir) -> str: > - return get_file_path(build_dir, KUNITCONFIG_PATH) > +def get_kunitconfig_path(build_dir: str) -> str: > + return os.path.join(build_dir, KUNITCONFIG_PATH) > > -def get_old_kunitconfig_path(build_dir) -> str: > - return get_file_path(build_dir, OLD_KUNITCONFIG_PATH) > +def get_old_kunitconfig_path(build_dir: str) -> str: > + return os.path.join(build_dir, OLD_KUNITCONFIG_PATH) > > -def get_outfile_path(build_dir) -> str: > - return get_file_path(build_dir, OUTFILE_PATH) > +def get_outfile_path(build_dir: str) -> str: > + return os.path.join(build_dir, OUTFILE_PATH) > > def get_source_tree_ops(arch: str, cross_compile: Optional[str]) -> LinuxSourceTreeOperations: > config_path = os.path.join(QEMU_CONFIGS_DIR, arch + '.py') > @@ -268,7 +257,7 @@ class LinuxSourceTree(object): > return False > return True > > - def validate_config(self, build_dir) -> bool: > + def validate_config(self, build_dir: str) -> bool: > kconfig_path = get_kconfig_path(build_dir) > validated_kconfig = kunit_config.parse_file(kconfig_path) > if self._kconfig.is_subset_of(validated_kconfig): > @@ -283,7 +272,7 @@ class LinuxSourceTree(object): > logging.error(message) > return False > > - def build_config(self, build_dir, make_options) -> bool: > + def build_config(self, build_dir: str, make_options) -> bool: > kconfig_path = get_kconfig_path(build_dir) > if build_dir and not os.path.exists(build_dir): > os.mkdir(build_dir) > @@ -311,7 +300,7 @@ class LinuxSourceTree(object): > old_kconfig = kunit_config.parse_file(old_path) > return old_kconfig.entries() != self._kconfig.entries() > > - def build_reconfig(self, build_dir, make_options) -> bool: > + def build_reconfig(self, build_dir: str, make_options) -> bool: > """Creates a new .config if it is not a subset of the .kunitconfig.""" > kconfig_path = get_kconfig_path(build_dir) > if not os.path.exists(kconfig_path): > @@ -326,7 +315,7 @@ class LinuxSourceTree(object): > os.remove(kconfig_path) > return self.build_config(build_dir, make_options) > > - def build_kernel(self, alltests, jobs, build_dir, make_options) -> bool: > + def build_kernel(self, alltests, jobs, build_dir: str, make_options) -> bool: > try: > if alltests: > self._ops.make_allyesconfig(build_dir, make_options) > diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py > index f7cbc248a405..a3c036a620b2 100755 > --- a/tools/testing/kunit/kunit_tool_test.py > +++ b/tools/testing/kunit/kunit_tool_test.py > @@ -469,7 +469,7 @@ class KUnitJsonTest(unittest.TestCase): > json_obj = kunit_json.get_json_result( > test=test_result, > def_config='kunit_defconfig', > - build_dir=None) > + build_dir='.kunit') > return json.loads(json_obj) > > def test_failed_test_json(self): > -- > 2.34.1.703.g22d0c6ccf7-goog >