Introduce a test that checks newly introduced virAcpi module.
There are three IORT tables from a real HW (IORT_ampere,
IORT_gigabyte and IORT_qualcomm), then there's one from a VM
(IORT_virt_aarch64) and one that I handcrafted to be empty
(IORT_empty).

Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
Reviewed-by: Andrea Bolognani <abolo...@redhat.com>
---
 build-aux/syntax-check.mk           |   2 +-
 tests/meson.build                   |   1 +
 tests/viracpidata/IORT_ampere       | Bin 0 -> 2304 bytes
 tests/viracpidata/IORT_empty        | Bin 0 -> 65 bytes
 tests/viracpidata/IORT_gigabyte     | Bin 0 -> 10100 bytes
 tests/viracpidata/IORT_qualcomm     | Bin 0 -> 3560 bytes
 tests/viracpidata/IORT_virt_aarch64 | Bin 0 -> 128 bytes
 tests/viracpitest.c                 | 135 ++++++++++++++++++++++++++++
 8 files changed, 137 insertions(+), 1 deletion(-)
 create mode 100644 tests/viracpidata/IORT_ampere
 create mode 100644 tests/viracpidata/IORT_empty
 create mode 100644 tests/viracpidata/IORT_gigabyte
 create mode 100644 tests/viracpidata/IORT_qualcomm
 create mode 100644 tests/viracpidata/IORT_virt_aarch64
 create mode 100644 tests/viracpitest.c

diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
index 5829dc9011..64c1e2773e 100644
--- a/build-aux/syntax-check.mk
+++ b/build-aux/syntax-check.mk
@@ -1370,7 +1370,7 @@ exclude_file_name_regexp--sc_prohibit_close = \
   
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$)
 
 exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
