mirror of
				https://github.com/Icinga/icinga2.git
				synced 2025-11-04 05:34:12 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* 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()
 |