summary refs log tree commit diff
path: root/src/nm-initrd-generator/tests
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2025-09-12 19:47:07 +0200
committerMichael Biebl <biebl@debian.org>2025-09-12 19:47:07 +0200
commitbc5f10851bffd6af1c2855635be7a28b6dba3195 (patch)
treed47255895378efcdc0a32c2ddeed055f76935654 /src/nm-initrd-generator/tests
parent7e9091a5960f67a84787c03153324915220e4816 (diff)
New upstream version 1.54.1 upstream/1.54.1
Diffstat (limited to 'src/nm-initrd-generator/tests')
-rw-r--r--src/nm-initrd-generator/tests/meson.build4
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-Dell.PowerEdge.R760bin0 -> 1017 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-dhcp-ipv4bin0 -> 825 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-Dell.PowerEdge.R660-fw1.5.5-mpath+discoverybin0 -> 4147 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-multibin0 -> 2589 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-rhpocbin0 -> 724 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-static-ipv4bin0 -> 725 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-auto-ipv6bin0 -> 721 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-dhcp-ipv6bin0 -> 725 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-ipv6-noip+discbin0 -> 785 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-ipv6-static/firmware/acpi/tables/NBFT-static-ipv6bin0 -> 721 bytes
-rw-r--r--src/nm-initrd-generator/tests/nbft-vlan/firmware/acpi/tables/NBFT-qemu-vlans-incompletebin0 -> 2200 bytes
-rw-r--r--src/nm-initrd-generator/tests/test-cmdline-reader.c144
-rw-r--r--src/nm-initrd-generator/tests/test-nbft-reader.c397
14 files changed, 545 insertions, 0 deletions
diff --git a/src/nm-initrd-generator/tests/meson.build b/src/nm-initrd-generator/tests/meson.build
index 8fa3bcac..897a2148 100644
--- a/src/nm-initrd-generator/tests/meson.build
+++ b/src/nm-initrd-generator/tests/meson.build
@@ -6,6 +6,10 @@ test_units = [
   'test-cmdline-reader',
 ]
 