-  
(^tests/(nodedevmdevctl|virhostcpu|virpcitest|virstoragetest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
+  
(^tests/(nodedevmdevctl|viracpi|virhostcpu|virpcitest|virstoragetest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
 
 exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
   
(^(src/(util/(vircommand|virdaemon)|lxc/lxc_controller)|tests/testutils)\.c$$)
diff --git a/tests/meson.build b/tests/meson.build
index 24d08e4f97..35adbc2d56 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -269,6 +269,7 @@ tests += [
   { 'name': 'storagevolxml2xmltest' },
   { 'name': 'sysinfotest' },
   { 'name': 'utiltest' },
+  { 'name': 'viracpitest' },
   { 'name': 'viralloctest' },
   { 'name': 'virauthconfigtest' },
   { 'name': 'virbitmaptest' },
diff --git a/tests/viracpidata/IORT_ampere b/tests/viracpidata/IORT_ampere
new file mode 100644
index 
0000000000000000000000000000000000000000..02e7fd98499729025346c6ac3ae5cf10b0f1074d
GIT binary patch
literal 2304
zcmbW1y-EW?6opUzV}1)8%LN4mK`kr-7P4TWg&4%rLXlu$L<trF3*SI2d;m)y!oo6-
zU}@n4<PFw6a}$x7++mo7OlH2Bv)?d#caKg^&#(mGIla9fj0WlOVRV@!NluU+_qUdT
z!dl+nA>g$lfAhAGcZwV=;3b8Z6<$$zRpB*-Hx%AfcuV1Jg?AL*&3Um09*JpqZe{?O
zqhNo2j#<W4z|_q6b6jWV&dnkEb9^p#ZW55=mh9ZFc{qL_Z*Aw^0&-kp=UV2W`+Zzu
z=f(j!){UL}3CPtK<oc!v{rlwWW&1t?a;#%Jx4}*1m#@xP=XUOOmMahCb!BZF@J7IQ
zwg>YGkfFbw)ib1ii+>)bWKJ0S3tjuMt`ZLaZB1OlRM%>(tBecBB}{d#$GR#QJ1$|W
zYctkW#f#$-rn<IcT{XNrE@7(cG0eq0f4rm)8~8LMX=F~A>UxTGHSy)RgsHBpSXT>E
n$0ba4UB|lGsLR0_qjZI-uA5j_2Z`enrn>H8U0w7XmoVaAS)q0T

literal 0
HcmV?d00001

diff --git a/tests/viracpidata/IORT_empty b/tests/viracpidata/IORT_empty
new file mode 100644
index 
0000000000000000000000000000000000000000..58b696fe935b432020377aabc76fe2b95376b48f
GIT binary patch
literal 65
ucmebD4+?Q$U|?Y6a`g=eiDdBcbPDqf3SnRbih&p)8U!4`B$SXqaJT?S&j#KA

literal 0
HcmV?d00001

diff --git a/tests/viracpidata/IORT_gigabyte b/tests/viracpidata/IORT_gigabyte
new file mode 100644
index 
0000000000000000000000000000000000000000..b18b445b5de0911ba7190dfe396a72fec3fe6cf5
GIT binary patch
literal 10100
zcmeI1OHRWu5Qg2REq(9^AS76TA~tNhV95qiBr266RV`x4f;U?ZP>CaO1rESrH~<IW
z4#mG`Y%0}>oNhgq5>JSK2mi4?O{V>;(fI91sY?6o^twN}9A8X^z4OscMJd%Ejt6^<
zo$Nrz$NF$>*F_2;#-b&+H51}AsNpZVy_<6t=eh}%I??@99|OL|*gKAGch7<JWQ6!2
zKEQ!k_5s#9o8kP=o+?8Ke981-U^Cb2&}l4Nd`wCMne>1O=h`F3(vuP5gZKakV%Y~+
zD>13!@}VLoSw2~g{cuiHq~RfsV<DP4{xRLkJf}gD1&xoFSs*W;cuw0rb09q#AwGx?
za3Gd_fVC2nszJOoABj$*RNBT2{_o0eAd_Bb3U_|xNP03td=MYtKrH(JYb7QnK}<>@
z(9PynpX+p8l*6sikW!lF5}H<y#uVlFo~_Rz7xm?K>cb3_`W*WeOMOMwNiSS{Sk4Ei
zh>1=0y-jlzF_BX_$HZUO_?VOiGD+%l<a;dj7g?vgZ#a;*4{(o|)Cyu!2Ljz}Za3xM
zHH$dL>0c?$20f;fCe6|Kc$o$AQtESLYAp2^S*N^jIFPpwaF5v64&vo11iD#Xe(lq>
zk4fD?CP{scJdCCOBI}g*4F~e}0qzlBIzdcYgFrXSq~0N27v*r9G^CVfYY7d1;x0Vr
E57fpI9{>OV

literal 0
HcmV?d00001

diff --git a/tests/viracpidata/IORT_qualcomm b/tests/viracpidata/IORT_qualcomm
new file mode 100644
index 
0000000000000000000000000000000000000000..5364a9968fa024f34b5e911513a08e8a7f88cf91
GIT binary patch
literal 3560
zcmb7_yK7WI6vk)w?gfdc+XO5}jbI^i_hDy|WN$P9V~9y%A;c$GhzN?HK?NJFM9@YX
zTmKYG!TbS&7AXbo*Yn+ZoZX!D-Z=xi^Z3p;bLMyV++Eway1jqI7;|ZJw6SjOW_htc
zEDGDArL`;Dm*?|&yF%lFK2<v&2ChdOTIas0hHV;`)ylW=_^@${n9qH$<`_PppeG2V
z_Q>~PpYhnO$Ma|k4ZC3t<Mxogs9|h<PhEz2XknjKzmVIYgnqBe=OLYs7@>C?blad8
z)4JsI;{czZk<Vkw>6z#9bS9q`KM%?s_r`81d;+7u=bm2>_cy;HAH)c~+o0P9y_nV|
zpWg@g{E2*C5tCid<@HQHZNUe-rSS3FnZW0bUl8{<e<L5n2))~&+XlUu)+HaRh-2>A
zSHEb~7tPV$Qa;ap-tT=s{oFIb2fL;4$=nf<&lkTS?r-+0eBROdh!HyKi}L-ij{2(8
zQC}0f<U<ufdbqclqxzyb+6T(%h3E2dCZCSrgWXd2blee<&sV=7?vMKN`6EW?sINL5
z^;M^%z9w|Zhbn?}=0o*GbF@#y<fZ5Gc_yD+@WE~=d~$b0<g@P=#QjlUK7Ygr9rabG
zqrU2N)YpXGy5JH6k25|;jE~a)%Hs8%t>v9_<$8e|24;sU28c=X_M*3CwBCO7w$<K2
z^k!<W`=iAjJ8JLwcy6xs_L#F(dzteIwU;@cRC}58DYch5FQ~oD`Lx#CXU>aiFLPc}
zdztgH+RL0rYA<sx)n4Yj(%`Lr`1D$c?~MU-zM=Lq=bLITbH1haGUwZBFLS=5_A=+Y
zliu)B_HfbRy+kcraPQ}>a?~@eq_}=!+#oS-SQ~fN<#%m$R3ygL--Gw7zX!(+%s=~I
BN)P}5

literal 0
HcmV?d00001

