From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 7296424300414763008 X-Received: by 2002:a50:950f:0:b0:543:7401:88b0 with SMTP id u15-20020a50950f000000b00543740188b0mr3294010eda.16.1698831166947; Wed, 01 Nov 2023 02:32:46 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:aa7:d281:0:b0:540:e958:cfd8 with SMTP id w1-20020aa7d281000000b00540e958cfd8ls1651049edq.2.-pod-prod-01-eu; Wed, 01 Nov 2023 02:32:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF07cQlQpv2ZHPBVeOUSLl+CHKIPnYFI17mga31rmqc0O3GUYfyEIrQPNn37HHKu9hcFiYs X-Received: by 2002:a50:935d:0:b0:543:9670:7ee8 with SMTP id n29-20020a50935d000000b0054396707ee8mr1164259eda.14.1698831164903; Wed, 01 Nov 2023 02:32:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698831164; cv=none; d=google.com; s=arc-20160816; b=tbU47sNCuAtC15jEPX4JcRBshF139qlLcGxTFi/9CFnSdXFsPBvhFEQ/lSd59kasYP rtvHS6X7QNN1kQHbYzOtUcB2KolWuLnXPDqSNpFPYssC/Qtwe8Ptng1FpQCze5IYG3Vs rVWIh8IUWG2OHoYKoNAUrX06a8TGrF9gn3XV90aZ3eC6rO/IVasmWaMs1SMULEfP7pYJ 23PQYSo0dIu1pLF++Ehv8pE8eqQGa03yHU0tJNgsifSFTZTx8gYtXH3P2hZ3pAQbjEaI RStS8JxfiKoSPgukaMPvjnhEB+e9KWrd0KSGw6mJZFYcMfTSP5e4+eAfct7/ZhFMhylx bXEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from; bh=6FQnftaAfoCsfmqQoYoD50GAkADQ3ItTub7791m5n4s=; fh=/h9QQkzJ8EboVkWg45aWwpaUro6WMavIVd2OhN45RtE=; b=mYfp3QKu372lKfqUJyyYQESHRR19uDhuiOwRGoL13EQa7j+BUDG504ZGw7wCXkJZg6 OaRVU3067Vmoh0l0itxz9j3HZcq0SlALa09tfHj6GdsRAp6msmLrnN22SATODvYaEqra X3b+GjQECOA7oSDXz0Pw1IQ2gmQol6SC9GfUuD9wQ339pFHWmEDWzMlb8mICKSkuXylw dVf16KE7qVOC26/YYcjKDtuxyp3qRBB8V47Ftujrte0qfHyB6gnlFsDmOZWrhqkUhz7H pgnPUlGqrJP5r/3f/qkcRFmN4DVzE+xxdd0WTPIUm0wqHVNPQ19J4917RM5K0418Jrkv KxLQ== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Return-Path: Received: from shymkent.ilbers.de (shymkent.ilbers.de. [85.214.156.166]) by gmr-mx.google.com with ESMTPS id eo11-20020a056402530b00b00542da7908e0si70030edb.2.2023.11.01.02.32.44 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 01 Nov 2023 02:32:44 -0700 (PDT) Received-SPF: pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) client-ip=85.214.156.166; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Received: from user-B660.promwad.corp ([159.148.83.123]) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPSA id 3A19Wcdv010192 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 1 Nov 2023 10:32:38 +0100 From: Anton Mikanovich To: isar-users@googlegroups.com Cc: Anton Mikanovich Subject: [PATCH] testsuite: Add source package contents test case Date: Wed, 1 Nov 2023 11:32:30 +0200 Message-Id: <20231101093230.1984785-1-amikan@ilbers.de> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-TUID: 5hpSqWhfR6FI Add new test case for checking source package contents. Two aspects are currently checking: 1) Source package content do not include .git files 2) Setting empty DPKG_SOURCE_EXTRA_ARGS makes package include new files Also introduce some new APIs for test writters: 1) create_tmp_layer and cleanup_tmp_layer Create and remove meta-tmp for temporary source changing. Now we can put bbappend into it without touching meta and meta-isar. 2) getVars API to retrieve one or more bitbake variables from repices. Setting target value makes it parce multiconfig related variables. 3) get_tar_content Obtain filenames from tar.* files. Signed-off-by: Anton Mikanovich --- testsuite/cibase.py | 54 +++++++++++++++++++++++++++++++ testsuite/cibuilder.py | 73 ++++++++++++++++++++++++++++++++++++++++++ testsuite/citest.py | 15 +++++++++ 3 files changed, 142 insertions(+) diff --git a/testsuite/cibase.py b/testsuite/cibase.py index d7010387..adeff205 100755 --- a/testsuite/cibase.py +++ b/testsuite/cibase.py @@ -212,3 +212,57 @@ class CIBaseTest(CIBuilder): ['do_rootfs_install_setscene', '!do_rootfs_install']) ]): self.fail("Failed rebuild package and image") + + def perform_source_test(self, targets, **kwargs): + def get_source_content(targets): + sfiles = dict() + for target in targets: + sfiles[target] = dict() + package = target.rsplit(':', 1)[-1] + isar_apt = self.getVars('REPO_ISAR_DB_DIR', target=target) + fpath = f'{package}/{package}*.tar.gz' + targz = set(glob.glob(f'{isar_apt}/../apt/*/pool/*/*/{fpath}')) + if len(targz) < 1: + self.fail('No source packages found') + for filename in targz: + sfiles[target][filename] = self.get_tar_content(filename) + return sfiles + + self.configure(**kwargs) + + tmp_layer_dir = self.create_tmp_layer() + try: + self.bitbake(targets, bitbake_cmd='do_deploy_source', **kwargs) + + sfiles_before = get_source_content(targets) + for tdir in sfiles_before: + for filename in sfiles_before[tdir]: + for file in sfiles_before[tdir][filename]: + if os.path.basename(file).startswith('.git'): + self.fail('Found .git files') + + package = targets[0].rsplit(':', 1)[-1] + tmp_layer_nested_dirs = os.path.join(tmp_layer_dir, + 'recipes-app', package) + os.makedirs(tmp_layer_nested_dirs, exist_ok=True) + bbappend_file = os.path.join(tmp_layer_nested_dirs, + package + '.bbappend') + with open(bbappend_file, 'w') as file: + file.write('DPKG_SOURCE_EXTRA_ARGS = ""') + + self.bitbake(targets, bitbake_cmd='do_deploy_source', **kwargs) + + sfiles_after = get_source_content(targets) + + for tdir in sfiles_after: + for filename in sfiles_after[tdir]: + if not sfiles_before[tdir][filename]: + self.fail('Source filenames are different') + diff = [] + for file in sfiles_after[tdir][filename]: + if file not in sfiles_before[tdir][filename]: + diff.append(file) + if len(diff) < 1: + self.fail('Source packages are equal') + finally: + self.cleanup_tmp_layer(tmp_layer_dir) diff --git a/testsuite/cibuilder.py b/testsuite/cibuilder.py index 1ff77332..2b784ef9 100755 --- a/testsuite/cibuilder.py +++ b/testsuite/cibuilder.py @@ -8,6 +8,8 @@ import select import shutil import signal import subprocess +import sys +import tarfile import time import tempfile @@ -17,6 +19,11 @@ from avocado import Test from avocado.utils import path from avocado.utils import process +sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '/../bitbake/lib') + +import bb +import bb.tinfoil + DEF_VM_TO_SEC = 600 isar_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) @@ -245,6 +252,72 @@ class CIBuilder(Test): return env['LAYERDIR_' + layer].strip('"') + def getVars(self, *vars, target=None): + def fixStream(stream): + # fix stream objects to emulate _io.TextIOWrapper + stream.isatty = lambda: False + stream.fileno = lambda: False + stream.encoding = sys.getdefaultencoding() + + sl = target is not None + fixStream(sys.stdout) + fixStream(sys.stderr) + + lockfile = os.path.join(self.build_dir, 'bitbake.lock2') + checks = 0 + while os.path.exists(lockfile) and checks < 5: + time.sleep(1) + checks += 1 + + with bb.tinfoil.Tinfoil(setup_logging=sl) as tinfoil: + values = () + if target: + tinfoil.prepare(quiet=2) + d = tinfoil.parse_recipe(target) + for var in vars: + values = values + (d.getVar(var),) + else: + tinfoil.prepare(config_only=True, quiet=2) + for var in vars: + values = values + (tinfoil.config_data.getVar(var),) + return values if len(values) > 1 else values[0] + + def create_tmp_layer(self): + tmp_layer_dir = os.path.join(isar_root, 'meta-tmp') + + conf_dir = os.path.join(tmp_layer_dir, 'conf') + os.makedirs(conf_dir, exist_ok=True) + layer_conf_file = os.path.join(conf_dir, 'layer.conf') + with open(layer_conf_file, 'w') as file: + file.write('\ +BBPATH .= ":${LAYERDIR}"\ +\nBBFILES += "${LAYERDIR}/recipes-*/*/*.bbappend"\ +\nBBFILE_COLLECTIONS += "tmp"\ +\nBBFILE_PATTERN_tmp = "^${LAYERDIR}/"\ +\nBBFILE_PRIORITY_tmp = "5"\ +\nLAYERVERSION_tmp = "1"\ +\nLAYERSERIES_COMPAT_tmp = "v0.6"\ +') + + bblayersconf_file = os.path.join(self.build_dir, 'conf', + 'bblayers.conf') + bb.utils.edit_bblayers_conf(bblayersconf_file, tmp_layer_dir, None) + + return tmp_layer_dir + + def cleanup_tmp_layer(self, tmp_layer_dir): + bblayersconf_file = os.path.join(self.build_dir, 'conf', + 'bblayers.conf') + bb.utils.edit_bblayers_conf(bblayersconf_file, None, tmp_layer_dir) + bb.utils.prunedir(tmp_layer_dir) + + def get_tar_content(self, filename): + try: + tar = tarfile.open(filename) + return tar.getnames() + except Exception: + return [] + def get_ssh_cmd_prefix(self, user, host, port, priv_key): cmd_prefix = 'ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no '\ '-p %s -o IdentityFile=%s %s@%s ' \ diff --git a/testsuite/citest.py b/testsuite/citest.py index 81bdeba5..7be2b86b 100755 --- a/testsuite/citest.py +++ b/testsuite/citest.py @@ -314,6 +314,21 @@ class SingleTest(CIBaseTest): self.vm_start(machine.removeprefix('qemu'), distro, stop_vm=True) +class SourceTest(CIBaseTest): + + """ + Source contents test + + :avocado: tags=source + """ + def test_source(self): + targets = [ + 'mc:qemuamd64-bookworm:libhello', + 'mc:qemuarm64-bookworm:libhello', + ] + + self.init() + self.perform_source_test(targets) class VmBootTestFast(CIBaseTest): -- 2.34.1