From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 7075593626590380032 X-Received: by 2002:a7b:cd1a:0:b0:38c:720a:a123 with SMTP id f26-20020a7bcd1a000000b0038c720aa123mr164074wmj.5.1647415020678; Wed, 16 Mar 2022 00:17:00 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a05:600c:3c92:b0:389:e8c4:aef4 with SMTP id bg18-20020a05600c3c9200b00389e8c4aef4ls513478wmb.2.gmail; Wed, 16 Mar 2022 00:16:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwrcYHd+lIxzsPASz44FBQBQILSVftNKc4QWrcfGPB5pVMcKLH6g59DoQ+6o+pllgNSgr+P X-Received: by 2002:a05:600c:3c8a:b0:389:cf43:eaf6 with SMTP id bg10-20020a05600c3c8a00b00389cf43eaf6mr6069873wmb.199.1647415019779; Wed, 16 Mar 2022 00:16:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647415019; cv=none; d=google.com; s=arc-20160816; b=IJ3v2ByqZaQh8BthEj+KBJ3ILex0GCs823DLCgVDisNuVgxvaPZDqf2xwg5sgPNNs0 FD3HYuIonjtnXMGOf2O/pZsI/kspiRQQoIXNm9NWnCby+hEr2ykQ/wPsKF661hc6BmXo 5OgE5kj0y360W48ftgjAOR+U2LEdEEswJx627HFR8pOPoofHFsbdju2Z1LaDQy3hq4lO 8SyIjQjxEogMxFrOluYohHneXr0ndBTnTcoiLhvaQHNymNQ1/iTaCuA1A8EDXWPcqYV1 R0lhhE0cV+v5lhFcd2mHKf6knDIQ2KeONjhtB9EDiGRJaTtrBtIM0RZjj+g2rXIkU6Ry 9EGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=u4kY5d8zQc6WBRG55lpIbzEhOLwT/IfJ76GwQsd7HE0=; b=Ugb2fCZBjL5D6e6anfJjAsHee9FIZMghfFZ3ptwVfWqp6bbpGqKe3h5kNCEVjXpLE9 GTNIuFIvPbaMzQvKT1xfXVyIaouwFNK7sm4ly+d44WRxdfKW24tUp2pWZbVTN1Kz46z7 /EO982ZvX9lDrciXGsb1c7gAMzj++1j9p1Wv9E4cBzwdNlQFl0iFVgPWEOIJfg1P29KM y5UjPDErRiUIbUyGxg16a2V+DfAh7LzRI1pbQAQIvSNfKcwgujev/JO7W16nrUjnU1ve fN7Sz7mhMHBW5CNs+7tas+N5pF7BuGQfAlLTgnPxmc6T0eXgJB7ci5U6ko2jZbyfAIK5 BCwA== 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 l10-20020a05600002aa00b00203c23e563bsi71966wry.2.2022.03.16.00.16.59 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 16 Mar 2022 00:16:59 -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 localhost.localdomain (mm-14-51-214-37.mgts.dynamic.pppoe.byfly.by [37.214.51.14] (may be forged)) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8) with ESMTPSA id 22G7GtBM021311 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 16 Mar 2022 08:16:59 +0100 From: Anton Mikanovich To: isar-users@googlegroups.com Cc: Anton Mikanovich Subject: [PATCH v3 2/7] CI: Migrate all tests to one location Date: Wed, 16 Mar 2022 10:16:42 +0300 Message-Id: <20220316071647.8919-3-amikan@ilbers.de> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220316071647.8919-1-amikan@ilbers.de> References: <20220316071647.8919-1-amikan@ilbers.de> 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: Uu9XkQcFkILq Move QEMU start tests to the same class as build tests to be able to run everything from the single avocado command. Signed-off-by: Anton Mikanovich --- scripts/vm_smoke_test | 2 +- testsuite/build_test.py | 46 +++++++++++++ testsuite/cibuilder.py | 68 ++++++++++++++++++++ testsuite/vm_boot_test.py | 132 -------------------------------------- 4 files changed, 115 insertions(+), 133 deletions(-) delete mode 100755 testsuite/vm_boot_test.py diff --git a/scripts/vm_smoke_test b/scripts/vm_smoke_test index 50051a7..28c959a 100755 --- a/scripts/vm_smoke_test +++ b/scripts/vm_smoke_test @@ -95,7 +95,7 @@ logs_dir = $BUILD_DIR/job-results EOF export VIRTUAL_ENV="./" -if avocado $VERBOSE run "$TESTSUITE_DIR/vm_boot_test.py" -t $TAGS \ +if avocado $VERBOSE run "$TESTSUITE_DIR/build_test.py" -t $TAGS,startvm \ --test-runner=runner --disable-sysinfo \ -p build_dir="$BUILD_DIR" -p time_to_wait=$TIMEOUT; then RET=$ES_OK diff --git a/testsuite/build_test.py b/testsuite/build_test.py index e0eea1b..d1e66d7 100755 --- a/testsuite/build_test.py +++ b/testsuite/build_test.py @@ -244,3 +244,49 @@ class SstateTest(CIBaseTest): self.init('build-sstate') self.perform_sstate_test(image_target, package_target) + +class VmBootTestFast(CIBaseTest): + + """ + Test QEMU image start (fast) + + :avocado: tags=startvm,fast,full + """ + def test_arm_bullseye(self): + self.init() + self.vm_start('arm','bullseye') + + def test_arm_buster(self): + self.init() + self.vm_start('arm','buster') + + def test_arm64_bullseye(self): + self.init() + self.vm_start('arm64','bullseye') + + def test_amd64_bullseye(self): + self.init() + self.vm_start('amd64','bullseye') + +class VmBootTestFull(CIBaseTest): + + """ + Test QEMU image start (full) + + :avocado: tags=startvm,full + """ + def test_i386_stretch(self): + self.init() + self.vm_start('i386','stretch') + + def test_i386_buster(self): + self.init() + self.vm_start('i386','buster') + + def test_amd64_buster(self): + self.init() + self.vm_start('amd64','buster') + + def test_amd64_focal(self): + self.init() + self.vm_start('amd64','focal') diff --git a/testsuite/cibuilder.py b/testsuite/cibuilder.py index f0c4bc3..2170ea6 100755 --- a/testsuite/cibuilder.py +++ b/testsuite/cibuilder.py @@ -5,6 +5,10 @@ import os import select import shutil import subprocess +import time +import tempfile + +import start_vm from avocado import Test from avocado.utils import path @@ -15,6 +19,9 @@ backup_prefix = '.ci-backup' app_log = logging.getLogger("avocado.app") +class CanBeFinished(Exception): + pass + class CIBuilder(Test): def setUp(self): super(CIBuilder, self).setUp() @@ -181,3 +188,64 @@ class CIBuilder(Test): for x in output.splitlines() if x != '')) return env['LAYERDIR_' + layer].strip('"') + + def vm_start(self, arch='amd64', distro='buster'): + time_to_wait = self.params.get('time_to_wait', default=60) + + self.log.info('===================================================') + self.log.info('Running Isar VM boot test for (' + distro + '-' + arch + ')') + self.log.info('Isar build folder is: ' + self.build_dir) + self.log.info('===================================================') + + self.check_init() + + fd, output_file = tempfile.mkstemp(suffix='_log.txt', + prefix='vm_start_' + distro + '_' + + arch + '_', dir=self.build_dir, text=True) + os.chmod(output_file, 0o644) + + cmdline = start_vm.format_qemu_cmdline(arch, self.build_dir, distro, + output_file, None) + cmdline.insert(1, '-nographic') + + self.log.info('QEMU boot line: ' + str(cmdline)) + + login_prompt = b'isar login:' + service_prompt = b'Just an example' + + timeout = time.time() + int(time_to_wait) + + p1 = subprocess.Popen(cmdline, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + try: + poller = select.poll() + poller.register(p1.stdout, select.POLLIN) + poller.register(p1.stderr, select.POLLIN) + while time.time() < timeout and p1.poll() is None: + events = poller.poll(1000 * (timeout - time.time())) + for fd, event in events: + if fd == p1.stdout.fileno(): + # Wait for the complete string if it is read in chunks + # like "i", "sar", " login:" + time.sleep(0.01) + data = os.read(fd, 1024) + if login_prompt in data: + raise CanBeFinished + if fd == p1.stderr.fileno(): + self.log.error(p1.stderr.readline()) + except CanBeFinished: + self.log.debug('Got login prompt') + finally: + if p1.poll() is None: + p1.kill() + p1.wait() + + if os.path.exists(output_file): + with open(output_file, "rb") as f1: + data = f1.read() + if service_prompt in data and login_prompt in data: + return + else: + self.log.error(data) + + self.fail('Log ' + output_file) diff --git a/testsuite/vm_boot_test.py b/testsuite/vm_boot_test.py deleted file mode 100755 index 6c4e979..0000000 --- a/testsuite/vm_boot_test.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python3 - -import os -import select -import subprocess -import sys -import time -import tempfile - -from os.path import dirname - -import start_vm - -from avocado import Test -from avocado.utils import process -from avocado.utils import path - -class CanBeFinished(Exception): - pass - -class VmBase(Test): - - def check_bitbake(self, build_dir): - try: - path.find_command('bitbake') - except path.CmdNotFoundError: - out = process.getoutput('/bin/bash -c "cd ../.. && \ - source isar-init-build-env \ - %s 2>&1 >/dev/null; env"' % build_dir) - env = dict(((x.split('=', 1) + [''])[:2] \ - for x in output.splitlines() if x != '')) - os.environ.update(env) - - def vm_start(self, arch='amd64', distro='buster'): - build_dir = self.params.get('build_dir', default='.') - time_to_wait = self.params.get('time_to_wait', default=60) - - self.log.info('===================================================') - self.log.info('Running Isar VM boot test for (' + distro + '-' + arch + ')') - self.log.info('Isar build folder is: ' + build_dir) - self.log.info('===================================================') - - self.check_bitbake(build_dir) - - fd, output_file = tempfile.mkstemp(suffix='_log.txt', - prefix='vm_start_' + distro + '_' + - arch + '_', dir=build_dir, text=True) - os.chmod(output_file, 0o644) - - cmdline = start_vm.format_qemu_cmdline(arch, build_dir, distro, - output_file, None) - cmdline.insert(1, '-nographic') - - self.log.info('QEMU boot line: ' + str(cmdline)) - - login_prompt = b'isar login:' - service_prompt = b'Just an example' - - timeout = time.time() + int(time_to_wait) - - p1 = subprocess.Popen(cmdline, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - try: - poller = select.poll() - poller.register(p1.stdout, select.POLLIN) - poller.register(p1.stderr, select.POLLIN) - while time.time() < timeout and p1.poll() is None: - events = poller.poll(1000 * (timeout - time.time())) - for fd, event in events: - if fd == p1.stdout.fileno(): - # Wait for the complete string if it is read in chunks - # like "i", "sar", " login:" - time.sleep(0.01) - data = os.read(fd, 1024) - if login_prompt in data: - raise CanBeFinished - if fd == p1.stderr.fileno(): - self.log.error(p1.stderr.readline()) - except CanBeFinished: - self.log.debug('Got login prompt') - finally: - if p1.poll() is None: - p1.kill() - p1.wait() - - if os.path.exists(output_file): - with open(output_file, "rb") as f1: - data = f1.read() - if service_prompt in data and login_prompt in data: - return - else: - self.log.error(data) - - self.fail('Log ' + output_file) - -class VmBootTestFast(VmBase): - - """ - Test QEMU image start (fast) - - :avocado: tags=fast,full - """ - def test_arm_bullseye(self): - self.vm_start('arm','bullseye') - - def test_arm_buster(self): - self.vm_start('arm','buster') - - def test_arm64_bullseye(self): - self.vm_start('arm64','bullseye') - - def test_amd64_bullseye(self): - self.vm_start('amd64','bullseye') - -class VmBootTestFull(VmBase): - - """ - Test QEMU image start (full) - - :avocado: tags=full - """ - def test_i386_stretch(self): - self.vm_start('i386','stretch') - - def test_i386_buster(self): - self.vm_start('i386','buster') - - def test_amd64_buster(self): - self.vm_start('amd64','buster') - - def test_amd64_focal(self): - self.vm_start('amd64','focal') -- 2.17.1