示例#1
0
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;
}
示例#2
0
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;
}
示例#4
0
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;
}
示例#7
0
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;
}
示例#8
0
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;
}