1
0
mirror of https://github.com/falk-werner/webfuse synced 2024-10-27 20:34:10 +00:00
falk-werner_webfuse/test/webfuse/jsonrpc/test_server.cc
2020-07-18 23:16:18 +02:00

220 lines
6.9 KiB
C++

#include <gtest/gtest.h>
#include "webfuse/impl/jsonrpc/server.h"
#include "webfuse/impl/jsonrpc/request.h"
#include "webfuse/impl/json/node.h"
#include "webfuse/impl/message.h"
#include "webfuse/status.h"
#include "webfuse/test_util/json_doc.hpp"
using webfuse_test::JsonDoc;
namespace
{
class Context
{
public:
Context()
: doc("{}")
, response(nullptr)
, is_called(false)
{
}
JsonDoc doc;
wf_json const * response;
bool is_called;
};
bool jsonrpc_send(
wf_message * request,
void * user_data)
{
Context * context = reinterpret_cast<Context*>(user_data);
context->is_called = true;
context->doc = std::move(JsonDoc(std::string(request->data, request->length)));
context->response = context->doc.root();
wf_impl_message_dispose(request);
return true;
}
void sayHello(
struct wf_jsonrpc_request * request,
char const * method_name,
wf_json const * params,
void * user_data)
{
(void) method_name;
(void) params;
(void) user_data;
wf_impl_jsonrpc_respond(request);
}
}
TEST(wf_jsonrpc_server, process_request)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
wf_impl_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr);
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": \"sayHello\", \"params\": [], \"id\": 23}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_TRUE(context.is_called);
ASSERT_NE(nullptr, context.response);
ASSERT_TRUE(wf_impl_json_is_object(context.response));
struct wf_json const * id = wf_impl_json_object_get(context.response, "id");
ASSERT_TRUE(wf_impl_json_is_int(id));
ASSERT_EQ(23, wf_impl_json_int_get(id));
struct wf_json const * result = wf_impl_json_object_get(context.response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, process_request_with_object_params)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
wf_impl_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr);
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": \"sayHello\", \"params\": {}, \"id\": 23}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_TRUE(context.is_called);
ASSERT_NE(nullptr, context.response);
ASSERT_TRUE(wf_impl_json_is_object(context.response));
struct wf_json const * id = wf_impl_json_object_get(context.response, "id");
ASSERT_TRUE(wf_impl_json_is_int(id));
ASSERT_EQ(23, wf_impl_json_int_get(id));
struct wf_json const * result = wf_impl_json_object_get(context.response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, invoke_unknown_method)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
wf_impl_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr);
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": \"greet\", \"params\": [], \"id\": 42}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_TRUE(context.is_called);
ASSERT_NE(nullptr, context.response);
ASSERT_TRUE(wf_impl_json_is_object(context.response));
struct wf_json const * id = wf_impl_json_object_get(context.response, "id");
ASSERT_TRUE(wf_impl_json_is_int(id));
ASSERT_EQ(42, wf_impl_json_int_get(id));
struct wf_json const * err = wf_impl_json_object_get(context.response, "error");
ASSERT_TRUE(wf_impl_json_is_object(err));
struct wf_json const * err_code = wf_impl_json_object_get(err, "code");
ASSERT_TRUE(wf_impl_json_is_int(err_code));
ASSERT_EQ(WF_BAD_NOTIMPLEMENTED, wf_impl_json_int_get(err_code));
struct wf_json const * err_message = wf_impl_json_object_get(err, "message");
ASSERT_TRUE(wf_impl_json_is_string(err_message));
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, skip_invalid_request_missing_id)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": \"sayHello\", \"params\": []}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_FALSE(context.is_called);
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, skip_invalid_request_wrong_id_type)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": \"sayHello\", \"params\": [], \"id\": \"42\"}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_FALSE(context.is_called);
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, skip_invalid_request_missing_params)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": \"sayHello\", \"id\": 23}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_FALSE(context.is_called);
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, skip_invalid_request_wrong_params_type)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": \"sayHello\", \"params\": \"invalid\", \"id\": 42}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_FALSE(context.is_called);
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, skip_invalid_request_missing_method)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"params\": [], \"id\": 23}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_FALSE(context.is_called);
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, skip_invalid_request_wront_method_type)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
Context context;
void * user_data = reinterpret_cast<void*>(&context);
JsonDoc request("{\"method\": 42, \"params\": [], \"id\": 23}");
wf_impl_jsonrpc_server_process(server, request.root(), &jsonrpc_send, user_data);
ASSERT_FALSE(context.is_called);
wf_impl_jsonrpc_server_dispose(server);
}