END_TEST START_TEST(test_eval_predicate_dot) { peos_resource_t* resources; Tree t_dot, t_res, t_exists; resources = (peos_resource_t *) calloc(1, sizeof(peos_resource_t)); strcpy(resources[0].name, "res"); strcpy(resources[0].value, "my_file"); t_res = make_tree("res", 0, NULL, NULL); t_exists = make_tree("exists", 0, NULL, NULL); t_dot = make_tree(NULL, DOT, t_res, t_exists); /* Happy path: requires { res.exists } */ system("touch my_file"); fail_unless(eval_predicate(resources, 1, t_dot) == 1, "eval_predicate_dot 1 failed"); system("rm my_file"); fail_unless(eval_predicate(resources, 1, t_dot) == 0, "eval_predicate_dot 2 failed"); /* requires { doc.title } -> [isTrue [title ${doc}]] */ /* requires { doc.spellchecked } -> [isTrue [spellchecked ${doc}] */ /* requires { doc.spellchecked == "True" } [spellchecked ${doc}] == true */ free(resources); }
static int eval_predicate(bool_node *pred) { bool_node *lhs, *rhs; switch(pred->tag) { case N_and: lhs = pred->data.children.left; rhs = pred->data.children.right; return eval_predicate(lhs) && eval_predicate(rhs); case N_or: lhs = pred->data.children.left; rhs = pred->data.children.right; return eval_predicate(lhs) || eval_predicate(rhs); case N_not: lhs = pred->data.children.left; return !eval_predicate(lhs); case N_true: return 1; case N_false: return 0; default: return eval_comparison(pred); }/*switch*/ }
END_TEST START_TEST(test_eval_predicate_and_or) { peos_resource_t* resources; Tree t_and, t_or, t_res0, t_res1; resources = (peos_resource_t *) calloc(2, sizeof(peos_resource_t)); strcpy(resources[0].name, "res0"); strcpy(resources[0].value, "my_file0"); strcpy(resources[1].name, "res1"); strcpy(resources[1].value, "my_file1"); t_res0 = make_tree("res0", 0, NULL, NULL); t_res1 = make_tree("res1", 0, NULL, NULL); t_and = make_tree(NULL, AND, t_res0, t_res1); t_or = make_tree(NULL, OR, t_res0, t_res1); system("touch my_file0"); system("touch my_file1"); fail_unless(eval_predicate(resources, 2, t_and) == 1, "res0 AND res1 (both exist) failed"); fail_unless(eval_predicate(resources, 2, t_or) == 1, "res0 OR res1 (both exist) failed"); system("rm my_file0"); fail_unless(eval_predicate(resources, 2, t_and) == 0, "res0 AND res1 (res0 doesn't exist) failed"); fail_unless(eval_predicate(resources, 2, t_or) == 1, "res0 OR res1 (res0 doesn't exist) failed"); system("rm my_file1"); fail_unless(eval_predicate(resources, 2, t_and) == 0, "res0 AND res1 (neither exists) failed"); fail_unless(eval_predicate(resources, 2, t_or) == 0, "res0 OR res1 (neither exists) failed"); free(resources); }
END_TEST START_TEST(test_eval_predicate_single_node) { peos_resource_t* resources; Tree t; resources = (peos_resource_t *) calloc(1, sizeof(peos_resource_t)); strcpy(resources[0].name, "res"); strcpy(resources[0].value, "my_file"); t = make_tree("\"True\"", 0, NULL, NULL); fail_unless(eval_predicate(NULL, 0, t) == 1, "\"True\" failed"); free(t); t = make_tree("\"true\"", 0, NULL, NULL); fail_unless(eval_predicate(NULL, 0, t) == 1, "\"true\" failed"); free(t); t = make_tree("\"1\"", 0, NULL, NULL); fail_unless(eval_predicate(NULL, 0, t) == 1, "\"1\" failed"); free(t); t = make_tree("\"False\"", 0, NULL, NULL); fail_unless(eval_predicate(NULL, 0, t) == 0, "\"False\" failed"); free(t); t = make_tree("\"false\"", 0, NULL, NULL); fail_unless(eval_predicate(NULL, 0, t) == 0, "\"false\" failed"); free(t); t = make_tree("\"0\"", 0, NULL, NULL); fail_unless(eval_predicate(NULL, 0, t) == 0, "\"0\" failed"); free(t); t = make_tree("res", 0, NULL, NULL); system("touch my_file"); fail_unless(eval_predicate(resources, 1, t) == 1, "[exists ${res}] (= my_file) failed"); system("rm my_file"); fail_unless(eval_predicate(resources, 1, t) == 0, "not [exists ${res}] (= my_file0) failed"); free(t); free(resources); }
END_TEST START_TEST(test_eval_predicate_abstract) { peos_resource_t* resources; Tree t_res; resources = (peos_resource_t *) calloc(1, sizeof(peos_resource_t)); strcpy(resources[0].name, "res"); strcpy(resources[0].value, "my_file"); strcpy(resources[0].qualifier, "abstract"); t_res = make_tree("res", 0, NULL, NULL); fail_unless(eval_predicate(resources, 1, t_res) == 0, "eval_predicate_abstract_0 failed"); /* XXX ignores qualifier */ free(resources); }
int is_provides_true(Node n) { int i; int num_resources = 0; peos_resource_t* resources; peos_resource_t* proc_resources; peos_context_t* context = peos_get_context(PID(n)); resources = get_resource_list_action_provides(PID(n), n->name, &num_resources); if (context && context->num_resources > 0) { proc_resources = (peos_resource_t *) calloc(context->num_resources, sizeof(peos_resource_t)); for (i = 0; i < context->num_resources; i++) { strcpy(proc_resources[i].name, context->resources[i].name); strcpy(proc_resources[i].value, context->resources[i].value); } eval_resource_list(&proc_resources, context->num_resources); fill_resource_list_value(proc_resources, context->num_resources, &resources, num_resources); } return eval_predicate(resources, num_resources, n->provides); }
END_TEST START_TEST(test_eval_predicate_eq_ne_gt_le_ge) { peos_resource_t* resources; Tree t_eq, t_ne, t_lt, t_gt, t_le, t_ge, t_dot0, t_dot1, t_res0, t_res1, t_attr0, t_attr1; resources = (peos_resource_t *) calloc(2, sizeof(peos_resource_t)); strcpy(resources[0].name, "res0"); strcpy(resources[0].value, "my_file0"); strcpy(resources[1].name, "res1"); strcpy(resources[1].value, "my_file1"); t_res0 = make_tree("res0", 0, NULL, NULL); t_attr0 = make_tree("filesize", 0, NULL, NULL); t_dot0 = make_tree(NULL, DOT, t_res0, t_attr0); t_res1 = make_tree("res1", 0, NULL, NULL); t_attr1 = make_tree("filesize", 0, NULL, NULL); t_dot1 = make_tree(NULL, DOT, t_res1, t_attr1); t_eq = make_tree(NULL, EQ, t_dot0, t_dot1); // res0.filesize == res1.filesize t_ne = make_tree(NULL, NE, t_dot0, t_dot1); // res0.filesize != res1.filesize t_lt = make_tree(NULL, LT, t_dot0, t_dot1); // res0.filesize < res1.filesize t_gt = make_tree(NULL, GT, t_dot0, t_dot1); // res0.filesize > res1.filesize t_le = make_tree(NULL, LE, t_dot0, t_dot1); // res0.filesize <= res1.filesize t_ge = make_tree(NULL, GE, t_dot0, t_dot1); // res0.filesize >= res1.filesize system("touch my_file0"); system("touch my_file1"); fail_unless(eval_predicate(resources, 2, t_eq) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_ne) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_lt) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_gt) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_le) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_ge) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); system("echo \"12\" > my_file0"); system("echo \"1234\" > my_file1"); fail_unless(eval_predicate(resources, 2, t_eq) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_ne) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_lt) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_gt) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_le) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_ge) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); system("echo \"1234\" > my_file0"); system("echo \"12\" > my_file1"); fail_unless(eval_predicate(resources, 2, t_eq) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_ne) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_lt) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_gt) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_le) == 0, "eval_predicate_eq_ne_gt_le_ge failed"); fail_unless(eval_predicate(resources, 2, t_ge) == 1, "eval_predicate_eq_ne_gt_le_ge failed"); system("rm my_file0"); system("rm my_file1"); }
END_TEST START_TEST(test_eval_predicate_error) { peos_resource_t* resources = NULL; Tree t_dot, t_op, t0, t1, t_true; t0 = make_tree("res", 0, NULL, NULL); //test resources == NULL fail_unless(eval_predicate(resources, 0, t0) == -1, "null resource list failed"); //test num_resources == 0 resources = (peos_resource_t *) calloc(1, sizeof(peos_resource_t)); fail_unless(eval_predicate(resources, 0, t0) == -1, "empty resource list failed"); //resource name not found t1 = make_tree("exists", 0, NULL, NULL); t_dot = make_tree(NULL, DOT, t0, t1); strcpy(resources[0].name, "res_not_in_tree"); strcpy(resources[0].value, "res_not_in_tree"); fail_unless(eval_predicate(resources, 1, t_dot) == -1, "unbound resource failed"); //test tcl attr procedure not exists strcpy(resources[0].name, "res"); strcpy(resources[0].value, "val"); free(t1); free(t_dot); t1 = make_tree("not_exist_tcl_proc", 0, NULL, NULL); t_dot = make_tree(NULL, DOT, t0, t1); fail_unless(eval_predicate(resources, 1, t_dot) == -1, "missing tcl attr procedure failed"); //test operators that operate on error tree t_true = make_tree("\"True\"", 0, NULL, NULL); t_op = make_tree(NULL, EQ, t_true, t_dot); fail_unless(eval_predicate(resources, 1, t_op) == -1, "missing tcl attr procedure EQ failed"); t_op->ival = NE; fail_unless(eval_predicate(resources, 1, t_op) == -1, "missing tcl attr procedure NE failed"); t_op->ival = LT; fail_unless(eval_predicate(resources, 1, t_op) == -1, "missing tcl attr procedure LT failed"); t_op->ival = GT; fail_unless(eval_predicate(resources, 1, t_op) == -1, "missing tcl attr procedure GT failed"); t_op->ival = LE; fail_unless(eval_predicate(resources, 1, t_op) == -1, "missing tcl attr procedure LE failed"); t_op->ival = GE; fail_unless(eval_predicate(resources, 1, t_op) == -1, "missing tcl attr procedure GE failed"); t_op->ival = AND; fail_unless(eval_predicate(resources, 1, t_op) == -1, "missing tcl attr procedure AND failed"); t_op->ival = OR; /* "True" || res.not_exist_tcl_proc is true */ fail_unless(eval_predicate(resources, 1, t_op) == 1, "missing tcl attr procedure OR failed"); free(resources); }
END_TEST START_TEST(test_eval_predicate_null_tree) { fail_unless(eval_predicate(NULL, 0, NULL) == 1, "eval_predicate_null_tree failed"); }
int eval_tree(config_vars *vars) { the_vars = vars; return eval_predicate(the_tree); }