summaryrefslogtreecommitdiffstats
path: root/test/base-json.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:34:54 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:34:54 +0000
commit0915b3ef56dfac3113cce55a59a5765dc94976be (patch)
treea8fea11d50b4f083e1bf0f90025ece7f0824784a /test/base-json.cpp
parentInitial commit. (diff)
downloadicinga2-0915b3ef56dfac3113cce55a59a5765dc94976be.tar.xz
icinga2-0915b3ef56dfac3113cce55a59a5765dc94976be.zip
Adding upstream version 2.13.6.upstream/2.13.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'test/base-json.cpp')
-rw-r--r--test/base-json.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/test/base-json.cpp b/test/base-json.cpp
new file mode 100644
index 0000000..02bbebb
--- /dev/null
+++ b/test/base-json.cpp
@@ -0,0 +1,110 @@
+/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
+
+#include "base/dictionary.hpp"
+#include "base/function.hpp"
+#include "base/namespace.hpp"
+#include "base/array.hpp"
+#include "base/objectlock.hpp"
+#include "base/json.hpp"
+#include <boost/algorithm/string/replace.hpp>
+#include <BoostTestTargetConfig.h>
+
+using namespace icinga;
+
+BOOST_AUTO_TEST_SUITE(base_json)
+
+BOOST_AUTO_TEST_CASE(encode)
+{
+ Dictionary::Ptr input (new Dictionary({
+ { "array", new Array({ new Namespace() }) },
+ { "false", false },
+ { "float", -1.25 },
+ { "fx", new Function("<test>", []() {}) },
+ { "int", -42 },
+ { "null", Value() },
+ { "string", "LF\nTAB\tAUml\xC3\xA4Ill\xC3" },
+ { "true", true },
+ { "uint", 23u }
+ }));
+
+ String output (R"EOF({
+ "array": [
+ {}
+ ],
+ "false": false,
+ "float": -1.25,
+ "fx": "Object of type 'Function'",
+ "int": -42,
+ "null": null,
+ "string": "LF\nTAB\tAUml\u00e4Ill\ufffd",
+ "true": true,
+ "uint": 23
+}
+)EOF");
+
+ BOOST_CHECK(JsonEncode(input, true) == output);
+
+ boost::algorithm::replace_all(output, " ", "");
+ boost::algorithm::replace_all(output, "Objectoftype'Function'", "Object of type 'Function'");
+ boost::algorithm::replace_all(output, "\n", "");
+
+ BOOST_CHECK(JsonEncode(input, false) == output);
+}
+
+BOOST_AUTO_TEST_CASE(decode)
+{
+ String input (R"EOF({
+ "array": [
+ {}
+ ],
+ "false": false,
+ "float": -1.25,
+ "int": -42,
+ "null": null,
+ "string": "LF\nTAB\tAUmlIll",
+ "true": true,
+ "uint": 23
+}
+)EOF");
+
+ boost::algorithm::replace_all(input, "AUml", "AUml\xC3\xA4");
+ boost::algorithm::replace_all(input, "Ill", "Ill\xC3");
+
+ auto output ((Dictionary::Ptr)JsonDecode(input));
+ BOOST_CHECK(output->GetKeys() == std::vector<String>({"array", "false", "float", "int", "null", "string", "true", "uint"}));
+
+ auto array ((Array::Ptr)output->Get("array"));
+ BOOST_CHECK(array->GetLength() == 1u);
+
+ auto array0 ((Dictionary::Ptr)array->Get(0));
+ BOOST_CHECK(array0->GetKeys() == std::vector<String>());
+
+ auto fAlse (output->Get("false"));
+ BOOST_CHECK(fAlse.IsBoolean() && !fAlse.ToBool());
+
+ auto fLoat (output->Get("float"));
+ BOOST_CHECK(fLoat.IsNumber() && fLoat.Get<double>() == -1.25);
+
+ auto iNt (output->Get("int"));
+ BOOST_CHECK(iNt.IsNumber() && iNt.Get<double>() == -42.0);
+
+ BOOST_CHECK(output->Get("null").IsEmpty());
+
+ auto string (output->Get("string"));
+ BOOST_CHECK(string.IsString() && string.Get<String>() == "LF\nTAB\tAUml\xC3\xA4Ill\xEF\xBF\xBD");
+
+ auto tRue (output->Get("true"));
+ BOOST_CHECK(tRue.IsBoolean() && tRue.ToBool());
+
+ auto uint (output->Get("uint"));
+ BOOST_CHECK(uint.IsNumber() && uint.Get<double>() == 23.0);
+}
+
+BOOST_AUTO_TEST_CASE(invalid1)
+{
+ BOOST_CHECK_THROW(JsonDecode("\"1.7"), std::exception);
+ BOOST_CHECK_THROW(JsonDecode("{8: \"test\"}"), std::exception);
+ BOOST_CHECK_THROW(JsonDecode("{\"test\": \"test\""), std::exception);
+}
+
+BOOST_AUTO_TEST_SUITE_END()