+if enable_nbft
+  test_units += [ 'test-nbft-reader' ]
+endif
+
 foreach test_unit : test_units
   exe = executable(
     test_unit,
diff --git a/src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-Dell.PowerEdge.R760 b/src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-Dell.PowerEdge.R760
new file mode 100644
index 00000000..2dea9363
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-Dell.PowerEdge.R760
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-dhcp-ipv4 b/src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-dhcp-ipv4
new file mode 100644
index 00000000..1af159de
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv4-dhcp/firmware/acpi/tables/NBFT-dhcp-ipv4
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-Dell.PowerEdge.R660-fw1.5.5-mpath+discovery b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-Dell.PowerEdge.R660-fw1.5.5-mpath+discovery
new file mode 100644
index 00000000..0fbb35cf
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-Dell.PowerEdge.R660-fw1.5.5-mpath+discovery
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-multi b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-multi
new file mode 100644
index 00000000..c34875bc
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-multi
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-rhpoc b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-rhpoc
new file mode 100644
index 00000000..5d0a6cc0
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-rhpoc
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-static-ipv4 b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-static-ipv4
new file mode 100644
index 00000000..bf3f8404
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv4-static/firmware/acpi/tables/NBFT-static-ipv4
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-auto-ipv6 b/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-auto-ipv6
new file mode 100644
index 00000000..64457d7d
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-auto-ipv6
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-dhcp-ipv6 b/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-dhcp-ipv6
new file mode 100644
index 00000000..20715eeb
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-dhcp-ipv6
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-ipv6-noip+disc b/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-ipv6-noip+disc
new file mode 100644
index 00000000..7a0690cb
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv6-auto/firmware/acpi/tables/NBFT-ipv6-noip+disc
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-ipv6-static/firmware/acpi/tables/NBFT-static-ipv6 b/src/nm-initrd-generator/tests/nbft-ipv6-static/firmware/acpi/tables/NBFT-static-ipv6
new file mode 100644
index 00000000..07b09cfb
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-ipv6-static/firmware/acpi/tables/NBFT-static-ipv6
Binary files differdiff --git a/src/nm-initrd-generator/tests/nbft-vlan/firmware/acpi/tables/NBFT-qemu-vlans-incomplete b/src/nm-initrd-generator/tests/nbft-vlan/firmware/acpi/tables/NBFT-qemu-vlans-incomplete
new file mode 100644
index 00000000..da385318
--- /dev/null
+++ b/src/nm-initrd-generator/tests/nbft-vlan/firmware/acpi/tables/NBFT-qemu-vlans-incomplete
Binary files differdiff --git a/src/nm-initrd-generator/tests/test-cmdline-reader.c b/src/nm-initrd-generator/tests/test-cmdline-reader.c
index cd7b1069..ac722872 100644
--- a/src/nm-initrd-generator/tests/test-cmdline-reader.c
+++ b/src/nm-initrd-generator/tests/test-cmdline-reader.c
@@ -2786,6 +2786,149 @@ test_plain_equal_char(void)
 
 /*****************************************************************************/
 
+#define _dhcp_client_id_check_invalid(arg)                        \
+    G_STMT_START                                                  \
+    {                                                             \
+        gs_unref_hashtable GHashTable *_connections2 = NULL;      \
+                                                                  \
+        _connections2 = _parse_cons(NM_MAKE_STRV(arg));           \
+        g_test_assert_expected_messages();                        \
+        g_assert_cmpint(g_hash_table_size(_connections2), ==, 0); \
+    }                                                             \
+    G_STMT_END
+
+#define _dhcp_client_id_check_v(strv, exp_ifname, exp_client_id)                                 \
+    G_STMT_START                                                                                 \
+    {                                                                                            \
+        gs_unref_object NMConnection *_connection = NULL;                                        \
+        NMSettingIPConfig            *_s_ip4;                                                    \
+                                                                                                 \
+        _connection = _parse_con(strv, exp_ifname);                                              \
+                                                                                                 \
+        g_test_assert_expected_messages();                                                       \
+                                                                                                 \
+        g_assert(nm_connection_get_setting_connection(_connection));                             \
+        g_assert(nm_connection_is_type(_connection, NM_SETTING_WIRED_SETTING_NAME));             \
+        g_assert(nm_connection_get_setting_ip4_config(_connection));                             \
+        g_assert(nm_connection_get_setting_ip6_config(_connection));                             \
+        _s_ip4 = nm_connection_get_setting_ip4_config(_connection);                              \
+        g_assert(NM_IS_SETTING_IP_CONFIG(_s_ip4));                                               \
+                                                                                                 \
+        g_assert_cmpstr(nm_setting_ip4_config_get_dhcp_client_id(NM_SETTING_IP4_CONFIG(_s_ip4)), \
+                        ==,                                                                      \
+                        (exp_client_id));                                                        \
+    }                                                                                            \
+    G_STMT_END
+
+#define _dhcp_client_id_check(arg, exp_ifname, exp_client_id) \
+    _dhcp_client_id_check_v(NM_MAKE_STRV("" arg ""), (exp_ifname), (exp_client_id))
+
+#define DHCP_CLIENT_ID_INVALID_MSG(_id)                                                \
+    "cmdline-reader: "                                                                 \
+    "rd.net.dhcp.client-id: invalid client-id \"" _id "\". Must be hexadecimal bytes " \
+    "separated by dashes (for example \"00-01-02-03-04-05-06\"), or '@' followed by a string"
+
+static void
+test_rd_dhcp_client_id(void)
+{
+    NMTST_EXPECT_NM_WARN("cmdline-reader: rd.net.dhcp.client-id: missing interface");
+    _dhcp_client_id_check_invalid("rd.net.dhcp.client-id=");
+
+    NMTST_EXPECT_NM_WARN("cmdline-reader: rd.net.dhcp.client-id: missing interface");
+    _dhcp_client_id_check_invalid("rd.net.dhcp.client-id=:");
+
+    NMTST_EXPECT_NM_WARN("cmdline-reader: rd.net.dhcp.client-id: missing client-id");
+    _dhcp_client_id_check_invalid("rd.net.dhcp.client-id=eth0:");
+
+    NMTST_EXPECT_NM_WARN(DHCP_CLIENT_ID_INVALID_MSG("invalid"));
+    _dhcp_client_id_check_invalid("rd.net.dhcp.client-id=eth0:invalid");
+
+    NMTST_EXPECT_NM_WARN(DHCP_CLIENT_ID_INVALID_MSG("01:AA:BB:CC:DD:EE:FF"));
+    _dhcp_client_id_check_invalid("rd.net.dhcp.client-id=eth0:01:AA:BB:CC:DD:EE:FF");
+
+    NMTST_EXPECT_NM_WARN(DHCP_CLIENT_ID_INVALID_MSG("@"));
+    _dhcp_client_id_check_invalid("rd.net.dhcp.client-id=eth0:@");
+
+    NMTST_EXPECT_NM_WARN("cmdline-reader: rd.net.dhcp.client-id: invalid client-id \"01\". Must be "
+                         "at least two bytes");
+    _dhcp_client_id_check_invalid("rd.net.dhcp.client-id=eth0:01");
+
+    /* Client-id with hex string */
+    _dhcp_client_id_check("rd.net.dhcp.client-id=eth0:01-aa-BB-cc-dd-EE-ff",
+                          "eth0",
+                          "01:aa:bb:cc:dd:ee:ff");
+
+    /* Client-id with plain string */
+    _dhcp_client_id_check("rd.net.dhcp.client-id=eth0:@test.com",
+                          "eth0",
+                          "00:74:65:73:74:2e:63:6f:6d");
+
+    /* Minimal client-id, hex */
+    _dhcp_client_id_check("rd.net.dhcp.client-id=eth1:01-02", "eth1", "01:02");
+
+    /* Minimal client-id, string */
+    _dhcp_client_id_check("rd.net.dhcp.client-id=eth1:@1", "eth1", "00:31");
+
+    /* Long client-id */
+    _dhcp_client_id_check(
+        "rd.net.dhcp.client-id=enp1s0:"
+        "01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-"
+        "25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-40-41-42-43-44-45-46-47-48-"
+        "49-50-51-52-53-54-55-56-57-58-59-60-61-62-63-64-65-66-67-68-69-70-71-72",
+        "enp1s0",
+        "01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:"
+        "25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:"
+        "49:50:51:52:53:54:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72");
+
+    /* Test ordering: client-id before ip= */
+    _dhcp_client_id_check_v(
+        NM_MAKE_STRV("rd.net.dhcp.client-id=eth0:aa-bb-cc-dd-ee-ff", "ip=eth0:dhcp"),
+        "eth0",
+        "aa:bb:cc:dd:ee:ff");
+
+    /* Test ordering: client-id after ip= */
+    _dhcp_client_id_check_v(
+        NM_MAKE_STRV("ip=eth2:dhcp", "rd.net.dhcp.client-id=eth2:ba-da-cc-dd-ee-ff"),
+        "eth2",
+        "ba:da:cc:dd:ee:ff");
+
+    /* Duplicate option: last wins */
+    _dhcp_client_id_check_v(NM_MAKE_STRV("ip=eth3:dhcp",
+                                         "rd.net.dhcp.client-id=eth3:01-02",
+                                         "rd.net.dhcp.client-id=eth3:01-03"),
+                            "eth3",
+                            "01:03");
+
+    /* Multiple connections */
+    {
+        gs_unref_hashtable GHashTable *connections = NULL;
+        NMConnection                  *connection;
+        NMSettingIP4Config            *s_ip4;
+
+        connections = _parse_cons(NM_MAKE_STRV("ip=eth0:dhcp",
+                                               "ip=eth1:dhcp",
+                                               "rd.net.dhcp.client-id=eth1:01-01-01",
+                                               "rd.net.dhcp.client-id=eth0:00-00-00"));
+
+        g_assert_nonnull(connections);
+        g_assert_cmpint(g_hash_table_size(connections), ==, 2);
+
+        connection = g_hash_table_lookup(connections, "eth0");
+        g_assert_nonnull(connection);
+        s_ip4 = (NMSettingIP4Config *) nm_connection_get_setting_ip4_config(connection);
+        g_assert_nonnull(s_ip4);
+        g_assert_cmpstr(nm_setting_ip4_config_get_dhcp_client_id(s_ip4), ==, "00:00:00");
+
+        connection = g_hash_table_lookup(connections, "eth1");
+        g_assert_nonnull(connection);
+        s_ip4 = (NMSettingIP4Config *) nm_connection_get_setting_ip4_config(connection);
+        g_assert_nonnull(s_ip4);
+        g_assert_cmpstr(nm_setting_ip4_config_get_dhcp_client_id(s_ip4), ==, "01:01:01");
+    }
+}
+
+/*****************************************************************************/
+
 NMTST_DEFINE();
 
 int
@@ -2848,6 +2991,7 @@ main(int argc, char **argv)
     g_test_add_func("/initrd/cmdline/rd_ethtool", test_rd_ethtool);
     g_test_add_func("/initrd/cmdline/plain_equal_char", test_plain_equal_char);
     g_test_add_func("/initrd/cmdline/global_dns", test_global_dns);
+    g_test_add_func("/initrd/cmdline/rd_dhcp_client_id", test_rd_dhcp_client_id);
 
     return g_test_run();
 }
