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' />" \
44null_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' />" \
70id_missing(
void **state)
82#define RULE_IDREF_PARENT "<" PCMK_XE_CIB ">" RULE_OP "</" PCMK_XE_CIB ">"
85good_idref(
void **state)
100bad_idref(
void **state)
114#define RULE_EMPTY "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' />"
117empty_default(
void **state)
128#define RULE_EMPTY_AND \
129 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \
130 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_AND "' />"
133empty_and(
void **state)
144#define RULE_EMPTY_OR \
145 "<" PCMK_XE_RULE " " PCMK_XA_ID "='r' " \
146 PCMK_XA_BOOLEAN_OP "='" PCMK_VALUE_OR "' />"
149empty_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 ">"
169default_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 ">"
191invalid_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 ">"
212and_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 ">"
229lonely_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 ">"
249and_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 ">"
270and_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 ">"
291or_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 ">"
311or_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 ">"
329lonely_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 ">"
349or_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))
#define PCMK_ACTION_MONITOR
#define PCMK_RESOURCE_CLASS_OCF
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.
void crm_time_free(crm_time_t *dt)
crm_time_t * crm_time_new_undefined(void)
Allocate memory for an uninitialized time object.
struct crm_time_s crm_time_t
#define RULE_AND_TWO_FAIL
#define RULE_IDREF_PARENT
#define RULE_DEFAULT_BOOLEAN_OP
#define RULE_INVALID_BOOLEAN_OP
#define RULE_OP_MISSING_ID
#define RULE_AND_ONE_FAILS
#define RULE_OR_ONE_PASSES
int pcmk__xml_test_teardown_group(void **state)
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
int pcmk__xml_test_setup_group(void **state)
Wrappers for and extensions to libxml2.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xml_free(xmlNode *xml)
xmlNode * pcmk__xml_parse(const char *input)