From 8390c3a5fea71555d9862ea8eac11a2d037de82f Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sun, 28 Apr 2019 13:00:23 +0200 Subject: [PATCH] adds tests of jsonrpc server --- CMakeLists.txt | 3 +- test/adapter/jsonrpc/test_server.cc | 125 ++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 test/adapter/jsonrpc/test_server.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e5476e..c311eb8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -307,12 +307,13 @@ add_executable(alltests test/adapter/test_credentials.cc test/adapter/test_authenticator.cc test/adapter/test_authenticators.cc + test/adapter/test_fuse_req.cc test/adapter/jsonrpc/test_util.cc test/adapter/jsonrpc/test_is_request.cc test/adapter/jsonrpc/test_request.cc test/adapter/jsonrpc/test_is_response.cc test/adapter/jsonrpc/test_response.cc - test/adapter/test_fuse_req.cc + test/adapter/jsonrpc/test_server.cc test/provider/test_url.cc test/provider/test_static_filesystem.cc ) diff --git a/test/adapter/jsonrpc/test_server.cc b/test/adapter/jsonrpc/test_server.cc new file mode 100644 index 0000000..20d5d0f --- /dev/null +++ b/test/adapter/jsonrpc/test_server.cc @@ -0,0 +1,125 @@ +#include +#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(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(&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(&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(&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); +}