diff --git a/src/nm-initrd-generator/tests/test-nbft-reader.c b/src/nm-initrd-generator/tests/test-nbft-reader.c
new file mode 100644
index 00000000..f93d3d76
--- /dev/null
+++ b/src/nm-initrd-generator/tests/test-nbft-reader.c
@@ -0,0 +1,397 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2025 Red Hat, Inc.
+ */
+
+#include "src/core/nm-default-daemon.h"
+
+#include "libnm-core-intern/nm-core-internal.h"
+#include "libnm-glib-aux/nm-test-utils.h"
+
+#include "nm-initrd-generator/nm-initrd-generator.h"
+
+#define TEST_INITRD_DIR NM_BUILD_SRCDIR "/src/nm-initrd-generator/tests"
+
+/*****************************************************************************/
+
+static NMConnection *
+find_connection_for_mac(NMConnection **nbft_connections, const char *expected_mac, guint32 vlan_id)
+{
+    NMConnection  **c;
+    NMSettingWired *s_wired;
+    NMSettingVlan  *s_vlan;
+    const char     *mac_address;
+
+    for (c = nbft_connections; c && *c; c++) {
+        s_wired = nm_connection_get_setting_wired(*c);
+        g_assert(s_wired);
+        mac_address = nm_setting_wired_get_mac_address(s_wired);
+        g_assert(mac_address);
+        if (!nm_utils_hwaddr_matches(mac_address, -1, expected_mac, -1))
+            continue;
+        s_vlan = nm_connection_get_setting_vlan(*c);
+        if (vlan_id > 0) {
+            if (!s_vlan)
+                continue;
+            if (nm_setting_vlan_get_id(s_vlan) != vlan_id)
+                continue;
+        } else if (s_vlan)
+            continue;
+        return *c;
+    }
+
+    return NULL;
+}
+
+static void
+verify_connection(NMConnection *c, const char *expected_mac, guint32 expected_vlan_id)
+{
+    NMSettingConnection *s_con;
+    NMSettingWired      *s_wired;
+    NMSettingVlan       *s_vlan;
+    const char          *mac_address;
+
+    nmtst_assert_connection_verifies_without_normalization(c);
+
+    s_con = nm_connection_get_setting_connection(c);
+    g_assert(s_con);
+
+    g_assert(g_str_has_prefix(nm_setting_connection_get_id(s_con), "NBFT"));
+    g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, NULL);
+    g_assert(nm_setting_connection_get_autoconnect_priority(s_con)
+             == NMI_AUTOCONNECT_PRIORITY_FIRMWARE);
+
+    s_wired = nm_connection_get_setting_wired(c);
+    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, -1));
+
+    if (expected_vlan_id > 0) {
+        g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                        ==,
+                        NM_SETTING_VLAN_SETTING_NAME);
+        s_vlan = nm_connection_get_setting_vlan(c);
+        g_assert(s_vlan);
+        g_assert_cmpint(nm_setting_vlan_get_id(s_vlan), ==, expected_vlan_id);
+        g_assert_cmpstr(nm_setting_vlan_get_parent(s_vlan), ==, NULL);
+    } else {
+        g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+                        ==,
+                        NM_SETTING_WIRED_SETTING_NAME);
+    }
+}
+
+static void
+verify_ipv4(NMConnection *c, const char *addr, int mask, const char *gateway)
+{
+    NMSettingIPConfig *s_ip4;
+    NMIPAddress       *ip4_addr;
+
+    s_ip4 = nm_connection_get_setting_ip4_config(c);
+    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), ==, addr);
+    g_assert_cmpint(nm_ip_address_get_prefix(ip4_addr), ==, mask);
+
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, gateway);
+}
+
+static void
+verify_ipv4_dhcp(NMConnection *c)
+{
+    NMSettingIPConfig *s_ip4;
+
+    s_ip4 = nm_connection_get_setting_ip4_config(c);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+}
+
+static void
+verify_ipv4_disabled(NMConnection *c)
+{
+    NMSettingIPConfig *s_ip4;
+
+    s_ip4 = nm_connection_get_setting_ip4_config(c);
+    g_assert(s_ip4);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4),
+                    ==,
+                    NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+}
+
+static void
+verify_ipv6(NMConnection *c, const char *addr, int prefix, const char *gateway)
+{
+    NMSettingIPConfig *s_ip6;
+    NMIPAddress       *ip6_addr;
+
+    s_ip6 = nm_connection_get_setting_ip6_config(c);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
+
+    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), ==, 1);
+    ip6_addr = nm_setting_ip_config_get_address(s_ip6, 0);
+    g_assert(ip6_addr);
+    g_assert_cmpstr(nm_ip_address_get_address(ip6_addr), ==, addr);
+    g_assert_cmpint(nm_ip_address_get_prefix(ip6_addr), ==, prefix);
+
+    g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip6), ==, gateway);
+}
+
+static void
+verify_ipv6_auto(NMConnection *c)
+{
+    NMSettingIPConfig *s_ip6;
+
+    s_ip6 = nm_connection_get_setting_ip6_config(c);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+}
+
+static void
+verify_ipv6_disabled(NMConnection *c)
+{
+    NMSettingIPConfig *s_ip6;
+
+    s_ip6 = nm_connection_get_setting_ip6_config(c);
+    g_assert(s_ip6);
+    g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6),
+                    ==,
+                    NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
+}
+
+static int
+count_nm_conn(NMConnection **connections)
+{
+    int cnt;
+
+    for (cnt = 0; connections && *connections; connections++, cnt++)
+        ;
+
+    return cnt;
+}
+
+static void
+free_connections(NMConnection **connections)
+{
+    NMConnection **c;
+
+    for (c = connections; c && *c; c++)
+        g_object_unref(*c);
+    g_free(connections);
+}
+
+static void
+test_read_nbft_ipv4_static(void)
+{
+    NMConnection **nbft_connections;
+    NMConnection  *connection;
+    const char    *expected_mac_address;
+    gs_free char  *hostname = NULL;
+
+    nbft_connections = nmi_nbft_reader_parse(TEST_INITRD_DIR "/nbft-ipv4-static", &hostname);
+    g_assert_nonnull(hostname);
+    g_assert_cmpint(count_nm_conn(nbft_connections), ==, 6);
+
+    /* NBFT-multi HFI 1 */
+    expected_mac_address = "52:54:00:72:c5:ae";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4(connection, "192.168.122.158", 24, "192.168.122.1");
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-multi HFI 2 */
+    expected_mac_address = "52:54:00:72:c5:af";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4_dhcp(connection);
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-Dell.PowerEdge.R660-fw1.5.5-mpath+discovery HFI 1 */
+    expected_mac_address = "00:62:0b:cb:eb:70";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4(connection, "172.18.240.1", 24, NULL);
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-Dell.PowerEdge.R660-fw1.5.5-mpath+discovery HFI 2 */
+    expected_mac_address = "00:62:0b:cb:eb:71";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4(connection, "172.18.230.2", 24, NULL);
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-rhpoc */
+    expected_mac_address = "ea:eb:d3:58:89:58";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4(connection, "192.168.101.30", 24, NULL);
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-static-ipv4 */
+    expected_mac_address = "52:54:00:b8:19:b9";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4(connection, "192.168.49.50", 24, NULL);
+    verify_ipv6_disabled(connection);
+
+    free_connections(nbft_connections);
+}
+
+static void
+test_read_nbft_ipv4_dhcp(void)
+{
+    NMConnection **nbft_connections;
+    NMConnection  *connection;
+    const char    *expected_mac_address;
+    gs_free char  *hostname = NULL;
+
+    nbft_connections = nmi_nbft_reader_parse(TEST_INITRD_DIR "/nbft-ipv4-dhcp", &hostname);
+    g_assert_nonnull(hostname);
+    g_assert_cmpint(count_nm_conn(nbft_connections), ==, 2);
+
+    /* NBFT-dhcp-ipv4 */
+    expected_mac_address = "52:54:00:b8:19:b9";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4_dhcp(connection);
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-Dell.PowerEdge.R760 */
+    expected_mac_address = "b0:26:28:e8:7c:0e";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4_dhcp(connection);
+    verify_ipv6_disabled(connection);
+
+    free_connections(nbft_connections);
+}
+
+static void
+test_read_nbft_ipv6_static(void)
+{
+    NMConnection **nbft_connections;
+    NMConnection  *connection;
+    const char    *expected_mac_address;
+    gs_free char  *hostname = NULL;
+
+    nbft_connections = nmi_nbft_reader_parse(TEST_INITRD_DIR "/nbft-ipv6-static", &hostname);
+    g_assert_nonnull(hostname);
+    g_assert_cmpint(count_nm_conn(nbft_connections), ==, 1);
+
+    /* NBFT-static-ipv6 */
+    expected_mac_address = "52:54:00:9e:20:1a";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv6(connection, "fd09:9a46:b5c1:1fe::10", 64, NULL);
+    verify_ipv4_disabled(connection);
+
+    free_connections(nbft_connections);
+}
+
+static void
+test_read_nbft_ipv6_auto(void)
+{
+    NMConnection **nbft_connections;
+    NMConnection  *connection;
+    const char    *expected_mac_address;
+    gs_free char  *hostname = NULL;
+
+    nbft_connections = nmi_nbft_reader_parse(TEST_INITRD_DIR "/nbft-ipv6-auto", &hostname);
+    g_assert_nonnull(hostname);
+    g_assert_cmpint(count_nm_conn(nbft_connections), ==, 3);
+
+    /* NBFT-auto-ipv6 */
+    expected_mac_address = "52:54:00:9e:20:1a";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv6(connection, "fd09:9a46:b5c1:1ff:5054:ff:fe9e:201a", 64, NULL);
+    verify_ipv4_disabled(connection);
+
+    /* NBFT-dhcp-ipv6 */
+    expected_mac_address = "52:54:00:b8:19:b9";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv6_auto(connection);
+    verify_ipv4_disabled(connection);
+
+    /* NBFT-ipv6-noip+disc */
+    expected_mac_address = "40:a6:b7:c0:8a:c9";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv6_auto(connection);
+    verify_ipv4_disabled(connection);
+
+    free_connections(nbft_connections);
+}
+
+static void
+test_read_nbft_vlan(void)
+{
+    NMConnection **nbft_connections;
+    NMConnection  *connection;
+    const char    *expected_mac_address;
+    gs_free char  *hostname = NULL;
+
+    nbft_connections = nmi_nbft_reader_parse(TEST_INITRD_DIR "/nbft-vlan", &hostname);
+    g_assert_cmpstr(hostname, ==, NULL);
+    g_assert_cmpint(count_nm_conn(nbft_connections), ==, 4);
+
+    /* NBFT-qemu-vlans-incomplete HFI 1 */
+    expected_mac_address = "52:54:00:72:c5:ae";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4(connection, "192.168.122.158", 24, "192.168.122.1");
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-qemu-vlans-incomplete HFI 2 */
+    expected_mac_address = "52:54:00:72:c5:af";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 0);
+    verify_connection(connection, expected_mac_address, 0);
+    verify_ipv4_disabled(connection);
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-qemu-vlans-incomplete HFI 2 VLAN 11 */
+    expected_mac_address = "52:54:00:72:c5:af";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 11);
+    verify_connection(connection, expected_mac_address, 11);
+    verify_ipv4(connection, "192.168.124.58", 24, NULL);
+    verify_ipv6_disabled(connection);
+
+    /* NBFT-qemu-vlans-incomplete HFI 2 VLAN 12 */
+    expected_mac_address = "52:54:00:72:c5:af";
+    connection           = find_connection_for_mac(nbft_connections, expected_mac_address, 12);
+    verify_connection(connection, expected_mac_address, 12);
+    verify_ipv4(connection, "192.168.125.58", 24, NULL);
+    verify_ipv6_disabled(connection);
+
+    free_connections(nbft_connections);
+}
+
+NMTST_DEFINE();
+
+int
+main(int argc, char **argv)
+{
+    nmtst_init_assert_logging(&argc, &argv, "INFO", "DEFAULT");
+
+    g_test_add_func("/initrd/nbft/ipv4-static", test_read_nbft_ipv4_static);
+    g_test_add_func("/initrd/nbft/ipv4-dhcp", test_read_nbft_ipv4_dhcp);
+    g_test_add_func("/initrd/nbft/ipv6-static", test_read_nbft_ipv6_static);
+    g_test_add_func("/initrd/nbft/ipv6-auto", test_read_nbft_ipv6_auto);
+    g_test_add_func("/initrd/nbft/vlan", test_read_nbft_vlan);
+
+    return g_test_run();
+}