root/lib/common/tests/patchset/pcmk__cib_element_in_patchset_test.c

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

DEFINITIONS

This source file includes following definitions.
  1. assert_in_patchset
  2. null_patchset_asserts
  3. create_op
  4. delete_op
  5. modify_op
  6. move_op

   1 /*
   2  * Copyright 2024 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 <crm/common/unittest_internal.h>
  13 #include <crm/common/xml.h>
  14 #include <crm/common/xml_internal.h>
  15 
  16 #define ORIG_CIB                                                            \
  17     "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\""                        \
  18                     " " PCMK_XA_EPOCH "=\"0\""                              \
  19                     " " PCMK_XA_NUM_UPDATES "=\"0\">"                       \
  20       "<" PCMK_XE_CONFIGURATION ">"                                         \
  21         "<" PCMK_XE_CRM_CONFIG "/>"                                         \
  22         "<" PCMK_XE_NODES ">"                                               \
  23           "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\""                          \
  24                            " " PCMK_XA_UNAME "=\"node-1\"/>"                \
  25         "</" PCMK_XE_NODES ">"                                              \
  26         "<" PCMK_XE_RESOURCES "/>"                                          \
  27         "<" PCMK_XE_CONSTRAINTS "/>"                                        \
  28       "</" PCMK_XE_CONFIGURATION ">"                                        \
  29       "<" PCMK_XE_STATUS "/>"                                               \
  30     "</" PCMK_XE_CIB ">"
  31 
  32 static void
  33 assert_in_patchset(const char *source_s, const char *target_s,
     /* [previous][next][first][last][top][bottom][index][help] */
  34                    const char *element, bool reference)
  35 {
  36     xmlNode *source = pcmk__xml_parse(source_s);
  37     xmlNode *target = pcmk__xml_parse(target_s);
  38     xmlNode *patchset = NULL;
  39 
  40     xml_track_changes(target, NULL, NULL, false);
  41     xml_calculate_significant_changes(source, target);
  42     patchset = xml_create_patchset(2, source, target, NULL, false);
  43 
  44     if (reference) {
  45         assert_true(pcmk__cib_element_in_patchset(patchset, element));
  46     } else {
  47         assert_false(pcmk__cib_element_in_patchset(patchset, element));
  48     }
  49 
  50     pcmk__xml_free(source);
  51     pcmk__xml_free(target);
  52     pcmk__xml_free(patchset);
  53 }
  54 
  55 static void
  56 null_patchset_asserts(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  57 {
  58     pcmk__assert_asserts(pcmk__cib_element_in_patchset(NULL, NULL));
  59     pcmk__assert_asserts(pcmk__cib_element_in_patchset(NULL, PCMK_XE_NODES));
  60 }
  61 
  62 // PCMK_XE_ALERTS element has been created relative to ORIG_CIB
  63 #define CREATE_CIB                                                          \
  64     "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\""                        \
  65                     " " PCMK_XA_EPOCH "=\"0\""                              \
  66                     " " PCMK_XA_NUM_UPDATES "=\"0\">"                       \
  67       "<" PCMK_XE_CONFIGURATION ">"                                         \
  68         "<" PCMK_XE_CRM_CONFIG "/>"                                         \
  69         "<" PCMK_XE_NODES ">"                                               \
  70           "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\""                          \
  71                            " " PCMK_XA_UNAME "=\"node-1\"/>"                \
  72         "</" PCMK_XE_NODES ">"                                              \
  73         "<" PCMK_XE_RESOURCES "/>"                                          \
  74         "<" PCMK_XE_CONSTRAINTS "/>"                                        \
  75         "<" PCMK_XE_ALERTS "/>"                                             \
  76       "</" PCMK_XE_CONFIGURATION ">"                                        \
  77       "<" PCMK_XE_STATUS "/>"                                               \
  78     "</" PCMK_XE_CIB ">"
  79 
  80 static void
  81 create_op(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  82 {
  83     // Requested element was created
  84     assert_in_patchset(ORIG_CIB, CREATE_CIB, PCMK_XE_ALERTS, true);
  85 
  86     // Requested element's descendant was created
  87     assert_in_patchset(ORIG_CIB, CREATE_CIB, PCMK_XE_CONFIGURATION, true);
  88     assert_in_patchset(ORIG_CIB, CREATE_CIB, NULL, true);
  89 
  90     // Requested element was not changed
  91     assert_in_patchset(ORIG_CIB, CREATE_CIB, PCMK_XE_STATUS, false);
  92 }
  93 
  94 static void
  95 delete_op(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  96 {
  97     // Requested element was deleted
  98     assert_in_patchset(CREATE_CIB, ORIG_CIB, PCMK_XE_ALERTS, true);
  99 
 100     // Requested element's descendant was deleted
 101     assert_in_patchset(CREATE_CIB, ORIG_CIB, PCMK_XE_CONFIGURATION, true);
 102     assert_in_patchset(CREATE_CIB, ORIG_CIB, NULL, true);
 103 
 104     // Requested element was not changed
 105     assert_in_patchset(CREATE_CIB, ORIG_CIB, PCMK_XE_STATUS, false);
 106 }
 107 
 108 // PCMK_XE_CIB XML attribute was added relative to ORIG_CIB
 109 #define MODIFY_ADD_CIB                                                      \
 110     "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\""                        \
 111                     " " PCMK_XA_EPOCH "=\"0\""                              \
 112                     " " PCMK_XA_NUM_UPDATES "=\"0\""                        \
 113                     " " PCMK_XA_CRM_FEATURE_SET "=\"3.19.7\">"              \
 114       "<" PCMK_XE_CONFIGURATION ">"                                         \
 115         "<" PCMK_XE_CRM_CONFIG "/>"                                         \
 116         "<" PCMK_XE_NODES ">"                                               \
 117           "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\""                          \
 118                            " " PCMK_XA_UNAME "=\"node-1\"/>"                \
 119         "</" PCMK_XE_NODES ">"                                              \
 120         "<" PCMK_XE_RESOURCES "/>"                                          \
 121         "<" PCMK_XE_CONSTRAINTS "/>"                                        \
 122       "</" PCMK_XE_CONFIGURATION ">"                                        \
 123       "<" PCMK_XE_STATUS "/>"                                               \
 124     "</" PCMK_XE_CIB ">"
 125 
 126 // PCMK_XE_CIB XML attribute was updated relative to ORIG_CIB
 127 #define MODIFY_UPDATE_CIB                                                   \
 128     "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\""                        \
 129                     " " PCMK_XA_EPOCH "=\"0\""                              \
 130                     " " PCMK_XA_NUM_UPDATES "=\"1\">"                       \
 131       "<" PCMK_XE_CONFIGURATION ">"                                         \
 132         "<" PCMK_XE_CRM_CONFIG "/>"                                         \
 133         "<" PCMK_XE_NODES ">"                                               \
 134           "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\""                          \
 135                            " " PCMK_XA_UNAME "=\"node-1\"/>"                \
 136         "</" PCMK_XE_NODES ">"                                              \
 137         "<" PCMK_XE_RESOURCES "/>"                                          \
 138         "<" PCMK_XE_CONSTRAINTS "/>"                                        \
 139       "</" PCMK_XE_CONFIGURATION ">"                                        \
 140       "<" PCMK_XE_STATUS "/>"                                               \
 141     "</" PCMK_XE_CIB ">"
 142 
 143 // PCMK_XE_NODE XML attribute was added relative to ORIG_CIB
 144 #define MODIFY_ADD_NODE_CIB                                                 \
 145     "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\""                        \
 146                     " " PCMK_XA_EPOCH "=\"0\""                              \
 147                     " " PCMK_XA_NUM_UPDATES "=\"0\">"                       \
 148       "<" PCMK_XE_CONFIGURATION ">"                                         \
 149         "<" PCMK_XE_CRM_CONFIG "/>"                                         \
 150         "<" PCMK_XE_NODES ">"                                               \
 151           "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\""                          \
 152                            " " PCMK_XA_UNAME "=\"node-1\""                  \
 153                            " " PCMK_XA_TYPE "=\"member\"/>"                 \
 154         "</" PCMK_XE_NODES ">"                                              \
 155         "<" PCMK_XE_RESOURCES "/>"                                          \
 156         "<" PCMK_XE_CONSTRAINTS "/>"                                        \
 157       "</" PCMK_XE_CONFIGURATION ">"                                        \
 158       "<" PCMK_XE_STATUS "/>"                                               \
 159     "</" PCMK_XE_CIB ">"
 160 
 161 // PCMK_XE_NODE XML attribute was updated relative to ORIG_CIB
 162 #define MODIFY_UPDATE_NODE_CIB                                              \
 163     "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\""                        \
 164                     " " PCMK_XA_EPOCH "=\"0\""                              \
 165                     " " PCMK_XA_NUM_UPDATES "=\"0\">"                       \
 166       "<" PCMK_XE_CONFIGURATION ">"                                         \
 167         "<" PCMK_XE_CRM_CONFIG "/>"                                         \
 168         "<" PCMK_XE_NODES ">"                                               \
 169           "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\""                          \
 170                            " " PCMK_XA_UNAME "=\"node-2\"/>"                \
 171         "</" PCMK_XE_NODES ">"                                              \
 172         "<" PCMK_XE_RESOURCES "/>"                                          \
 173         "<" PCMK_XE_CONSTRAINTS "/>"                                        \
 174       "</" PCMK_XE_CONFIGURATION ">"                                        \
 175       "<" PCMK_XE_STATUS "/>"                                               \
 176     "</" PCMK_XE_CIB ">"
 177 
 178 static void
 179 modify_op(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
 180 {
 181     // Requested element was modified (attribute added)
 182     assert_in_patchset(ORIG_CIB, MODIFY_ADD_CIB, PCMK_XE_CIB, true);
 183 
 184     // Requested element was modified (attribute updated)
 185     assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_CIB, PCMK_XE_CIB, true);
 186 
 187     // Requested element was modified (attribute deleted)
 188     assert_in_patchset(MODIFY_ADD_CIB, ORIG_CIB, PCMK_XE_CIB, true);
 189 
 190     // Requested element's descendant was modified (attribute added)
 191     assert_in_patchset(ORIG_CIB, MODIFY_ADD_NODE_CIB, PCMK_XE_CIB, true);
 192     assert_in_patchset(ORIG_CIB, MODIFY_ADD_NODE_CIB, NULL, true);
 193 
 194     // Requested element's descendant was modified (attribute updated)
 195     assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_NODE_CIB, PCMK_XE_CIB, true);
 196     assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_NODE_CIB, NULL, true);
 197 
 198     // Requested element's descenant was modified (attribute deleted)
 199     assert_in_patchset(MODIFY_ADD_NODE_CIB, ORIG_CIB, PCMK_XE_CIB, true);
 200     assert_in_patchset(MODIFY_ADD_NODE_CIB, ORIG_CIB, NULL, true);
 201 
 202     // Requested element was not changed
 203     assert_in_patchset(ORIG_CIB, MODIFY_ADD_CIB, PCMK_XE_STATUS, false);
 204     assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_CIB, PCMK_XE_STATUS, false);
 205     assert_in_patchset(ORIG_CIB, MODIFY_ADD_NODE_CIB, PCMK_XE_STATUS, false);
 206     assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_NODE_CIB, PCMK_XE_STATUS, false);
 207 }
 208 
 209 // PCMK_XE_RESOURCES and PCMK_XE_CONSTRAINTS are swapped relative to ORIG_CIB
 210 #define MOVE_CIB                                                            \
 211     "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\""                        \
 212                     " " PCMK_XA_EPOCH "=\"0\""                              \
 213                     " " PCMK_XA_NUM_UPDATES "=\"0\">"                       \
 214       "<" PCMK_XE_CONFIGURATION ">"                                         \
 215         "<" PCMK_XE_CRM_CONFIG "/>"                                         \
 216         "<" PCMK_XE_NODES "/>"                                              \
 217         "<" PCMK_XE_CONSTRAINTS "/>"                                        \
 218         "<" PCMK_XE_RESOURCES "/>"                                          \
 219       "</" PCMK_XE_CONFIGURATION ">"                                        \
 220       "<" PCMK_XE_STATUS "/>"                                               \
 221     "</" PCMK_XE_CIB ">"
 222 
 223 static void
 224 move_op(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
 225 {
 226     // Requested element was moved
 227     assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_RESOURCES, true);
 228     assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_CONSTRAINTS, true);
 229 
 230     // Requested element's descendant was moved
 231     assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_CONFIGURATION, true);
 232     assert_in_patchset(ORIG_CIB, MOVE_CIB, NULL, true);
 233 
 234     // Requested element was not changed
 235     assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_STATUS, false);
 236 }
 237 
 238 PCMK__UNIT_TEST(pcmk__xml_test_setup_group, pcmk__xml_test_teardown_group,
 239                 cmocka_unit_test(null_patchset_asserts),
 240                 cmocka_unit_test(create_op),
 241                 cmocka_unit_test(delete_op),
 242                 cmocka_unit_test(modify_op),
 243                 cmocka_unit_test(move_op))

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