summary refs log tree commit diff
path: root/src/core/initrd/tests
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2021-02-11 18:11:46 +0100
committerMichael Biebl <biebl@debian.org>2021-02-11 18:11:46 +0100
commit80ec1decc49c72efec2a8b87c06245c92c0ab807 (patch)
treee3b229aa94e8dcf0590f2317664176e7b8f7607b /src/core/initrd/tests
parent65f86e8f56267192d42f2b629fc6b0c99fb9cd0c (diff)
New upstream version 1.29.90 upstream/1.29.90
Diffstat (limited to 'src/core/initrd/tests')
-rw-r--r--src/core/initrd/tests/meson.build24
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/class/net/eth1/address1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port1
-rw-r--r--src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-dt-tftp/firmware/devicetree/base/chosen/bootpathbin0 -> 108 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-requestbin0 -> 273 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-responsebin0 -> 300 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootpathbin0 -> 37 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/broadcast-ip1
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-ip2
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-namebin0 -> 9 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/domain-namebin0 -> 15 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/gateway-ip2
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/namebin0 -> 7 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/netmask-ipbin0 -> 4 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/root-pathbin0 -> 1 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/server-ip2
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/tftp-filebin0 -> 11 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/vendor-optionsbin0 -> 1 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/device_typebin0 -> 8 bytes
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/local-mac-address1
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/mac-address1
-rw-r--r--src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/namebin0 -> 9 bytes
-rw-r--r--src/core/initrd/tests/sysfs-static/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs-static/class/net/eth1/address1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target0/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target1/index1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target1/lun1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target1/port1
-rw-r--r--src/core/initrd/tests/sysfs-static/firmware/ibft/target1/target-name1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name1
-rw-r--r--src/core/initrd/tests/sysfs/class/net/eth0/address1
-rw-r--r--src/core/initrd/tests/sysfs/class/net/eth2/address1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/signature1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/flags1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/index1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/mac1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/origin1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/flags1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/index1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/mac1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/origin1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/initiator/flags1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/initiator/index1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/initiator/isns-server1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/initiator/slp-server1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target0/chap-type1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target0/flags1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target0/index1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target0/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target0/lun1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target0/port1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/chap-type1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/flags1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/index1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/ip-addr1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/lun1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/port1
-rw-r--r--src/core/initrd/tests/sysfs/firmware/ibft/target2/target-name1
-rw-r--r--src/core/initrd/tests/test-cmdline-reader.c2118
-rw-r--r--src/core/initrd/tests/test-dt-reader.c144
-rw-r--r--src/core/initrd/tests/test-ibft-reader.c303
215 files changed, 2790 insertions, 0 deletions
diff --git a/src/core/initrd/tests/meson.build b/src/core/initrd/tests/meson.build
new file mode 100644
index 00000000..e47ff790
--- /dev/null
+++ b/src/core/initrd/tests/meson.build
@@ -0,0 +1,24 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+test_units = [
+  'test-dt-reader',
+  'test-ibft-reader',
+  'test-cmdline-reader',
+]
+
+foreach test_unit : test_units
+  exe = executable(
+    test_unit,
+    test_unit + '.c',
+    dependencies: libNetworkManagerTest_dep,
+    c_args: test_c_flags,
+    link_with: libnmi_core,
+  )
+
+  test(
+    'initrd/' + test_unit,
+    test_script,
+    timeout: default_test_timeout,
+    args: test_args + [exe.full_path()],
+  )
+endforeach
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/class/net/eth0/address b/src/core/initrd/tests/sysfs-bad-dns1/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2303dbdc
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10000.500.250.1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/class/net/eth0/address b/src/core/initrd/tests/sysfs-bad-dns2/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..5ed7b719
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+blah.foo.bar.baz
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/class/net/eth0/address b/src/core/initrd/tests/sysfs-bad-gateway/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..1970856e
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+bb.cc.dd.ee
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address b/src/core/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..d526f324
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+aa.bb.cc.dd
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/class/net/eth0/address b/src/core/initrd/tests/sysfs-dhcp/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/class/net/eth1/address b/src/core/initrd/tests/sysfs-dhcp/class/net/eth1/address
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/class/net/eth1/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..59ea5b82
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+10.16.52.254
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..e440e5c8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway
new file mode 100644
index 00000000..59ea5b82
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway
@@ -0,0 +1 @@
+10.16.52.254
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin
new file mode 100644
index 00000000..e440e5c8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name
new file mode 100644
index 00000000..ac3a6a2a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name
@@ -0,0 +1 @@
+iqn.1.2008-11.com.blahblah:iscsi1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dt-tftp/firmware/devicetree/base/chosen/bootpath b/src/core/initrd/tests/sysfs-dt-tftp/firmware/devicetree/base/chosen/bootpath
new file mode 100644
index 00000000..6f069ae0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt-tftp/firmware/devicetree/base/chosen/bootpath
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-request b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-request
new file mode 100644
index 00000000..034d423e
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-request
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-response b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-response
new file mode 100644
index 00000000..25982d6f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootp-response
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootpath b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootpath
new file mode 100644
index 00000000..db880702
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/bootpath
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/broadcast-ip b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/broadcast-ip
new file mode 100644
index 00000000..7bde8641
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/broadcast-ip
@@ -0,0 +1 @@
+ÿÿÿÿ
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-ip b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-ip
new file mode 100644
index 00000000..f108ba9b
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-ip
@@ -0,0 +1,2 @@
+
++
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-name b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-name
new file mode 100644
index 00000000..fe0f76b8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/client-name
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/domain-name b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/domain-name
new file mode 100644
index 00000000..b34f9f96
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/domain-name
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/gateway-ip b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/gateway-ip
new file mode 100644
index 00000000..f0361835
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/gateway-ip
@@ -0,0 +1,2 @@
+
++þ
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/name b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/name
new file mode 100644
index 00000000..f3e58052
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/name
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/netmask-ip b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/netmask-ip
new file mode 100644
index 00000000..d441cd83
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/netmask-ip
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/root-path b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/root-path
new file mode 100644
index 00000000..f76dd238
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/root-path
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/server-ip b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/server-ip
new file mode 100644
index 00000000..a2a4b2e8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/server-ip
@@ -0,0 +1,2 @@
+
+&
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/tftp-file b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/tftp-file
new file mode 100644
index 00000000..c0e0e330
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/tftp-file
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/vendor-options b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/vendor-options
new file mode 100644
index 00000000..f76dd238
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/chosen/vendor-options
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/device_type b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/device_type
new file mode 100644
index 00000000..df3c9d9f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/device_type
Binary files differdiff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/local-mac-address b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/local-mac-address
new file mode 100644
index 00000000..c983e752
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/local-mac-address
@@ -0,0 +1 @@
+¬>åØ
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/mac-address b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/mac-address
new file mode 100644
index 00000000..c983e752
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/mac-address
@@ -0,0 +1 @@
+¬>åØ
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/name b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/name
new file mode 100644
index 00000000..88eaddfe
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-dt/firmware/devicetree/base/ethernet/name
Binary files differdiff --git a/src/core/initrd/tests/sysfs-static/class/net/eth0/address b/src/core/initrd/tests/sysfs-static/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/class/net/eth1/address b/src/core/initrd/tests/sysfs-static/class/net/eth1/address
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/class/net/eth1/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway
new file mode 100644
index 00000000..59ea5b82
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway
@@ -0,0 +1 @@
+10.16.52.254
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin
new file mode 100644
index 00000000..e440e5c8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/target-name b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/index b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/lun b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/port b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/target-name b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/target-name
new file mode 100644
index 00000000..ac3a6a2a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-static/firmware/ibft/target1/target-name
@@ -0,0 +1 @@
+iqn.1.2008-11.com.blahblah:iscsi1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/class/net/eth0/address b/src/core/initrd/tests/sysfs-vlan/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..4923230c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.6.200
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..cabf43b5
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+24
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..5a279b41
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.255.0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..d800886d
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+123
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..8e9cd2c4
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.2010-04.org.ipxe:d05faa97-c4be-44f6-a723-efde9aa399a0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..a32ce01b
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+192.168.6.32
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun
new file mode 100644
index 00000000..f309ca6a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+01000000
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..f0e61157
--- /dev/null
+++ b/src/core/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.2003-01.org.x:disk1
\ No newline at end of file
diff --git a/src/core/initrd/tests/sysfs/class/net/eth0/address b/src/core/initrd/tests/sysfs/class/net/eth0/address
new file mode 100644
index 00000000..1f2f610e
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/class/net/eth0/address
@@ -0,0 +1 @@
+00:53:00:AB:00:01
diff --git a/src/core/initrd/tests/sysfs/class/net/eth2/address b/src/core/initrd/tests/sysfs/class/net/eth2/address
new file mode 100644
index 00000000..6ec1078a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/class/net/eth2/address
@@ -0,0 +1 @@
+00:53:06:66:ab:01
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id b/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id
new file mode 100644
index 00000000..590d9cd2
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id
@@ -0,0 +1 @@
+NMTst
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id b/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id
new file mode 100644
index 00000000..35d4d09c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id
@@ -0,0 +1 @@
+Whatevs
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/signature b/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/signature
new file mode 100644
index 00000000..e3a5d7ef
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/acpi_header/signature
@@ -0,0 +1 @@
+IBFT
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp
new file mode 100644
index 00000000..98a0d797
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0002
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/flags b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/flags
@@ -0,0 +1 @@
+3
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..7f378f8f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0001
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname
new file mode 100644
index 00000000..3ed5163c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname
@@ -0,0 +1 @@
+host0.example.com
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/index b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..98a0d797
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0002
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/mac b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..f2441319
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:53:00:ab:00:01
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/origin b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..b8626c4c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+4
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..900731ff
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+64
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..e7511d5a
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0053
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..1f6c5c95
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:5353
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..5df93454
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.255.255
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..7cc86ad1
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+666
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp
new file mode 100644
index 00000000..61ef5585
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp
@@ -0,0 +1 @@
+192.0.2.2
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/flags b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/flags
@@ -0,0 +1 @@
+3
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway
new file mode 100644
index 00000000..2096f194
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway
@@ -0,0 +1 @@
+192.0.2.1
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname
new file mode 100644
index 00000000..5dc539d5
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname
@@ -0,0 +1 @@
+host2.example.com
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/index b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/index
new file mode 100644
index 00000000..0cfbf088
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/index
@@ -0,0 +1 @@
+2
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr
new file mode 100644
index 00000000..61ef5585
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr
@@ -0,0 +1 @@
+192.0.2.2
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/mac b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/mac
new file mode 100644
index 00000000..2fc3d525
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/mac
@@ -0,0 +1 @@
+00:53:06:66:AB:01
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/origin b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/origin
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/origin
@@ -0,0 +1 @@
+3
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len
new file mode 100644
index 00000000..a45fd52c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len
@@ -0,0 +1 @@
+24
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns
new file mode 100644
index 00000000..6fa8c742
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns
@@ -0,0 +1 @@
+192.0.2.53
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns
new file mode 100644
index 00000000..a7269ff5
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns
@@ -0,0 +1 @@
+192.0.2.54
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask
new file mode 100644
index 00000000..d30f9e9f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask
@@ -0,0 +1 @@
+255.255.255.0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan
@@ -0,0 +1 @@
+0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/initiator/flags b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/flags
@@ -0,0 +1 @@
+3
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/initiator/index b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/index
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/index
@@ -0,0 +1 @@
+0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..337b5a0f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.1994-05.com.example.initiator:48b055856417
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/initiator/isns-server b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/isns-server
new file mode 100644
index 00000000..4aff9398
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/isns-server
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:3205
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server
new file mode 100644
index 00000000..a26fb649
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:1812
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server
new file mode 100644
index 00000000..908be27f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server
@@ -0,0 +1 @@
+192.0.2.181
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/initiator/slp-server b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/slp-server
new file mode 100644
index 00000000..fca9e24b
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/initiator/slp-server
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0427
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target0/chap-type b/src/core/initrd/tests/sysfs/firmware/ibft/target0/chap-type
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target0/chap-type
@@ -0,0 +1 @@
+0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target0/flags b/src/core/initrd/tests/sysfs/firmware/ibft/target0/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target0/flags
@@ -0,0 +1 @@
+3
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target0/index b/src/core/initrd/tests/sysfs/firmware/ibft/target0/index
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target0/ip-addr b/src/core/initrd/tests/sysfs/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..994b6e9c
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:3260
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target0/lun b/src/core/initrd/tests/sysfs/firmware/ibft/target0/lun
new file mode 100644
index 00000000..7c295bd4
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+01000000
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc b/src/core/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc
@@ -0,0 +1 @@
+0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target0/port b/src/core/initrd/tests/sysfs/firmware/ibft/target0/port
new file mode 100644
index 00000000..53f0295f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/chap-type b/src/core/initrd/tests/sysfs/firmware/ibft/target2/chap-type
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/chap-type
@@ -0,0 +1 @@
+0
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/flags b/src/core/initrd/tests/sysfs/firmware/ibft/target2/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/flags
@@ -0,0 +1 @@
+3
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/index b/src/core/initrd/tests/sysfs/firmware/ibft/target2/index
new file mode 100644
index 00000000..0cfbf088
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/index
@@ -0,0 +1 @@
+2
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/ip-addr b/src/core/initrd/tests/sysfs/firmware/ibft/target2/ip-addr
new file mode 100644
index 00000000..a210477e
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/ip-addr
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0002:3260
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/lun b/src/core/initrd/tests/sysfs/firmware/ibft/target2/lun
new file mode 100644
index 00000000..7c295bd4
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/lun
@@ -0,0 +1 @@
+01000000
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc b/src/core/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc
new file mode 100644
index 00000000..0cfbf088
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc
@@ -0,0 +1 @@
+2
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/port b/src/core/initrd/tests/sysfs/firmware/ibft/target2/port
new file mode 100644
index 00000000..53f0295f
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/port
@@ -0,0 +1 @@
+3260
diff --git a/src/core/initrd/tests/sysfs/firmware/ibft/target2/target-name b/src/core/initrd/tests/sysfs/firmware/ibft/target2/target-name
new file mode 100644
index 00000000..f4094320
--- /dev/null
+++ b/src/core/initrd/tests/sysfs/firmware/ibft/target2/target-name
@@ -0,0 +1 @@
+iqn.1994-05.com.example.target:48b055851337
diff --git a/src/core/initrd/tests/test-cmdline-reader.c b/src/core/initrd/tests/test-cmdline-reader.c
new file mode 100644
index 00000000..cb65cd33
--- /dev/null
+++ b/src/core/initrd/tests/test-cmdline-reader.c
@@ -0,0 +1,2118 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2018 Red Hat, Inc.
+ */
+
+#include "src/core/nm-default-daemon.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
+#include "nm-core-internal.h"
+#include "NetworkManagerUtils.h"
+
+#include "../nm-initrd-generator.h"
+
+#include "nm-test-utils-core.h"
+
+#define TEST_INITRD_DIR NM_BUILD_SRCDIR "/src/core/initrd/tests"
+
+/*****************************************************************************/
+
+#define _parse(ARGV, out_hostname, out_carrier_timeout_sec)                            \
+    ({                                                                                 \
+        const char *const *const _ARGV                    = (ARGV);                    \
+        char **const             _out_hostname            = (out_hostname);            \
+        gint64 *const            _out_carrier_timeout_sec = (out_carrier_timeout_sec); \
+        GHashTable *             _connections;                                         \
+                                                                                       \
+        _connections = nmi_cmdline_reader_parse(TEST_INITRD_DIR "/sysfs",              \
+                                                _ARGV,                                 \
+                                                _out_hostname,                         \
+                                                _out_carrier_timeout_sec);             \
+                                                                                       \
+        g_assert(_connections);                                                        \
+                                                                                       \
+        _connections;                                                                  \
+    })
+
+#define _parse_cons(ARGV)                                                                    \
+    ({                                                                                       \
+        GHashTable *  _con_connections;                                                      \
+        gs_free char *_con_hostname            = NULL;                                       \
+        gint64        _con_carrier_timeout_sec = 0;                                          \
+                                                                                             \
+        _con_connections = _parse((ARGV),                                                    \
+                                  nmtst_get_rand_bool() ? &_con_hostname : NULL,             \
+                                  nmtst_get_rand_bool() ? &_con_carrier_timeout_sec : NULL); \
+        g_assert_cmpstr(_con_hostname, ==, NULL);                                            \
+        g_assert_cmpint(_con_carrier_timeout_sec, ==, 0);                                    \
+                                                                                             \
+        _con_connections;                                                                    \
+    })
+
+#define _parse_con(ARGV, connection_name)                                        \
+    ({                                                                           \
+        gs_unref_hashtable GHashTable *_1_connections = NULL;                    \
+        NMConnection *                 _1_connection;                            \
+        const char *const              _1_connection_name = (connection_name);   \
+                                                                                 \
+        g_assert(_1_connection_name);                                            \
+                                                                                 \
+        _1_connections = _parse_cons((ARGV));                                    \
+                                                                                 \
+        g_assert_cmpint(g_hash_table_size(_1_connections), ==, 1);               \
+                                                                                 \
+        _1_connection = g_hash_table_lookup(_1_connections, _1_connection_name); \
+        g_assert(NM_IS_CONNECTION(_1_connection));                               \
+                                                                                 \
+        nmtst_assert_connection_verifies_without_normalization(_1_connection);   \
+                                                                                 \
+        NM_CONNECTION(g_object_ref(_1_connection));                              \
+    })
+
+/*****************************************************************************/
+
+static void
+test_auto(void)
+{
+    const char *const *ARGV                  = NM_MAKE_STRV("ip=auto");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingConnection *         s_con;
+    NMSettingWired *              s_wired;
+    NMSettingIPConfig *           s_ip4;
+    NMSettingIPConfig *           s_ip6;
+
+    connection = _parse_con(ARGV, "default_connection");
+
+    g_assert(!nm_connection_get_setting_vlan(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "Wired Connection");
+    g_assert_cmpint(nm_setting_connection_get_timestamp(s_con), ==, 0);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_MULTIPLE);
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+
+    g_assert(nm_setting_connection_get_autoconnect(s_con));
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert(!nm_setting_wired_get_mac_address(s_wired));
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 0);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip4));
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip6), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+}
+
+static void
+test_dhcp_with_hostname(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("ip=::::host1::dhcp");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingWired *               s_wired;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    gs_free char *                 hostname            = NULL;
+    gint64                         carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 1);
+    g_assert_cmpstr(hostname, ==, "host1");
+    g_assert_cmpint(carrier_timeout_sec, ==, 0);
+
+    connection = g_hash_table_lookup(connections, "default_connection");
+
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    g_assert(!nm_connection_get_setting_vlan(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "Wired Connection");
+    g_assert_cmpint(nm_setting_connection_get_timestamp(s_con), ==, 0);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_MULTIPLE);
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+
+    g_assert(nm_setting_connection_get_autoconnect(s_con));
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert(!nm_setting_wired_get_mac_address(s_wired));
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 0);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+}
+
+static void
+test_dhcp_with_mtu(void)
+{
+    const char *const *ARGV0  = NM_MAKE_STRV("ip=:dhcp:1499");
+    const char *const *ARGV1  = NM_MAKE_STRV("ip=::::::dhcp:1499");
+    const char *const *ARGV[] = {ARGV0, ARGV1};
+    guint              i;
+
+    for (i = 0; i < G_N_ELEMENTS(ARGV); i++) {
+        gs_unref_object NMConnection *connection = NULL;
+        NMSettingConnection *         s_con;
+        NMSettingWired *              s_wired;
+        NMSettingIPConfig *           s_ip4;
+        NMSettingIPConfig *           s_ip6;
+
+        connection = _parse_con(ARGV[i], "default_connection");
+
+        s_con = nm_connection_get_setting_connection(connection);
+        g_assert(s_con);
+        g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                        ==,
+                        NM_SETTING_WIRED_SETTING_NAME);
+        g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "Wired Connection");
+        g_assert_cmpint(nm_setting_connection_get_timestamp(s_con), ==, 0);
+        g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                        ==,
+                        NM_CONNECTION_MULTI_CONNECT_MULTIPLE);
+        g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+
+        g_assert(nm_setting_connection_get_autoconnect(s_con));
+
+        s_wired = nm_connection_get_setting_wired(connection);
+        g_assert(s_wired);
+        g_assert(!nm_setting_wired_get_mac_address(s_wired));
+        g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 1499);
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    }
+}
+
+static void
+test_if_auto_with_mtu(void)
+{
+    const char *const *ARGV                  = NM_MAKE_STRV("ip=eth0:auto:1666");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingWired *              s_wired;
+    NMSettingIPConfig *           s_ip4;
+    NMSettingIPConfig *           s_ip6;
+
+    connection = _parse_con(ARGV, "eth0");
+
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 1666);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+}
+
+static void
+test_if_dhcp6(void)
+{
+    const char *const *ARGV                  = NM_MAKE_STRV("ip=eth1:dhcp6");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingIPConfig *           s_ip4;
+    NMSettingIPConfig *           s_ip6;
+
+    connection = _parse_con(ARGV, "eth1");
+
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth1");
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+}
+
+static void
+test_if_auto_with_mtu_and_mac(void)
+{
+    const char *const *ARGV                  = NM_MAKE_STRV("ip=eth2:auto6:2048:00:53:ef:12:34:56");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingWired *              s_wired;
+    NMSettingIPConfig *           s_ip4;
+    NMSettingIPConfig *           s_ip6;
+
+    connection = _parse_con(ARGV, "eth2");
+
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth2");
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 2048);
+    g_assert_cmpstr(nm_setting_wired_get_cloned_mac_address(s_wired), ==, "00:53:EF:12:34:56");
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+}
+
+static void
+test_if_ip4_manual(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV = NM_MAKE_STRV("ip=192.0.2.2::192.0.2.1:255.255.255.0:"
+                                           "hostname0.example.com:eth3:none:192.0.2.53",
+                                           "ip=203.0.113.2::203.0.113.1:26:"
+                                           "hostname1.example.com:eth4");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    NMIPAddress *                  ip_addr;
+    gs_free char *                 hostname            = NULL;
+    gint64                         carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+    g_assert_cmpstr(hostname, ==, "hostname1.example.com");
+    g_assert_cmpint(carrier_timeout_sec, ==, 0);
+
+    connection = g_hash_table_lookup(connections, "eth3");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth3");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 0), ==, "192.0.2.53");
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
+    ip_addr = nm_setting_ip_config_get_address(s_ip4, 0);
+    g_assert(ip_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "192.0.2.2");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 24);
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "192.0.2.1");
+    g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "hostname0.example.com");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+    g_assert(nm_setting_ip_config_get_may_fail(s_ip6));
+
+    connection = g_hash_table_lookup(connections, "eth4");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth4");
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
+    ip_addr = nm_setting_ip_config_get_address(s_ip4, 0);
+    g_assert(ip_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "203.0.113.2");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 26);
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "203.0.113.1");
+    g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "hostname1.example.com");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(nm_setting_ip_config_get_may_fail(s_ip6));
+}
+
+static void
+test_if_ip6_manual(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV = NM_MAKE_STRV("ip=[2001:0db8::02]/64::[2001:0db8::01]::"
+                                           "hostname0.example.com:eth4::[2001:0db8::53]");
+    NMConnection *                 connection;
+    NMSettingIPConfig *            s_ip6;
+    NMIPAddress *                  ip_addr;
+    gs_free char *                 hostname            = NULL;
+    gint64                         carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 1);
+    g_assert_cmpstr(hostname, ==, "hostname0.example.com");
+    g_assert_cmpint(carrier_timeout_sec, ==, 0);
+
+    connection = g_hash_table_lookup(connections, "eth4");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth4");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip6, 0), ==, "2001:db8::53");
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip6), ==, 1);
+    ip_addr = nm_setting_ip_config_get_address(s_ip6, 0);
+    g_assert(ip_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "2001:db8::2");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 64);
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip6), ==, "2001:db8::1");
+    g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, "hostname0.example.com");
+}
+
+static void
+test_if_off(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("ip=off",
+                                           "ip=ens3:off",
+                                           "ip=10.0.0.8:::::ens4:off",
+                                           "ip=[2001:DB8::8]:::::ens5:off");
+    NMConnection *                 connection;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    struct {
+        const char name[32];
+        const char ipv4_method[32];
+        const char ipv6_method[32];
+
+    } conn_expected[] = {
+        {"default_connection",
+         NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
+         NM_SETTING_IP6_CONFIG_METHOD_DISABLED},
+        {"ens3", NM_SETTING_IP4_CONFIG_METHOD_DISABLED, NM_SETTING_IP6_CONFIG_METHOD_DISABLED},
+        {"ens4", NM_SETTING_IP4_CONFIG_METHOD_MANUAL, NM_SETTING_IP6_CONFIG_METHOD_DISABLED},
+        {"ens5", NM_SETTING_IP4_CONFIG_METHOD_DISABLED, NM_SETTING_IP6_CONFIG_METHOD_MANUAL},
+    };
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, G_N_ELEMENTS(conn_expected));
+
+    for (int i = 0; i < G_N_ELEMENTS(conn_expected); ++i) {
+        connection = g_hash_table_lookup(connections, conn_expected[i].name);
+        nmtst_assert_connection_verifies_without_normalization(connection);
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, conn_expected[i].ipv4_method);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, conn_expected[i].ipv6_method);
+    }
+}
+
+static void
+test_if_mac_ifname(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV = NM_MAKE_STRV("ip=[2001:0db8::42]/64::[2001:0db8::01]::"
+                                           "hostname0:00-11-22-33-44-55::[2001:0db8::53]");
+    NMConnection *                 connection;
+    NMSettingIPConfig *            s_ip6;
+    NMSettingWired *               s_wired;
+    NMIPAddress *                  ip_addr;
+    gs_free char *                 hostname            = NULL;
+    gint64                         carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 1);
+    g_assert_cmpstr(hostname, ==, "hostname0");
+    g_assert_cmpint(carrier_timeout_sec, ==, 0);
+
+    connection = g_hash_table_lookup(connections, "00:11:22:33:44:55");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "00:11:22:33:44:55");
+    g_assert_cmpstr(nm_connection_get_interface_name(connection), ==, NULL);
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert_cmpstr(nm_setting_wired_get_mac_address(s_wired), ==, "00:11:22:33:44:55");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip6, 0), ==, "2001:db8::53");
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip6), ==, 1);
+    ip_addr = nm_setting_ip_config_get_address(s_ip6, 0);
+    g_assert(ip_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "2001:db8::42");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 64);
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip6), ==, "2001:db8::1");
+    g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, "hostname0");
+}
+
+static void
+test_multiple_merge(void)
+{
+    const char *const *ARGV =
+        NM_MAKE_STRV("ip=192.0.2.2/16:::::eth0", "ip=[2001:db8::2]:::56::eth0");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingConnection *         s_con;
+    NMSettingWired *              s_wired;
+    NMSettingIPConfig *           s_ip4;
+    NMSettingIPConfig *           s_ip6;
+    NMIPAddress *                 ip_addr;
+
+    connection = _parse_con(ARGV, "eth0");
+
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
+    ip_addr = nm_setting_ip_config_get_address(s_ip4, 0);
+    g_assert(ip_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "192.0.2.2");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 16);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip6), ==, 1);
+    ip_addr = nm_setting_ip_config_get_address(s_ip6, 0);
+    g_assert(ip_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "2001:db8::2");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 56);
+}
+
+static void
+test_multiple_bootdev(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+
+    const char *const *ARGV = NM_MAKE_STRV("nameserver=1.2.3.4",
+                                           "ip=eth3:auto6",
+                                           "ip=eth4:dhcp",
+                                           "ip=eth5:link6",
+                                           "bootdev=eth4");
+
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingIPConfig *  s_ip4;
+    NMSettingIPConfig *  s_ip6;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 3);
+
+    connection = g_hash_table_lookup(connections, "eth3");
+    g_assert(connection);
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+
+    connection = g_hash_table_lookup(connections, "eth4");
+    g_assert(connection);
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con),
+                    ==,
+                    NMI_WAIT_DEVICE_TIMEOUT_MS);
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 0), ==, "1.2.3.4");
+
+    connection = g_hash_table_lookup(connections, "eth5");
+    g_assert(connection);
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL);
+}
+
+static void
+test_bootdev(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("vlan=vlan2:ens5", "bootdev=ens3");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 3);
+
+    connection = g_hash_table_lookup(connections, "ens3");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "ens3");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "ens3");
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con),
+                    ==,
+                    NMI_WAIT_DEVICE_TIMEOUT_MS);
+
+    connection = g_hash_table_lookup(connections, "vlan2");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_VLAN_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "vlan2");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "vlan2");
+
+    connection = g_hash_table_lookup(connections, "ens5");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "ens5");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "ens5");
+}
+
+static void
+test_some_more(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("bootdev=eth1",
+                                           "hail",
+                                           "nameserver=[2001:DB8:3::53]",
+                                           "satan",
+                                           "nameserver=192.0.2.53",
+                                           "worship",
+                                           "doom",
+                                           "rd.peerdns=0",
+                                           "rd.route=[2001:DB8:3::/48]:[2001:DB8:2::1]:ens10");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingWired *               s_wired;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    NMIPRoute *                    ip_route;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+    connection = g_hash_table_lookup(connections, "eth1");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth1");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eth1");
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 0), ==, "192.0.2.53");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 1);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip6, 0), ==, "2001:db8:3::53");
+
+    connection = g_hash_table_lookup(connections, "ens10");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "ens10");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "ens10");
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert(!nm_setting_wired_get_mac_address(s_wired));
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip6, 0), ==, "2001:db8:3::53");
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 1);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    ip_route = nm_setting_ip_config_get_route(s_ip6, 0);
+    g_assert_cmpstr(nm_ip_route_get_dest(ip_route), ==, "2001:db8:3::");
+    g_assert_cmpint(nm_ip_route_get_family(ip_route), ==, AF_INET6);
+    g_assert_cmpint(nm_ip_route_get_metric(ip_route), ==, -1);
+    g_assert_cmpstr(nm_ip_route_get_next_hop(ip_route), ==, "2001:db8:2::1");
+    g_assert_cmpint(nm_ip_route_get_prefix(ip_route), ==, 48);
+}
+
+static void
+test_bond(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("rd.route=192.0.2.53::bong0",
+                                           "bond=bong0:eth0,eth1:mode=balance-rr",
+                                           "nameserver=203.0.113.53");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    NMSettingBond *                s_bond;
+    NMIPRoute *                    ip_route;
+    const char *                   master_uuid;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 3);
+
+    connection = g_hash_table_lookup(connections, "bong0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "bong0");
+    master_uuid = nm_connection_get_uuid(connection);
+    g_assert(master_uuid);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 0), ==, "203.0.113.53");
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 1);
+    ip_route = nm_setting_ip_config_get_route(s_ip4, 0);
+    g_assert_cmpstr(nm_ip_route_get_dest(ip_route), ==, "192.0.2.53");
+    g_assert_cmpint(nm_ip_route_get_family(ip_route), ==, AF_INET);
+    g_assert_cmpint(nm_ip_route_get_metric(ip_route), ==, -1);
+    g_assert(!nm_ip_route_get_next_hop(ip_route));
+    g_assert_cmpint(nm_ip_route_get_prefix(ip_route), ==, 32);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+
+    s_bond = nm_connection_get_setting_bond(connection);
+    g_assert(s_bond);
+    g_assert_cmpint(nm_setting_bond_get_num_options(s_bond), ==, 1);
+    g_assert_cmpstr(nm_setting_bond_get_option_by_name(s_bond, "mode"), ==, "balance-rr");
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth0");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+
+    connection = g_hash_table_lookup(connections, "eth1");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth1");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth1");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+}
+
+static void
+test_bond_ip(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV =
+        NM_MAKE_STRV("bond=bond0:eth0,eth1",
+                     "ip=192.168.1.1::192.168.1.254:24::bond0:none:1480:01:02:03:04:05:06",
+                     "nameserver=4.8.15.16");
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingIPConfig *  s_ip4;
+    NMSettingIPConfig *  s_ip6;
+    NMSettingWired *     s_wired;
+    NMSettingBond *      s_bond;
+    NMIPAddress *        ip_addr;
+    const char *         master_uuid;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 3);
+
+    connection = g_hash_table_lookup(connections, "bond0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "bond0");
+    master_uuid = nm_connection_get_uuid(connection);
+    g_assert(master_uuid);
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 1480);
+    g_assert_cmpstr(nm_setting_wired_get_cloned_mac_address(s_wired), ==, "01:02:03:04:05:06");
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
+    ip_addr = nm_setting_ip_config_get_address(s_ip4, 0);
+    g_assert(ip_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "192.168.1.1");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 24);
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "192.168.1.254");
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 0), ==, "4.8.15.16");
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+
+    s_bond = nm_connection_get_setting_bond(connection);
+    g_assert(s_bond);
+    g_assert_cmpint(nm_setting_bond_get_num_options(s_bond), ==, 1);
+    g_assert_cmpstr(nm_setting_bond_get_option_by_name(s_bond, "mode"), ==, "balance-rr");
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth0");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+
+    connection = g_hash_table_lookup(connections, "eth1");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth1");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth1");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+}
+
+static void
+test_bond_default(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("bond");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    NMSettingBond *                s_bond;
+    const char *                   master_uuid;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+    connection = g_hash_table_lookup(connections, "bond0");
+
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "bond0");
+    master_uuid = nm_connection_get_uuid(connection);
+    g_assert(master_uuid);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+
+    s_bond = nm_connection_get_setting_bond(connection);
+    g_assert(s_bond);
+    g_assert_cmpint(nm_setting_bond_get_num_options(s_bond), ==, 1);
+    g_assert_cmpstr(nm_setting_bond_get_option_by_name(s_bond, "mode"), ==, "balance-rr");
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth0");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+}
+
+static void
+test_bridge(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("bridge=bridge0:eth0,eth1",
+                                           "rd.route=192.0.2.53::bridge0",
+                                           "rd.net.timeout.dhcp=10");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    NMSettingBridge *              s_bridge;
+    NMIPRoute *                    ip_route;
+    const char *                   master_uuid;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 3);
+
+    connection = g_hash_table_lookup(connections, "bridge0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_BRIDGE_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "bridge0");
+    master_uuid = nm_connection_get_uuid(connection);
+    g_assert(master_uuid);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 1);
+    g_assert_cmpint(nm_setting_ip_config_get_dhcp_timeout(s_ip4), ==, 10);
+    ip_route = nm_setting_ip_config_get_route(s_ip4, 0);
+    g_assert_cmpstr(nm_ip_route_get_dest(ip_route), ==, "192.0.2.53");
+    g_assert_cmpint(nm_ip_route_get_family(ip_route), ==, AF_INET);
+    g_assert_cmpint(nm_ip_route_get_metric(ip_route), ==, -1);
+    g_assert(!nm_ip_route_get_next_hop(ip_route));
+    g_assert_cmpint(nm_ip_route_get_prefix(ip_route), ==, 32);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+    g_assert_cmpint(nm_setting_ip_config_get_dhcp_timeout(s_ip6), ==, 10);
+
+    s_bridge = nm_connection_get_setting_bridge(connection);
+    g_assert(s_bridge);
+    g_assert_cmpint(nm_setting_bridge_get_stp(s_bridge), ==, FALSE);
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth0");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con),
+                    ==,
+                    NM_SETTING_BRIDGE_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+
+    connection = g_hash_table_lookup(connections, "eth1");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth1");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth1");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con),
+                    ==,
+                    NM_SETTING_BRIDGE_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+}
+
+static void
+test_bridge_default(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("bridge");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    NMSettingBridge *              s_bridge;
+    const char *                   master_uuid;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+    connection = g_hash_table_lookup(connections, "br0");
+
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_BRIDGE_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "br0");
+    master_uuid = nm_connection_get_uuid(connection);
+    g_assert(master_uuid);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+
+    s_bridge = nm_connection_get_setting_bridge(connection);
+    g_assert(s_bridge);
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth0");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con),
+                    ==,
+                    NM_SETTING_BRIDGE_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+}
+
+static void
+test_bridge_ip(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV =
+        NM_MAKE_STRV("ip=bridge123:auto:1280:00:11:22:33:CA:fe",
+                     "bridge=bridge123:eth0,eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8,eth9");
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingIPConfig *  s_ip4;
+    NMSettingIPConfig *  s_ip6;
+    NMSettingWired *     s_wired;
+    NMSettingBridge *    s_bridge;
+    const char *         master_uuid;
+    guint                i;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 11);
+
+    connection = g_hash_table_lookup(connections, "bridge123");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_BRIDGE_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "bridge123");
+    master_uuid = nm_connection_get_uuid(connection);
+    g_assert(master_uuid);
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 1280);
+    g_assert_cmpstr(nm_setting_wired_get_cloned_mac_address(s_wired), ==, "00:11:22:33:CA:FE");
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+
+    s_bridge = nm_connection_get_setting_bridge(connection);
+    g_assert(s_bridge);
+
+    for (i = 0; i < 10; i++) {
+        char ifname[16];
+
+        nm_sprintf_buf(ifname, "eth%u", i);
+
+        connection = g_hash_table_lookup(connections, ifname);
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, ifname);
+
+        s_con = nm_connection_get_setting_connection(connection);
+        g_assert(s_con);
+        g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                        ==,
+                        NM_SETTING_WIRED_SETTING_NAME);
+        g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, ifname);
+        g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con),
+                        ==,
+                        NM_SETTING_BRIDGE_SETTING_NAME);
+        g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+        g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                        ==,
+                        NM_CONNECTION_MULTI_CONNECT_SINGLE);
+    }
+}
+
+static void
+test_team(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV = NM_MAKE_STRV("team=team0:eth0,eth1", "ip=team0:dhcp6");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+    NMSettingIPConfig *            s_ip4;
+    NMSettingIPConfig *            s_ip6;
+    NMSettingTeam *                s_team;
+    const char *                   master_uuid;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 3);
+
+    connection = g_hash_table_lookup(connections, "team0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_TEAM_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "team0");
+    master_uuid = nm_connection_get_uuid(connection);
+    g_assert(master_uuid);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip4));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0);
+    g_assert(!nm_setting_ip_config_get_gateway(s_ip6));
+    g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0);
+
+    s_team = nm_connection_get_setting_team(connection);
+    g_assert(s_team);
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth0");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con), ==, NM_SETTING_TEAM_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+
+    connection = g_hash_table_lookup(connections, "eth1");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth1");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth1");
+    g_assert_cmpstr(nm_setting_connection_get_slave_type(s_con), ==, NM_SETTING_TEAM_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_master(s_con), ==, master_uuid);
+    g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con),
+                    ==,
+                    NM_CONNECTION_MULTI_CONNECT_SINGLE);
+}
+
+static void
+test_vlan(void)
+{
+    const char *const *ARGV0  = NM_MAKE_STRV("ip=eth0.100:dhcp", "vlan=eth0.100:eth0");
+    const char *const *ARGV1  = NM_MAKE_STRV("vlan=eth0.100:eth0", "ip=eth0.100:dhcp");
+    const char *const *ARGV[] = {ARGV0, ARGV1};
+    guint              i;
+
+    for (i = 0; i < G_N_ELEMENTS(ARGV); i++) {
+        gs_unref_hashtable GHashTable *connections = NULL;
+        NMConnection *                 connection;
+        NMSettingIPConfig *            s_ip4;
+        NMSettingIPConfig *            s_ip6;
+        NMSettingVlan *                s_vlan;
+
+        connections = _parse_cons(ARGV[i]);
+        g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+        /* VLAN eth0.100 */
+        connection = g_hash_table_lookup(connections, "eth0.100");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                        ==,
+                        NM_SETTING_VLAN_SETTING_NAME);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0.100");
+
+        s_vlan = nm_connection_get_setting_vlan(connection);
+        g_assert(s_vlan);
+        g_assert_cmpstr(nm_setting_vlan_get_parent(s_vlan), ==, "eth0");
+        g_assert_cmpint(nm_setting_vlan_get_id(s_vlan), ==, 100);
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+
+        /* Ethernet eth0 */
+        connection = g_hash_table_lookup(connections, "eth0");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                        ==,
+                        NM_SETTING_WIRED_SETTING_NAME);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+    }
+}
+
+static void
+test_vlan_with_dhcp_on_parent(void)
+{
+    const char *const *ARGV0  = NM_MAKE_STRV("vlan=eth0.100:eth0", "ip=eth0:dhcp");
+    const char *const *ARGV1  = NM_MAKE_STRV("ip=eth0:dhcp", "vlan=eth0.100:eth0");
+    const char *const *ARGV[] = {ARGV0, ARGV1};
+    guint              i;
+
+    for (i = 0; i < G_N_ELEMENTS(ARGV); i++) {
+        gs_unref_hashtable GHashTable *connections = NULL;
+        NMConnection *                 connection;
+        NMSettingIPConfig *            s_ip4;
+        NMSettingIPConfig *            s_ip6;
+        NMSettingVlan *                s_vlan;
+
+        connections = _parse_cons(ARGV[i]);
+        g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+        /* VLAN eth0.100 */
+        connection = g_hash_table_lookup(connections, "eth0.100");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                        ==,
+                        NM_SETTING_VLAN_SETTING_NAME);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0.100");
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+
+        s_vlan = nm_connection_get_setting_vlan(connection);
+        g_assert(s_vlan);
+        g_assert_cmpstr(nm_setting_vlan_get_parent(s_vlan), ==, "eth0");
+        g_assert_cmpint(nm_setting_vlan_get_id(s_vlan), ==, 100);
+
+        /* Ethernet eth0 */
+        connection = g_hash_table_lookup(connections, "eth0");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                        ==,
+                        NM_SETTING_WIRED_SETTING_NAME);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    }
+}
+
+static void
+test_vlan_over_bond(void)
+{
+    const char *const *ARGV0  = NM_MAKE_STRV("ip=1.2.3.4:::24::vlan1:none",
+                                            "bond=bond2:ens3,ens4:mode=active-backup",
+                                            "vlan=vlan1:bond2");
+    const char *const *ARGV1  = NM_MAKE_STRV("vlan=vlan1:bond2",
+                                            "ip=1.2.3.4:::24::vlan1:none",
+                                            "bond=bond2:ens3,ens4:mode=active-backup");
+    const char *const *ARGV2  = NM_MAKE_STRV("bond=bond2:ens3,ens4:mode=active-backup",
+                                            "ip=1.2.3.4:::24::vlan1:none",
+                                            "vlan=vlan1:bond2");
+    const char *const *ARGV[] = {ARGV0, ARGV1, ARGV2};
+    guint              i;
+
+    for (i = 0; i < G_N_ELEMENTS(ARGV); i++) {
+        gs_unref_hashtable GHashTable *connections = NULL;
+        NMConnection *                 connection;
+        NMSettingIPConfig *            s_ip4;
+        NMSettingIPConfig *            s_ip6;
+        NMSettingVlan *                s_vlan;
+
+        connections = _parse_cons(ARGV[i]);
+        g_assert_cmpint(g_hash_table_size(connections), ==, 4);
+
+        /* VLAN vlan1 */
+        connection = g_hash_table_lookup(connections, "vlan1");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                        ==,
+                        NM_SETTING_VLAN_SETTING_NAME);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "vlan1");
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+
+        s_vlan = nm_connection_get_setting_vlan(connection);
+        g_assert(s_vlan);
+        g_assert_cmpstr(nm_setting_vlan_get_parent(s_vlan), ==, "bond2");
+        g_assert_cmpint(nm_setting_vlan_get_id(s_vlan), ==, 1);
+
+        /* Bond bond2 */
+        connection = g_hash_table_lookup(connections, "bond2");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                        ==,
+                        NM_SETTING_BOND_SETTING_NAME);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "bond2");
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+
+        /* Ethernet ens3 and ens4 */
+        connection = g_hash_table_lookup(connections, "ens3");
+        g_assert(connection);
+        connection = g_hash_table_lookup(connections, "ens4");
+        g_assert(connection);
+    }
+}
+
+static void
+test_ibft_ip_dev(void)
+{
+    const char *const *  ARGV = NM_MAKE_STRV("ip=eth0:ibft");
+    NMSettingConnection *s_con;
+    gs_unref_object NMConnection *connection = NULL;
+
+    connection = _parse_con(ARGV, "eth0");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_VLAN_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, NULL);
+}
+
+static void
+test_ibft_ip_dev_mac(void)
+{
+    const char *const *  ARGV = NM_MAKE_STRV("ip=00-53-06-66-ab-01:ibft");
+    NMSettingConnection *s_con;
+    gs_unref_object NMConnection *connection = NULL;
+
+    connection = _parse_con(ARGV, "00:53:06:66:AB:01");
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, NULL);
+}
+
+static void
+_test_ibft_ip(const char *const *ARGV)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    NMConnection *                 connection;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+    connection = g_hash_table_lookup(connections, "ibft0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "iBFT VLAN Connection 0");
+    g_assert_cmpstr(nm_connection_get_interface_name(connection), ==, NULL);
+
+    connection = g_hash_table_lookup(connections, "ibft2");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "iBFT Connection 2");
+    g_assert_cmpstr(nm_connection_get_interface_name(connection), ==, NULL);
+}
+
+static void
+test_ibft_ip(void)
+{
+    const char *const *ARGV = NM_MAKE_STRV("ip=ibft");
+
+    _test_ibft_ip(ARGV);
+}
+
+static void
+test_ibft_rd_iscsi_ibft(void)
+{
+    const char *const *ARGV = NM_MAKE_STRV("rd.iscsi.ibft");
+
+    _test_ibft_ip(ARGV);
+}
+
+static void
+test_ignore_extra(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("blabla", "extra", "lalala");
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 0);
+}
+
+static void
+test_rd_znet(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *const       ARGV =
+        NM_MAKE_STRV("ip=10.11.12.13::10.11.12.1:24:foo.example.com:enc800:none",
+                     "ip=slc600:dhcp",
+                     "rd.znet=qeth,0.0.0800,0.0.0801,0.0.0802,layer2=0,portno=1",
+                     "rd.znet=ctc,0.0.0600,0.0.0601,layer2=0,portno=0");
+    NMConnection *          connection;
+    NMSettingConnection *   s_con;
+    NMSettingWired *        s_wired;
+    const char *const *     v_subchannels;
+    const NMUtilsNamedValue s390_options[] = {
+        {.name = "layer2", .value_str = "0"},
+        {.name = "portno", .value_str = "1"},
+    };
+    int           i_s390_options_keys;
+    gs_free char *hostname            = NULL;
+    gint64        carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+    g_assert_cmpstr(hostname, ==, "foo.example.com");
+    g_assert_cmpint(carrier_timeout_sec, ==, 0);
+
+    connection = g_hash_table_lookup(connections, "enc800");
+    g_assert(NM_IS_CONNECTION(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(NM_IS_SETTING_CONNECTION(s_con));
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "enc800");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "enc800");
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(NM_IS_SETTING_WIRED(s_wired));
+
+    v_subchannels = nm_setting_wired_get_s390_subchannels(s_wired);
+    g_assert(v_subchannels);
+    g_assert_cmpstr(v_subchannels[0], ==, "0.0.0800");
+    g_assert_cmpstr(v_subchannels[1], ==, "0.0.0801");
+    g_assert_cmpstr(v_subchannels[2], ==, "0.0.0802");
+    g_assert_cmpstr(v_subchannels[3], ==, NULL);
+
+    g_assert_cmpint(nm_setting_wired_get_num_s390_options(s_wired), ==, G_N_ELEMENTS(s390_options));
+    for (i_s390_options_keys = 0; i_s390_options_keys < G_N_ELEMENTS(s390_options);
+         i_s390_options_keys++) {
+        const NMUtilsNamedValue *s390_option = &s390_options[i_s390_options_keys];
+        const char *             k;
+        const char *             v;
+        const char *             v2;
+
+        g_assert(s390_option->name);
+        g_assert(s390_option->value_str);
+        v = nm_setting_wired_get_s390_option_by_key(s_wired, s390_option->name);
+        g_assert(v);
+        g_assert_cmpstr(v, ==, s390_option->value_str);
+
+        if (!nm_setting_wired_get_s390_option(s_wired, i_s390_options_keys, &k, &v2))
+            g_assert_not_reached();
+        g_assert_cmpstr(k, ==, s390_option->name);
+        g_assert(v == v2);
+        g_assert_cmpstr(v2, ==, s390_option->value_str);
+    }
+
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    connection = g_hash_table_lookup(connections, "slc600");
+    g_assert(NM_IS_CONNECTION(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(NM_IS_SETTING_CONNECTION(s_con));
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "slc600");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "slc600");
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(NM_IS_SETTING_WIRED(s_wired));
+
+    v_subchannels = nm_setting_wired_get_s390_subchannels(s_wired);
+    g_assert(v_subchannels);
+    g_assert_cmpstr(v_subchannels[0], ==, "0.0.0600");
+    g_assert_cmpstr(v_subchannels[1], ==, "0.0.0601");
+    g_assert_cmpstr(v_subchannels[2], ==, NULL);
+
+    nmtst_assert_connection_verifies_without_normalization(connection);
+}
+
+static void
+test_rd_znet_legacy(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *const       ARGV =
+        NM_MAKE_STRV("ip=10.11.12.13::10.11.12.1:24:foo.example.com:eth0:none",
+                     "rd.znet=qeth,0.0.0800,0.0.0801,0.0.0802,layer2=0,portno=1",
+                     "rd.znet=ctc,0.0.0600,0.0.0601,layer2=0,portno=0",
+                     "ip=ctc0:dhcp",
+                     "net.ifnames=0");
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    gs_free char *       hostname            = NULL;
+    gint64               carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+    g_assert_cmpstr(hostname, ==, "foo.example.com");
+    g_assert_cmpint(carrier_timeout_sec, ==, 0);
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    g_assert(NM_IS_CONNECTION(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(NM_IS_SETTING_CONNECTION(s_con));
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "eth0");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eth0");
+
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    connection = g_hash_table_lookup(connections, "ctc0");
+    g_assert(NM_IS_CONNECTION(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(NM_IS_SETTING_CONNECTION(s_con));
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "ctc0");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "ctc0");
+
+    nmtst_assert_connection_verifies_without_normalization(connection);
+}
+
+static void
+test_rd_znet_no_ip(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *const       ARGV =
+        NM_MAKE_STRV("rd.znet=qeth,0.0.0800,0.0.0801,0.0.0802,layer2=0,portno=1");
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 0);
+}
+
+static void
+test_bootif_ip(void)
+{
+    const char *const *ARGV                  = NM_MAKE_STRV("BOOTIF=00:53:AB:cd:02:03", "ip=dhcp");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingWired *              s_wired;
+    NMSettingIPConfig *           s_ip4;
+    NMSettingIPConfig *           s_ip6;
+
+    connection = _parse_con(ARGV, "default_connection");
+
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "Wired Connection");
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert_cmpstr(nm_setting_wired_get_mac_address(s_wired), ==, "00:53:AB:CD:02:03");
+    g_assert(s_wired);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+    g_assert(!nm_setting_ip_config_get_may_fail(s_ip4));
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+}
+
+static void
+test_neednet(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV        = NM_MAKE_STRV("rd.neednet",
+                                           "ip=eno1:dhcp",
+                                           "ip=172.25.1.100::172.25.1.1:24::eno2",
+                                           "bridge=br0:eno3");
+    NMConnection *                 connection;
+    NMSettingConnection *          s_con;
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 4);
+
+    connection = g_hash_table_lookup(connections, "eno1");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eno1");
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con),
+                    ==,
+                    NMI_WAIT_DEVICE_TIMEOUT_MS);
+
+    connection = g_hash_table_lookup(connections, "eno2");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eno2");
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con),
+                    ==,
+                    NMI_WAIT_DEVICE_TIMEOUT_MS);
+
+    connection = g_hash_table_lookup(connections, "eno3");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eno3");
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con),
+                    ==,
+                    NMI_WAIT_DEVICE_TIMEOUT_MS);
+
+    connection = g_hash_table_lookup(connections, "br0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "br0");
+    g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1);
+}
+
+static void
+test_bootif_no_ip(void)
+{
+    const char *const *ARGV                  = NM_MAKE_STRV("BOOTIF=00:53:AB:cd:02:03");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingWired *              s_wired;
+    NMSettingIPConfig *           s_ip4;
+    NMSettingIPConfig *           s_ip6;
+
+    connection = _parse_con(ARGV, "default_connection");
+
+    g_assert_cmpstr(nm_connection_get_id(connection), ==, "Wired Connection");
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert_cmpstr(nm_setting_wired_get_mac_address(s_wired), ==, "00:53:AB:CD:02:03");
+    g_assert(s_wired);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert(nm_setting_ip_config_get_may_fail(s_ip4));
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_assert(nm_setting_ip_config_get_may_fail(s_ip6));
+}
+
+static void
+test_bootif_hwtype(void)
+{
+    const char *const *ARGV0  = NM_MAKE_STRV("ip=eth0:dhcp", "BOOTIF=01-00-53-AB-cd-02-03");
+    const char *const *ARGV1  = NM_MAKE_STRV("ip=eth0:dhcp", "BOOTIF=00-00-53-Ab-cD-02-03");
+    const char *const *ARGV[] = {ARGV0, ARGV1};
+    guint              i;
+
+    for (i = 0; i < G_N_ELEMENTS(ARGV); i++) {
+        gs_unref_hashtable GHashTable *connections = NULL;
+        NMConnection *                 connection;
+        NMSettingWired *               s_wired;
+        NMSettingIPConfig *            s_ip4;
+        NMSettingIPConfig *            s_ip6;
+
+        connections = _parse_cons(ARGV[i]);
+        g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+        connection = g_hash_table_lookup(connections, "eth0");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0");
+
+        s_wired = nm_connection_get_setting_wired(connection);
+        g_assert(!nm_setting_wired_get_mac_address(s_wired));
+        g_assert(s_wired);
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+        g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+        g_assert(!nm_setting_ip_config_get_may_fail(s_ip4));
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+        g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+
+        connection = g_hash_table_lookup(connections, "bootif_connection");
+        nmtst_assert_connection_verifies_without_normalization(connection);
+        g_assert_cmpstr(nm_connection_get_id(connection), ==, "BOOTIF Connection");
+
+        s_wired = nm_connection_get_setting_wired(connection);
+        g_assert_cmpstr(nm_setting_wired_get_mac_address(s_wired), ==, "00:53:AB:CD:02:03");
+        g_assert(s_wired);
+
+        s_ip4 = nm_connection_get_setting_ip4_config(connection);
+        g_assert(s_ip4);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                        ==,
+                        NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+        g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4));
+        g_assert(nm_setting_ip_config_get_may_fail(s_ip4));
+
+        s_ip6 = nm_connection_get_setting_ip6_config(connection);
+        g_assert(s_ip6);
+        g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                        ==,
+                        NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+        g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6));
+        g_assert(nm_setting_ip_config_get_may_fail(s_ip6));
+    }
+}
+
+/* Check that nameservers are assigned to all existing
+ * connections that support the specific IPv4/IPv6 address
+ * family.
+ */
+static void
+test_nameserver(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *            ARGV =
+        NM_MAKE_STRV("nameserver=1.1.1.1",
+                     "ip=eth0:dhcp",
+                     "ip=eth1:auto6",
+                     "ip=10.11.12.13::10.11.12.1:24:foo.example.com:eth2:none",
+                     "nameserver=1.0.0.1",
+                     "nameserver=[2606:4700:4700::1111]");
+    NMConnection *     connection;
+    NMSettingIPConfig *s_ip;
+    gs_free char *     hostname            = NULL;
+    gint64             carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 3);
+    g_assert_cmpstr(hostname, ==, "foo.example.com");
+    g_assert_cmpint(carrier_timeout_sec, ==, 0);
+
+    connection = g_hash_table_lookup(connections, "eth0");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_ip = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip);
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip), ==, 2);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip, 0), ==, "1.1.1.1");
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip, 1), ==, "1.0.0.1");
+
+    connection = g_hash_table_lookup(connections, "eth1");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_ip = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip);
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip), ==, 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip, 0), ==, "2606:4700:4700::1111");
+
+    connection = g_hash_table_lookup(connections, "eth2");
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_ip = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip);
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip), ==, 2);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip, 0), ==, "1.1.1.1");
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip, 1), ==, "1.0.0.1");
+}
+
+static void
+test_bootif_off(void)
+{
+    gs_unref_hashtable GHashTable *connections = NULL;
+    const char *const *ARGV = NM_MAKE_STRV("BOOTIF=01-00-53-AB-cd-02-03", "rd.bootif=0");
+
+    connections = _parse_cons(ARGV);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 0);
+}
+
+static void
+test_dhcp_vendor_class_id(void)
+{
+    const char *const *ARGV;
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingIP4Config *          s_ip4;
+    gs_free char *                vci_long          = NULL;
+    char                          vci_arg_long[512] = {0};
+
+    ARGV       = NM_MAKE_STRV("rd.net.dhcp.vendor-class=testvci", "ip=eno1:dhcp");
+    connection = _parse_con(ARGV, "eno1");
+    s_ip4      = NM_SETTING_IP4_CONFIG(nm_connection_get_setting_ip4_config(connection));
+    g_assert_cmpstr(nm_setting_ip4_config_get_dhcp_vendor_class_identifier(s_ip4), ==, "testvci");
+
+    g_clear_object(&connection);
+
+    ARGV       = NM_MAKE_STRV("rd.net.dhcp.vendor-class", "ip=eno1:dhcp");
+    connection = _parse_con(ARGV, "eno1");
+    s_ip4      = NM_SETTING_IP4_CONFIG(nm_connection_get_setting_ip4_config(connection));
+    g_assert(nm_setting_ip4_config_get_dhcp_vendor_class_identifier(s_ip4) == NULL);
+
+    g_clear_object(&connection);
+
+    memset(vci_arg_long, 'A', 400);
+    vci_long   = g_strdup_printf("rd.net.dhcp.vendor-class=%s", vci_arg_long);
+    ARGV       = NM_MAKE_STRV(vci_long, "ip=eno1:dhcp");
+    connection = _parse_con(ARGV, "eno1");
+    s_ip4      = NM_SETTING_IP4_CONFIG(nm_connection_get_setting_ip4_config(connection));
+    g_assert(nm_setting_ip4_config_get_dhcp_vendor_class_identifier(s_ip4) == NULL);
+}
+
+static void
+test_infiniband_iface(void)
+{
+    const char *const *ARGV                  = NM_MAKE_STRV("ip=ib1:dhcp");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingInfiniband *         s_ib;
+
+    connection = _parse_con(ARGV, "ib1");
+
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_INFINIBAND_SETTING_NAME);
+    s_ib = nm_connection_get_setting_infiniband(connection);
+    g_assert(s_ib);
+}
+
+static void
+test_infiniband_mac(void)
+{
+    const char *const *ARGV =
+        NM_MAKE_STRV("ip=00-11-22-33-44-55-66-77-88-99-aa-bb-cc-dd-ee-ff-00-11-22-33:dhcp");
+    gs_unref_object NMConnection *connection = NULL;
+    NMSettingInfiniband *         s_ib;
+
+    connection = _parse_con(ARGV, "00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33");
+
+    g_assert_cmpstr(nm_connection_get_connection_type(connection),
+                    ==,
+                    NM_SETTING_INFINIBAND_SETTING_NAME);
+    g_assert_cmpstr(nm_connection_get_interface_name(connection), ==, NULL);
+    s_ib = nm_connection_get_setting_infiniband(connection);
+    g_assert(s_ib);
+    g_assert_cmpstr(nm_setting_infiniband_get_mac_address(s_ib),
+                    ==,
+                    "00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33");
+}
+
+static void
+test_carrier_timeout(void)
+{
+    gs_unref_hashtable GHashTable *connections         = NULL;
+    const char *const *            ARGV                = NM_MAKE_STRV("rd.net.timeout.carrier=20");
+    gs_free char *                 hostname            = NULL;
+    gint64                         carrier_timeout_sec = 0;
+
+    connections = _parse(ARGV, &hostname, &carrier_timeout_sec);
+    g_assert_cmpint(g_hash_table_size(connections), ==, 0);
+    g_assert_cmpstr(hostname, ==, NULL);
+    g_assert_cmpint(carrier_timeout_sec, ==, 20);
+}
+
+NMTST_DEFINE();
+
+int
+main(int argc, char **argv)
+{
+    nmtst_init_assert_logging(&argc, &argv, "INFO", "DEFAULT");
+
+    g_test_add_func("/initrd/cmdline/auto", test_auto);
+    g_test_add_func("/initrd/cmdline/dhcp_with_hostname", test_dhcp_with_hostname);
+    g_test_add_func("/initrd/cmdline/dhcp_with_mtu", test_dhcp_with_mtu);
+    g_test_add_func("/initrd/cmdline/if_auto_with_mtu", test_if_auto_with_mtu);
+    g_test_add_func("/initrd/cmdline/if_dhcp6", test_if_dhcp6);
+    g_test_add_func("/initrd/cmdline/if_auto_with_mtu_and_mac", test_if_auto_with_mtu_and_mac);
+    g_test_add_func("/initrd/cmdline/if_ip4_manual", test_if_ip4_manual);
+    g_test_add_func("/initrd/cmdline/if_ip6_manual", test_if_ip6_manual);
+    g_test_add_func("/initrd/cmdline/if_mac_ifname", test_if_mac_ifname);
+    g_test_add_func("/initrd/cmdline/if_off", test_if_off);
+    g_test_add_func("/initrd/cmdline/multiple/merge", test_multiple_merge);
+    g_test_add_func("/initrd/cmdline/multiple/bootdev", test_multiple_bootdev);
+    g_test_add_func("/initrd/cmdline/nameserver", test_nameserver);
+    g_test_add_func("/initrd/cmdline/some_more", test_some_more);
+    g_test_add_func("/initrd/cmdline/bootdev", test_bootdev);
+    g_test_add_func("/initrd/cmdline/bond", test_bond);
+    g_test_add_func("/initrd/cmdline/bond/ip", test_bond_ip);
+    g_test_add_func("/initrd/cmdline/bond/default", test_bond_default);
+    g_test_add_func("/initrd/cmdline/team", test_team);
+    g_test_add_func("/initrd/cmdline/vlan", test_vlan);
+    g_test_add_func("/initrd/cmdline/vlan/dhcp-on-parent", test_vlan_with_dhcp_on_parent);
+    g_test_add_func("/initrd/cmdline/vlan/over-bond", test_vlan_over_bond);
+    g_test_add_func("/initrd/cmdline/bridge", test_bridge);
+    g_test_add_func("/initrd/cmdline/bridge/default", test_bridge_default);
+    g_test_add_func("/initrd/cmdline/bridge/ip", test_bridge_ip);
+    g_test_add_func("/initrd/cmdline/ibft/ip_dev", test_ibft_ip_dev);
+    g_test_add_func("/initrd/cmdline/ibft/ip_dev_mac", test_ibft_ip_dev_mac);
+    g_test_add_func("/initrd/cmdline/ibft/ip", test_ibft_ip);
+    g_test_add_func("/initrd/cmdline/ibft/rd_iscsi_ibft", test_ibft_rd_iscsi_ibft);
+    g_test_add_func("/initrd/cmdline/ignore_extra", test_ignore_extra);
+    g_test_add_func("/initrd/cmdline/rd_znet", test_rd_znet);
+    g_test_add_func("/initrd/cmdline/rd_znet/legacy", test_rd_znet_legacy);
+    g_test_add_func("/initrd/cmdline/rd_znet/no_ip", test_rd_znet_no_ip);
+    g_test_add_func("/initrd/cmdline/bootif/ip", test_bootif_ip);
+    g_test_add_func("/initrd/cmdline/bootif/no_ip", test_bootif_no_ip);
+    g_test_add_func("/initrd/cmdline/bootif/hwtype", test_bootif_hwtype);
+    g_test_add_func("/initrd/cmdline/bootif/off", test_bootif_off);
+    g_test_add_func("/initrd/cmdline/neednet", test_neednet);
+    g_test_add_func("/initrd/cmdline/dhcp/vendor_class_id", test_dhcp_vendor_class_id);
+    g_test_add_func("/initrd/cmdline/infiniband/iface", test_infiniband_iface);
+    g_test_add_func("/initrd/cmdline/infiniband/mac", test_infiniband_mac);
+    g_test_add_func("/initrd/cmdline/carrier_timeout", test_carrier_timeout);
+
+    return g_test_run();
+}
diff --git a/src/core/initrd/tests/test-dt-reader.c b/src/core/initrd/tests/test-dt-reader.c
new file mode 100644
index 00000000..619a4e6f
--- /dev/null
+++ b/src/core/initrd/tests/test-dt-reader.c
@@ -0,0 +1,144 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2014 - 2018 Red Hat, Inc.
+ */
+
+#include "src/core/nm-default-daemon.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
+#include "nm-core-internal.h"
+#include "NetworkManagerUtils.h"
+
+#include "../nm-initrd-generator.h"
+
+#include "nm-test-utils-core.h"
+
+#define TEST_INITRD_DIR NM_BUILD_SRCDIR "/src/core/initrd/tests"
+
+/*****************************************************************************/
+
+static void
+test_read_dt_ofw(void)
+{
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingWired *     s_wired;
+    NMSettingIPConfig *  s_ip4;
+    NMSettingIPConfig *  s_ip6;
+    const char *         mac_address;
+
+    connection = nmi_dt_reader_parse(TEST_INITRD_DIR "/sysfs-dt");
+    g_assert(connection);
+    nmtst_assert_connection_verifies(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "OpenFirmware Connection");
+    g_assert_cmpint(nm_setting_connection_get_timestamp(s_con), ==, 0);
+    g_assert(nm_setting_connection_get_autoconnect(s_con));
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    mac_address = nm_setting_wired_get_mac_address(s_wired);
+    g_assert(mac_address);
+    g_assert(nm_utils_hwaddr_matches(mac_address, -1, "ac:7f:3e:e5:d8:d8", -1));
+    g_assert(!nm_setting_wired_get_duplex(s_wired));
+    g_assert_cmpint(nm_setting_wired_get_speed(s_wired), ==, 0);
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 0);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+    g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "demiurge");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+
+    g_object_unref(connection);
+}
+
+static void
+test_read_dt_slof(void)
+{
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingWired *     s_wired;
+    NMSettingIPConfig *  s_ip4;
+    NMSettingIPConfig *  s_ip6;
+    NMIPAddress *        ip4_addr;
+
+    connection = nmi_dt_reader_parse(TEST_INITRD_DIR "/sysfs-dt-tftp");
+    g_assert(connection);
+    nmtst_assert_connection_verifies(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "OpenFirmware Connection");
+    g_assert_cmpint(nm_setting_connection_get_timestamp(s_con), ==, 0);
+    g_assert(nm_setting_connection_get_autoconnect(s_con));
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    g_assert(!nm_setting_wired_get_mac_address(s_wired));
+    g_assert_cmpstr(nm_setting_wired_get_duplex(s_wired), ==, "half");
+    g_assert_cmpint(nm_setting_wired_get_speed(s_wired), ==, 10);
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 0);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
+    ip4_addr = nm_setting_ip_config_get_address(s_ip4, 0);
+    g_assert(ip4_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip4_addr), ==, "192.168.32.2");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip4_addr), ==, 16);
+
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "192.168.32.1");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+
+    g_object_unref(connection);
+}
+
+static void
+test_read_dt_none(void)
+{
+    NMConnection *connection;
+
+    connection = nmi_dt_reader_parse(TEST_INITRD_DIR "/sysfs");
+    g_assert(!connection);
+}
+
+NMTST_DEFINE();
+
+int
+main(int argc, char **argv)
+{
+    nmtst_init_assert_logging(&argc, &argv, "INFO", "DEFAULT");
+
+    g_test_add_func("/initrd/dt/ofw", test_read_dt_ofw);
+    g_test_add_func("/initrd/dt/slof", test_read_dt_slof);
+    g_test_add_func("/initrd/dt/none", test_read_dt_none);
+
+    return g_test_run();
+}
diff --git a/src/core/initrd/tests/test-ibft-reader.c b/src/core/initrd/tests/test-ibft-reader.c
new file mode 100644
index 00000000..1d263b9e
--- /dev/null
+++ b/src/core/initrd/tests/test-ibft-reader.c
@@ -0,0 +1,303 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2014 - 2018 Red Hat, Inc.
+ */
+
+#include "src/core/nm-default-daemon.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
+#include "nm-core-internal.h"
+#include "NetworkManagerUtils.h"
+
+#include "../nm-initrd-generator.h"
+
+#include "nm-test-utils-core.h"
+
+#define TEST_INITRD_DIR NM_BUILD_SRCDIR "/src/core/initrd/tests"
+
+/*****************************************************************************/
+
+static NMConnection *
+read_connection(const char *sysfs_dir, const char *expected_mac, GError **error)
+{
+    NMConnection *     connection       = NULL;
+    gs_unref_hashtable GHashTable *ibft = NULL;
+    gs_free char *                 mac  = NULL;
+    GHashTable *                   nic  = NULL;
+
+    ibft = nmi_ibft_read(sysfs_dir);
+
+    mac = g_ascii_strup(expected_mac, -1);
+    nic = g_hash_table_lookup(ibft, mac);
+    if (!nic)
+        return NULL;
+
+    connection = nm_simple_connection_new();
+
+    if (!nmi_ibft_update_connection_from_nic(connection, nic, error))
+        g_clear_object(&connection);
+
+    return connection;
+}
+
+static void
+test_read_ibft_dhcp(void)
+{
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingWired *     s_wired;
+    NMSettingIPConfig *  s_ip4;
+    NMSettingIPConfig *  s_ip6;
+    GError *             error = NULL;
+    const char *         mac_address;
+    const char *         expected_mac_address = "00:33:21:98:b9:f1";
+
+    connection = read_connection(TEST_INITRD_DIR "/sysfs-dhcp", expected_mac_address, &error);
+    g_assert_no_error(error);
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    g_assert(!nm_connection_get_setting_vlan(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "iBFT Connection 1");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, NULL);
+    g_assert_cmpint(nm_setting_connection_get_timestamp(s_con), ==, 0);
+    g_assert(nm_setting_connection_get_autoconnect(s_con));
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    mac_address = nm_setting_wired_get_mac_address(s_wired);
+    g_assert(mac_address);
+    g_assert(nm_utils_hwaddr_matches(mac_address, -1, expected_mac_address, -1));
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 0);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+
+    g_object_unref(connection);
+}
+
+static void
+test_read_ibft_static(void)
+{
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingWired *     s_wired;
+    NMSettingIPConfig *  s_ip4;
+    NMSettingIPConfig *  s_ip6;
+    GError *             error = NULL;
+    const char *         mac_address;
+    const char *         expected_mac_address = "00:33:21:98:b9:f0";
+    NMIPAddress *        ip4_addr;
+
+    connection = read_connection(TEST_INITRD_DIR "/sysfs-static", expected_mac_address, &error);
+    g_assert_no_error(error);
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    g_assert(!nm_connection_get_setting_vlan(connection));
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_WIRED_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_id(s_con), ==, "iBFT Connection 0");
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, NULL);
+    g_assert_cmpint(nm_setting_connection_get_timestamp(s_con), ==, 0);
+    g_assert(nm_setting_connection_get_autoconnect(s_con));
+
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    mac_address = nm_setting_wired_get_mac_address(s_wired);
+    g_assert(mac_address);
+    g_assert(nm_utils_hwaddr_matches(mac_address, -1, expected_mac_address, -1));
+    g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 0);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 2);
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 0), ==, "10.16.255.2");
+    g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 1), ==, "10.16.255.3");
+
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
+    ip4_addr = nm_setting_ip_config_get_address(s_ip4, 0);
+    g_assert(ip4_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip4_addr), ==, "192.168.32.72");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip4_addr), ==, 22);
+
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "192.168.35.254");
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+
+    g_object_unref(connection);
+}
+
+static void
+test_read_ibft_bad_address(gconstpointer user_data)
+{
+    const char *  sysfs_dir = user_data;
+    NMConnection *connection;
+    GError *      error = NULL;
+
+    g_assert(g_file_test(sysfs_dir, G_FILE_TEST_EXISTS));
+
+    connection = read_connection(sysfs_dir, "00:33:21:98:b9:f0", &error);
+    g_assert(connection == NULL);
+    g_assert(error);
+    g_clear_error(&error);
+}
+
+static void
+test_read_ibft_vlan(void)
+{
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingWired *     s_wired;
+    NMSettingVlan *      s_vlan;
+    NMSettingIPConfig *  s_ip4;
+    const char *         mac_address;
+    const char *         expected_mac_address = "00:33:21:98:b9:f0";
+    NMIPAddress *        ip4_addr;
+    GError *             error = NULL;
+
+    connection = read_connection(TEST_INITRD_DIR "/sysfs-vlan", expected_mac_address, &error);
+    g_assert_no_error(error);
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_con = nm_connection_get_setting_connection(connection);
+    g_assert(s_con);
+    g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                    ==,
+                    NM_SETTING_VLAN_SETTING_NAME);
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, NULL);
+
+    /* ===== WIRED SETTING ===== */
+    s_wired = nm_connection_get_setting_wired(connection);
+    g_assert(s_wired);
+    mac_address = nm_setting_wired_get_mac_address(s_wired);
+    g_assert(mac_address);
+    g_assert(nm_utils_hwaddr_matches(mac_address, -1, expected_mac_address, -1));
+
+    /* ===== VLAN SETTING ===== */
+    s_vlan = nm_connection_get_setting_vlan(connection);
+    g_assert(s_vlan);
+    g_assert_cmpint(nm_setting_vlan_get_id(s_vlan), ==, 123);
+    g_assert_cmpstr(nm_setting_vlan_get_parent(s_vlan), ==, NULL);
+
+    /* ===== IPv4 SETTING ===== */
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+
+    g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0);
+
+    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1);
+    ip4_addr = nm_setting_ip_config_get_address(s_ip4, 0);
+    g_assert(ip4_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip4_addr), ==, "192.168.6.200");
+    g_assert_cmpint(nm_ip_address_get_prefix(ip4_addr), ==, 24);
+
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, NULL);
+
+    g_object_unref(connection);
+}
+
+static void
+test_read_ibft(void)
+{
+    NMConnection *     connection;
+    NMSettingIPConfig *s_ip4;
+    NMSettingIPConfig *s_ip6;
+    GError *           error = NULL;
+
+    /* This test doesn't actually test too much (apart from the presence of
+     * IPv6 that is not covered by other tests), but the test fixture is a good
+     * example of about everything that can be included in iBFT table (as of
+     * ACPI 3.0b). */
+
+    connection = read_connection(TEST_INITRD_DIR "/sysfs", "00:53:00:AB:00:01", &error);
+    g_assert(connection);
+    g_assert_no_error(error);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    nmtst_assert_connection_verifies_without_normalization(connection);
+    g_assert(nm_setting_ip_config_get_num_addresses(s_ip4) == 0);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(nm_setting_ip_config_get_num_addresses(s_ip6) == 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+    g_object_unref(connection);
+
+    connection = read_connection(TEST_INITRD_DIR "/sysfs", "00:53:06:66:AB:01", &error);
+    g_assert(connection);
+    g_assert_no_error(error);
+    nmtst_assert_connection_verifies_without_normalization(connection);
+
+    s_ip4 = nm_connection_get_setting_ip4_config(connection);
+    g_assert(nm_setting_ip_config_get_num_addresses(s_ip4) == 1);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+    s_ip6 = nm_connection_get_setting_ip6_config(connection);
+    g_assert(nm_setting_ip_config_get_num_addresses(s_ip6) == 0);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+    g_object_unref(connection);
+}
+
+NMTST_DEFINE();
+
+int
+main(int argc, char **argv)
+{
+    nmtst_init_assert_logging(&argc, &argv, "INFO", "DEFAULT");
+
+    g_test_add_func("/initrd/ibft", test_read_ibft);
+    g_test_add_func("/initrd/ibft/dhcp", test_read_ibft_dhcp);
+    g_test_add_func("/initrd/ibft/static", test_read_ibft_static);
+    g_test_add_func("/initrd/ibft/vlan", test_read_ibft_vlan);
+    g_test_add_data_func("/initrd/ibft/bad-ipaddr-read",
+                         TEST_INITRD_DIR "/sysfs-bad-ipaddr",
+                         test_read_ibft_bad_address);
+    g_test_add_data_func("/initrd/ibft/bad-gateway-read",
+                         TEST_INITRD_DIR "/sysfs-bad-gateway",
+                         test_read_ibft_bad_address);
+    g_test_add_data_func("/initrd/ibft/bad-dns1-read",
+                         TEST_INITRD_DIR "/sysfs-bad-dns1",
+                         test_read_ibft_bad_address);
+    g_test_add_data_func("/initrd/ibft/bad-dns2-read",
+                         TEST_INITRD_DIR "/sysfs-bad-dns2",
+                         test_read_ibft_bad_address);
+
+    return g_test_run();
+}