static void test_simple(void **state) { struct state *st = (*state); st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 2); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface[name='iface1']"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface[name='iface1']/ietf-ip:ipv4/address"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 2); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface[name='iface1']/ietf-ip:ipv4/address[ip='10.0.0.1']"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); ly_set_free(st->set); st->set = NULL; }
static void test_attributes(void **state) { struct state *st = (*state); st->set = lyd_find_xpath(st->dt, "//*[@*]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 6); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//@*/.."); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 6); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//*[@*[substring(local-name(.),1,2) = 'ip']]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 4); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//*[@*[substring(local-name(.),1,2) = 'ip']]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 4); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//*[@yang:ip_attr > '20']"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 2); ly_set_free(st->set); st->set = NULL; }
int __wrap_sr_delete_item(sr_session_ctx_t *session, const char *xpath, const sr_edit_options_t opts) { (void)session; struct ly_set *set; uint32_t i; set = lyd_find_xpath(data, xpath); assert_ptr_not_equal(set, NULL); if ((opts & SR_EDIT_STRICT) && !set->number) { ly_set_free(set); return SR_ERR_DATA_MISSING; } for (i = 0; i < set->number; ++i) { if ((opts & SR_EDIT_NON_RECURSIVE) && set->set.d[i]->child) { ly_set_free(set); return SR_ERR_UNSUPPORTED; } lyd_free(set->set.d[i]); } ly_set_free(set); return SR_ERR_OK; }
static void test_invalid(void **state) { struct state *st = (*state); st->set = lyd_find_xpath(st->dt, "/:interface/name"); assert_ptr_equal(st->set, NULL); assert_int_not_equal(ly_errno, 0); st->set = lyd_find_xpath(st->dt, "/interface/name[./]"); assert_ptr_equal(st->set, NULL); assert_int_not_equal(ly_errno, 0); st->set = lyd_find_xpath(st->dt, "/interface/name[./.]()"); assert_ptr_equal(st->set, NULL); assert_int_not_equal(ly_errno, 0); }
int __wrap_sr_move_item(sr_session_ctx_t *session, const char *xpath, const sr_move_position_t position, const char *relative_item) { (void)session; struct ly_set *set, *set2 = NULL; struct lyd_node *node; set = lyd_find_xpath(data, xpath); assert_ptr_not_equal(set, NULL); assert_int_equal(set->number, 1); switch (position) { case SR_MOVE_BEFORE: set2 = lyd_find_xpath(data, relative_item); assert_ptr_not_equal(set2, NULL); assert_int_equal(set2->number, 1); assert_int_equal(lyd_insert_before(set2->set.d[0], set->set.d[0]), 0); break; case SR_MOVE_AFTER: set2 = lyd_find_xpath(data, relative_item); assert_ptr_not_equal(set2, NULL); assert_int_equal(set2->number, 1); assert_int_equal(lyd_insert_after(set2->set.d[0], set->set.d[0]), 0); break; case SR_MOVE_FIRST: node = set->set.d[0]->parent->child; assert_int_equal(lyd_insert_before(node, set->set.d[0]), 0); break; case SR_MOVE_LAST: node = set->set.d[0]->parent->child->prev; assert_int_equal(lyd_insert_after(node, set->set.d[0]), 0); break; } ly_set_free(set); ly_set_free(set2); return SR_ERR_OK; }
int __wrap_sr_get_item_next(sr_session_ctx_t *session, sr_val_iter_t *iter, sr_val_t **value) { static struct ly_set *ietf_if_set = NULL; const char *xpath = (const char *)iter; char *path; (void)session; if (!strcmp(xpath, "/ietf-interfaces:interfaces//*")) { if (!ietf_if_set) { ietf_if_set = lyd_find_xpath(data, xpath); } if (!ietf_if_set->number) { ly_set_free(ietf_if_set); ietf_if_set = NULL; return SR_ERR_NOT_FOUND; } path = lyd_path(ietf_if_set->set.d[0]); *value = calloc(1, sizeof **value); op_set_srval(ietf_if_set->set.d[0], path, 1, *value, NULL); (*value)->dflt = ietf_if_set->set.d[0]->dflt; free(path); --ietf_if_set->number; if (ietf_if_set->number) { memmove(ietf_if_set->set.d, ietf_if_set->set.d + 1, ietf_if_set->number * sizeof(void *)); } } else { *value = NULL; return SR_ERR_NOT_FOUND; } return SR_ERR_OK; }
static void test_advanced(void **state) { struct state *st = (*state); st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface[name='iface1']/ietf-ip:ipv4/*[ip]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 3); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces//*[ietf-ip:ip]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 10); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces//*[ietf-ip:ip[.='10.0.0.1']]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 2); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//ietf-ip:ip[.='10.0.0.1']"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 2); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//*[../description]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 14); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//interface[name='iface1']/ipv4//*"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 12); ly_set_free(st->set); st->set = NULL; }
static void test_functions_operators(void **state) { struct state *st = (*state); st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface/name[true() and not(false()) and not(boolean(. != 'iface1'))]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[0])->value_str, "iface1"); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface/name[round(ceiling(1.8)+0.4)+floor(0.28)]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[0])->value_str, "iface2"); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "/ietf-interfaces:interfaces/interface/type[string-length(substring-after(\"hello12hi\", '12')) != 2 or starts-with(.,'iana') and contains(.,'back') and .=substring-before(concat(string(.),'aab', \"abb\"),'aa')]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[0])->value_str, "iana-if-type:softwareLoopback"); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//*[neighbor/link-layer-address = translate(normalize-space('\t\n01 .34 .56\t.78.9a\n\r.bc.de.f0 \t'), '. ', ':')]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 2); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//ip[position() = last()]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[0])->value_str, "2001:abcd:ef01:2345:6789:0:1:1"); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//ip[count(//*[.='52'])]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 1); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[0])->value_str, "10.0.0.1"); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//*[local-name()='autoconf' and namespace-uri()='urn:ietf:params:xml:ns:yang:ietf-ip']"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 2); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//interface[name='iface2']//. | //ip | //interface[number((1 mod (20 - 15)) div 1)]//."); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 68); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//ip[position() mod 2 = 1] | //ip[position() mod 2 = 0]"); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 10); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[0])->value_str, "10.0.0.1"); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[1])->value_str, "172.0.0.1"); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[2])->value_str, "10.0.0.2"); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[7])->value_str, "10.0.0.1"); assert_string_equal(((struct lyd_node_leaf_list *)st->set->set.d[9])->value_str, "2001:abcd:ef01:2345:6789:0:1:1"); ly_set_free(st->set); st->set = NULL; st->set = lyd_find_xpath(st->dt, "//*[1] | //*[last()] | //*[10] | //*[8]//."); assert_ptr_not_equal(st->set, NULL); assert_int_equal(st->set->number, 15); ly_set_free(st->set); st->set = NULL; }