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_control_socket.cc
+ libkea_yang_la_SOURCES += translator_control_socket.h
+libkea_yang_la_SOURCES += translator_option_data.cc
+libkea_yang_la_SOURCES += translator_option_data.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_control_socket.h
++ translator_control_socket.h \
+ translator_option_data.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_control_socket.h>
++#include <yang/tests/sysrepo_setup.h>
+
-// Test get empty control socket using the Kea ad hoc model.
-TEST(TranslatorControlSocketTest, getEmpty) {
- // Get a translator control socket object to play with.
- S_Connection conn(new Connection("translator control socket unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorControlSocket> tcs_obj;
+ #include <gtest/gtest.h>
+
+ 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(tcs_obj.reset(new TranslatorControlSocket(sess, model)));
++/// @brief Translator name.
++extern char const control_socket[] = "control socket";
+
- EXPECT_NO_THROW(sock = tcs_obj->getControlSocket(xpath));
++/// @brief Test fixture class for @ref TranslatorControlSocket.
++class TranslatorControlSocketTest :
++ public GenericTranslatorTest<control_socket, TranslatorControlSocket> {
++public:
++
++ /// Constructor.
++ TranslatorControlSocketTest() { }
++
++ /// Destructor (does nothing).
++ virtual ~TranslatorControlSocketTest() { }
++};
++
++// This test verifies that an empty control socket can be properly
++// translated from YANG to JSON.
++TEST_F(TranslatorControlSocketTest, getEmpty) {
++ useModel("kea-dhcp4-server");
+
+ // Get empty.
+ const string& xpath = "/kea-dhcp4-server:config/control-socket";
+ ConstElementPtr sock;
-// Test get not empty control socket using the Kea ad hoc model.
-TEST(TranslatorControlSocketTest, get) {
- // Get a translator control socket object to play with.
- S_Connection conn(new Connection("translator control socket unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorControlSocket> tcs_obj;
-
- // Use the ad hoc model.
- const string& model = "kea-dhcp6-server";
- EXPECT_NO_THROW(tcs_obj.reset(new TranslatorControlSocket(sess, model)));
++ EXPECT_NO_THROW(sock = t_obj_->getControlSocket(xpath));
+ EXPECT_FALSE(sock);
+ }
+
- EXPECT_NO_THROW(sess->set_item(xname.c_str(), s_name));
++// This test verifies that a not empty control socket can be properly
++// translated from YANG to JSON.
++TEST_F(TranslatorControlSocketTest, get) {
++ useModel("kea-dhcp6-server");
+
+ // Set a value.
+ const string& xpath = "/kea-dhcp6-server:config/control-socket";
+ const string& xname = xpath + "/socket-name";
+ const string& xtype = xpath + "/socket-type";
+ const string& xcontext = xpath + "/user-context";
+ S_Val s_name(new Val("/tmp/kea.sock"));
- EXPECT_NO_THROW(sess->set_item(xtype.c_str(), s_type));
++ EXPECT_NO_THROW(sess_->set_item(xname.c_str(), s_name));
+ S_Val s_type(new Val("unix", SR_ENUM_T));
- EXPECT_NO_THROW(sess->set_item(xcontext.c_str(), s_context));
++ EXPECT_NO_THROW(sess_->set_item(xtype.c_str(), s_type));
+ S_Val s_context(new Val("{ \"foo\": 1 }"));
- EXPECT_NO_THROW(sock = tcs_obj->getControlSocket(xpath));
++ EXPECT_NO_THROW(sess_->set_item(xcontext.c_str(), s_context));
+
+ // Get it.
+ ConstElementPtr sock;
-// Test set not empty control socket using the Kea ad hoc model.
-TEST(TranslatorControlSocketTest, set) {
- // Get a translator control socket object to play with.
- S_Connection conn(new Connection("translator control socket unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorControlSocket> tcs_obj;
-
- // Use the ad hoc model.
- const string& model = "kea-ctrl-agent";
- EXPECT_NO_THROW(tcs_obj.reset(new TranslatorControlSocket(sess, model)));
++ EXPECT_NO_THROW(sock = t_obj_->getControlSocket(xpath));
+ ASSERT_TRUE(sock);
+ ASSERT_EQ(Element::map, sock->getType());
+ EXPECT_EQ(3, sock->size());
+ ConstElementPtr type = sock->get("socket-type");
+ ASSERT_TRUE(type);
+ ASSERT_EQ(Element::string, type->getType());
+ EXPECT_EQ("unix", type->stringValue());
+ ConstElementPtr name = sock->get("socket-name");
+ ASSERT_TRUE(name);
+ ASSERT_EQ(Element::string, name->getType());
+ EXPECT_EQ("/tmp/kea.sock", name->stringValue());
+ ConstElementPtr context = sock->get("user-context");
+ ASSERT_TRUE(context);
+ EXPECT_EQ("{ \"foo\": 1 }", context->str());
+ }
+
- tcs_obj->setControlSocket(xpath, sock);
++// This test verifies that a not empty control socket can be properly
++// translated from JSON to YANG.
++TEST_F(TranslatorControlSocketTest, set) {
++ useModel("kea-ctrl-agent");
+
+ // Set a value.
+ const string& xpath =
+ "/kea-ctrl-agent:config/control-sockets/socket[server-type='dhcp4']/control-socket";
+ ElementPtr sock = Element::createMap();
+ sock->set("socket-name", Element::create(string("/tmp/kea.sock")));
+ sock->set("socket-type", Element::create(string("unix")));
+ sock->set("comment", Element::create(string("a comment")));
+ try {
- ASSERT_NO_THROW(tcs_obj->setControlSocket(xpath, sock));
++ t_obj_->setControlSocket(xpath, sock);
+ } catch (const std::exception& ex) {
+ cerr << "setControlSocket fail with " << ex.what() << endl;
+ }
- EXPECT_NO_THROW(got = tcs_obj->getControlSocket(xpath));
++ ASSERT_NO_THROW(t_obj_->setControlSocket(xpath, sock));
+
+ // Get it back.
+ ConstElementPtr got;
-}
++ EXPECT_NO_THROW(got = t_obj_->getControlSocket(xpath));
+ ASSERT_TRUE(got);
+ ASSERT_EQ(Element::map, got->getType());
+ EXPECT_EQ(3, got->size());
+ ConstElementPtr name = got->get("socket-name");
+ ASSERT_TRUE(name);
+ ASSERT_EQ(Element::string, name->getType());
+ EXPECT_EQ("/tmp/kea.sock", name->stringValue());
+ ConstElementPtr type = got->get("socket-type");
+ ASSERT_TRUE(type);
+ ASSERT_EQ(Element::string, type->getType());
+ EXPECT_EQ("unix", type->stringValue());
+ ConstElementPtr context = got->get("user-context");
+ ASSERT_TRUE(context);
+ EXPECT_EQ("{ \"comment\": \"a comment\" }", context->str());
-// Test set empty control socket using the Kea ad hoc model.
-TEST(TranslatorControlSocketTest, setEmpty) {
- // Get a translator control socket object to play with.
- S_Connection conn(new Connection("translator control socket unittests"));
- S_Session sess(new Session(conn, SR_DS_CANDIDATE));
- boost::scoped_ptr<TranslatorControlSocket> tcs_obj;
+
- // Use the ad hoc model.
- const string& model = "kea-dhcp4-server";
- EXPECT_NO_THROW(tcs_obj.reset(new TranslatorControlSocket(sess, model)));
++ // Check it validates.
++ EXPECT_NO_THROW(sess_->validate());
++}
+
- EXPECT_NO_THROW(sess->set_item(xname.c_str(), s_name));
++// This test verifies that an empty control socket can be properly
++// translated from JSON to YANG.
++TEST_F(TranslatorControlSocketTest, setEmpty) {
++ useModel("kea-dhcp4-server");
+
+ // Set a value.
+ const string& xpath = "/kea-dhcp4-server:config/control-socket";
+ const string& xname = xpath + "/socket-name";
+ const string& xtype = xpath + "/socket-type";
+ const string& xcontext = xpath + "/user-context";
+ S_Val s_name(new Val("/tmp/kea.sock"));
- EXPECT_NO_THROW(sess->set_item(xtype.c_str(), s_type));
++ EXPECT_NO_THROW(sess_->set_item(xname.c_str(), s_name));
+ S_Val s_type(new Val("unix", SR_ENUM_T));
- EXPECT_NO_THROW(sess->set_item(xcontext.c_str(), s_context));
++ EXPECT_NO_THROW(sess_->set_item(xtype.c_str(), s_type));
+ S_Val s_context(new Val("{ \"foo\": 1 }"));
- ASSERT_NO_THROW(tcs_obj->setControlSocket(xpath, ConstElementPtr()));
++ EXPECT_NO_THROW(sess_->set_item(xcontext.c_str(), s_context));
+
+ // Reset to empty.
- EXPECT_NO_THROW(sock = tcs_obj->getControlSocket(xpath));
++ ASSERT_NO_THROW(t_obj_->setControlSocket(xpath, ConstElementPtr()));
+
+ // Get it back.
+ ConstElementPtr sock;
++ EXPECT_NO_THROW(sock = t_obj_->getControlSocket(xpath));
+ EXPECT_FALSE(sock);
+ }
+
+ }; // end of anonymous namespace