| 54 | } |
| 55 | |
| 56 | gboolean |
| 57 | test_rule(xmlNode * rule, GHashTable * node_hash, enum rsc_role_e role, crm_time_t * now) |
| 58 | { |
| 59 | xmlNode *expr = NULL; |
| 60 | gboolean test = TRUE; |
| 61 | gboolean empty = TRUE; |
| 62 | gboolean passed = TRUE; |
| 63 | gboolean do_and = TRUE; |
| 64 | const char *value = NULL; |
| 65 | |
| 66 | rule = expand_idref(rule, NULL); |
| 67 | value = crm_element_value(rule, XML_RULE_ATTR_BOOLEAN_OP); |
| 68 | if (safe_str_eq(value, "or")) { |
| 69 | do_and = FALSE; |
| 70 | passed = FALSE; |
| 71 | } |
| 72 | |
| 73 | crm_trace("Testing rule %s", ID(rule)); |
| 74 | for (expr = __xml_first_child(rule); expr != NULL; expr = __xml_next(expr)) { |
| 75 | test = test_expression(expr, node_hash, role, now); |
| 76 | empty = FALSE; |
| 77 | |
| 78 | if (test && do_and == FALSE) { |
| 79 | crm_trace("Expression %s/%s passed", ID(rule), ID(expr)); |
| 80 | return TRUE; |
| 81 | |
| 82 | } else if (test == FALSE && do_and) { |
| 83 | crm_trace("Expression %s/%s failed", ID(rule), ID(expr)); |
| 84 | return FALSE; |
| 85 | } |
| 86 | } |
| 87 | |
| 88 | if (empty) { |
| 89 | crm_err("Invalid Rule %s: rules must contain at least one expression", ID(rule)); |
| 90 | } |
| 91 | |
| 92 | crm_trace("Rule %s %s", ID(rule), passed ? "passed" : "failed"); |
| 93 | return passed; |
| 94 | } |
| 95 | |
| 96 | gboolean |
| 97 | test_expression(xmlNode * expr, GHashTable * node_hash, enum rsc_role_e role, crm_time_t * now) |
no test coverage detected