mirror of
https://github.com/falk-werner/webfuse
synced 2024-10-27 20:34:10 +00:00
126 lines
3.8 KiB
C++
126 lines
3.8 KiB
C++
|
#include <gtest/gtest.h>
|
||
|
#include "webfuse/adapter/impl/jsonrpc/server.h"
|
||
|
#include "webfuse/adapter/impl/jsonrpc/request.h"
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
struct Context
|
||
|
{
|
||
|
json_t * response;
|
||
|
bool is_called;
|
||
|
};
|
||
|
|
||
|
bool jsonrpc_send(
|
||
|
json_t * request,
|
||
|
void * user_data)
|
||
|
{
|
||
|
Context * context = reinterpret_cast<Context*>(user_data);
|
||
|
context->is_called = true;
|
||
|
context->response = request;
|
||
|
json_incref(request);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void sayHello(
|
||
|
struct wf_impl_jsonrpc_request * request,
|
||
|
char const * method_name,
|
||
|
json_t * params,
|
||
|
void * user_data)
|
||
|
{
|
||
|
(void) method_name;
|
||
|
(void) params;
|
||
|
(void) user_data;
|
||
|
|
||
|
json_t * result = json_string("Hello");
|
||
|
wf_impl_jsonrpc_respond(request, result);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
TEST(jsonrpc_server, process_request)
|
||
|
{
|
||
|
struct wf_impl_jsonrpc_server server;
|
||
|
wf_impl_jsonrpc_server_init(&server);
|
||
|
wf_impl_jsonrpc_server_add(&server, "sayHello", &sayHello, nullptr);
|
||
|
|
||
|
Context context{nullptr, false};
|
||
|
void * user_data = reinterpret_cast<void*>(&context);
|
||
|
json_t * request = json_object();
|
||
|
json_object_set_new(request, "method", json_string("sayHello"));
|
||
|
json_object_set_new(request, "params", json_array());
|
||
|
json_object_set_new(request, "id", json_integer(23));
|
||
|
wf_impl_jsonrpc_server_process(&server, request, &jsonrpc_send, user_data);
|
||
|
|
||
|
ASSERT_TRUE(context.is_called);
|
||
|
ASSERT_NE(nullptr, context.response);
|
||
|
ASSERT_TRUE(json_is_object(context.response));
|
||
|
|
||
|
json_t * id = json_object_get(context.response, "id");
|
||
|
ASSERT_TRUE(json_is_integer(id));
|
||
|
ASSERT_EQ(23, json_integer_value(id));
|
||
|
|
||
|
json_t * result = json_object_get(context.response, "result");
|
||
|
ASSERT_TRUE(json_is_string(result));
|
||
|
ASSERT_STREQ("Hello", json_string_value(result));
|
||
|
|
||
|
json_decref(context.response);
|
||
|
json_decref(request);
|
||
|
wf_impl_jsonrpc_server_cleanup(&server);
|
||
|
}
|
||
|
|
||
|
TEST(jsonrpc_server, invoke_unknown_method)
|
||
|
{
|
||
|
struct wf_impl_jsonrpc_server server;
|
||
|
wf_impl_jsonrpc_server_init(&server);
|
||
|
wf_impl_jsonrpc_server_add(&server, "sayHello", &sayHello, nullptr);
|
||
|
|
||
|
Context context{nullptr, false};
|
||
|
void * user_data = reinterpret_cast<void*>(&context);
|
||
|
json_t * request = json_object();
|
||
|
json_object_set_new(request, "method", json_string("greet"));
|
||
|
json_object_set_new(request, "params", json_array());
|
||
|
json_object_set_new(request, "id", json_integer(42));
|
||
|
wf_impl_jsonrpc_server_process(&server, request, &jsonrpc_send, user_data);
|
||
|
|
||
|
ASSERT_TRUE(context.is_called);
|
||
|
ASSERT_NE(nullptr, context.response);
|
||
|
ASSERT_TRUE(json_is_object(context.response));
|
||
|
|
||
|
json_t * id = json_object_get(context.response, "id");
|
||
|
ASSERT_TRUE(json_is_integer(id));
|
||
|
ASSERT_EQ(42, json_integer_value(id));
|
||
|
|
||
|
json_t * err = json_object_get(context.response, "error");
|
||
|
ASSERT_TRUE(json_is_object(err));
|
||
|
|
||
|
json_t * err_code = json_object_get(err, "code");
|
||
|
ASSERT_TRUE(json_is_integer(err_code));
|
||
|
ASSERT_EQ(WF_BAD_NOTIMPLEMENTED, json_integer_value(err_code));
|
||
|
|
||
|
json_t * err_message = json_object_get(err, "message");
|
||
|
ASSERT_TRUE(json_is_string(err_message));
|
||
|
|
||
|
json_decref(context.response);
|
||
|
json_decref(request);
|
||
|
wf_impl_jsonrpc_server_cleanup(&server);
|
||
|
}
|
||
|
|
||
|
TEST(jsonrpc_server, skip_invalid_request)
|
||
|
{
|
||
|
struct wf_impl_jsonrpc_server server;
|
||
|
wf_impl_jsonrpc_server_init(&server);
|
||
|
|
||
|
Context context{nullptr, false};
|
||
|
void * user_data = reinterpret_cast<void*>(&context);
|
||
|
json_t * request = json_object();
|
||
|
json_object_set_new(request, "method", json_string("sayHello"));
|
||
|
json_object_set_new(request, "params", json_array());
|
||
|
wf_impl_jsonrpc_server_process(&server, request, &jsonrpc_send, user_data);
|
||
|
|
||
|
ASSERT_FALSE(context.is_called);
|
||
|
|
||
|
json_decref(request);
|
||
|
wf_impl_jsonrpc_server_cleanup(&server);
|
||
|
}
|