AM_CXXFLAGS = $(KEA_CXXFLAGS)
lib_LTLIBRARIES = libkea-yang.la
-libkea_yang_la_SOURCES = sysrepo_error.h
+libkea_yang_la_SOURCES = adaptor.cc adaptor.h
+libkea_yang_la_SOURCES += sysrepo_error.h
libkea_yang_la_SOURCES += translator.cc translator.h
+libkea_yang_la_SOURCES += translator_option_data.cc
+libkea_yang_la_SOURCES += translator_option_data.h
+ libkea_yang_la_SOURCES += translator_option_def.cc
+ libkea_yang_la_SOURCES += translator_option_def.h
libkea_yang_la_LIBADD = $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
libkea_yang_la_LIBADD += $(top_builddir)/src/lib/cc/libkea-cc.la
# Specify the headers for copying into the installation directory tree.
libkea_yang_includedir = $(pkgincludedir)/yang
libkea_yang_include_HEADERS = \
+ adaptor.h \
sysrepo_error.h \
translator.h \
- translator_option_data.h
++ translator_option_data.h \
+ translator_option_def.h
EXTRA_DIST = yang.dox
+# Distribute yang models.
+EXTRA_DIST += models/ietf-dhcpv6-client.yang
+EXTRA_DIST += models/ietf-dhcpv6-options.yang
+EXTRA_DIST += models/ietf-dhcpv6-relay.yang
+EXTRA_DIST += models/ietf-dhcpv6-server.yang
+EXTRA_DIST += models/ietf-dhcpv6-types.yang
+EXTRA_DIST += models/ietf-inet-types.yang
+EXTRA_DIST += models/ietf-yang-types.yang
+EXTRA_DIST += models/kea-ctrl-agent.yang
+EXTRA_DIST += models/kea-dhcp-ddns.yang
+EXTRA_DIST += models/kea-dhcp-types.yang
+EXTRA_DIST += models/kea-dhcp4-server.yang
+EXTRA_DIST += models/kea-dhcp6-server.yang
+EXTRA_DIST += models/kea-logging.yang
+EXTRA_DIST += models/kea-types.yang
CLEANFILES = *.gcno *.gcda
--- /dev/null
-#include <boost/scoped_ptr.hpp>
+ // Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
+ //
+ // This Source Code Form is subject to the terms of the Mozilla Public
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+ #include <config.h>
+
+ #include <yang/translator_option_def.h>
++#include <yang/tests/sysrepo_setup.h>
+
-// Test get empty option definition list.
-TEST(TranslatorOptionDefListTest, getEmpty) {
- // Get a translator option definition list object to play with.
- S_Connection conn(new Connection("translator option definition list unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorOptionDefList> todl_obj;
+ #include <gtest/gtest.h>
+ #include <sstream>
+
+ using namespace std;
+ using namespace isc;
+ using namespace isc::data;
+ using namespace isc::yang;
++using namespace isc::yang::test;
+
+ namespace {
+
- // Use the ad hoc model.
- const string& model = "kea-dhcp4-server";
- EXPECT_NO_THROW(todl_obj.reset(new TranslatorOptionDefList(sess, model)));
++/// @brief Translator name.
++extern char const option_definition_list[] = "option definition list";
+
- EXPECT_NO_THROW(options = todl_obj->getOptionDefList(xpath));
++/// @brief Test fixture class for @ref TranslatorOptionDefList.
++class TranslatorOptionDefListTest :
++ public GenericTranslatorTest<option_definition_list, TranslatorOptionDefList> {
++public:
++
++ /// Constructor.
++ TranslatorOptionDefListTest() { }
++
++ /// Destructor (does nothing).
++ virtual ~TranslatorOptionDefListTest() { }
++};
++
++// This test verifies that an empty option definition list can be properly
++// translated from YANG to JSON.
++TEST_F(TranslatorOptionDefListTest, getEmpty) {
++ useModel("kea-dhcp4-server");
+
+ // Get the option definition list and checks it is empty.
+ const string& xpath = "/kea-dhcp4-server:config/option-def-list";
+ ConstElementPtr options;
-// Test get one option def.
-TEST(TranslatorOptionDefListTest, get) {
- // Get a translator option definition list object to play with.
- S_Connection conn(new Connection("translator option definition list unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorOptionDefList> todl_obj;
-
- // Use the ad hoc model.
- const string& model = "kea-dhcp6-server";
- EXPECT_NO_THROW(todl_obj.reset(new TranslatorOptionDefList(sess, model)));
++ EXPECT_NO_THROW(options = t_obj_->getOptionDefList(xpath));
+ ASSERT_TRUE(options);
+ ASSERT_EQ(Element::list, options->getType());
+ EXPECT_EQ(0, options->size());
+ }
+
- ASSERT_NO_THROW(sess->set_item(xname.c_str(), s_name));
++// This test verifies that one option definition can be properly
++// translated from YANG to JSON.
++TEST_F(TranslatorOptionDefListTest, get) {
++ useModel("kea-dhcp6-server");
+
+ // Create the option code 100.
+ const string& xpath = "/kea-dhcp6-server:config/option-def-list";
+ const string& xdef = xpath + "/option-def[code='100'][space='isc']";
+ const string& xname = xdef + "/name";
+ const string& xtype = xdef + "/type";
+ const string& xarray = xdef + "/array";
+ S_Val s_name(new Val("foo"));
- ASSERT_NO_THROW(sess->set_item(xtype.c_str(), s_type));
++ ASSERT_NO_THROW(sess_->set_item(xname.c_str(), s_name));
+ S_Val s_type(new Val("string"));
- ASSERT_NO_THROW(sess->set_item(xarray.c_str(), s_array));
++ ASSERT_NO_THROW(sess_->set_item(xtype.c_str(), s_type));
+ S_Val s_array(new Val(false));
- EXPECT_NO_THROW(def = todl_obj->getOptionDef(xdef));
++ ASSERT_NO_THROW(sess_->set_item(xarray.c_str(), s_array));
+
+ // Get the option def.
+ ConstElementPtr def;
- EXPECT_NO_THROW(defs = todl_obj->getOptionDefList(xpath));
++ EXPECT_NO_THROW(def = t_obj_->getOptionDef(xdef));
+ ASSERT_TRUE(def);
+ EXPECT_EQ("{ \"array\": false, \"code\": 100, \"name\": \"foo\", \"space\": \"isc\", \"type\": \"string\" }",
+ def->str());
+
+ // Get the option definition list.
+ ConstElementPtr defs;
-// Test set empty option definition list.
-TEST(TranslatorOptionDefListTest, setEmpty) {
- // Get a translator option definition list object to play with.
- S_Connection conn(new Connection("translator option definition list unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorOptionDefList> todl_obj;
-
- // Use the ad hoc model.
- const string& model = "kea-dhcp4-server";
- EXPECT_NO_THROW(todl_obj.reset(new TranslatorOptionDefList(sess, model)));
++ EXPECT_NO_THROW(defs = t_obj_->getOptionDefList(xpath));
+ ASSERT_TRUE(defs);
+ ASSERT_EQ(Element::list, defs->getType());
+ EXPECT_EQ(1, defs->size());
+ EXPECT_TRUE(def->equals(*defs->get(0)));
+ }
+
- EXPECT_NO_THROW(todl_obj->setOptionDefList(xpath, defs));
++// This test verifies that an empty option definition list can be properly
++// translated from JSON to YANG.
++TEST_F(TranslatorOptionDefListTest, setEmpty) {
++ useModel("kea-dhcp4-server");
+
+ // Set empty list.
+ const string& xpath = "/kea-dhcp4-server:config/option-def-list";
+ ConstElementPtr defs = Element::createList();
- EXPECT_NO_THROW(defs = todl_obj->getOptionDefList(xpath));
++ EXPECT_NO_THROW(t_obj_->setOptionDefList(xpath, defs));
+
+ // Get it back.
+ defs.reset();
-}
++ EXPECT_NO_THROW(defs = t_obj_->getOptionDefList(xpath));
+ ASSERT_TRUE(defs);
+ EXPECT_EQ(0, defs->size());
-// Test set an option definition.
-TEST(TranslatorOptionDefListTest, set) {
- // Get a translator option definition list object to play with.
- S_Connection conn(new Connection("translator option definition list unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorOptionDefList> todl_obj;
+
- // Use the ad hoc model.
- const string& model = "kea-dhcp6-server";
- EXPECT_NO_THROW(todl_obj.reset(new TranslatorOptionDefList(sess, model)));
++ // Check that the tree representation is empty.
++ S_Tree tree;
++ EXPECT_NO_THROW(tree = sess_->get_subtree("/kea-dhcp4-server:config"));
++ EXPECT_FALSE(tree);
++}
+
- EXPECT_NO_THROW(todl_obj->setOptionDefList(xpath, defs));
++// This test verifies that one option definition can be properly
++// translated from JSON to YANG.
++TEST_F(TranslatorOptionDefListTest, set) {
++ useModel("kea-dhcp6-server");
+
+ // Set one option def.
+ const string& xpath = "/kea-dhcp6-server:config/option-def-list";
+ ElementPtr defs = Element::createList();
+ ElementPtr def = Element::createMap();
+ def->set("code", Element::create(100));
+ def->set("name", Element::create(string("foo")));
+ def->set("space", Element::create(string("isc")));
+ def->set("type", Element::create(string("string")));
+ def->set("array", Element::create(false));
+ defs->add(def);
- EXPECT_NO_THROW(got = todl_obj->getOptionDefList(xpath));
++ EXPECT_NO_THROW(t_obj_->setOptionDefList(xpath, defs));
+
+ // Get it back.
+ ConstElementPtr got;
- EXPECT_NO_THROW(tree = sess->get_subtree("/kea-dhcp6-server:config"));
++ EXPECT_NO_THROW(got = t_obj_->getOptionDefList(xpath));
+ ASSERT_TRUE(got);
+ ASSERT_EQ(1, got->size());
+ EXPECT_TRUE(def->equals(*got->get(0)));
+
+ // Check the tree representation.
+ S_Tree tree;
++ EXPECT_NO_THROW(tree = sess_->get_subtree("/kea-dhcp6-server:config"));
+ ASSERT_TRUE(tree);
+ string expected =
+ "kea-dhcp6-server:config (container)\n"
+ " |\n"
+ " -- option-def-list (container)\n"
+ " |\n"
+ " -- option-def (list instance)\n"
+ " |\n"
+ " -- code = 100\n"
+ " |\n"
+ " -- space = isc\n"
+ " |\n"
+ " -- name = foo\n"
+ " |\n"
+ " -- type = string\n"
+ " |\n"
+ " -- array = false\n";
+ EXPECT_EQ(expected, tree->to_string(100));
++
++ // Check it validates.
++ EXPECT_NO_THROW(sess_->validate());
+ }
+
+ }; // end of anonymous namespace