summaryrefslogtreecommitdiffstats
path: root/src/lib/yang/tests/translator_control_socket_unittests.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/yang/tests/translator_control_socket_unittests.cc')
-rw-r--r--src/lib/yang/tests/translator_control_socket_unittests.cc176
1 files changed, 176 insertions, 0 deletions
diff --git a/src/lib/yang/tests/translator_control_socket_unittests.cc b/src/lib/yang/tests/translator_control_socket_unittests.cc
new file mode 100644
index 0000000..3d9d4fe
--- /dev/null
+++ b/src/lib/yang/tests/translator_control_socket_unittests.cc
@@ -0,0 +1,176 @@
+// Copyright (C) 2018-2021 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/yang_models.h>
+#include <yang/tests/sysrepo_setup.h>
+
+#include <gtest/gtest.h>
+
+using namespace std;
+using namespace isc;
+using namespace isc::data;
+using namespace isc::yang;
+using namespace isc::yang::test;
+using namespace sysrepo;
+
+namespace {
+
+/// @brief Translator name.
+extern char const control_socket[] = "control socket";
+
+/// @brief Test fixture class for @ref TranslatorControlSocket.
+class TranslatorControlSocketTestv4 :
+ public GenericTranslatorTest<control_socket, TranslatorControlSocket> {
+public:
+
+ /// Constructor.
+ TranslatorControlSocketTestv4() {
+ model_ = KEA_DHCP4_SERVER;
+ }
+
+ virtual ~TranslatorControlSocketTestv4() = default;
+};
+class TranslatorControlSocketTestv6 :
+ public GenericTranslatorTest<control_socket, TranslatorControlSocket> {
+public:
+
+ /// Constructor.
+ TranslatorControlSocketTestv6() {
+ model_ = KEA_DHCP6_SERVER;
+ }
+
+ virtual ~TranslatorControlSocketTestv6() = default;
+};
+class TranslatorControlSocketTestCtrlAgent :
+ public GenericTranslatorTest<control_socket, TranslatorControlSocket> {
+public:
+
+ /// Constructor.
+ TranslatorControlSocketTestCtrlAgent() {
+ model_ = KEA_CTRL_AGENT;
+ }
+
+ virtual ~TranslatorControlSocketTestCtrlAgent() = default;
+};
+
+// This test verifies that an empty control socket can be properly
+// translated from YANG to JSON.
+TEST_F(TranslatorControlSocketTestv4, getEmpty) {
+ // Get empty.
+ const string& xpath = "/kea-dhcp4-server:config/control-socket";
+ ConstElementPtr sock;
+ EXPECT_NO_THROW(sock = t_obj_->getControlSocket(xpath));
+ EXPECT_FALSE(sock);
+}
+
+// This test verifies that a not empty control socket can be properly
+// translated from YANG to JSON.
+TEST_F(TranslatorControlSocketTestv6, get) {
+ // 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(xname.c_str(), s_name));
+ S_Val s_type(new Val("unix", SR_ENUM_T));
+ EXPECT_NO_THROW(sess_->set_item(xtype.c_str(), s_type));
+ S_Val s_context(new Val("{ \"foo\": 1 }"));
+ EXPECT_NO_THROW(sess_->set_item(xcontext.c_str(), s_context));
+
+ // Get it.
+ ConstElementPtr sock;
+ 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());
+}
+
+// This test verifies that a not empty control socket can be properly
+// translated from JSON to YANG.
+TEST_F(TranslatorControlSocketTestCtrlAgent, set) {
+ // 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 {
+ t_obj_->setControlSocket(xpath, sock);
+ } catch (const std::exception& ex) {
+ cerr << "setControlSocket fail with " << ex.what() << endl;
+ }
+ ASSERT_NO_THROW_LOG(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());
+
+ // Check it validates.
+ EXPECT_NO_THROW(sess_->validate());
+}
+
+// This test verifies that an empty control socket can be properly
+// translated from JSON to YANG.
+TEST_F(TranslatorControlSocketTestv4, setEmpty) {
+ // 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(xname.c_str(), s_name));
+ S_Val s_type(new Val("unix", SR_ENUM_T));
+ EXPECT_NO_THROW(sess_->set_item(xtype.c_str(), s_type));
+ S_Val s_context(new Val("{ \"foo\": 1 }"));
+ EXPECT_NO_THROW(sess_->set_item(xcontext.c_str(), s_context));
+ sess_->apply_changes();
+
+ // Get it back.
+ ConstElementPtr sock;
+ EXPECT_NO_THROW(sock = t_obj_->getControlSocket(xpath));
+ ASSERT_TRUE(sock);
+ EXPECT_EQ(sock->str(),
+ R"({ "socket-name": "/tmp/kea.sock", "socket-type": "unix", "user-context": { "foo": 1 } })");
+
+ // Reset to empty.
+ EXPECT_NO_THROW(t_obj_->setControlSocket(xpath, ConstElementPtr()));
+
+ // Get it back.
+ EXPECT_NO_THROW(sock = t_obj_->getControlSocket(xpath));
+ EXPECT_FALSE(sock);
+}
+
+} // namespace