import org.cesnet.*;
import org.cesnet.Module;
import static org.cesnet.LYD_ANYDATA_VALUETYPE.LYD_ANYDATA_CONSTSTRING;
import static org.cesnet.LYD_FORMAT.LYD_JSON;
import static org.cesnet.LYD_FORMAT.LYD_XML;
import static org.cesnet.LYS_INFORMAT.LYS_IN_YIN;
import static org.cesnet.yangConstants.*;
import java.io.FileDescriptor;
import java.io.RandomAccessFile;
import java.lang.reflect.Field;
import org.junit.Test;
import static org.junit.Assert.*;
public class TreeDataTest {
static {
System.loadLibrary("yangJava");
}
String lys_module_a = "\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
"
\n" +
"";
String result_xml = "test";
String result_xml_format =
"\n" +
" test\n" +
"\n";
String result_json = "{\n" +
" \"a:x\": {\n" +
" \"bubba\": \"test\"\n" +
" }\n" +
"}\n";
@Test
public void test_ly_ctx_parse_data_mem() {
String a_data_xml = "\n" +
"test\n" +
"";
String yang_folder = Constants.TESTS_DIR + "/api/files";
String yin_file = Constants.TESTS_DIR + "/api/files/a.yin";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_path(yin_file, LYS_IN_YIN);
Data_Node root = ctx.parse_data_mem(a_data_xml, LYD_XML, LYD_OPT_NOSIBLINGS | LYD_OPT_STRICT);
assertNotNull(root);
assertEquals("x", root.schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_ctx_parse_data_fd() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String yin_file = Constants.TESTS_DIR + "/api/files/a.yin";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_path(yin_file, LYS_IN_YIN);
RandomAccessFile f = new RandomAccessFile(config_file, "r");
FileDescriptor fileno = f.getFD();
Field _fileno = FileDescriptor.class.getDeclaredField("fd");
_fileno.setAccessible(true);
Integer fd = (Integer) _fileno.get(fileno);
Data_Node root = ctx.parse_data_fd(fd, LYD_XML, LYD_OPT_NOSIBLINGS | LYD_OPT_STRICT);
assertNotNull(root);
assertEquals("x", root.schema().name());
f.close();
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_ctx_parse_data_path() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String yin_file = Constants.TESTS_DIR + "/api/files/a.yin";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
String module_name = "a";
String schema_name = "x";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
Module module = ctx.parse_module_path(yin_file, LYS_IN_YIN);
assertNotNull(module);
assertEquals(module_name, module.name());
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
assertEquals(schema_name, root.schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_ctx_parse_data_path_invalid() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
Data_Node root = ctx.parse_data_path("INVALID_PATH", LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
throw new Exception("exception not thrown");
} catch (Exception e) {
assertTrue(e.getMessage().contains("INVALID_PATH"));
}
}
@Test
public void test_ly_data_node() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node new_node = new Data_Node(root, root.child().schema().module(), "bar-y");
assertNotNull(new_node);
new_node = new Data_Node(root, root.schema().module(), "number32", "100");
assertNotNull(new_node);
Data_Node dup_node = new_node.dup(0);
assertNotNull(dup_node);
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_new_path() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
Module mod = ctx.get_module("a", null, 1);
assertNotNull(mod);
Data_Node root = new Data_Node(ctx, "/a:x/bar-gggg", "a", LYD_ANYDATA_CONSTSTRING, 0);
assertNotNull(root);
assertEquals("x", root.schema().name());
assertEquals("bar-gggg", root.child().schema().name());
Data_Node node = root.new_path(ctx, "def-leaf", "def", LYD_ANYDATA_CONSTSTRING, LYD_PATH_OPT_DFLT);
assertNotNull(node);
assertEquals("def-leaf", node.schema().name());
assertEquals(1, node.dflt());
node = root.new_path(ctx, "def-leaf", "def", LYD_ANYDATA_CONSTSTRING, 0);
assertNotNull(node);
assertEquals("def-leaf", node.schema().name());
assertEquals(0, node.dflt());
node = root.new_path(ctx, "bubba", "b", LYD_ANYDATA_CONSTSTRING, 0);
assertNotNull(node);
assertEquals("bubba", node.schema().name());
node = root.new_path(ctx, "/a:x/number32", "3", LYD_ANYDATA_CONSTSTRING, 0);
assertNotNull(node);
assertEquals("number32", node.schema().name());
node = root.new_path(ctx, "/a:l[key1='1'][key2='2']/value", null, LYD_ANYDATA_CONSTSTRING, 0);
assertNotNull(node);
assertEquals("l", node.schema().name());
assertEquals("key1", node.child().schema().name());
assertEquals("key2", node.child().next().schema().name());
assertEquals("value", node.child().next().next().schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_insert() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node new_node = new Data_Node(root, root.schema().module(), "number32", "200");
assertNotNull(new_node);
int rc = root.insert(new_node);
assertEquals(0, rc);
assertEquals("number32", root.child().prev().schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_insert_sibling() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node last = root.prev();
Data_Node new_node = new Data_Node(null, root.schema().module(), "y", "test");
assertNotNull(new_node);
int rc = root.insert_sibling(new_node);
assertEquals(0, rc);
assertNotEquals(last.schema().name(), root.prev().schema().name());
assertEquals("y", root.prev().schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_insert_before() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node last = root.prev();
Data_Node new_node = new Data_Node(null, root.schema().module(), "y", "test");
assertNotNull(new_node);
int rc = root.insert_before(new_node);
assertEquals(0, rc);
assertNotEquals(last.schema().name(), root.prev().schema().name());
assertEquals("y", root.prev().schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_insert_after() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node last = root.next();
Data_Node new_node = new Data_Node(null, root.schema().module(), "y", "test");
assertNotNull(new_node);
int rc = root.insert_after(new_node);
assertEquals(0, rc);
assertNotEquals(last.schema().name(), root.next().schema().name());
assertEquals("y", root.next().schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_schema_sort() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
Module mod = ctx.get_module("a", null, 1);
assertNotNull(mod);
Data_Node root = new Data_Node(null, mod, "l");
assertNotNull(root);
Data_Node node = new Data_Node(root, mod, "key1", "1");
assertNotNull(node);
node = new Data_Node(root, mod, "key2", "2");
assertNotNull(node);
node = new Data_Node(null, mod, "x");
assertNotNull(node);
int rc = root.insert_after(node);
assertEquals(0, rc);
node = root.next();
Data_Node node2 = new Data_Node(node, mod, "bubba", "a");
assertNotNull(node2);
node2 = new Data_Node(node, mod, "bar-gggg", "b");
assertNotNull(node2);
node2 = new Data_Node(node, mod, "number64", "64");
assertNotNull(node2);
node2 = new Data_Node(node, mod, "number32", "32");
assertNotNull(node2);
rc = root.schema_sort(1);
assertEquals(0, rc);
root = node;
assertEquals("x", root.schema().name());
assertEquals("l", root.next().schema().name());
assertEquals("bar-gggg", root.child().schema().name());
assertEquals("bubba", root.child().next().schema().name());
assertEquals("number32", root.child().next().next().schema().name());
assertEquals("number64", root.child().next().next().next().schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_find_path() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node node = root.child();
assertNotNull(node);
Set set = node.find_path("/a:x/bubba");
assertNotNull(set);
assertEquals(1, set.number());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_find_instance() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node node = root.child();
assertNotNull(node);
Set set = node.find_instance(node.schema());
assertNotNull(set);
assertEquals(1, set.number());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_validate() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
int rc = root.validate(LYD_OPT_CONFIG, ctx);
assertEquals(0, rc);
Data_Node new_node = new Data_Node(root, root.schema().module(), "number32", "1");
assertNotNull(new_node);
rc = root.insert(new_node);
assertEquals(0, rc);
rc = root.validate(LYD_OPT_CONFIG, ctx);
assertEquals(0, rc);
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_unlink() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
Data_Node node = root.child();
Data_Node new_node = new Data_Node(root, root.schema().module(), "number32", "1");
assertNotNull(new_node);
int rc = root.insert(new_node);
assertEquals(0, rc);
assertEquals("number32", node.prev().schema().name());
rc = node.prev().unlink();
assertEquals(0, rc);
assertNotEquals("number32", node.prev().schema().name());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_print_mem_xml() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
String result = root.print_mem(LYD_XML, 0);
assertEquals(result_xml, result);
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_print_mem_xml_format() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
String result = root.print_mem(LYD_XML, LYP_FORMAT);
assertEquals(result_xml_format, result);
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_print_mem_json() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
String result = root.print_mem(LYD_JSON, LYP_FORMAT);
assertEquals(result_json, result);
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void test_ly_data_node_path() {
String yang_folder = Constants.TESTS_DIR + "/api/files";
String config_file = Constants.TESTS_DIR + "/api/files/a.xml";
try {
Context ctx = new Context(yang_folder);
assertNotNull(ctx);
ctx.parse_module_mem(lys_module_a, LYS_IN_YIN);
Data_Node root = ctx.parse_data_path(config_file, LYD_XML, LYD_OPT_CONFIG | LYD_OPT_STRICT);
assertNotNull(root);
String path = root.path();
assertNotNull(path);
assertEquals("/a:x", path);
path = root.child().path();
assertNotNull(path);
assertEquals("/a:x/bubba", path);
} catch (Exception e) {
fail(e.getMessage());
}
}
public static void main(String[] args) {
new TreeDataTest();
}
}