TEST(ConfdUtTranslation, KeylessLists) { TEST_DESCRIPTION("Translate a RWXML DOM with keyless lists to confd"); XMLManager::uptr_t mgr(xml_manager_create_xerces()); ASSERT_TRUE(mgr.get()); YangModel* model = mgr->get_yang_model(); ASSERT_TRUE(model); YangModule* ydom_top = model->load_module("base-conversion"); EXPECT_TRUE(ydom_top); ydom_top = 0; ydom_top = model->load_module("flat-conversion"); EXPECT_TRUE(ydom_top); ConfdUnittestHarness::uptr_t harness = ConfdUnittestHarness::create_harness_autostart("keyless-lists", model); ASSERT_TRUE(harness.get()); EXPECT_TRUE(harness->is_running()); ConfdUnittestHarness::context_t* ctx= harness->get_confd_context(); UNUSED (ctx); ConfdUnittestHarness::sockaddr_t sa; harness->make_confd_sockaddr(&sa); EXPECT_TRUE(harness->wait_till_phase2(&sa)); { bool ret = model->app_data_get_token (YANGMODEL_ANNOTATION_KEY,YANGMODEL_ANNOTATION_CONFD_NS , &model->adt_confd_ns_); RW_ASSERT(ret); ret = model->app_data_get_token (YANGMODEL_ANNOTATION_KEY, YANGMODEL_ANNOTATION_CONFD_NAME, &model->adt_confd_name_); RW_ASSERT(ret); ASSERT_EQ (CONFD_OK, confd_load_schemas ((struct sockaddr *)&sa, sizeof(sa)) ); namespace_map_t ns_map; struct confd_nsinfo *listp; uint32_t ns_count = confd_get_nslist(&listp); RW_ASSERT (ns_count); // for now for (uint32_t i = 0; i < ns_count; i++) { ns_map[listp[i].uri] = listp[i].hash; } rw_confd_annotate_ynodes (model, ns_map, confd_str2hash, YANGMODEL_ANNOTATION_CONFD_NS, YANGMODEL_ANNOTATION_CONFD_NAME ); // Create a DOM model->register_ypbc_schema( (const rw_yang_pb_schema_t*)RWPB_G_SCHEMA_YPBCSD(FlatConversion)); RWPB_M_MSG_DECL_INIT(FlatConversion_data_Flat, flat); RWPB_T_MSG (FlatConversion_data_Flat_Keyless)* kf = &flat.keyless[0]; flat.n_keyless = 4; sprintf (kf->str, "%s", "First One in the keyless list"); kf->has_str = 1; kf->has_cont = 1; kf->cont.has_bool_ = 1; kf->has_number = 1; kf->number = 1234; kf = &flat.keyless[1]; sprintf (kf->str, "%s", "More no keys"); kf->has_str = 1; kf->has_enum_ = 1; kf->enum_ = FLAT_CONVERSION_ENUM_FOO_BAR; kf = &flat.keyless[2]; kf->has_number = 1; kf->number = 12; kf->has_enum_ = 1; kf->enum_ = FLAT_CONVERSION_ENUM_FOO; kf = &flat.keyless[3]; sprintf (kf->str, "%s", "First One in the keyless list"); kf->has_str = 1; kf->has_cont = 1; kf->cont.has_bool_ = 1; kf->has_number = 1; kf->number = 1234; rw_yang_netconf_op_status_t ncrs; XMLDocument::uptr_t dom(mgr->create_document()); ASSERT_TRUE(dom.get()); XMLNode* root_node = dom->get_root_node(); ASSERT_TRUE (root_node); XMLNode *first_elt = root_node->add_child("flat", 0, "http://riftio.com/ns/core/util/yangtools/tests/conversion"); ASSERT_TRUE (first_elt); ncrs = first_elt->merge ((ProtobufCMessage *)&flat); ASSERT_EQ(ncrs, RW_YANG_NETCONF_OP_STATUS_OK); ASSERT_EQ(4, first_elt->get_children()->length()); confd_hkeypath_t path; memset (&path, 0, sizeof (confd_hkeypath_t)); // Build a confd hkeypath size_t length = 3; path.len = length; length --; CONFD_SET_XMLTAG (&path.v[length][0], flat_conversion_flat, flat_conversion__ns); length --; CONFD_SET_XMLTAG (&path.v[length][0], flat_conversion_keyless, flat_conversion__ns); length--; first_elt = first_elt->get_first_child(); ASSERT_FALSE (length); CONFD_SET_INT64 (&path.v[length][0] , (int64_t) first_elt); path.v[length][1].type = C_NOEXISTS; XMLNode *node = get_node_by_hkeypath (root_node, &path, 0); ASSERT_TRUE (node); ASSERT_EQ (first_elt, node); struct confd_cs_node *cs_node = confd_find_cs_node(&path, 2); ASSERT_TRUE (cs_node); confd_value_t keys[5]; int key_count = 0; XMLNode *next_node; ASSERT_EQ (get_current_key_and_next_node (node, cs_node, &next_node, keys, &key_count), RW_STATUS_SUCCESS); EXPECT_EQ (1, key_count); EXPECT_EQ ((int64_t) first_elt, keys[0].val.i64); // Get object with the key set to the pointer ASSERT_NE (next_node, nullptr); ASSERT_EQ (get_current_key_and_next_node (next_node, cs_node, &next_node, keys, &key_count), RW_STATUS_SUCCESS); EXPECT_EQ (1, key_count); } }
virtual void SetUp() { mgr = XMLManager::uptr_t(xml_manager_create_xerces()); YangModel* model = mgr->get_yang_model(); ASSERT_TRUE(model); YangModule* ydom_top = model->load_module("company"); ASSERT_TRUE(ydom_top); model->register_ypbc_schema( (const rw_yang_pb_schema_t*)RWPB_G_SCHEMA_YPBCSD(Company)); ASSERT_EQ((const rw_yang_pb_schema_t*)RWPB_G_SCHEMA_YPBCSD(Company), model->get_ypbc_schema()); ydom_top = model->load_module("company-augment"); ASSERT_TRUE(ydom_top); model->register_ypbc_schema( (const rw_yang_pb_schema_t*)RWPB_G_SCHEMA_YPBCSD(CompanyAugment)); ASSERT_EQ((const rw_yang_pb_schema_t*)RWPB_G_SCHEMA_YPBCSD(CompanyAugment), model->get_ypbc_schema()); schema = mgr->get_yang_model()->get_ypbc_schema(); ASSERT_TRUE(schema); std::string const delta_xml = "<data>" " <company xmlns=\"http://riftio.com/ns/core/util/yangtools/tests/company\">" " <employee>" " <id>0</id>" " <name>foo</name>" " </employee>" " <employee>" " <id>1</id>" " <name>bar</name>" " </employee>" " <wacky-interests>" " <name>foo</name>" " <id>0</id>" " </wacky-interests>" " <wacky-interests>" " <name>bar</name>" " <id>1</id>" " </wacky-interests>" " </company>" " <mangle-base xmlns=\"http://riftio.com/ns/core/util/yangtools/tests/company\">" " <mangle>" " <name>asdf</name>" " <id>13</id>" " <bucket xmlns=\"http://riftio.com/ns/core/util/yangtools/tests/company-augment\">" " <contents>water</contents>" " </bucket>" " <bucket-list xmlns=\"http://riftio.com/ns/core/util/yangtools/tests/company-augment\">" " <place>victoria falls</place>" " </bucket-list>" " <bucket-list xmlns=\"http://riftio.com/ns/core/util/yangtools/tests/company-augment\">" " <place>angkor wat</place>" " </bucket-list>" " </mangle>" " </mangle-base>" "</data>"; std::string error_out; dom = XMLDocument::uptr_t(mgr->create_document_from_string(delta_xml.c_str(), error_out, false)); ASSERT_TRUE(dom.get()) << error_out; root = dom->get_root_node(); ASSERT_TRUE(root); }
TEST(ConfdUtTranslation, ConfdNewBuilder) { TEST_DESCRIPTION("Translate a RWXML DOM to Confd and back without list filter and new builder"); XMLManager::uptr_t mgr(xml_manager_create_xerces()); ASSERT_TRUE(mgr.get()); YangModel* model = mgr->get_yang_model(); ASSERT_TRUE(model); YangModule* ydom_top = model->load_module("base-conversion"); EXPECT_TRUE(ydom_top); ydom_top = 0; ydom_top = model->load_module("flat-conversion"); EXPECT_TRUE(ydom_top); model->register_ypbc_schema( (const rw_yang_pb_schema_t*)RWPB_G_SCHEMA_YPBCSD(FlatConversion)); std::ifstream fp; ConfdUnittestHarness::uptr_t harness = ConfdUnittestHarness::create_harness_autostart("ConfdDOM", model); ASSERT_TRUE(harness.get()); EXPECT_TRUE(harness->is_running()); ConfdUnittestHarness::context_t* ctx= harness->get_confd_context(); UNUSED (ctx); ConfdUnittestHarness::sockaddr_t sa; harness->make_confd_sockaddr(&sa); EXPECT_TRUE(harness->wait_till_phase2(&sa)); { bool ret = model->app_data_get_token (YANGMODEL_ANNOTATION_KEY,YANGMODEL_ANNOTATION_CONFD_NS , &model->adt_confd_ns_); RW_ASSERT(ret); ret = model->app_data_get_token (YANGMODEL_ANNOTATION_KEY, YANGMODEL_ANNOTATION_CONFD_NAME, &model->adt_confd_name_); RW_ASSERT(ret); ASSERT_EQ (CONFD_OK, confd_load_schemas ((struct sockaddr *)&sa, sizeof(sa)) ); namespace_map_t ns_map; struct confd_nsinfo *listp; uint32_t ns_count = confd_get_nslist(&listp); RW_ASSERT (ns_count); // for now for (uint32_t i = 0; i < ns_count; i++) { ns_map[listp[i].uri] = listp[i].hash; } rw_confd_annotate_ynodes (model, ns_map, confd_str2hash, YANGMODEL_ANNOTATION_CONFD_NS, YANGMODEL_ANNOTATION_CONFD_NAME ); // Create a DOM std::string file_name = get_rift_root() + std::string("/modules/core/util/yangtools/test/confd.xml"); XMLDocument::uptr_t dom(mgr->create_document_from_file (file_name.c_str(), false/*validate*/)); ASSERT_TRUE(dom.get()); XMLNode* root_node = dom->get_root_node(); ASSERT_TRUE (root_node); root_node = root_node->get_first_child(); // associated confd structures struct confd_cs_node *cs_node = confd_find_cs_root(flat_conversion__ns); // Translate the DOM to confd ConfdTLVBuilder builder(cs_node,true); XMLTraverser traverser(&builder,root_node); traverser.traverse(); ASSERT_TRUE (builder.length()); size_t length = builder.length(); // Add 3 more - to add a delete keyspec confd_tag_value_t *array = (confd_tag_value_t *) RW_MALLOC (sizeof (confd_tag_value_t) * (length + 3)); builder.copy_and_destroy_tag_array(array); // Array is of the following form for the test // The nodes with C++ comments added to test deletion /* 1 C_XMLBEGIN "container_1-1" */ /* 2 C_BUF "leaf-1_1.1" */ /* 3 C_XMLBEGIN "list-1.1_2" */ /* 4 C_INT32 "int_1.1.2_1" */ /* 5 C_XMLEND "list-1.1_2" */ /* 6 C_XMLBEGIN "list-1.1_2" */ /* 7 C_XMLTAG "grey-goose" */ /* 8 C_INT32 "int_1.1.2_1" */ /* 9 C_XMLEND "list-1.1_2" */ // 10 C_XMLBEGINDEL "list-1.1_2" */ // 11 C_INT32 "int_1.1.2_1" */ // 12 C_XMLEND "list-1.1_2" */ /* 13 C_XMLEND "container_1-1" */ /* 14 C_LIST "leaf.list.1.2" */ /* 15 C_XMLBEGIN "two-keys" */ /* 16 C_ENUM_VALUE "prim-enum" */ /* 17 C_BUF "sec-string" */ /* 18 C_XMLEND "two-keys" */ /* 19 C_XMLBEGIN "two-keys" */ /* 20 C_ENUM_VALUE "prim-enum" */ /* 21 C_BUF "sec-string" */ /* 22 C_XMLEND "two-keys" */ /* 23 C_XMLTAG "empty-1_3" */ /* 24 C_LIST "enum_1-4" */ /* 25 C_ENUM_VALUE "enum_1.5" */ // add 3 lines in the middle memmove (&array[12], &array[9], sizeof (confd_tag_value_t) * 13); memcpy (&array[9], &array[2], sizeof (confd_tag_value_t) * 3); array[9].v.type = C_XMLBEGINDEL; array[10].v.val.i32 = 0xdeadbeef; length += 3; // Translate the confd to DOM rw_yang::XMLDocument::uptr_t converted = std::move(mgr->create_document(model->get_root_node())); XMLNode *root = converted->get_root_node(); YangNode *container_1 = ydom_top->get_first_node(); XMLNode *build_node = root->add_child (container_1); XMLBuilder xml_builder(build_node); ConfdTLVTraverser tlv_traverser(&xml_builder, array, length ); tlv_traverser.traverse(); std::string orig = dom->get_root_node()->get_first_element()->to_string(); std::string copy = xml_builder.current_node_->to_string(); ASSERT_EQ (1, xml_builder.delete_ks_.size()); for (size_t i = 0; i < length; i++) { confd_free_value(CONFD_GET_TAG_VALUE(&array[i])); } RW_FREE (array); } }