summary refs log tree commit diff
path: root/src/libnm-client-impl/tests/test-libnm.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-05-04 15:35:24 +0200
committerMichael Biebl <biebl@debian.org>2022-05-04 15:35:24 +0200
commit9959fdb2e8ddd06f2161798ca0a39c77d67c652d (patch)
tree2ce24a336d2b1c5fd5dec3090db312eded6c78ba /src/libnm-client-impl/tests/test-libnm.c
parent8c623dddbdebe354cb94bfc559a5371a14865317 (diff)
New upstream version 1.37.92 upstream/1.37.92
Diffstat (limited to 'src/libnm-client-impl/tests/test-libnm.c')
-rw-r--r--src/libnm-client-impl/tests/test-libnm.c117
1 files changed, 106 insertions, 11 deletions
diff --git a/src/libnm-client-impl/tests/test-libnm.c b/src/libnm-client-impl/tests/test-libnm.c
index 0f600a4a..1810e139 100644
--- a/src/libnm-client-impl/tests/test-libnm.c
+++ b/src/libnm-client-impl/tests/test-libnm.c
@@ -2272,6 +2272,12 @@ _memfd_create(const char *name)
     return -1;
 }
 
+typedef enum {
+    READ_VPN_DETAIL_TYPE_GOOD,
+    READ_VPN_DETAIL_TYPE_NO_DONE,
+    READ_VPN_DETAIL_TYPE_BROKEN,
+} ReadVpnDetailType;
+
 typedef struct {
     const char *key;
     const char *val;
@@ -2285,6 +2291,7 @@ _do_read_vpn_details_impl1(const char              *file,
                            int                      memfd,
                            char                    *mem,
                            gsize                    len,
+                           ReadVpnDetailType        detail_type,
                            const ReadVpnDetailData *expected_data,
                            guint                    expected_data_len,
                            const ReadVpnDetailData *expected_secrets,
@@ -2294,10 +2301,27 @@ _do_read_vpn_details_impl1(const char              *file,
     off_t                          lseeked;
     gs_unref_hashtable GHashTable *data    = NULL;
     gs_unref_hashtable GHashTable *secrets = NULL;
+    char                           ch;
+    gboolean                       append_quit;
+    char                           read_buf[1024];
+    gssize                         n_read;
+    gssize                         i;
 
     written = write(memfd, mem, len);
     g_assert_cmpint(written, ==, (gssize) len);
 
+    append_quit = nmtst_get_rand_bool();
+
+    if (append_quit) {
+        if (len > 0 && mem[len - 1] != '\n') {
+            ch      = '\n';
+            written = write(memfd, &ch, 1);
+            g_assert_cmpint(written, ==, 1);
+        }
+        written = write(memfd, "QUIT", 4);
+        g_assert_cmpint(written, ==, 4);
+    }
+
     lseeked = lseek(memfd, 0, SEEK_SET);
     g_assert_cmpint(lseeked, ==, 0);
 
@@ -2327,13 +2351,14 @@ _do_read_vpn_details_impl1(const char              *file,
                 if (nm_streq(_expected[_i].key, _k))                                          \
                     break;                                                                    \
             }                                                                                 \
-            if (_i >= _expected_len)                                                          \
+            if (_i >= _expected_len) {                                                        \
                 g_error("%s:%d: hash '%s' contains unexpected data key '%s' with value '%s'", \
                         file,                                                                 \
                         line,                                                                 \
                         G_STRINGIFY(hash),                                                    \
                         _k,                                                                   \
                         _v);                                                                  \
+            }                                                                                 \
         }                                                                                     \
                                                                                               \
         for (_i = 0; _i < _expected_len; _i++) {                                              \
@@ -2342,7 +2367,7 @@ _do_read_vpn_details_impl1(const char              *file,
             g_assert(_d->key);                                                                \
             g_assert(_d->val);                                                                \
             _v = g_hash_table_lookup(_hash, _d->key);                                         \
-            if (!nm_streq0(_v, _d->val))                                                      \
+            if (!nm_streq0(_v, _d->val)) {                                                    \
                 g_error("%s:%d: hash '%s' contains data key '%s' with value %s%s%s but we "   \
                         "expected '%s'",                                                      \
                         file,                                                                 \
@@ -2351,20 +2376,71 @@ _do_read_vpn_details_impl1(const char              *file,
                         _d->key,                                                              \
                         NM_PRINT_FMT_QUOTE_STRING(_v),                                        \
                         _d->val);                                                             \
+            }                                                                                 \
         }                                                                                     \
                                                                                               \
         g_assert_cmpint(g_hash_table_size(_hash), ==, _expected_len);                         \
     }                                                                                         \
     G_STMT_END
 
+    NM_PRAGMA_WARNING_DISABLE_DANGLING_POINTER
     _assert_hash(data, expected_data, expected_data_len);
     _assert_hash(secrets, expected_secrets, expected_secrets_len);
+    NM_PRAGMA_WARNING_REENABLE
 
 #undef _assert_hash
+
+    n_read = read(memfd, read_buf, sizeof(read_buf));
+
+    if (0) {
+        gs_free char *ss = NULL;
+
+        g_print(">>>> n_read=%zd;  \"%s\"",
+                n_read,
+                n_read > 0 ? (
+                    ss = nm_utils_buf_utf8safe_escape_cp(read_buf,
+                                                         n_read,
+                                                         NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL))
+                           : "");
+    }
+
+    g_assert_cmpint(n_read, >=, 0);
+    g_assert_cmpint(n_read, <, sizeof(read_buf));
+
+    i = read(memfd, &ch, 1);
+    g_assert_cmpint(i, ==, 0);
+
+    switch (detail_type) {
+    case READ_VPN_DETAIL_TYPE_GOOD:
+        g_assert_cmpint(n_read, >=, 0);
+        i = 0;
+        while (i < n_read && NM_IN_SET(read_buf[i], '\n'))
+            i++;
+        if (append_quit)
+            g_assert_cmpmem("QUIT", 4, &read_buf[i], n_read - i);
+        else
+            g_assert_cmpint(n_read - i, ==, 0);
+        break;
+    case READ_VPN_DETAIL_TYPE_NO_DONE:
+        g_assert_cmpint(n_read, ==, 0);
+        break;
+    case READ_VPN_DETAIL_TYPE_BROKEN:
+        g_assert_cmpint(n_read, >, 0);
+        if (append_quit) {
+            g_assert_cmpint(n_read, >, 4);
+            g_assert(memmem(&read_buf[i], n_read + i, "QUIT", 4));
+        }
+        break;
+    default:
+        g_assert_not_reached();
+        break;
+    }
+
     return TRUE;
 }
 
 #define _do_read_vpn_details_impl0(str,                                          \
+                                   detail_type,                                  \
                                    expected_data,                                \
                                    expected_data_len,                            \
                                    expected_secrets,                             \
@@ -2385,6 +2461,7 @@ _do_read_vpn_details_impl1(const char              *file,
                                        _memfd,                                   \
                                        "" str "",                                \
                                        NM_STRLEN(str),                           \
+                                       (detail_type),                            \
                                        expected_data,                            \
                                        expected_data_len,                        \
                                        expected_secrets,                         \
@@ -2393,14 +2470,16 @@ _do_read_vpn_details_impl1(const char              *file,
     }                                                                            \
     G_STMT_END
 
-#define _do_read_vpn_details_empty(str) _do_read_vpn_details_impl0(str, NULL, 0, NULL, 0, {})
+#define _do_read_vpn_details_empty(str) \
+    _do_read_vpn_details_impl0(str, READ_VPN_DETAIL_TYPE_GOOD, NULL, 0, NULL, 0, {})
 
-#define _do_read_vpn_details(str, expected_data, expected_secrets, pre_setup_cmd) \
-    _do_read_vpn_details_impl0(str,                                               \
-                               expected_data,                                     \
-                               G_N_ELEMENTS(expected_data),                       \
-                               expected_secrets,                                  \
-                               G_N_ELEMENTS(expected_secrets),                    \
+#define _do_read_vpn_details(str, detail_type, expected_data, expected_secrets, pre_setup_cmd) \
+    _do_read_vpn_details_impl0(str,                                                            \
+                               detail_type,                                                    \
+                               expected_data,                                                  \
+                               G_N_ELEMENTS(expected_data),                                    \
+                               expected_secrets,                                               \
+                               G_N_ELEMENTS(expected_secrets),                                 \
                                pre_setup_cmd)
 
 static void
@@ -2426,6 +2505,7 @@ test_nm_vpn_service_plugin_read_vpn_details(void)
                          "DONE\n"
                          "\n"
                          "",
+                         READ_VPN_DETAIL_TYPE_GOOD,
                          READ_VPN_DETAIL_DATA({"some-key", "string"}, {"some-other-key", "val2"}, ),
                          READ_VPN_DETAIL_DATA({"some-secret", "val3"}, ), );
 
@@ -2433,6 +2513,7 @@ test_nm_vpn_service_plugin_read_vpn_details(void)
                          "DATA_KEY=some-key\n"
                          "DATA_VAL=string\n"
                          "DONE\n",
+                         READ_VPN_DETAIL_TYPE_GOOD,
                          READ_VPN_DETAIL_DATA({"some-key", "string"}, ),
                          READ_VPN_DETAIL_DATA(), );
 
@@ -2461,6 +2542,7 @@ test_nm_vpn_service_plugin_read_vpn_details(void)
         "\n"
         "DONE\n"
         "",
+        READ_VPN_DETAIL_TYPE_BROKEN,
         READ_VPN_DETAIL_DATA({"some-key", "string\ncontinued after a line break"}, ),
         READ_VPN_DETAIL_DATA({"key names\ncan have\ncontinuations too", "value"}, ), );
 
@@ -2474,6 +2556,7 @@ test_nm_vpn_service_plugin_read_vpn_details(void)
         "=continuations too\n"
         "SECRET_VAL=value\n"
         "",
+        READ_VPN_DETAIL_TYPE_NO_DONE,
         READ_VPN_DETAIL_DATA({"some-key", "string\ncontinued after a line break"}, ),
         READ_VPN_DETAIL_DATA({"key names\ncan have\ncontinuations too", "value"}, ), );
 
