From nobody Mon Feb 9 04:30:03 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1638535624436708.5321367078852; Fri, 3 Dec 2021 04:47:04 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-516-k4xEZk9uMn2N0xe8EefeAA-1; Fri, 03 Dec 2021 07:46:17 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BB11384BA6C; Fri, 3 Dec 2021 12:46:11 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8250F5ED25; Fri, 3 Dec 2021 12:46:11 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 56B741806D2B; Fri, 3 Dec 2021 12:46:11 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 1B3CjxbD017116 for ; Fri, 3 Dec 2021 07:45:59 -0500 Received: by smtp.corp.redhat.com (Postfix) id ABD7C401E38; Fri, 3 Dec 2021 12:45:59 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A7577401E2B for ; Fri, 3 Dec 2021 12:45:59 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8F5B480122B for ; Fri, 3 Dec 2021 12:45:59 +0000 (UTC) Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-6-2RG8p3wpM8OkmeFd-PAWyA-1; Fri, 03 Dec 2021 07:45:58 -0500 Received: by mail-pg1-f170.google.com with SMTP id m15so2878434pgu.11 for ; Fri, 03 Dec 2021 04:45:57 -0800 (PST) Received: from localhost ([2400:ddc0:1000::b373:390c]) by smtp.gmail.com with ESMTPSA id y190sm3202409pfg.153.2021.12.03.04.45.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Dec 2021 04:45:56 -0800 (PST) X-MC-Unique: k4xEZk9uMn2N0xe8EefeAA-1 X-MC-Unique: 2RG8p3wpM8OkmeFd-PAWyA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=r6BhjGQW1kDYlAJ0FAYATPKeKcy5FIJh1hBVioMioDI=; b=Xf4pTQdMupmY4UlL3/d0WX5MvhTkAtamEfBIdE4pfww+U/3U4oTSuenjIhKp60uYaD Amb75U/bk/wmHxjTYE0iJvOqZkfnEJIg/lhrWSPkzrDNa9PIo/jwOhMtG4qJbHix+2Og 8xkYbS3MoZ4mf/1Vn1h5+EAAA8LCxrulxc6ZrAalviEDJW54m2b1wnPVUNSP+AKhbYJd Tr+LsSoh5S9KHi6ktCsz4rbomsm1hWqgivulTehkFFpyycMGqt2svy7Xg/yLhomomcru CkgVRZpHGdW0XU6eH3ekJaweXer7oTmO9RBof/H895mRDuHChU9mdYoCbmPtwvQ0iUB6 AO5A== X-Gm-Message-State: AOAM531w/Prmh+qmjxqBv0GQSjHIXNv5BMinkZDz5MvNYuQc16UZQdjE /7Crk1Nticz/WtNtUaRZ+GpIxg4YEWhzlviS X-Google-Smtp-Source: ABdhPJyz2KfbNB200nLQPmTAAEXt0I5Gcfumdq4UCruuKA38Cp9jXXuDUfwv1VisxA6so+Ldm+3pzA== X-Received: by 2002:a05:6a00:1150:b0:4a2:7328:cce6 with SMTP id b16-20020a056a00115000b004a27328cce6mr19329550pfm.67.1638535556466; Fri, 03 Dec 2021 04:45:56 -0800 (PST) From: Luke Yue To: libvir-list@redhat.com Subject: [PATCH v4 8/8] tests: Add generichotplugtest Date: Fri, 3 Dec 2021 20:45:17 +0800 Message-Id: <20211203124517.571524-9-lukedyue@gmail.com> In-Reply-To: <20211203124517.571524-1-lukedyue@gmail.com> References: <20211203124517.571524-1-lukedyue@gmail.com> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1638535625093100003 Content-Type: text/plain; charset="utf-8" For testing hypervisor independent device detach / attach / update functions, currently only detaching included. Signed-off-by: Luke Yue --- The test would show error messages with expected to fail tests even with VIR_TEST_DEBUG=3D0, really don't know what I missed to make it quiet :( I would really appreciate it if anyone could tell me what should I do, than= ks. --- tests/generichotplugtest.c | 178 +++++++++++++++++++++++++++++++++++++ tests/meson.build | 1 + 2 files changed, 179 insertions(+) create mode 100644 tests/generichotplugtest.c diff --git a/tests/generichotplugtest.c b/tests/generichotplugtest.c new file mode 100644 index 0000000000..443fc907d3 --- /dev/null +++ b/tests/generichotplugtest.c @@ -0,0 +1,178 @@ +#include + +#include "internal.h" +#include "testutils.h" + +enum { + ATTACH, + DETACH, + UPDATE +}; + +#define VIR_FROM_THIS VIR_FROM_NONE + +struct genericHotplugTestData { + const char *device_filename; + const char *device_alias; + bool fail; + bool alias; + bool keep; + int action; + unsigned int flags; + virDomainPtr dom; +}; + +static int +testGenericHotplug(const void *data) +{ + int ret =3D 0; + g_autofree char *domain_xml =3D g_strdup_printf("test://%s/../examples= /xml/test/testnode.xml", + abs_srcdir); + struct genericHotplugTestData *test =3D (struct genericHotplugTestData= *) data; + g_autofree char *device_filename =3D NULL; + g_autofree char *device_alias =3D NULL; + g_autofree char *device_xml =3D NULL; + bool fail =3D test->fail; + bool alias =3D test->alias; + unsigned int flags =3D test->flags; + virConnectPtr conn =3D virConnectOpen(domain_xml); + virDomainPtr dom =3D NULL; + + if (!test->dom) { + dom =3D virDomainLookupByName(conn, "fc5"); + test->dom =3D dom; + } + + if (alias) { + device_alias =3D g_strdup_printf("%s", test->device_alias); + } else { + device_filename =3D g_strdup_printf("%s/generichotplugdata/generic= hotplug-%s.xml", + abs_srcdir, test->device_filenam= e); + + if (virTestLoadFile(device_filename, &device_xml) < 0) + return -1; + } + + switch (test->action) { + case ATTACH: + ret =3D virDomainAttachDeviceFlags(test->dom, device_xml, flags); + break; + + case DETACH: + if (alias) { + ret =3D virDomainDetachDeviceAlias(test->dom, device_alias, fl= ags); + } else { + ret =3D virDomainDetachDeviceFlags(test->dom, device_xml, flag= s); + } + break; + + case UPDATE: + ret =3D virDomainUpdateDeviceFlags(test->dom, device_xml, flags); + break; + } + + if (!test->keep) { + virDomainDestroy(test->dom); + virDomainFree(test->dom); + test->dom =3D NULL; + } else { + test->dom =3D dom; + } + virConnectClose(conn); + + return ((ret < 0 && fail) || (!ret && !fail)) ? 0 : -1; +} + +static int +mymain(void) +{ + int ret =3D 0; + struct genericHotplugTestData data =3D {0}; + unsigned int test_flags =3D VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT= _CONFIG; + +#define DO_TEST(ACTION, dev, dev_alias, alias_, fail_, keep_, flags_) \ + do { \ + const char *name =3D (alias_) ? \ + "Generic " #ACTION " alias " dev_alias : \ + "Generic " #ACTION " " dev; \ + data.action =3D ACTION; \ + data.device_filename =3D dev; \ + data.device_alias =3D dev_alias; \ + data.alias =3D alias_; \ + data.fail =3D fail_; \ + data.flags =3D flags_; \ + data.keep =3D keep_; \ + if (virTestRun(name, testGenericHotplug, &data) < 0) \ + ret =3D -1; \ + } while (0) + +#define DO_TEST_DETACH(dev, dev_alias, alias, fail, keep, flags) \ + DO_TEST(DETACH, dev, dev_alias, alias, fail, keep, flags) + + /* Every detach test is followed by a repeated one that is expected + to fail, cause the previous one should detach the device successfully = */ + DO_TEST_DETACH("controller", "", false, false, true, test_flags); + DO_TEST_DETACH("controller", "", false, true, false, test_flags); + + DO_TEST_DETACH("disk-cdrom", "", false, false, true, test_flags); + DO_TEST_DETACH("disk-cdrom", "", false, true, false, test_flags); + + DO_TEST_DETACH("filesystem", "", false, false, true, test_flags); + DO_TEST_DETACH("filesystem", "", false, true, false, test_flags); + + DO_TEST_DETACH("hostdev", "", false, false, true, test_flags); + DO_TEST_DETACH("hostdev", "", false, true, false, test_flags); + + DO_TEST_DETACH("input", "", false, false, true, test_flags); + DO_TEST_DETACH("input", "", false, true, false, test_flags); + + DO_TEST_DETACH("interface", "", false, false, true, test_flags); + DO_TEST_DETACH("interface", "", false, true, false, test_flags); + + DO_TEST_DETACH("lease", "", false, false, true, test_flags); + DO_TEST_DETACH("lease", "", false, true, false, test_flags); + + DO_TEST_DETACH("memory", "", false, false, true, test_flags); + DO_TEST_DETACH("memory", "", false, true, false, test_flags); + + DO_TEST_DETACH("rng", "", false, false, true, test_flags); + DO_TEST_DETACH("rng", "", false, true, false, test_flags); + + DO_TEST_DETACH("shmem", "", false, false, true, test_flags); + DO_TEST_DETACH("shmem", "", false, true, false, test_flags); + + DO_TEST_DETACH("sound", "", false, false, true, test_flags); + DO_TEST_DETACH("sound", "", false, true, false, test_flags); + + DO_TEST_DETACH("tpm", "", false, false, true, test_flags); + DO_TEST_DETACH("tpm", "", false, true, false, test_flags); + + DO_TEST_DETACH("vsock", "", false, false, true, test_flags); + DO_TEST_DETACH("vsock", "", false, true, false, test_flags); + + DO_TEST_DETACH("watchdog", "", false, false, true, test_flags); + DO_TEST_DETACH("watchdog", "", false, true, false, test_flags); + + DO_TEST_DETACH("disk-cdrom", "", false, false, true, test_flags); + DO_TEST_DETACH("", "ua-testCD", true, true, false, test_flags); + + DO_TEST_DETACH("", "ua-testCD", true, false, true, test_flags); + DO_TEST_DETACH("", "ua-testCD", true, true, false, test_flags); + + /* Memballoon device shouldn't be hotpluggable */ + DO_TEST_DETACH("memballoon", "", false, true, false, test_flags); + + DO_TEST_DETACH("memballoon", "", false, false, true, + VIR_DOMAIN_AFFECT_CONFIG); + DO_TEST_DETACH("memballoon", "", false, true, false, + VIR_DOMAIN_AFFECT_CONFIG); + + if (data.dom) { + virDomainDestroy(data.dom); + virDomainFree(data.dom); + } + + return (ret =3D=3D 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} + +VIR_TEST_MAIN(mymain) diff --git a/tests/meson.build b/tests/meson.build index f75c248720..659b044984 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -288,6 +288,7 @@ tests +=3D [ { 'name': 'cputest', 'link_with': cputest_link_with, 'link_whole': cpute= st_link_whole }, { 'name': 'domaincapstest', 'link_with': domaincapstest_link_with, 'link= _whole': domaincapstest_link_whole }, { 'name': 'domainconftest' }, + { 'name': 'generichotplugtest' }, { 'name': 'genericxml2xmltest' }, { 'name': 'interfacexml2xmltest' }, { 'name': 'metadatatest' }, -- 2.34.1