Blame tests/data/test_metadata.c

Packit 8fb591
/**
Packit 8fb591
 * @file test_metadata.c
Packit 8fb591
 * @author Radek Krejci <rkrejci@cesnet.cz>
Packit 8fb591
 * @brief Cmocka tests for ietf-yang-metadata (annotations extension).
Packit 8fb591
 *
Packit 8fb591
 * Copyright (c) 2017 CESNET, z.s.p.o.
Packit 8fb591
 *
Packit 8fb591
 * This source code is licensed under BSD 3-Clause License (the "License").
Packit 8fb591
 * You may not use this file except in compliance with the License.
Packit 8fb591
 * You may obtain a copy of the License at
Packit 8fb591
 *
Packit 8fb591
 *     https://opensource.org/licenses/BSD-3-Clause
Packit 8fb591
 */
Packit 8fb591
Packit 8fb591
#include <stdio.h>
Packit 8fb591
#include <stdlib.h>
Packit 8fb591
#include <setjmp.h>
Packit 8fb591
#include <stdarg.h>
Packit 8fb591
#include <cmocka.h>
Packit 8fb591
Packit 8fb591
#include "tests/config.h"
Packit 8fb591
#include "libyang.h"
Packit 8fb591
Packit 8fb591
struct state {
Packit 8fb591
    struct ly_ctx *ctx;
Packit 8fb591
    struct lyd_node *data;
Packit 8fb591
    char *str;
Packit 8fb591
};
Packit 8fb591
Packit 8fb591
static int
Packit 8fb591
setup_f(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st;
Packit 8fb591
Packit 8fb591
    (*state) = st = calloc(1, sizeof *st);
Packit 8fb591
    if (!st) {
Packit 8fb591
        fprintf(stderr, "Memory allocation error");
Packit 8fb591
        return -1;
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    /* libyang context */
Packit 8fb591
    st->ctx = ly_ctx_new(TESTS_DIR"/schema/yang/ietf/", 0);
Packit 8fb591
    if (!st->ctx) {
Packit 8fb591
        fprintf(stderr, "Failed to create context.\n");
Packit 8fb591
        goto error;
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    return 0;
Packit 8fb591
Packit 8fb591
error:
Packit 8fb591
    ly_ctx_destroy(st->ctx, NULL);
Packit 8fb591
    free(st);
Packit 8fb591
    (*state) = NULL;
Packit 8fb591
Packit 8fb591
    return -1;
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static int
Packit 8fb591
teardown_f(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
Packit 8fb591
    free(st->str);
Packit 8fb591
    lyd_free_withsiblings(st->data);
Packit 8fb591
    ly_ctx_destroy(st->ctx, NULL);
Packit 8fb591
    free(st);
Packit 8fb591
    (*state) = NULL;
Packit 8fb591
Packit 8fb591
    return 0;
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * leafref is not supported for annotations in libyang
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_leafref_type(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  import ietf-yang-metadata { prefix md; }"
Packit 8fb591
                    "  md:annotation x { type leafref { path \"/x:a\"; } }"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_equal(mod, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EPLUGIN);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * attribute with no appropriate anotation specification cannot be loaded
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_unknown_metadata_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "a";
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    /* parse input with strict - error */
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
Packit 8fb591
    /* parse input without strict - passes, but the attribute is not present */
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_CONFIG, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    assert_ptr_equal(st->data->attr, NULL);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_unknown_metadata_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\": \"a\","
Packit 8fb591
        "\"@x:a\": {"
Packit 8fb591
            "\"x:attribute\": \"not-defined\""
Packit 8fb591
        "}"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    /* parse input with strict - error */
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_CONFIG | LYD_OPT_STRICT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INMETA);
Packit 8fb591
Packit 8fb591
    /* parse input without strict - passes, but the attribute is not present */
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_CONFIG, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    assert_ptr_equal(st->data->attr, NULL);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's filter's attributes
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_filter1_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *filter_subtree = "<get xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
Packit 8fb591
                    "<filter type=\"subtree\">
Packit 8fb591
                    "xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\"><module-set-id/>"
Packit 8fb591
                    "</modules-state></filter></get>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, filter_subtree, LYD_XML, LYD_OPT_RPC, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_XML, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, filter_subtree);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_filter2_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *filter_xpath = "<get xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
Packit 8fb591
                    "
Packit 8fb591
                    "xmlns:yanglib=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
Packit 8fb591
                    "select=\"/yanglib:modules-state/yanglib:module-set-id\"/></get>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal((mod = lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG)), NULL);
Packit 8fb591
    assert_int_equal(lys_features_enable(mod, "xpath"), 0);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, filter_xpath, LYD_XML, LYD_OPT_RPC, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_XML, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, filter_xpath);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's filter attributes
Packit 8fb591
 * - incorrect namespace
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_filter3_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *input =
Packit 8fb591
        "<get-config xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.1\">"
Packit 8fb591
          "<source>"
Packit 8fb591
            "<running/>"
Packit 8fb591
          "</source>"
Packit 8fb591
          "<filter nc:type=\"subtree\">"
Packit 8fb591
            "<some>filter</some>"
Packit 8fb591
          "</filter>"
Packit 8fb591
        "</get-config>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_RPC | LYD_OPT_STRICT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_RPC, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    assert_ptr_equal(st->data->child->next->attr, NULL);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's filter attributes
Packit 8fb591
 * - incorrect value
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_filter4_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *input =
Packit 8fb591
        "<get-config xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
Packit 8fb591
          "<source>"
Packit 8fb591
            "<running/>"
Packit 8fb591
          "</source>"
Packit 8fb591
          "<filter type=\"subtrees\">"
Packit 8fb591
            "<some>filter</some>"
Packit 8fb591
          "</filter>"
Packit 8fb591
        "</get-config>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_RPC, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INMETA);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's filter attributes
Packit 8fb591
 * - xpath feature off
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_filter5_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *input =
Packit 8fb591
        "<get-config xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
Packit 8fb591
          "<source>"
Packit 8fb591
            "<running/>"
Packit 8fb591
          "</source>"
Packit 8fb591
          "<filter type=\"xpath\">"
Packit 8fb591
            "<some>filter</some>"
Packit 8fb591
          "</filter>"
Packit 8fb591
        "</get-config>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_RPC, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INMETA);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's filter attributes
Packit 8fb591
 * - mix of filter types
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_filter6_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *input =
Packit 8fb591
        "<get-config xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
Packit 8fb591
          "<source>"
Packit 8fb591
            "<running/>"
Packit 8fb591
          "</source>"
Packit 8fb591
          "<filter type=\"subtree\" type=\"xpath\" select=\"/*[local-name() = 'modules-state']/*\">"
Packit 8fb591
          "</filter>"
Packit 8fb591
        "</get-config>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal((mod = lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG)), NULL);
Packit 8fb591
    assert_int_equal(lys_features_enable(mod, "xpath"), 0);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_RPC, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's filter attributes
Packit 8fb591
 * - xpath filter without select
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_filter7_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *input =
Packit 8fb591
        "<get-config xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
Packit 8fb591
          "<source>"
Packit 8fb591
            "<running/>"
Packit 8fb591
          "</source>"
Packit 8fb591
          "<filter type=\"xpath\">"
Packit 8fb591
          "</filter>"
Packit 8fb591
        "</get-config>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal((mod = lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG)), NULL);
Packit 8fb591
    assert_int_equal(lys_features_enable(mod, "xpath"), 0);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_RPC, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_MISSATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - invalid operation's value
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig1_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "
Packit 8fb591
                    "nc:operation=\"not-defined\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    /* operation attribute is valid, but its value is invalid so the parsing fails no matter if strict is used */
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INMETA);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig1_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":\"a\","
Packit 8fb591
        "\"@x:a\":{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"not-defined\""
Packit 8fb591
        "}"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    /* operation attribute is valid, but its value is invalid so the parsing fails no matter if strict is used */
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INMETA);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - too many operation attributes
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig2_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "
Packit 8fb591
                    "nc:operation=\"merge\" nc:operation=\"replace\" nc:operation=\"create\" "
Packit 8fb591
                    "nc:operation=\"delete\" nc:operation=\"remove\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig2_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":\"a\","
Packit 8fb591
        "\"@x:a\":{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"merge\","
Packit 8fb591
            "\"ietf-netconf:operation\":\"replace\","
Packit 8fb591
            "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
            "\"ietf-netconf:operation\":\"delete\","
Packit 8fb591
            "\"ietf-netconf:operation\":\"remove\""
Packit 8fb591
        "}"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - correct use
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig3_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "
Packit 8fb591
                    "nc:operation=\"create\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_XML, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig3_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":\"a\","
Packit 8fb591
        "\"@x:a\":{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"create\""
Packit 8fb591
        "}"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_JSON, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - insert, value attr in system-ordered list
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig4_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig4_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[\"a\"],"
Packit 8fb591
        "\"@x:a\":[{"
Packit 8fb591
            "\"yang:insert\":\"before\","
Packit 8fb591
            "\"yang:value\":\"b\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - insert attr in operation delete
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig5_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"delete\" yang:insert=\"first\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig5_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[\"a\"],"
Packit 8fb591
        "\"@x:a\":[{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"delete\","
Packit 8fb591
            "\"yang:insert\":\"first\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - several insert attr
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig6_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"first\" yang:insert=\"last\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig6_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[\"a\"],"
Packit 8fb591
        "\"@x:a\":[{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
            "\"yang:insert\":\"first\","
Packit 8fb591
            "\"yang:insert\":\"last\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - several value attr
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig7_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"before\" yang:value=\"b\" yang:value=\"d\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig7_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[\"a\"],"
Packit 8fb591
        "\"@x:a\":[{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
            "\"yang:insert\":\"before\","
Packit 8fb591
            "\"yang:value\":\"b\","
Packit 8fb591
            "\"yang:value\":\"d\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - correct use
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig8_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"first\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_XML, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig8_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[\"a\"],"
Packit 8fb591
        "\"@x:a\":[{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
            "\"yang:insert\":\"first\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_JSON, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - correct use
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig9_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"replace\" yang:insert=\"before\" yang:value=\"b\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_XML, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig9_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[\"a\"],"
Packit 8fb591
        "\"@x:a\":[{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"replace\","
Packit 8fb591
            "\"yang:insert\":\"before\","
Packit 8fb591
            "\"yang:value\":\"b\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_JSON, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - insert in system ordered list
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig10_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by system; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"before\" yang:key=\"[...]\"><k>a</k>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig10_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by system; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[{"
Packit 8fb591
            "\"@\":{"
Packit 8fb591
                "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
                "\"yang:insert\":\"before\","
Packit 8fb591
                "\"yang:key\":\"[...]\""
Packit 8fb591
            "},"
Packit 8fb591
            "\"k\":\"a\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - insert attr in operation delete
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig11_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"delete\" yang:insert=\"first\"><k>a</k>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig11_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[{"
Packit 8fb591
            "\"@\":{"
Packit 8fb591
                "\"ietf-netconf:operation\":\"delete\","
Packit 8fb591
                "\"yang:insert\":\"first\""
Packit 8fb591
            "},"
Packit 8fb591
            "\"k\":\"a\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - several insert attr
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig12_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"before\" yang:insert=\"last\"><k>a</k>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig12_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[{"
Packit 8fb591
            "\"@\":{"
Packit 8fb591
                "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
                "\"yang:insert\":\"before\","
Packit 8fb591
                "\"yang:insert\":\"last\""
Packit 8fb591
            "},"
Packit 8fb591
            "\"k\":\"a\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - several key attr
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig13_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"before\" yang:key=\"[...]\" yang:key=\"[...]\"><k>a</k>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig13_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[{"
Packit 8fb591
            "\"@\":{"
Packit 8fb591
                "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
                "\"yang:insert\":\"before\","
Packit 8fb591
                "\"yang:key\":\"[...]\","
Packit 8fb591
                "\"yang:key\":\"[...]\""
Packit 8fb591
            "},"
Packit 8fb591
            "\"k\":\"a\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - correct use
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig14_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"first\"><k>a</k>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_XML, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig14_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[{"
Packit 8fb591
            "\"@\":{"
Packit 8fb591
                "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
                "\"yang:insert\":\"first\""
Packit 8fb591
            "},"
Packit 8fb591
            "\"k\":\"a\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_JSON, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - correct use
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig15_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"replace\" yang:insert=\"before\" yang:key=\"[...]\"><k>a</k>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_XML, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig15_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[{"
Packit 8fb591
            "\"@\":{"
Packit 8fb591
                "\"ietf-netconf:operation\":\"replace\","
Packit 8fb591
                "\"yang:insert\":\"before\","
Packit 8fb591
                "\"yang:key\":\"[...]\""
Packit 8fb591
            "},"
Packit 8fb591
            "\"k\":\"a\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    lyd_print_mem(&st->str, st->data, LYD_JSON, 0);
Packit 8fb591
    assert_ptr_not_equal(st->str, NULL);
Packit 8fb591
    assert_string_equal(st->str, input);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - value in list
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig16_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"before\" yang:value=\"d\"><k>a</k>";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig16_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  list a { key \"k\"; leaf k { type string; } ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[{"
Packit 8fb591
            "\"@\":{"
Packit 8fb591
                "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
                "\"yang:insert\":\"before\","
Packit 8fb591
                "\"yang:value\":\"d\""
Packit 8fb591
            "},"
Packit 8fb591
            "\"k\":\"a\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - key in leaf-list
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig17_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"create\" yang:insert=\"before\" yang:key=\"[...]\">a";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig17_json(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf-list a { type string; ordered-by user; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input = "{"
Packit 8fb591
        "\"x:a\":[\"a\"],"
Packit 8fb591
        "\"@x:a\":[{"
Packit 8fb591
            "\"ietf-netconf:operation\":\"create\","
Packit 8fb591
            "\"yang:insert\":\"before\","
Packit 8fb591
            "\"yang:key\":\"[...]\""
Packit 8fb591
        "}]"
Packit 8fb591
    "}";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_JSON, LYD_OPT_EDIT, NULL);
Packit 8fb591
    assert_ptr_equal(st->data, NULL);
Packit 8fb591
    assert_int_equal(ly_errno, LY_EVALID);
Packit 8fb591
    assert_int_equal(ly_vecode(st->ctx), LYVE_INATTR);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
/*
Packit 8fb591
 * correctness of parsing and printing NETCONF's edit-config's attributes
Packit 8fb591
 * - operation delete with an empty XML tag
Packit 8fb591
 */
Packit 8fb591
static void
Packit 8fb591
test_nc_editconfig18_xml(void **state)
Packit 8fb591
{
Packit 8fb591
    struct state *st = (*state);
Packit 8fb591
    const char *yang = "module x {"
Packit 8fb591
                    "  namespace urn:x;"
Packit 8fb591
                    "  prefix x;"
Packit 8fb591
                    "  leaf a { type string; }"
Packit 8fb591
                    "}";
Packit 8fb591
    const struct lys_module *mod;
Packit 8fb591
    const char *input =
Packit 8fb591
        "
Packit 8fb591
            "nc:operation=\"delete\">";
Packit 8fb591
Packit 8fb591
    /* load ietf-netconf schema */
Packit 8fb591
    assert_ptr_not_equal(lys_parse_path(st->ctx, TESTS_DIR"/schema/yang/ietf/ietf-netconf.yang", LYS_IN_YANG), NULL);
Packit 8fb591
Packit 8fb591
    /* load schema */
Packit 8fb591
    mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG);
Packit 8fb591
    assert_ptr_not_equal(mod, NULL);
Packit 8fb591
Packit 8fb591
    st->data = lyd_parse_mem(st->ctx, input, LYD_XML, LYD_OPT_EDIT , NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data->attr, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data->attr->name, NULL);
Packit 8fb591
    assert_ptr_not_equal(st->data->attr->value_str, NULL);
Packit 8fb591
    assert_string_equal(st->data->attr->name, "operation");
Packit 8fb591
    assert_string_equal(st->data->attr->value_str, "delete");
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
int main(void)
Packit 8fb591
{
Packit 8fb591
    const struct CMUnitTest tests[] = {
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_leafref_type, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_unknown_metadata_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_unknown_metadata_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_filter1_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_filter2_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_filter3_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_filter4_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_filter5_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_filter6_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_filter7_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig1_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig1_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig2_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig2_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig3_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig3_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig4_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig4_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig5_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig5_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig6_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig6_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig7_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig7_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig8_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig8_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig9_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig9_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig10_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig10_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig11_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig11_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig12_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig12_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig13_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig13_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig14_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig14_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig15_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig15_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig16_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig16_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig17_xml, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig17_json, setup_f, teardown_f),
Packit 8fb591
                    cmocka_unit_test_setup_teardown(test_nc_editconfig18_xml, setup_f, teardown_f),
Packit 8fb591
    };
Packit 8fb591
Packit 8fb591
    return cmocka_run_group_tests(tests, NULL, NULL);
Packit 8fb591
}