diff --git a/CMakeLists.txt b/CMakeLists.txt index 34c9d3a..76f6861 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,6 +308,8 @@ add_executable(alltests test/adapter/test_authenticator.cc test/adapter/test_authenticators.cc test/adapter/jsonrpc/test_util.cc + test/adapter/jsonrpc/test_is_request.cc + test/adapter/jsonrpc/test_request.cc test/adapter/test_fuse_req.cc test/provider/test_url.cc test/provider/test_static_filesystem.cc diff --git a/test/adapter/jsonrpc/test_is_request.cc b/test/adapter/jsonrpc/test_is_request.cc new file mode 100644 index 0000000..5fef81e --- /dev/null +++ b/test/adapter/jsonrpc/test_is_request.cc @@ -0,0 +1,112 @@ +#include +#include "webfuse/adapter/impl/jsonrpc/request.h" + +TEST(jsonrpc_is_request, request_with_object_params) +{ + json_t * request = json_object(); + json_object_set_new(request, "method", json_string("method")); + json_object_set_new(request, "params", json_object()); + json_object_set_new(request, "id", json_integer(42)); + + ASSERT_TRUE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, request_with_array_params) +{ + json_t * request = json_object(); + json_object_set_new(request, "method", json_string("method")); + json_object_set_new(request, "params", json_array()); + json_object_set_new(request, "id", json_integer(42)); + + ASSERT_TRUE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, null_request) +{ + ASSERT_FALSE(wf_impl_jsonrpc_is_request(nullptr)); +} + +TEST(jsonrpc_is_request, invalid_request) +{ + json_t * request = json_array(); + json_array_append_new(request, json_string("method")); + json_array_append_new(request, json_object()); + json_array_append_new(request, json_integer(42)); + + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, invalid_request_without_id) +{ + json_t * request = json_object(); + json_object_set_new(request, "method", json_string("method")); + json_object_set_new(request, "params", json_object()); + + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, invalid_request_due_to_invalid_id) +{ + json_t * request = json_object(); + json_object_set_new(request, "method", json_string("method")); + json_object_set_new(request, "params", json_object()); + json_object_set_new(request, "id", json_string("42")); + + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, invalid_request_without_method) +{ + json_t * request = json_object(); + json_object_set_new(request, "params", json_object()); + json_object_set_new(request, "id", json_integer(42)); + + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, invalid_request_due_to_invalid_method) +{ + json_t * request = json_object(); + json_object_set_new(request, "method", json_integer(42)); + json_object_set_new(request, "params", json_object()); + json_object_set_new(request, "id", json_integer(42)); + + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, invalid_request_without_params) +{ + json_t * request = json_object(); + json_object_set_new(request, "method", json_string("method")); + json_object_set_new(request, "id", json_integer(42)); + + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} + +TEST(jsonrpc_is_request, invalid_request_due_to_invalid_params) +{ + json_t * request = json_object(); + json_object_set_new(request, "methdo", json_string("method")); + json_object_set_new(request, "params", json_string("params")); + json_object_set_new(request, "id", json_integer(42)); + + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); + + json_decref(request); +} diff --git a/test/adapter/jsonrpc/test_request.cc b/test/adapter/jsonrpc/test_request.cc new file mode 100644 index 0000000..07c3da8 --- /dev/null +++ b/test/adapter/jsonrpc/test_request.cc @@ -0,0 +1,102 @@ +#include +#include "webfuse/adapter/impl/jsonrpc/request.h" + +namespace +{ + +struct Context +{ + json_t * response; +}; + +bool jsonrpc_send( + json_t * request, + void * user_data) +{ + Context * context = reinterpret_cast(user_data); + context->response = request; + json_incref(request); + + return true; +} + +} + +TEST(jsonrpc_request, create_dispose) +{ + Context context{nullptr}; + void * user_data = reinterpret_cast(&context); + + struct wf_impl_jsonrpc_request * request = + wf_impl_jsonrpc_request_create(42, &jsonrpc_send, user_data); + + ASSERT_NE(nullptr, request); + ASSERT_EQ(user_data, wf_impl_jsonrpc_request_get_userdata(request)); + + wf_impl_jsonrpc_request_dispose(request); +} + +TEST(jsonrpc_request, respond) +{ + Context context{nullptr}; + void * user_data = reinterpret_cast(&context); + + struct wf_impl_jsonrpc_request * request = + wf_impl_jsonrpc_request_create(42, &jsonrpc_send, user_data); + + wf_impl_jsonrpc_respond(request, json_string("okay")); + + ASSERT_NE(nullptr, context.response); + + + json_t * response = reinterpret_cast(context.response); + ASSERT_TRUE(json_is_object(response)); + + json_t * id = json_object_get(response, "id"); + ASSERT_TRUE(json_is_integer(id)); + ASSERT_EQ(42, json_integer_value(id)); + + json_t * result = json_object_get(response, "result"); + ASSERT_TRUE(json_is_string(result)); + ASSERT_STREQ("okay", json_string_value(result)); + + ASSERT_EQ(nullptr, json_object_get(response, "error")); + + json_decref(response); +} + +TEST(jsonrpc_request, respond_error) +{ + Context context{nullptr}; + void * user_data = reinterpret_cast(&context); + + struct wf_impl_jsonrpc_request * request = + wf_impl_jsonrpc_request_create(42, &jsonrpc_send, user_data); + + wf_impl_jsonrpc_respond_error(request, WF_BAD); + + ASSERT_NE(nullptr, context.response); + + + json_t * response = reinterpret_cast(context.response); + ASSERT_TRUE(json_is_object(response)); + + json_t * id = json_object_get(response, "id"); + ASSERT_TRUE(json_is_integer(id)); + ASSERT_EQ(42, json_integer_value(id)); + + ASSERT_EQ(nullptr, json_object_get(response, "result")); + + json_t * err = json_object_get(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, json_integer_value(err_code)); + + json_t * err_message = json_object_get(err, "message"); + ASSERT_TRUE(json_is_string(err_message)); + ASSERT_STREQ("Bad", json_string_value(err_message)); + + json_decref(response); +}