@@ -2507,6 +2590,7 @@ test_nm_vpn_service_plugin_read_vpn_details(void)
                          "DONE\n"
                          "\n"
                          "",
+                         READ_VPN_DETAIL_TYPE_GOOD,
                          READ_VPN_DETAIL_DATA({"some\nkey-2", "val2"},
                                               {"some-key", "string"},
                                               {"key3\nkey-2", "val3"}, ),
@@ -2546,8 +2630,15 @@ test_nm_vpn_service_plugin_read_vpn_details(void)
                          "DONE\n"
                          "\n"
                          "",
-                         READ_VPN_DETAIL_DATA({"some\nkey-2", "val2"}, {"some-key", "string"}, ),
-                         READ_VPN_DETAIL_DATA(), );
+                         READ_VPN_DETAIL_TYPE_GOOD,
+                         READ_VPN_DETAIL_DATA({"some\nkey-2", "val2"},
+                                              {"some-key", "string"},
+                                              {"key3\nkey-2", "val3"}, ),
+                         READ_VPN_DETAIL_DATA({"some-secret", "val3"},
+                                              {"key-inval", "in\xc1val"},
+                                              {"ke\xc0yx", "inval"},
+                                              {"keyx", ""},
+                                              {"", "val3"}), );
 }
 
 /*****************************************************************************/
