From nobody Sun Apr 5 13:04:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1774370223; cv=none; d=zohomail.com; s=zohoarc; b=T56zwpl+LDkJsmaqJW3LtKEyQMrBlnl+E8EnggOG0/dp6K91Nn6H3QY15o/EWEj2vPkhmS/X+VaFa7L864TKmmtO4S/cruydlZox+IOcoqqRJs1dO12ZIc5eWKNifOvrLtwyrLC9yJl3eSyRKY6NMfCVUBjmWqNUFfjp/JypPUw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774370223; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0EOmgni/KQ1xseWl4UKQ9gZG1695RjOvpdQ2UFYpGBs=; b=LfIIsCYeffGkeyV93MKzI1f38JYxs2C1aqCtRDA3XatarTzUj95ef3RtltE0H/cnO1j6UFcRT/9HSEeGnETSH+FJaN0JxGYvp58FRYRVUi5kvlUSmJ1TRWtpV9OPJe16+srIIP8FA/Arq4Np0wqjOOocDVFi876jJYhJoGqZjnM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177437022380343.8055347941181; Tue, 24 Mar 2026 09:37:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w54jq-00015k-Cd; Tue, 24 Mar 2026 12:36:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54jm-000152-Sj for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:14 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54jk-0004jG-L6 for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:13 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-684-iJz571bEP6m1Yh9mrn7lTA-1; Tue, 24 Mar 2026 12:36:07 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8F32E18002CA; Tue, 24 Mar 2026 16:36:06 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.45.224.189]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id E8C5F180075C; Tue, 24 Mar 2026 16:36:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1774370168; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0EOmgni/KQ1xseWl4UKQ9gZG1695RjOvpdQ2UFYpGBs=; b=Xu78bHEcZBFH9zNq8TW53TN6dJjioy26pBbIO76Hc7y/YXz/qAn1cqAmbQAgm+aG50Ae9o W0LuTw1p6TBNh/Jx97KTW4V6iFXP/O7q3LCvShbOcCN+EjR0RhuQcGbBRM0kqcu4xszDWQ /QJ/s87izt3dArfzhziFUmi1klM0xL4= X-MC-Unique: iJz571bEP6m1Yh9mrn7lTA-1 X-Mimecast-MFC-AGG-ID: iJz571bEP6m1Yh9mrn7lTA_1774370166 From: Thomas Huth To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Thomas Huth Subject: [PATCH 1/4] tests/functional/qemu_test: Silence warnings from pylint in tesseract.py Date: Tue, 24 Mar 2026 17:35:38 +0100 Message-ID: <20260324163543.55503-2-thuth@redhat.com> In-Reply-To: <20260324163543.55503-1-thuth@redhat.com> References: <20260324163543.55503-1-thuth@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1774370224547154100 From: Thomas Huth Pylint complains: tesseract.py:1:0: C0114: Missing module docstring (missing-module-docstrin= g) tesseract.py:12:0: C0116: Missing function or method docstring (missing-fu= nction-docstring) tesseract.py:15:11: W1510: 'subprocess.run' used without explicitly defini= ng the value for 'check'. (subprocess-run-check) tesseract.py:12:30: W0613: Unused argument 'tesseract_args' (unused-argume= nt) Thus add the missing bits and remove the unused tesseract_args argument. While we're at it, also add a SPDX identifier instead of the weird three dots at the beginning of the file. Signed-off-by: Thomas Huth --- tests/functional/qemu_test/tesseract.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/functional/qemu_test/tesseract.py b/tests/functional/qem= u_test/tesseract.py index ede6c6501e2..1f955d32b76 100644 --- a/tests/functional/qemu_test/tesseract.py +++ b/tests/functional/qemu_test/tesseract.py @@ -1,19 +1,24 @@ -# ... +# SPDX-License-Identifier: GPL-2.0-or-later # # Copyright (c) 2019 Philippe Mathieu-Daud=C3=A9 # # This work is licensed under the terms of the GNU GPL, version 2 or # later. See the COPYING file in the top-level directory. +''' +Tesseract is an program for doing Optical Character Recognition (OCR), +which can be used in the tests to extract text from screenshots. +''' =20 import logging from subprocess import run =20 =20 -def tesseract_ocr(image_path, tesseract_args=3D''): +def tesseract_ocr(image_path): + ''' Run the tesseract OCR to extract text from a screenshot ''' console_logger =3D logging.getLogger('console') console_logger.debug(image_path) proc =3D run(['tesseract', image_path, 'stdout'], - capture_output=3DTrue, encoding=3D'utf8') + capture_output=3DTrue, encoding=3D'utf8', check=3DFalse) if proc.returncode: return None lines =3D [] --=20 2.53.0 From nobody Sun Apr 5 13:04:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1774370200; cv=none; d=zohomail.com; s=zohoarc; b=Ww9sm+FiMiuzGfe0tZA8KGP/gP4d9Q31E8IkdbkYEZxS908fR4k1NwermrBgd9/oI0fAqGC8tWgUAZiK4KneNQsutLdzA4TM20cSMvzZShnN7UcsejzFWmoAJOfrSs9kIUunjpCV0ZZlh9Yc1+0Ny09fjz7FMtpJuB7CKtFK6D0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774370200; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+yoAx/LMss+x6qgLSY59oej7Px3L1jy1uYYD5EKmfaA=; b=EofPdOCoxss9T/WSbXmfU9kzvbGEu9v5A8EpavLv8oEgYk0cu7D6U+xZPH+hwhsdAkHykwG1AwBh2RNbNzax0G3f2AcaBFeOQZWfJYVyQvL9b94Y29aAYAFntpBq40CuSbbTOtnrdInJGxUbDcELT07I+V+o1OEX3DVHFKe2Ue0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177437020053555.33783037235298; Tue, 24 Mar 2026 09:36:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w54jw-00016i-Of; Tue, 24 Mar 2026 12:36:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54jq-00015m-Cp for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:19 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54jl-0004ja-E5 for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:16 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-271-R9aFR6ObOgeVkL1iFh-7eQ-1; Tue, 24 Mar 2026 12:36:11 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 20C3F1800365; Tue, 24 Mar 2026 16:36:10 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.45.224.189]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C8F3D1800107; Tue, 24 Mar 2026 16:36:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1774370172; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+yoAx/LMss+x6qgLSY59oej7Px3L1jy1uYYD5EKmfaA=; b=hEqBjOKEJdoSGIaIY/BVkMXwA2pHXVkrKWZjnwbXctULnsAVxe982wO3gbIIgGvTzHzVNM c+RZWgSGnN9OneLY8JIwDOuiFeCCVyC+CoK3Hc1S1UdhTf4GGZcnSjY825A2+4C/KjKSto vv7SD7nMr1WjHkrW3A0zneEpQRNXxjA= X-MC-Unique: R9aFR6ObOgeVkL1iFh-7eQ-1 X-Mimecast-MFC-AGG-ID: R9aFR6ObOgeVkL1iFh-7eQ_1774370170 From: Thomas Huth To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Thomas Huth Subject: [PATCH 2/4] tests/functional/qemu_test: Silence (most) warnings from pylint in asset.py Date: Tue, 24 Mar 2026 17:35:39 +0100 Message-ID: <20260324163543.55503-3-thuth@redhat.com> In-Reply-To: <20260324163543.55503-1-thuth@redhat.com> References: <20260324163543.55503-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1774370202559154100 Content-Type: text/plain; charset="utf-8" From: Thomas Huth Pylint currently complains: asset.py:1:0: C0114: Missing module docstring (missing-module-docstring) asset.py:21:0: C0115: Missing class docstring (missing-class-docstring) asset.py:28:15: C0209: Formatting a regular string which could be an f-str= ing (consider-using-f-string) asset.py:34:0: C0115: Missing class docstring (missing-class-docstring) asset.py:49:15: C0209: Formatting a regular string which could be an f-str= ing (consider-using-f-string) asset.py:73:4: C0116: Missing function or method docstring (missing-functi= on-docstring) asset.py:80:4: C0116: Missing function or method docstring (missing-functi= on-docstring) asset.py:83:4: C0116: Missing function or method docstring (missing-functi= on-docstring) asset.py:125:4: C0116: Missing function or method docstring (missing-funct= ion-docstring) asset.py:181:43: C0209: Formatting a regular string which could be an f-st= ring (consider-using-f-string) asset.py:190:39: C0209: Formatting a regular string which could be an f-st= ring (consider-using-f-string) asset.py:201:39: C0209: Formatting a regular string which could be an f-st= ring (consider-using-f-string) asset.py:213:15: W0718: Catching too general exception Exception (broad-ex= ception-caught) asset.py:218:35: C0209: Formatting a regular string which could be an f-st= ring (consider-using-f-string) asset.py:125:4: R0912: Too many branches (16/12) (too-many-branches) asset.py:125:4: R0915: Too many statements (64/50) (too-many-statements) asset.py:228:4: C0116: Missing function or method docstring (missing-funct= ion-docstring) asset.py:249:4: C0116: Missing function or method docstring (missing-funct= ion-docstring) asset.py:257:4: C0116: Missing function or method docstring (missing-funct= ion-docstring) Fix all the warnings except for the R0912 and R0915 which will be tackled in a later commit. And while we're at it, also add a proper SPDX license identifier. Signed-off-by: Thomas Huth --- tests/functional/qemu_test/asset.py | 53 +++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/tests/functional/qemu_test/asset.py b/tests/functional/qemu_te= st/asset.py index 45a2e01e2e6..1cd03c2a9a9 100644 --- a/tests/functional/qemu_test/asset.py +++ b/tests/functional/qemu_test/asset.py @@ -1,9 +1,12 @@ -# Test utilities for fetching & caching assets +# SPDX-License-Identifier: GPL-2.0-or-later # # Copyright 2024 Red Hat, Inc. # # This work is licensed under the terms of the GNU GPL, version 2 or # later. See the COPYING file in the top-level directory. +''' +Test utilities for fetching & caching assets +''' =20 import hashlib import logging @@ -18,21 +21,27 @@ from shutil import copyfileobj from urllib.error import HTTPError, URLError =20 + class AssetError(Exception): + '''This exception will be raised if an asset is not usable''' def __init__(self, asset, msg, transient=3DFalse): self.url =3D asset.url self.msg =3D msg self.transient =3D transient =20 def __str__(self): - return "%s: %s" % (self.url, self.msg) + return f"{self.url}: {self.msg}" =20 -# Instances of this class must be declared as class level variables -# starting with a name "ASSET_". This enables the pre-caching logic -# to easily find all referenced assets and download them prior to -# execution of the tests. -class Asset: =20 +class Asset: + ''' + This class is used to represent an asset that gets downloaded from + the internet and will be stored in the local asset cache. + Instances of this class must be declared as class level variables + starting with a name "ASSET_". This enables the pre-caching logic + to easily find all referenced assets and download them prior to + execution of the tests. + ''' def __init__(self, url, hashsum): self.url =3D url self.hash =3D hashsum @@ -46,8 +55,7 @@ def __init__(self, url, hashsum): self.log =3D logging.getLogger('qemu-test') =20 def __repr__(self): - return "Asset: url=3D%s hash=3D%s cache=3D%s" % ( - self.url, self.hash, self.cache_file) + return f"Asset: url=3D{self.url} hash=3D{self.hash} cache=3D{self.= cache_file}" =20 def __str__(self): return str(self.cache_file) @@ -71,6 +79,7 @@ def _check(self, cache_file): return self.hash =3D=3D hl.hexdigest() =20 def valid(self): + '''Check whether the file exists in the cache and has the right ha= sh''' if os.getenv("QEMU_TEST_REFRESH_CACHE", None) is not None: self.log.info("Force refresh of asset %s", self.url) return False @@ -78,9 +87,11 @@ def valid(self): return self.cache_file.exists() and self._check(self.cache_file) =20 def fetchable(self): + '''Check whether we are allowed to download assets from the intern= et''' return not os.environ.get("QEMU_TEST_NO_DOWNLOAD", False) =20 def available(self): + '''Check whether the asset is either in the cache or fetchable''' return self.valid() or self.fetchable() =20 def _wait_for_other_download(self, tmp_cache_file): @@ -123,6 +134,7 @@ def _save_time_stamp(self): self.cache_file.with_suffix(".stamp").write_text(f"{int(time.time(= ))}") =20 def fetch(self): + '''Download the asset from the internet''' if not self.cache_dir.exists(): self.cache_dir.mkdir(parents=3DTrue, exist_ok=3DTrue) =20 @@ -179,7 +191,7 @@ def fetch(self): # server or networking problem if e.code =3D=3D 404: raise AssetError(self, "Unable to download: " - "HTTP error %d" % e.code) from e + f"HTTP error {e.code}") from e continue except URLError as e: # This is typically a network/service level error @@ -187,8 +199,9 @@ def fetch(self): tmp_cache_file.unlink() self.log.error("Unable to download %s: URL error %s", self.url, e.reason) - raise AssetError(self, "Unable to download: URL error %s" % - e.reason, transient=3DTrue) from e + raise AssetError(self, + f"Unable to download: URL error{e.reason}= ", + transient=3DTrue) from e except ConnectionError as e: # A socket connection failure, such as dropped conn # or refused conn @@ -198,7 +211,7 @@ def fetch(self): continue except Exception as e: tmp_cache_file.unlink() - raise AssetError(self, "Unable to download: %s" % e, + raise AssetError(self, f"Unable to download: {e}", transient=3DTrue) from e =20 if not os.path.exists(tmp_cache_file): @@ -210,12 +223,12 @@ def fetch(self): self.url.encode('utf8')) os.setxattr(str(tmp_cache_file), "user.qemu-asset-hash", self.hash.encode('utf8')) - except Exception as e: + except OSError as e: self.log.debug("Unable to set xattr on %s: %s", tmp_cache_file= , e) =20 if not self._check(tmp_cache_file): tmp_cache_file.unlink() - raise AssetError(self, "Hash does not match %s" % self.hash) + raise AssetError(self, f"Hash does not match {self.hash}") tmp_cache_file.replace(self.cache_file) self._save_time_stamp() # Remove write perms to stop tests accidentally modifying them @@ -226,6 +239,10 @@ def fetch(self): =20 @staticmethod def precache_test(test): + ''' + Look for variables starting with "ASSET_" and try to fetch the ass= et + that is specified there. + ''' log =3D logging.getLogger('qemu-test') log.setLevel(logging.DEBUG) handler =3D logging.StreamHandler(sys.stdout) @@ -247,6 +264,9 @@ def precache_test(test): =20 @staticmethod def precache_suite(suite): + ''' + Iterate through all tests/suites in a suite and precache their ass= ets + ''' for test in suite: if isinstance(test, unittest.TestSuite): Asset.precache_suite(test) @@ -255,6 +275,9 @@ def precache_suite(suite): =20 @staticmethod def precache_suites(path, cache_tstamp): + ''' + Get the available test suite and precache their assets + ''' loader =3D unittest.loader.defaultTestLoader tests =3D loader.loadTestsFromNames([path], None) =20 --=20 2.53.0 From nobody Sun Apr 5 13:04:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1774370224; cv=none; d=zohomail.com; s=zohoarc; b=cqyGjLA+Vy/nPV/xGBSSUftblqTXu1O4xOQwYPeqvmThbzPNryMasLmsajzygqiCCcgi0SjNULUm4xqzwY7hkzMfW2ZsCKUP+l6rT7cjeAkPfZSYeBeUwoulitanQBdGrFFK6XQwiahGQVjA6KOCCbK/63s8v7cjghJ1SP1wyoA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774370224; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=XzV8UoDsgxkpKzeQqTX0p9JHx0Z7uhkmA5QCkKohu6c=; b=J5T87cbk2CLsMhU2KvvY7YidwQFu+Dd4+U6vSpz/KzLF338XqdI4zO1zJY02bu19kKWm03KT1wBJtWMYod2t58y9oaKVdJkLLiZ77JATl1dcY4dOZHHGRQVDpvrudQ364udy8K05bqA+f/VsEdgtSVrCHyoOukgNxpf/1JDEDhM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1774370224703787.9561764320367; Tue, 24 Mar 2026 09:37:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w54jz-00017e-Cq; Tue, 24 Mar 2026 12:36:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54jt-00016R-Hg for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:21 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54jr-0004kc-UW for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:21 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-26-eKFkCV7sOvCypvJZYvZIRw-1; Tue, 24 Mar 2026 12:36:16 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 7C0B319560AB; Tue, 24 Mar 2026 16:36:15 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.45.224.189]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id E8DF61800768; Tue, 24 Mar 2026 16:36:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1774370178; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XzV8UoDsgxkpKzeQqTX0p9JHx0Z7uhkmA5QCkKohu6c=; b=SnT29n8zDBJW1HVpFJ0R3sqyJSBdc+z9X1mpg1Q35+FVZIgqEiDVkn+kaXVNUK0cALblhx XAkPXrk2pRWK1aFc/L6hmU6tQr4HKfEVRxWATrIzcdSucJwdv/RkZm6eYT2hkYFIAlMqwt /s+CISLuoBrf+ByymQ2F36tKaMrzu9Y= X-MC-Unique: eKFkCV7sOvCypvJZYvZIRw-1 X-Mimecast-MFC-AGG-ID: eKFkCV7sOvCypvJZYvZIRw_1774370175 From: Thomas Huth To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Thomas Huth Subject: [PATCH 3/4] tests/functional/qemu_test: Split huge fetch() function in asset.py Date: Tue, 24 Mar 2026 17:35:40 +0100 Message-ID: <20260324163543.55503-4-thuth@redhat.com> In-Reply-To: <20260324163543.55503-1-thuth@redhat.com> References: <20260324163543.55503-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1774370226707158500 Content-Type: text/plain; charset="utf-8" From: Thomas Huth The fetch() function has become really huge and pylint complains about that. Extract the internal retry-three-times-download loop into a separate function to make it a little bit more readable and to make pylint happy about this file again. Signed-off-by: Thomas Huth Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- tests/functional/qemu_test/asset.py | 43 ++++++++++++++++------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/tests/functional/qemu_test/asset.py b/tests/functional/qemu_te= st/asset.py index 1cd03c2a9a9..51a434b2b70 100644 --- a/tests/functional/qemu_test/asset.py +++ b/tests/functional/qemu_test/asset.py @@ -133,24 +133,7 @@ def _save_time_stamp(self): ''' self.cache_file.with_suffix(".stamp").write_text(f"{int(time.time(= ))}") =20 - def fetch(self): - '''Download the asset from the internet''' - if not self.cache_dir.exists(): - self.cache_dir.mkdir(parents=3DTrue, exist_ok=3DTrue) - - if self.valid(): - self.log.debug("Using cached asset %s for %s", - self.cache_file, self.url) - self._save_time_stamp() - return str(self.cache_file) - - if not self.fetchable(): - raise AssetError(self, - "Asset cache is invalid and downloads disable= d") - - self.log.info("Downloading %s to %s...", self.url, self.cache_file) - tmp_cache_file =3D self.cache_file.with_suffix(".download") - + def _try_to_fetch(self, tmp_cache_file): for _retries in range(3): try: with tmp_cache_file.open("xb") as dst: @@ -176,7 +159,7 @@ def fetch(self): "waiting for other thread to finish...", tmp_cache_file) if self._wait_for_other_download(tmp_cache_file): - return str(self.cache_file) + return True self.log.debug("%s seems to be stale, " "deleting and retrying download...", tmp_cache_file) @@ -213,6 +196,28 @@ def fetch(self): tmp_cache_file.unlink() raise AssetError(self, f"Unable to download: {e}", transient=3DTrue) from e + return False + + def fetch(self): + '''Download the asset from the internet''' + if not self.cache_dir.exists(): + self.cache_dir.mkdir(parents=3DTrue, exist_ok=3DTrue) + + if self.valid(): + self.log.debug("Using cached asset %s for %s", + self.cache_file, self.url) + self._save_time_stamp() + return str(self.cache_file) + + if not self.fetchable(): + raise AssetError(self, + "Asset cache is invalid and downloads disable= d") + + self.log.info("Downloading %s to %s...", self.url, self.cache_file) + tmp_cache_file =3D self.cache_file.with_suffix(".download") + + if self._try_to_fetch(tmp_cache_file): + return str(self.cache_file) =20 if not os.path.exists(tmp_cache_file): raise AssetError(self, "Download retries exceeded", transient= =3DTrue) --=20 2.53.0 From nobody Sun Apr 5 13:04:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1774370223; cv=none; d=zohomail.com; s=zohoarc; b=ijKKPkdC7u3lxALMU8EhQ7B5MxJDd+qqJvMJPpfxCzfXnpL7U96iUav/AdCguJyTQRKAIPvL+zYXOppo25XgTEJIGE3/bRtl63aWfkt7O3K3rNrR8FuKlPavzUYGHus5ibb6tAjItj1eq5U2tnQ9/rSDSSvH3Q73niBudyGoKjA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774370223; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=z8d/kSXFJPxolA+ehSZUAyNS+VNAQPa/4/QOaVllsHk=; b=mCrqeYfbFCLh4ZRiWrdZWVLv26eFf/F+NATTlO/vIfTn/37q/n/s7iuIJ3t9RupExTlyv14wQmaEa7JCvD2G/yS6l/xj6/T24ila3YrYNXnfZn9vUsI+bSxcZ5I6Z1bCeQ8AbiT96haTiVMP+fkspBGkFDQay2/IQYsf4EGTEHA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1774370223527595.1593247069055; Tue, 24 Mar 2026 09:37:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w54k1-00018S-RR; Tue, 24 Mar 2026 12:36:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54k0-00017m-9j for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:28 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w54jy-0004lJ-9d for qemu-devel@nongnu.org; Tue, 24 Mar 2026 12:36:28 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-371-ZPQ3JTGMOuGSaid7EIB0xw-1; Tue, 24 Mar 2026 12:36:23 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2EC6F18002CA; Tue, 24 Mar 2026 16:36:22 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.45.224.189]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 4CB471800107; Tue, 24 Mar 2026 16:36:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1774370185; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z8d/kSXFJPxolA+ehSZUAyNS+VNAQPa/4/QOaVllsHk=; b=COppT6AzS2EE0Y+xVHKyW9i8p/npCdlJaXke76hh6vnjGrGTIooEw22wR3WFmdXDROOHNI Tv8ssnUhywI8Nx/MU3qF2jJQA1HSVISjH1gnFcxG7PYdFFT7xsKJfCPunq3tACvvoohuc7 L8uHzYVgBuBKNKw446tvUSb4NHODsxc= X-MC-Unique: ZPQ3JTGMOuGSaid7EIB0xw-1 X-Mimecast-MFC-AGG-ID: ZPQ3JTGMOuGSaid7EIB0xw_1774370182 From: Thomas Huth To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Thomas Huth Subject: [PATCH 4/4] tests/functional/qemu_test: Silence warnings from pylint in config.py Date: Tue, 24 Mar 2026 17:35:41 +0100 Message-ID: <20260324163543.55503-5-thuth@redhat.com> In-Reply-To: <20260324163543.55503-1-thuth@redhat.com> References: <20260324163543.55503-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1774370224546154100 Content-Type: text/plain; charset="utf-8" From: Thomas Huth Pylint complains here: config.py:1:0: C0114: Missing module docstring (missing-module-docstring) config.py:28:4: W0719: Raising too general exception: Exception (broad-exc= eption-raised) Add a module description and replace the general Exception to fix this. And while we're at it, and since we've got a proper module description string now, also replace the copy-n-pasted comment at the top of the file with a proper SPDX identifier. Signed-off-by: Thomas Huth Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- tests/functional/qemu_test/config.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/functional/qemu_test/config.py b/tests/functional/qemu_t= est/config.py index e0893f630ee..5d44b6fa4c0 100644 --- a/tests/functional/qemu_test/config.py +++ b/tests/functional/qemu_test/config.py @@ -1,4 +1,4 @@ -# Test class and utilities for functional tests +# SPDX-License-Identifier: GPL-2.0-or-later # # Copyright 2018, 2024 Red Hat, Inc. # @@ -10,6 +10,9 @@ # # This work is licensed under the terms of the GNU GPL, version 2 or # later. See the COPYING file in the top-level directory. +''' +Functions related to the configuration of the tests and of the host system +''' =20 import os from pathlib import Path @@ -25,9 +28,9 @@ def _build_dir(): if root is not None: return Path(root) =20 - raise Exception("Missing MESON_BUILD_ROOT environment variable. " + - "Please use the '/run' script if invoking "= + - "directly instead of via make/meson") + raise RuntimeError("Missing MESON_BUILD_ROOT environment variable. " + + "Please use the '/run' script if invokin= g " + + "directly instead of via make/meson") =20 BUILD_DIR =3D _build_dir() =20 --=20 2.53.0