25 .rsc_provider =
"heartbeat",
26 .rsc_agent =
"IPaddr2",
28 .op_interval_ms = 10000,
37 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' > " \ 38 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e' " \ 39 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 40 PCMK_XA_INTERVAL "='10s' />" \ 44 null_invalid(
void **state)
62 #define RULE_OP_MISSING_ID \ 63 "<" PCMK_XE_RULE "> " \ 64 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e' " \ 65 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 66 PCMK_XA_INTERVAL "='10s' />" \ 70 id_missing(
void **state)
82 #define RULE_IDREF_PARENT "<" PCMK_XE_CIB ">" RULE_OP "</" PCMK_XE_CIB ">" 85 good_idref(
void **state)
100 bad_idref(
void **state)
114 #define RULE_EMPTY "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' />" 117 empty_default(
void **state)
128 #define RULE_EMPTY_AND \ 129 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 130 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_AND "' />" 133 empty_and(
void **state)
144 #define RULE_EMPTY_OR \ 145 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 146 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_OR "' />" 149 empty_or(
void **state)
159 #define RULE_DEFAULT_BOOLEAN_OP \ 160 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' >" \ 161 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 162 PCMK_XA_TYPE "='Dummy' />" \ 163 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 164 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 165 PCMK_XA_INTERVAL "='10s' />" \ 166 "</" PCMK_XE_RULE ">" 169 default_boolean_op(
void **state)
180 #define RULE_INVALID_BOOLEAN_OP \ 181 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 182 PCMK_XA_BOOLEAN_OP "='not-an-op' >" \ 183 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 184 PCMK_XA_TYPE "='Dummy' />" \ 185 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 186 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 187 PCMK_XA_INTERVAL "='10s' />" \ 188 "</" PCMK_XE_RULE ">" 191 invalid_boolean_op(
void **state)
201 #define RULE_AND_PASSES \ 202 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 203 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_AND "' >" \ 204 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 205 PCMK_XA_TYPE "='IPaddr2' />" \ 206 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 207 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 208 PCMK_XA_INTERVAL "='10s' />" \ 209 "</" PCMK_XE_RULE ">" 212 and_passes(
void **state)
221 #define RULE_LONELY_AND \ 222 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 223 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_AND "' >" \ 224 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 225 PCMK_XA_TYPE "='IPaddr2' />" \ 226 "</" PCMK_XE_RULE ">" 229 lonely_and_passes(
void **state)
238 #define RULE_AND_ONE_FAILS \ 239 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 240 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_AND "' >" \ 241 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 242 PCMK_XA_TYPE "='Dummy' />" \ 243 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 244 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 245 PCMK_XA_INTERVAL "='10s' />" \ 246 "</" PCMK_XE_RULE ">" 249 and_one_fails(
void **state)
259 #define RULE_AND_TWO_FAIL \ 260 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 261 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_AND "' >" \ 262 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 263 PCMK_XA_TYPE "='Dummy' />" \ 264 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 265 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 266 PCMK_XA_INTERVAL "='9s' />" \ 267 "</" PCMK_XE_RULE ">" 270 and_two_fail(
void **state)
280 #define RULE_OR_ONE_PASSES \ 281 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 282 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_OR "' >" \ 283 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 284 PCMK_XA_TYPE "='Dummy' />" \ 285 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 286 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 287 PCMK_XA_INTERVAL "='10s' />" \ 288 "</" PCMK_XE_RULE ">" 291 or_one_passes(
void **state)
300 #define RULE_OR_TWO_PASS \ 301 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 302 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_OR "' >" \ 303 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 304 PCMK_XA_TYPE "='IPAddr2' />" \ 305 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 306 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 307 PCMK_XA_INTERVAL "='10s' />" \ 308 "</" PCMK_XE_RULE ">" 311 or_two_pass(
void **state)
320 #define RULE_LONELY_OR \ 321 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 322 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_OR "' >" \ 323 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 324 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 325 PCMK_XA_INTERVAL "='10s' />" \ 326 "</" PCMK_XE_RULE ">" 329 lonely_or_passes(
void **state)
338 #define RULE_OR_FAILS \ 339 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \ 340 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_OR "' >" \ 341 " <" PCMK_XE_RSC_EXPRESSION " " PCMK_XA_ID "='e1' " \ 342 PCMK_XA_TYPE "='Dummy' />" \ 343 " <" PCMK_XE_OP_EXPRESSION " " PCMK_XA_ID "='e2' " \ 344 PCMK_XA_NAME "='" PCMK_ACTION_MONITOR "' " \ 345 PCMK_XA_INTERVAL "='20s' />" \ 346 "</" PCMK_XE_RULE ">" 349 or_fails(
void **state)
360 cmocka_unit_test(null_invalid),
361 cmocka_unit_test(id_missing),
362 cmocka_unit_test(good_idref),
363 cmocka_unit_test(bad_idref),
364 cmocka_unit_test(empty_default),
365 cmocka_unit_test(empty_and),
366 cmocka_unit_test(empty_or),
367 cmocka_unit_test(default_boolean_op),
368 cmocka_unit_test(invalid_boolean_op),
369 cmocka_unit_test(and_passes),
370 cmocka_unit_test(lonely_and_passes),
371 cmocka_unit_test(and_one_fails),
372 cmocka_unit_test(and_two_fail),
373 cmocka_unit_test(or_one_passes),
374 cmocka_unit_test(or_two_pass),
375 cmocka_unit_test(lonely_or_passes),
376 cmocka_unit_test(or_fails))
crm_time_t * crm_time_new_undefined(void)
Allocate memory for an uninitialized time object.
#define RULE_INVALID_BOOLEAN_OP
struct crm_time_s crm_time_t
#define PCMK_ACTION_MONITOR
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
#define PCMK_RESOURCE_CLASS_OCF
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
#define RULE_AND_TWO_FAIL
void pcmk__xml_free(xmlNode *xml)
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
int pcmk_evaluate_rule(xmlNode *rule, const pcmk_rule_input_t *rule_input, crm_time_t *next_change)
Evaluate a single rule, including all its conditions.
#define RULE_OR_ONE_PASSES
int pcmk__xml_test_setup_group(void **state)
Wrappers for and extensions to libxml2.
#define RULE_AND_ONE_FAILS
#define RULE_IDREF_PARENT
int pcmk__xml_test_teardown_group(void **state)
xmlNode * pcmk__xml_parse(const char *input)
#define RULE_OP_MISSING_ID
#define RULE_DEFAULT_BOOLEAN_OP
void crm_time_free(crm_time_t *dt)