Files
MaxScale/server/core/test/test_json.cc
Markus Mäkelä 203bba0e1d Add support for multiple runtime error messages
Storing all the runtime errors makes it possible to return all of them
them via the REST API. MaxAdmin will still only show the latest error but
MaxCtrl will now show all errors if more than one error occurs.
2019-03-21 18:19:10 +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: 2022-01-01
*
* 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;
}