root/lib/common/tests/nvpair/pcmk__scan_nvpair_test.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. assert_scan_nvpair
  2. null_asserts
  3. already_allocated_asserts
  4. empty_input
  5. equal_sign_only
  6. name_only
  7. value_only
  8. valid

   1 /*
   2  * Copyright 2025 the Pacemaker project contributors
   3  *
   4  * The version control history for this file may have further details.
   5  *
   6  * This source code is licensed under the GNU General Public License version 2
   7  * or later (GPLv2+) WITHOUT ANY WARRANTY.
   8  */
   9 
  10 #include <crm_internal.h>
  11 
  12 #include <glib.h>       // gchar, g_free
  13 
  14 #include <crm/common/unittest_internal.h>
  15 
  16 static void
  17 assert_scan_nvpair(const gchar *input, int expected_rc,
     /* [previous][next][first][last][top][bottom][index][help] */
  18                    const gchar *expected_name, const gchar *expected_value)
  19 {
  20     gchar *name = NULL;
  21     gchar *value = NULL;
  22 
  23     assert_int_equal(pcmk__scan_nvpair(input, &name, &value),
  24                      expected_rc);
  25 
  26     if (expected_name == NULL) {
  27         assert_null(name);
  28     } else {
  29         assert_string_equal(name, expected_name);
  30     }
  31 
  32     if (expected_value == NULL) {
  33         assert_null(value);
  34     } else {
  35         assert_string_equal(value, expected_value);
  36     }
  37 
  38     g_free(name);
  39     g_free(value);
  40 }
  41 
  42 static void
  43 null_asserts(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  44 {
  45     const gchar *input = "key=value";
  46     gchar *name = NULL;
  47     gchar *value = NULL;
  48 
  49     pcmk__assert_asserts(pcmk__scan_nvpair(NULL, &name, &value));
  50     pcmk__assert_asserts(pcmk__scan_nvpair(input, NULL, &value));
  51     pcmk__assert_asserts(pcmk__scan_nvpair(input, &name, NULL));
  52 }
  53 
  54 static void
  55 already_allocated_asserts(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  56 {
  57     const gchar *input = "key=value";
  58     gchar *buf_null = NULL;
  59     gchar *buf_allocated = g_strdup("allocated string");
  60 
  61     pcmk__assert_asserts(pcmk__scan_nvpair(input, &buf_allocated, &buf_null));
  62     pcmk__assert_asserts(pcmk__scan_nvpair(input, &buf_null, &buf_allocated));
  63 
  64     g_free(buf_allocated);
  65 }
  66 
  67 static void
  68 empty_input(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  69 {
  70     assert_scan_nvpair("", pcmk_rc_bad_nvpair, NULL, NULL);
  71 }
  72 
  73 static void
  74 equal_sign_only(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  75 {
  76     assert_scan_nvpair("=", pcmk_rc_bad_nvpair, NULL, NULL);
  77 }
  78 
  79 static void
  80 name_only(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  81 {
  82     assert_scan_nvpair("name", pcmk_rc_bad_nvpair, NULL, NULL);
  83     assert_scan_nvpair("name=", pcmk_rc_bad_nvpair, NULL, NULL);
  84 }
  85 
  86 static void
  87 value_only(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  88 {
  89     assert_scan_nvpair("=value", pcmk_rc_bad_nvpair, NULL, NULL);
  90 }
  91 
  92 static void
  93 valid(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  94 {
  95     assert_scan_nvpair("name=value", pcmk_rc_ok, "name", "value");
  96 
  97     // Trailing newlines are discarded
  98     assert_scan_nvpair("name=value\n\n", pcmk_rc_ok, "name", "value");
  99     assert_scan_nvpair("\nname=value\n", pcmk_rc_ok, "\nname", "value");
 100     assert_scan_nvpair("name\n=value\n", pcmk_rc_ok, "name\n", "value");
 101     assert_scan_nvpair("name=\nvalue\n", pcmk_rc_ok, "name", "\nvalue");
 102     assert_scan_nvpair("name=val\nue\n", pcmk_rc_ok, "name", "val\nue");
 103 
 104     // Other whitespace is kept (checking only space characters here)
 105     assert_scan_nvpair(" name=value", pcmk_rc_ok, " name", "value");
 106     assert_scan_nvpair("name =value", pcmk_rc_ok, "name ", "value");
 107     assert_scan_nvpair("name= value", pcmk_rc_ok, "name", " value");
 108     assert_scan_nvpair("name=value ", pcmk_rc_ok, "name", "value ");
 109     assert_scan_nvpair("name =   value", pcmk_rc_ok, "name ", "   value");
 110 
 111     // Other trailing characters are kept
 112     assert_scan_nvpair("name=value=", pcmk_rc_ok, "name", "value=");
 113     assert_scan_nvpair("name=value=\n\n", pcmk_rc_ok, "name", "value=");
 114     assert_scan_nvpair("name=value=e", pcmk_rc_ok, "name", "value=e");
 115     assert_scan_nvpair("name=value=e\n\n", pcmk_rc_ok, "name", "value=e");
 116 
 117     // Quotes are not treated specially
 118     assert_scan_nvpair("name='value'", pcmk_rc_ok, "name", "'value'");
 119     assert_scan_nvpair("'name'=value", pcmk_rc_ok, "'name'", "value");
 120     assert_scan_nvpair("'name=value'", pcmk_rc_ok, "'name", "value'");
 121     assert_scan_nvpair("name=\"value\"", pcmk_rc_ok, "name", "\"value\"");
 122     assert_scan_nvpair("\"name\"=value", pcmk_rc_ok, "\"name\"", "value");
 123     assert_scan_nvpair("\"name=value\"", pcmk_rc_ok, "\"name", "value\"");
 124 
 125     // Other special characters are not treated specially (small sample)
 126     assert_scan_nvpair("!@#$%=^&*()", pcmk_rc_ok, "!@#$%", "^&*()");
 127     assert_scan_nvpair("name=$value", pcmk_rc_ok, "name", "$value");
 128 }
 129 
 130 PCMK__UNIT_TEST(NULL, NULL,
 131                 cmocka_unit_test(null_asserts),
 132                 cmocka_unit_test(already_allocated_asserts),
 133                 cmocka_unit_test(empty_input),
 134                 cmocka_unit_test(equal_sign_only),
 135                 cmocka_unit_test(name_only),
 136                 cmocka_unit_test(value_only),
 137                 cmocka_unit_test(valid))

/* [previous][next][first][last][top][bottom][index][help] */