@@ -3049,10 +3140,12 @@ check_dbus_properties:
                     break;
                 p_expected_type++;
                 if (p_expected_type >= &expected_types[G_N_ELEMENTS(expected_types)]) {
+                    NM_PRAGMA_WARNING_DISABLE_DANGLING_POINTER
                     g_error("D-Bus type \"%s\" is not implemented (in property %s.%s)",
                             (const char *) mpr->dbus_type,
                             mif->dbus_iface_name,
                             mpr->dbus_property_name);
+                    NM_PRAGMA_WARNING_REENABLE
                 }
             }
 
@@ -3151,6 +3244,7 @@ check_dbus_properties:
                             break;
                     }
                     if (p_expected_type_2 >= &expected_types[G_N_ELEMENTS(expected_types)]) {
+                        NM_PRAGMA_WARNING_DISABLE_DANGLING_POINTER
                         g_error("D-Bus property \"%s.%s\" (type \"%s\") maps to property \"%s\", "
                                 "but that has an unexpected property type %s (expected %s)",
                                 mif->dbus_iface_name,
@@ -3159,6 +3253,7 @@ check_dbus_properties:
                                 pspec->name,
                                 g_type_name(pspec->value_type),
                                 g_type_name(p_expected_type->default_gtype));
+                        NM_PRAGMA_WARNING_REENABLE
                     }
                 }