From patchwork Wed Jul 31 14:39:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: amr.mohamed@arm.com X-Patchwork-Id: 47057 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 aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3ED3AC3DA64 for ; Wed, 31 Jul 2024 14:39:59 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.44604.1722436796389651829 for ; Wed, 31 Jul 2024 07:39:56 -0700 Authentication-Results: mx.groups.io; dkim=none (message not signed); spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: amr.mohamed@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E74FE1007; Wed, 31 Jul 2024 07:40:20 -0700 (PDT) Received: from e125330.manchester.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5B3043F5A1; Wed, 31 Jul 2024 07:39:54 -0700 (PDT) From: amr.mohamed@arm.com To: meta-arm@lists.yoctoproject.org Cc: Amr Mohamed , Jon Mason Subject: [PATCH scarthgap 1/4] arm-systemready/linux-distros: new inc file for unattended installation Date: Wed, 31 Jul 2024 15:39:44 +0100 Message-Id: <20240731143947.2502491-1-amr.mohamed@arm.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 31 Jul 2024 14:39:59 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/5936 From: Amr Mohamed Add a new inc file to unpack and repack the distro ISO image after adding the kickstart configuration file inside. Signed-off-by: Amr Mohamed Signed-off-by: Jon Mason --- ...m-systemready-linux-distros-unattended.inc | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-unattended.inc diff --git a/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-unattended.inc b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-unattended.inc new file mode 100644 index 00000000..f8c9c6c5 --- /dev/null +++ b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-unattended.inc @@ -0,0 +1,45 @@ +SUMMARY = "Arm SystemReady Linux distros unattended requirements" +DESCRIPTION = "Arm SystemReady Linux distro unattended configurations \ + and ISO image modification" + +EXTRACTED_ISO_TEMP_DIR = "${WORKDIR}/extracted_iso_temp_dir" +NEW_ISO_TEMP_DIR = "${WORKDIR}/new_iso_temp_dir" + +# oeqa test case must be added to TEST_SUITES to acknowledge that the unattended +# installation was successful. +inherit testimage + +python () { + unattended_required_vars = ['ISO_LABEL', 'BOOT_CATALOG', 'BOOT_IMAGE', 'EFI_IMAGE'] + + for var in unattended_required_vars: + if not d.getVar(var): + raise bb.parse.SkipRecipe(f'{var} variable is not set') +} + +unpackiso() { + # Unpack the ISO image + bsdtar -xf ${WORKDIR}/${ISO_IMAGE_NAME}.iso -C ${EXTRACTED_ISO_TEMP_DIR} + chmod -R u+rw ${EXTRACTED_ISO_TEMP_DIR} +} + +modifyiso() { + +} + +repackiso() { + # Repack the ISO image + mkisofs -o ${NEW_ISO_TEMP_DIR}/${ISO_IMAGE_NAME}.iso -U -r -v -T -J -joliet-long -V ${ISO_LABEL} \ + -volset ${ISO_LABEL} -A ${ISO_LABEL} -b ${BOOT_IMAGE} -c ${BOOT_CATALOG} -no-emul-boot \ + -boot-load-size 4 -boot-info-table -J -R -V ${ISO_LABEL} -eltorito-alt-boot \ + -eltorito-boot ${EFI_IMAGE} -no-emul-boot ${EXTRACTED_ISO_TEMP_DIR} + + mv -f ${NEW_ISO_TEMP_DIR}/${ISO_IMAGE_NAME}.iso ${WORKDIR} +} + +# Write the test data in IMAGE_POSTPROCESS_COMMAND +IMAGE_POSTPROCESS_COMMAND += "write_image_test_data; " + +do_unpack[depends] += "cdrtools-native:do_populate_sysroot libarchive-native:do_populate_sysroot" +do_unpack[postfuncs] += "unpackiso modifyiso repackiso" +do_unpack[cleandirs] += "${EXTRACTED_ISO_TEMP_DIR} ${NEW_ISO_TEMP_DIR}" \ No newline at end of file From patchwork Wed Jul 31 14:39:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: amr.mohamed@arm.com X-Patchwork-Id: 47059 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 aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 514A6C52D1D for ; Wed, 31 Jul 2024 14:39:59 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web10.44370.1722436796802029302 for ; Wed, 31 Jul 2024 07:39:56 -0700 Authentication-Results: mx.groups.io; dkim=none (message not signed); spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: amr.mohamed@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 23E741063; Wed, 31 Jul 2024 07:40:22 -0700 (PDT) Received: from e125330.manchester.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 93B0A3F5A1; Wed, 31 Jul 2024 07:39:55 -0700 (PDT) From: amr.mohamed@arm.com To: meta-arm@lists.yoctoproject.org Cc: Amr Mohamed , Jon Mason Subject: [PATCH scarthgap 2/4] arm-systemready/linux-distros: Add kickstart file for Fedora unattended Date: Wed, 31 Jul 2024 15:39:45 +0100 Message-Id: <20240731143947.2502491-2-amr.mohamed@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240731143947.2502491-1-amr.mohamed@arm.com> References: <20240731143947.2502491-1-amr.mohamed@arm.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 31 Jul 2024 14:39:59 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/5937 From: Amr Mohamed Add the Fedora kickstart configuration file and define a function to modify the unpacked ISO image to add the kickstart file inside and modify the grub.cfg file. Signed-off-by: Amr Mohamed Signed-off-by: Jon Mason --- .../arm-systemready-linux-distros-fedora.bb | 16 ++++++++ .../arm-systemready-linux-distros.inc | 15 ++++++- .../unattended-boot-conf/Fedora/ks.cfg | 39 +++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 meta-arm-systemready/recipes-test/arm-systemready-linux-distros/unattended-boot-conf/Fedora/ks.cfg diff --git a/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-fedora.bb b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-fedora.bb index 25990b30..de4ea36d 100644 --- a/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-fedora.bb +++ b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros-fedora.bb @@ -98,6 +98,22 @@ file://${COMMON_LICENSE_DIR}/OPUBL-1.0;md5=99367d4750dbf0ae6cc74209ddd52f6d \ ARM_SYSTEMREADY_LINUX_DISTRO_INSTALL_SIZE = "6144" +TEST_SUITES = "${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "arm_systemready_fedora_unattended", "", d)}" + +ISO_LABEL = "${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "Fedora-S-dvd-aarch64-39", "", d)}" +BOOT_CATALOG = "${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "boot.catalog", "", d)}" +BOOT_IMAGE = "${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "EFI/BOOT/BOOTAA64.EFI", "", d)}" +EFI_IMAGE = "${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "images/efiboot.img", "", d)}" + PV = "39.1.5" SRC_URI = "https://download.fedoraproject.org/pub/fedora/linux/releases/39/Server/aarch64/iso/Fedora-Server-dvd-aarch64-39-1.5.iso;unpack=0;downloadfilename=${ISO_IMAGE_NAME}.iso" SRC_URI[sha256sum] = "d19dc2a39758155fa53e6fd555d0d173ccc8175b55dea48002d499f39cb30ce0" + +modifyiso() { + UNATTENDED_CONF_DIR="${THISDIR}/unattended-boot-conf/Fedora" + + cp "${UNATTENDED_CONF_DIR}/ks.cfg" ${EXTRACTED_ISO_TEMP_DIR} + sed -i 's/set default="1"/set default="0"/g' "${EXTRACTED_ISO_TEMP_DIR}/EFI/BOOT/grub.cfg" + sed -i 's/set timeout=60/set timeout=0/g' "${EXTRACTED_ISO_TEMP_DIR}/EFI/BOOT/grub.cfg" + sed -i '0,/vmlinuz/s/vmlinuz/& inst.ks=hd:LABEL=Fedora-S-dvd-aarch64-39:\/ks.cfg/' "${EXTRACTED_ISO_TEMP_DIR}/EFI/BOOT/grub.cfg" +} diff --git a/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros.inc b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros.inc index d80cf237..e04d7d46 100644 --- a/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros.inc +++ b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/arm-systemready-linux-distros.inc @@ -2,7 +2,12 @@ SUMMARY = "Arm SystemReady Linux distros installation" DESCRIPTION = "Arm SystemReady Linux distro CD/DVD images and installation \ target disk image" -IMAGE_CLASSES:remove = "license_image testimage" +DISTRO_UNATTENDED_INST_TESTS ?= "0" + +require ${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "arm-systemready-linux-distros-unattended.inc", "", d)} + +IMAGE_CLASSES:remove = "license_image" +IMAGE_CLASSES:remove = "${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "", "testimage", d)}" BUILDHISTORY_FEATURES:remove = "image" INHIBIT_DEFAULT_DEPS = "1" @@ -15,7 +20,7 @@ do_configure[noexec] = "1" do_compile[noexec] = "1" ISO_IMAGE_NAME = "${PN}-${PV}" -IMAGE_LINK_NAME = "${PN}-${PV}-${MACHINE}" +IMAGE_LINK_NAME = "${PN}-${MACHINE}" ARM_SYSTEMREADY_LINUX_DISTRO_ISO_IMAGE = \ "${DEPLOY_DIR_IMAGE}/${ISO_IMAGE_NAME}.iso" @@ -44,7 +49,13 @@ python do_image_complete() { from oe.utils import execute_pre_post_process post_process_cmds = d.getVar("IMAGE_POSTPROCESS_COMMAND") execute_pre_post_process(d, post_process_cmds) + + if d.getVar('DISTRO_UNATTENDED_INST_TESTS') == "1": + # Ensure an empty rootfs manifest exists (required by testimage) + fname = os.path.join(d.getVar('IMGDEPLOYDIR'), d.getVar('IMAGE_LINK_NAME') + ".manifest") + open(fname, 'w').close() } + do_image_complete[nostamp] = "1" addtask image_complete after do_deploy before do_build diff --git a/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/unattended-boot-conf/Fedora/ks.cfg b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/unattended-boot-conf/Fedora/ks.cfg new file mode 100644 index 00000000..f8ea3bc6 --- /dev/null +++ b/meta-arm-systemready/recipes-test/arm-systemready-linux-distros/unattended-boot-conf/Fedora/ks.cfg @@ -0,0 +1,39 @@ +# Generated by Anaconda 39.32.6 +# Generated by pykickstart v3.48 +#version=DEVEL +# Use text mode install +text + +# Keyboard layouts +keyboard --vckeymap=us --xlayouts='us' +# System language +lang en_GB.UTF-8 + +# Use CDROM installation media +cdrom + +%packages --excludedocs --ignoremissing +@core --nodefaults + +%end + +# Run the Setup Agent on first boot +firstboot --enable +# Do not configure the X Window System +skipx + +# System bootloader configuration +bootloader --location=mbr --boot-drive=vda +autopart +# Partition clearing information +clearpart --all --initlabel --drives=vda + +# System timezone +timezone Europe/London --utc + +# Root password +rootpw --lock +user --groups=wheel --name=user --password=unsafe --gecos="usr1" + +# Reboot after installation with an attempt to eject the installation media +reboot --eject From patchwork Wed Jul 31 14:39:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: amr.mohamed@arm.com X-Patchwork-Id: 47058 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 aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3DABAC3DA7F for ; Wed, 31 Jul 2024 14:39:59 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.44605.1722436798418198252 for ; Wed, 31 Jul 2024 07:39:58 -0700 Authentication-Results: mx.groups.io; dkim=none (message not signed); spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: amr.mohamed@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5BC991007; Wed, 31 Jul 2024 07:40:23 -0700 (PDT) Received: from e125330.manchester.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D28953F5A1; Wed, 31 Jul 2024 07:39:56 -0700 (PDT) From: amr.mohamed@arm.com To: meta-arm@lists.yoctoproject.org Cc: Amr Mohamed , Jon Mason Subject: [PATCH scarthgap 3/4] arm-systemready/oeqa: Add new test for Fedora unattended installation Date: Wed, 31 Jul 2024 15:39:46 +0100 Message-Id: <20240731143947.2502491-3-amr.mohamed@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240731143947.2502491-1-amr.mohamed@arm.com> References: <20240731143947.2502491-1-amr.mohamed@arm.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 31 Jul 2024 14:39:59 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/5938 From: Amr Mohamed The oeqa test responds to the boot loader prompt error message and waits till the distro installation is finished. Signed-off-by: Amr Mohamed Signed-off-by: Jon Mason --- .../arm_systemready_fedora_unattended.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 meta-arm-systemready/lib/oeqa/runtime/cases/arm_systemready_fedora_unattended.py diff --git a/meta-arm-systemready/lib/oeqa/runtime/cases/arm_systemready_fedora_unattended.py b/meta-arm-systemready/lib/oeqa/runtime/cases/arm_systemready_fedora_unattended.py new file mode 100644 index 00000000..f607fb12 --- /dev/null +++ b/meta-arm-systemready/lib/oeqa/runtime/cases/arm_systemready_fedora_unattended.py @@ -0,0 +1,39 @@ +from oeqa.runtime.case import OERuntimeTestCase + + +class SystemReadyFedoraUnattendedTest(OERuntimeTestCase): + def setUp(self): + super().setUp() + self.console = self.target.DEFAULT_CONSOLE + + def test_fedora_unattended(self): + # Turn on the FVP. + self.target.transition('on') + + # Timeout value = elapsed time * 2; where elapsed time was collected + # from the elapsed time in the log.do_testimage for each function after + # the build is finished on the development machine. + self.target.expect(self.console, + ' Booting `Install Fedora 39\'', + timeout=(2 * 60)) + bb.plain('Installation status: Loading the installer, kernel and initrd...') + + self.target.expect(self.console, + 'Setting up the installation environment', + timeout=(2 * 60 * 60)) + bb.plain('Installation status: Setting up the installation environment...') + + self.target.expect(self.console, + 'Installing the software', + timeout=(30 * 60)) + bb.plain('Installation status: Installing the software packages...') + + # Waiting to respond to the boot loader prompt error message. + self.target.expect(self.console, + 'Please respond \'yes\' or \'no\': ', + timeout=(16 * 60 * 60)) + self.target.sendline(self.console, 'yes') + + # Waiting till the installation is finished. + self.target.expect(self.console, r'.*login: ', timeout=(5 * 60 * 60)) + bb.plain('Installation status: Fedora installation finished successfully.') From patchwork Wed Jul 31 14:39:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: amr.mohamed@arm.com X-Patchwork-Id: 47060 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 aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18AC6C3DA64 for ; Wed, 31 Jul 2024 14:40:09 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.44606.1722436799332849970 for ; Wed, 31 Jul 2024 07:39:59 -0700 Authentication-Results: mx.groups.io; dkim=none (message not signed); spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: amr.mohamed@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9A7431063; Wed, 31 Jul 2024 07:40:24 -0700 (PDT) Received: from e125330.manchester.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 27A693F5A1; Wed, 31 Jul 2024 07:39:57 -0700 (PDT) From: amr.mohamed@arm.com To: meta-arm@lists.yoctoproject.org Cc: Amr Mohamed , Jon Mason Subject: [PATCH scarthgap 4/4] kas: Add new yml file for Distros unattended installation Date: Wed, 31 Jul 2024 15:39:47 +0100 Message-Id: <20240731143947.2502491-4-amr.mohamed@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240731143947.2502491-1-amr.mohamed@arm.com> References: <20240731143947.2502491-1-amr.mohamed@arm.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 31 Jul 2024 14:40:09 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/5939 From: Amr Mohamed Define “DISTRO_UNATTENDED_INST_TESTS” variable in meta-arm-systemready independently from meta-arm-auto-solutions. This will allow running the unattended installation without meta-arm-auto-solutions. Signed-off-by: Amr Mohamed Signed-off-by: Jon Mason --- kas/arm-systemready-linux-distros-fedora.yml | 1 + ...temready-linux-distros-unattended-installation.yml | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 kas/arm-systemready-linux-distros-unattended-installation.yml diff --git a/kas/arm-systemready-linux-distros-fedora.yml b/kas/arm-systemready-linux-distros-fedora.yml index b2b23d78..2faa19cb 100644 --- a/kas/arm-systemready-linux-distros-fedora.yml +++ b/kas/arm-systemready-linux-distros-fedora.yml @@ -2,6 +2,7 @@ header: version: 16 includes: - kas/arm-systemready-firmware.yml + - kas/arm-systemready-linux-distros-unattended-installation.yml target: - arm-systemready-linux-distros-fedora diff --git a/kas/arm-systemready-linux-distros-unattended-installation.yml b/kas/arm-systemready-linux-distros-unattended-installation.yml new file mode 100644 index 00000000..7976186f --- /dev/null +++ b/kas/arm-systemready-linux-distros-unattended-installation.yml @@ -0,0 +1,11 @@ +header: + version: 16 + +env: + DISTRO_UNATTENDED_INST_TESTS: + # The full testimage run typically takes around 12-24h on fvp-base. + TEST_OVERALL_TIMEOUT: "${@ 24*60*60}" + +local_conf_header: + systemready-unattended-inst: | + TESTIMAGE_AUTO = "${@oe.utils.vartrue("DISTRO_UNATTENDED_INST_TESTS", "1", "", d)}"