MaxScale/server/core/test/test_json.cc
2022-01-04 15:47:38 +02:00

333 lines
12 KiB
C++

/*
* Copyright (c) 2016 MariaDB Corporation Ab
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
*
* Change Date: 2026-01-04
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2 or later of the General
* Public License.
*/
#include <maxscale/ccdefs.hh>
#include <string>
#include <maxscale/jansson.hh>
#include <maxscale/json_api.hh>
using std::string;
const char* test1_json =
"{"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/servers/\""
" },"
" \"data\": ["
" {"
" \"id\": \"server1\","
" \"type\": \"servers\","
" \"relationships\": {"
" \"services\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/services/\""
" },"
" \"data\": ["
" {"
" \"id\": \"RW-Split-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"SchemaRouter-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"RW-Split-Hint-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"Read-Connection-Router\","
" \"type\": \"services\""
" }"
" ]"
" },"
" \"monitors\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/monitors/\""
" },"
" \"data\": ["
" {"
" \"id\": \"MySQL-Monitor\","
" \"type\": \"monitors\""
" }"
" ]"
" }"
" },"
" \"attributes\": {"
" \"parameters\": {"
" \"address\": \"127.0.0.1\","
" \"port\": 3000,"
" \"protocol\": \"MySQLBackend\""
" },"
" \"status\": \"Master, Running\","
" \"version_string\": \"10.1.19-MariaDB-1~jessie\","
" \"node_id\": 3000,"
" \"master_id\": -1,"
" \"replication_depth\": 0,"
" \"slaves\": ["
" 3001,"
" 3002,"
" 3003"
" ],"
" \"statistics\": {"
" \"connections\": 0,"
" \"total_connections\": 0,"
" \"active_operations\": 0"
" }"
" }"
" },"
" {"
" \"id\": \"server2\","
" \"type\": \"servers\","
" \"relationships\": {"
" \"services\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/services/\""
" },"
" \"data\": ["
" {"
" \"id\": \"RW-Split-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"SchemaRouter-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"RW-Split-Hint-Router\","
" \"type\": \"services\""
" }"
" ]"
" },"
" \"monitors\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/monitors/\""
" },"
" \"data\": ["
" {"
" \"id\": \"MySQL-Monitor\","
" \"type\": \"monitors\""
" }"
" ]"
" }"
" },"
" \"attributes\": {"
" \"parameters\": {"
" \"address\": \"127.0.0.1\","
" \"port\": 3001,"
" \"protocol\": \"MySQLBackend\""
" },"
" \"status\": \"Slave, Running\","
" \"version_string\": \"10.1.19-MariaDB-1~jessie\","
" \"node_id\": 3001,"
" \"master_id\": 3000,"
" \"replication_depth\": 1,"
" \"slaves\": [],"
" \"statistics\": {"
" \"connections\": 0,"
" \"total_connections\": 0,"
" \"active_operations\": 0"
" }"
" }"
" },"
" {"
" \"id\": \"server3\","
" \"type\": \"servers\","
" \"relationships\": {"
" \"services\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/services/\""
" },"
" \"data\": ["
" {"
" \"id\": \"RW-Split-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"SchemaRouter-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"RW-Split-Hint-Router\","
" \"type\": \"services\""
" }"
" ]"
" },"
" \"monitors\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/monitors/\""
" },"
" \"data\": ["
" {"
" \"id\": \"MySQL-Monitor\","
" \"type\": \"monitors\""
" }"
" ]"
" }"
" },"
" \"attributes\": {"
" \"parameters\": {"
" \"address\": \"127.0.0.1\","
" \"port\": 3002,"
" \"protocol\": \"MySQLBackend\""
" },"
" \"status\": \"Slave, Running\","
" \"version_string\": \"10.1.19-MariaDB-1~jessie\","
" \"node_id\": 3002,"
" \"master_id\": 3000,"
" \"replication_depth\": 1,"
" \"slaves\": [],"
" \"statistics\": {"
" \"connections\": 0,"
" \"total_connections\": 0,"
" \"active_operations\": 0"
" }"
" }"
" },"
" {"
" \"id\": \"server4\","
" \"type\": \"servers\","
" \"relationships\": {"
" \"services\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/services/\""
" },"
" \"data\": ["
" {"
" \"id\": \"RW-Split-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"SchemaRouter-Router\","
" \"type\": \"services\""
" },"
" {"
" \"id\": \"RW-Split-Hint-Router\","
" \"type\": \"services\""
" }"
" ]"
" },"
" \"monitors\": {"
" \"links\": {"
" \"self\": \"http://localhost:8989/v1/monitors/\""
" },"
" \"data\": ["
" {"
" \"id\": \"MySQL-Monitor\","
" \"type\": \"monitors\""
" }"
" ]"
" }"
" },"
" \"attributes\": {"
" \"parameters\": {"
" \"address\": \"127.0.0.1\","
" \"port\": 3003,"
" \"protocol\": \"MySQLBackend\""
" },"
" \"status\": \"Slave, Running\","
" \"version_string\": \"10.1.19-MariaDB-1~jessie\","
" \"node_id\": 3003,"
" \"master_id\": 3000,"
" \"replication_depth\": 1,"
" \"slaves\": [],"
" \"statistics\": {"
" \"connections\": 0,"
" \"total_connections\": 0,"
" \"active_operations\": 0"
" }"
" }"
" }"
" ]"
"}";
int test1()
{
json_error_t err = {};
json_t* json = json_loads(test1_json, 0, &err);
mxb_assert(json);
mxb_assert(mxs_json_pointer(json, "") == json);
mxb_assert(mxs_json_pointer(json, "links") == json_object_get(json, "links"));
mxb_assert(json_is_string(mxs_json_pointer(json, "links/self")));
mxb_assert(mxs_json_pointer(json, "data") == json_object_get(json, "data"));
mxb_assert(json_is_array(mxs_json_pointer(json, "data")));
mxb_assert(json_is_object(mxs_json_pointer(json, "data/0")));
mxb_assert(json_is_string(mxs_json_pointer(json, "data/0/id")));
string s = json_string_value(mxs_json_pointer(json, "data/0/id"));
mxb_assert(s == "server1");
mxb_assert(json_is_object(mxs_json_pointer(json, "data/1")));
mxb_assert(json_is_string(mxs_json_pointer(json, "data/1/id")));
s = json_string_value(mxs_json_pointer(json, "data/1/id"));
mxb_assert(s == "server2");
mxb_assert(json_is_object(mxs_json_pointer(json, "data/0/attributes")));
mxb_assert(json_is_object(mxs_json_pointer(json, "data/0/attributes/parameters")));
mxb_assert(json_is_integer(mxs_json_pointer(json, "data/0/attributes/parameters/port")));
int i = json_integer_value(mxs_json_pointer(json, "data/0/attributes/parameters/port"));
mxb_assert(i == 3000);
mxb_assert(json_is_array(mxs_json_pointer(json, "data/0/attributes/slaves")));
mxb_assert(json_array_size(mxs_json_pointer(json, "data/0/attributes/slaves")) == 3);
json_decref(json);
return 0;
}
int test2()
{
char* s;
json_t* err;
err = mxs_json_error("%s", "This is an error!");
s = json_dumps(err, 0);
printf("%s\n", s);
mxb_assert(strcmp(s, "{\"errors\": [{\"detail\": \"This is an error!\"}]}") == 0);
MXS_FREE(s);
json_decref(err);
err = mxs_json_error_append(NULL, "%s", "This is an error!");
s = json_dumps(err, 0);
printf("%s\n", s);
mxb_assert(strcmp(s, "{\"errors\": [{\"detail\": \"This is an error!\"}]}") == 0);
MXS_FREE(s);
err = mxs_json_error_append(err, "%s", "This is another error!");
s = json_dumps(err, 0);
printf("%s\n", s);
mxb_assert(strcmp(s,
"{\"errors\": [{\"detail\": \"This is an error!\"}, "
"{\"detail\": \"This is another error!\"}]}") == 0);
MXS_FREE(s);
json_decref(err);
return 0;
}
int main(int argc, char** argv)
{
int errors = 0;
errors += test1();
errors += test2();
return 0;
}