diff --git a/tests/viracpidata/IORT_virt_aarch64 
b/tests/viracpidata/IORT_virt_aarch64
new file mode 100644
index 
0000000000000000000000000000000000000000..7efd0ce8a6b3928efa7e1373f688ab4c5f50543b
GIT binary patch
literal 128
zcmebD4+?2uU|?Y0?Bwt45v<@85#X!<1dKp25F11@0kHuPgMkDCNC*yK93~3}W)K^M
VRiHGGVg_O`aDdYP|3ers^8jQz3IPBB

literal 0
HcmV?d00001

diff --git a/tests/viracpitest.c b/tests/viracpitest.c
new file mode 100644
index 0000000000..f5dd542ffb
--- /dev/null
+++ b/tests/viracpitest.c
@@ -0,0 +1,135 @@
+/*
+ * viracpitest.c: Test ACPI table parsing
+ *
+ * Copyright (C) 2023 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <config.h>
+
+#define LIBVIRT_VIRACPIPRIV_H_ALLOW
+#include "testutils.h"
+#include "viracpi.h"
+#include "viracpipriv.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+typedef struct testAarch64SMMUData testAarch64SMMUData;
+struct testAarch64SMMUData {
+    const char *filename;
+    ssize_t nnodes;
+    const virIORTNodeType *node_types;
+};
+
+static void
+printBitmap(virBitmap *types)
+{
+    size_t i;
+
+    for (i = 0; i < VIR_IORT_NODE_TYPE_LAST; i++) {
+        if (virBitmapIsBitSet(types, i)) {
+            fprintf(stderr, "%s\n", virIORTNodeTypeTypeToString(i));
+        }
+    }
+}
+
+static int
+testAarch64SMMU(const void *opaque)
+{
+    const testAarch64SMMUData *data = opaque;
+    g_autofree char *path = NULL;
+    g_autofree virIORTNodeHeader *nodes = NULL;
+    ssize_t nnodes = 0;
+
+    path = g_strdup_printf("%s/viracpidata/%s",
+                           abs_srcdir, data->filename);
+
+    nnodes = virAcpiParseIORT(&nodes, path);
+
+    if (nnodes != data->nnodes) {
+        fprintf(stderr,
+                "virAcpiParseIORT() returned wrong number of nodes: %zd, 
expected %zd\n",
+                nnodes, data->nnodes);
+        return -1;
+    }
+
+    if (nnodes > 0) {
+        g_autoptr(virBitmap) typesSeen = virBitmapNew(VIR_IORT_NODE_TYPE_LAST);
+        g_autoptr(virBitmap) typesExp = virBitmapNew(VIR_IORT_NODE_TYPE_LAST);
+        size_t i = 0;
+
+        for (i = 0; data->node_types[i] != VIR_IORT_NODE_TYPE_LAST; i++) {
+            size_t type = data->node_types[i];
+
+            ignore_value(virBitmapSetBit(typesExp, type));
+        }
+
+        for (i = 0; i < nnodes; i++) {
+            virIORTNodeHeader *h = &nodes[i];
+
+            ignore_value(virBitmapSetBit(typesSeen, h->type));
+        }
+
+        if (!virBitmapEqual(typesSeen, typesExp)) {
+            fprintf(stderr, "node types mismatch.\n\nExpected:\n");
+            printBitmap(typesExp);
+            fprintf(stderr, "\nActual:\n");
+            printBitmap(typesSeen);
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+
+static int
+mymain(void)
+{
+    int ret = 0;
+
+#define DO_TEST(filename, nnodes, ...) \
+    do { \
+        const virIORTNodeType node_types[] = { __VA_ARGS__, 
VIR_IORT_NODE_TYPE_LAST }; \
+        const testAarch64SMMUData data = {filename, nnodes, node_types }; \
+        if (virTestRun("aarch64 SMMU " filename, testAarch64SMMU, &data) < 0) \
+            ret = -1; \
+    } while (0)
+
+    DO_TEST("IORT_empty", 0, VIR_IORT_NODE_TYPE_LAST);
+    DO_TEST("IORT_virt_aarch64", 2,
+            VIR_IORT_NODE_TYPE_ITS_GROUP,
+            VIR_IORT_NODE_TYPE_ROOT_COMPLEX);
+    DO_TEST("IORT_ampere", 36,
+            VIR_IORT_NODE_TYPE_ITS_GROUP,
+            VIR_IORT_NODE_TYPE_ROOT_COMPLEX,
+            VIR_IORT_NODE_TYPE_SMMUV3);
+    DO_TEST("IORT_gigabyte", 30,
+            VIR_IORT_NODE_TYPE_ITS_GROUP,
+            VIR_IORT_NODE_TYPE_ROOT_COMPLEX,
+            VIR_IORT_NODE_TYPE_SMMUV1_OR_SMMUV2);
+    DO_TEST("IORT_qualcomm", 69,
+            VIR_IORT_NODE_TYPE_ITS_GROUP,
+            VIR_IORT_NODE_TYPE_NAMED_COMPONENT,
+            VIR_IORT_NODE_TYPE_ROOT_COMPLEX,
+            VIR_IORT_NODE_TYPE_SMMUV3,
+            VIR_IORT_NODE_TYPE_PMCG);
+
+    return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+VIR_TEST_MAIN(mymain)
-- 
2.39.2

Reply via email to