]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
test: wire up networkValidateTests()
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 27 Jan 2026 21:08:18 +0000 (22:08 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 29 Jan 2026 12:38:45 +0000 (13:38 +0100)
Our network driver calls networkValidate() right after a network
XML is parsed. This is similar to domain validation step when
parsing domain XML. But it's not that convoluted in network
driver. Regardless, any network related test should mimic real
life scenario as close as possible and thus
networkValidateTests() should be called right after domain XML is
parsed.

Now, networkValidate() might query sysfs wrt to PCI devices and
thus tests must start using virpcimock. The function will also
generate random MAC addresses, if needed, hence virrandommock.

With this change, passthrough-pf and passthrough-address-crash
test cases of networkxml2xmltest started failing but looking at
corresponding XMLs those test cases were designed to test just
XML parsing. They were never designed to showcase a "real"
network XML. So mark them as expected fail.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
27 files changed:
tests/networkxml2confdata/leasetime-hours.xml
tests/networkxml2confdata/leasetime-infinite.xml
tests/networkxml2confdata/leasetime-minutes.xml
tests/networkxml2confdata/leasetime-seconds.xml
tests/networkxml2confdata/netboot-tftp.xml
tests/networkxml2conftest.c
tests/networkxml2firewalltest.c
tests/networkxml2xmlout/dnsmasq-options.xml
tests/networkxml2xmlout/nat-network-dns-forward-plain.xml
tests/networkxml2xmlout/nat-network-dns-forwarder-no-resolv.xml
tests/networkxml2xmlout/nat-network-dns-forwarders.xml
tests/networkxml2xmlout/nat-network-dns-hosts.xml
tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml
tests/networkxml2xmlout/nat-network-dns-srv-record.xml
tests/networkxml2xmlout/nat-network-dns-srv-records.xml
tests/networkxml2xmlout/nat-network-dns-txt-record.xml
tests/networkxml2xmlout/nat-network-explicit-flood.xml
tests/networkxml2xmlout/nat-network-forward-nat-address.xml
tests/networkxml2xmlout/nat-network-forward-nat-ipv6.xml
tests/networkxml2xmlout/nat-network-forward-nat-no-address.xml
tests/networkxml2xmlout/nat-network-mtu.xml
tests/networkxml2xmlout/nat-network.xml
tests/networkxml2xmlout/netboot-network.xml
tests/networkxml2xmlout/netboot-proxy-network.xml
tests/networkxml2xmlout/passthrough-address-crash.xml [deleted file]
tests/networkxml2xmlout/passthrough-pf.xml [deleted file]
tests/networkxml2xmltest.c

index 5c8bec8328818e3a0c24ced9a39a3f707cac49ea..3824d42368555682afddb1b94470b47a6b88b13f 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'>
index a5a9e6c5ed40099e202c54146eb7b36c3e030e10..24df80d5e36a902de98f5c0693605d5c7879203b 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'>
index 1cbc2856852e2541683d4028d7b3f775fad2f2a2..99956edc51001a982c96e33b59d6e799c7dfea26 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'>
index 9d8efc26086157494590d544bbd6aed4c1161abf..76bd7909b87753a179a807c09d20cc095cbcd37c 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'>
index 297f5a7ba1abf4821bc2bdbed3c518fac1802f0c..9d5d57bae4c412d96d62bf1ee5294c7db564bbbe 100644 (file)
@@ -3,6 +3,7 @@
   <uuid>eb486e5c-4df5-42ee-ae4a-ad8557998d00</uuid>
   <forward mode='nat'/>
   <bridge name='virbr0' stp='off' delay='1'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <tftp root='/var/lib/tftproot'/>
   </ip>
index 59ab3a402b515107c7c7d2734eff5f2a538f8738..67856f2e8caaa5d9c96d0a9d6e10088a3fe087df 100644 (file)
@@ -36,6 +36,9 @@ testCompareXMLToConfFiles(const char *inxml, const char *outconf,
     if (!(def = virNetworkDefParse(NULL, inxml, xmlopt, false)))
         goto fail;
 
+    if (networkValidateTests(def) < 0)
+        goto fail;
+
     if (!(obj = virNetworkObjNew()))
         goto fail;
 
@@ -203,4 +206,6 @@ mymain(void)
 }
 
 VIR_TEST_MAIN_PRELOAD(mymain,
+                      VIR_TEST_MOCK("virpci"),
+                      VIR_TEST_MOCK("virrandom"),
                       VIR_TEST_MOCK("virdnsmasq"))
index e32f1b281ed3bffbd29216340c84cc564d42bb04..0febae9ebcade89db01c93558c69b58d9a963627 100644 (file)
@@ -27,6 +27,8 @@
 
 # include <gio/gio.h>
 
+# define LIBVIRT_BRIDGE_DRIVER_PRIV_H_ALLOW
+# include "bridge_driver_priv.h"
 # include "bridge_driver_platform.h"
 # include "virbuffer.h"
 # include "virmock.h"
@@ -106,6 +108,9 @@ static int testCompareXMLToArgvFiles(const char *xml,
     if (!(def = virNetworkDefParse(NULL, xml, NULL, false)))
         return -1;
 
+    if (networkValidateTests(def) < 0)
+        return -1;
+
     if (networkAddFirewallRules(def, backend, NULL) < 0)
         return -1;
 
@@ -213,7 +218,10 @@ mymain(void)
  * virGDBusIsServiceRegistered().
  */
 
-VIR_TEST_MAIN_PRELOAD(mymain, VIR_TEST_MOCK("virgdbus"),
+VIR_TEST_MAIN_PRELOAD(mymain,
+                      VIR_TEST_MOCK("virpci"),
+                      VIR_TEST_MOCK("virrandom"),
+                      VIR_TEST_MOCK("virgdbus"),
                       VIR_TEST_MOCK("virfirewall"))
 
 #else /* ! defined (__linux__) */
index 856a018f251157a98400b21e097ee20bdf56c512..97911eb65e3e3b04464c4cdae1c4e53b36802beb 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'/>
index 7522f6ae1cf09b8a5b4127dae5646a28c8e580b6..76e0f926a94f4be0acf408c94eb4694b56f03bd3 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth0'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns forwardPlainNames='yes'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
   </ip>
index 9661ce561e162478bd9ded690c9cc55e8dfb6959..ab2800331ceefef237b45d51692f77aa3b158df1 100644 (file)
@@ -3,6 +3,7 @@
   <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9c</uuid>
   <forward mode='nat'/>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns>
     <forwarder domain='example.com' addr='192.168.1.1'/>
   </dns>
index e03912750c38321d42380eb701dbf7a60341767b..170b043d098b70be4ca7f87a4db2592223153dd8 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth0'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns>
     <forwarder addr='8.8.8.8'/>
     <forwarder addr='8.8.4.4'/>
index 86832af5186e00e22c69969cfc6223f49ee17b08..548282e514d122d95285e689755dcd4f67657786 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth0'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns forwardPlainNames='no'>
     <host ip='192.168.122.122'>
       <hostname>pudding</hostname>
index a18afae2fd18ecffe465b7cc344205a797ba380b..50e968be9dbc954a149d1a435369d0d02e5d1b25 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns>
     <srv service='name' protocol='tcp'/>
   </dns>
index 3dd19e6698284c76d8ae1a3be433ca08ff885a36..1486fc3224729b65d3177835dfc424ac29a38817 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns>
     <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10'/>
   </dns>
index eda9e203337519473a9d70dabe5d6221c75e0d57..26b802e1ebc8291eb9f4ee063653179fa19d7fcc 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns>
     <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10'/>
     <srv service='name' protocol='tcp' domain='donkey' target='.' port='404' priority='10' weight='10'/>
index a4590119ef2a66ed84e36807a03adc005110bb65..cba7e9d1f8fd5747d48ab72f78886123e59e8785 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <dns>
     <txt name='example' value='example value'/>
   </dns>
index 305c3b7d98a1c80d954c03e5a2d6ad5302459ac1..c0399555431d0c26f0836824b9809009d195681e 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0' macTableManager='kernel'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'/>
index faeba24706610d4509af067553ac7db6b5cf138f..e3276ac33812b57bcb8befc0653b274425609aa1 100644 (file)
@@ -9,6 +9,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'/>
index cfec391ee2bb883af5bc44b3463c2e6ab07849b5..642929cc8d054d0a601a963a3255ddd4e1a7d482 100644 (file)
@@ -5,6 +5,7 @@
     <nat ipv6='yes'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
   </ip>
 </network>
index f19e34deecec83081d077bfbf46cc1dee1189203..77fc0b5324b79271ac7f397b62bb3d8e2a44d938 100644 (file)
@@ -8,6 +8,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'/>
index 715bc1b505f06375bd379c12c4151c45a500f2c7..97044c70ec729df53f72c1d39b69999e759894a0 100644 (file)
@@ -6,6 +6,7 @@
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
   <mtu size='7000'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'/>
index 93bc7db51d15e63fe28bbf877acc14ac85265298..9d3757f0e09fc2a917facca7fc6454820be9a342 100644 (file)
@@ -5,6 +5,7 @@
     <interface dev='eth1'/>
   </forward>
   <bridge name='virbr0' stp='on' delay='0'/>
+  <mac address='52:54:00:00:00:00'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'/>
index 8d5ad31a0092e71afb712877d7c01f12147c8975..723c6c7a725831b4873036ec2d31375f5c13f9cf 100644 (file)
@@ -3,6 +3,7 @@
   <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
   <forward mode='nat'/>
   <bridge name='virbr1' stp='off' delay='1'/>
+  <mac address='52:54:00:00:00:00'/>
   <domain name='example.com'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <tftp root='/var/lib/tftproot'/>
index a5b7c1e4e6c4084b520a08abdb2144b98d6aee35..8c9fae874cfeffa35a30701aa6c90f48aa186969 100644 (file)
@@ -3,6 +3,7 @@
   <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
   <forward mode='nat'/>
   <bridge name='virbr1' stp='off' delay='1'/>
+  <mac address='52:54:00:00:00:00'/>
   <domain name='example.com'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
diff --git a/tests/networkxml2xmlout/passthrough-address-crash.xml b/tests/networkxml2xmlout/passthrough-address-crash.xml
deleted file mode 100644 (file)
index a05dbbf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<network>
-  <name>passthrough_001</name>
-  <uuid>50e92386-8dd1-4a95-8a4b-9a888274eb66</uuid>
-  <forward mode='passthrough'>
-    <address type='pci' domain='0x0000' bus='0x11' slot='0x10' function='0x1'/>
-  </forward>
-</network>
diff --git a/tests/networkxml2xmlout/passthrough-pf.xml b/tests/networkxml2xmlout/passthrough-pf.xml
deleted file mode 100644 (file)
index 1a7e71e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<network>
-  <name>local</name>
-  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
-  <forward mode='passthrough'>
-    <pf dev='eth0'/>
-  </forward>
-  <ip address='192.168.122.1' netmask='255.255.255.0'>
-  </ip>
-</network>
index 840bcaa83f59c0d1322d03897a709fb506faf4ed..10eed8173e349ad6b4d3fd7d59220f1b75724396 100644 (file)
@@ -17,6 +17,7 @@
 typedef enum {
     TEST_COMPARE_NET_XML2XML_RESULT_SUCCESS,
     TEST_COMPARE_NET_XML2XML_RESULT_FAIL_PARSE,
+    TEST_COMPARE_NET_XML2XML_RESULT_FAIL_VALIDATE,
     TEST_COMPARE_NET_XML2XML_RESULT_FAIL_FORMAT,
     TEST_COMPARE_NET_XML2XML_RESULT_FAIL_COMPARE,
 } testCompareNetXML2XMLResult;
@@ -42,6 +43,13 @@ testCompareXMLToXMLFiles(const char *inxml, const char *outxml,
     if (expectResult == TEST_COMPARE_NET_XML2XML_RESULT_FAIL_PARSE)
         goto cleanup;
 
+    if (networkValidateTests(dev) < 0) {
+        result = TEST_COMPARE_NET_XML2XML_RESULT_FAIL_VALIDATE;
+        goto cleanup;
+    }
+    if (expectResult == TEST_COMPARE_NET_XML2XML_RESULT_FAIL_VALIDATE)
+        goto cleanup;
+
     if (!(actual = virNetworkDefFormat(dev, xmlopt, flags))) {
         result = TEST_COMPARE_NET_XML2XML_RESULT_FAIL_FORMAT;
         goto cleanup;
@@ -114,6 +122,8 @@ mymain(void)
     DO_TEST_FULL(name, flags, TEST_COMPARE_NET_XML2XML_RESULT_SUCCESS)
 #define DO_TEST_PARSE_ERROR(name) \
     DO_TEST_FULL(name, 0, TEST_COMPARE_NET_XML2XML_RESULT_FAIL_PARSE)
+#define DO_TEST_VALIDATE_ERROR(name) \
+    DO_TEST_FULL(name, 0, TEST_COMPARE_NET_XML2XML_RESULT_FAIL_VALIDATE)
 
     DO_TEST("dhcp6host-routed-network");
     DO_TEST("empty-allow-ipv6");
@@ -145,12 +155,12 @@ mymain(void)
     DO_TEST("vepa-net");
     DO_TEST("bandwidth-network");
     DO_TEST("openvswitch-net");
-    DO_TEST_FLAGS("passthrough-pf", VIR_NETWORK_XML_INACTIVE);
+    DO_TEST_VALIDATE_ERROR("passthrough-pf");
     DO_TEST("hostdev");
     DO_TEST_FLAGS("hostdev-pf", VIR_NETWORK_XML_INACTIVE);
     DO_TEST_FLAGS("hostdev-pf-driver-model", VIR_NETWORK_XML_INACTIVE);
 
-    DO_TEST("passthrough-address-crash");
+    DO_TEST_VALIDATE_ERROR("passthrough-address-crash");
     DO_TEST("nat-network-explicit-flood");
     DO_TEST("host-bridge-no-flood");
     DO_TEST_PARSE_ERROR("hostdev-duplicate");
@@ -167,4 +177,6 @@ mymain(void)
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
-VIR_TEST_MAIN(mymain)
+VIR_TEST_MAIN_PRELOAD(mymain,
+                      VIR_TEST_MOCK("virpci"),
+                      VIR_TEST_MOCK("virrandom"))