diff --git a/meson.build b/meson.build index b1d4f2d..54bdb39 100644 --- a/meson.build +++ b/meson.build @@ -218,6 +218,7 @@ alltests = executable('alltests', 'test/webfuse/mocks/mock_fuse.cc', 'test/webfuse/mocks/mock_operation_context.cc', 'test/webfuse/mocks/mock_jsonrpc_proxy.cc', + 'test/webfuse/mocks/mock_adapter_client_callback.cc', 'test/webfuse//tests/core/test_util.cc', 'test/webfuse/tests/core/test_container_of.cc', 'test/webfuse/tests/core/test_string.cc', diff --git a/test/webfuse/mocks/mock_adapter_client_callback.cc b/test/webfuse/mocks/mock_adapter_client_callback.cc new file mode 100644 index 0000000..4407497 --- /dev/null +++ b/test/webfuse/mocks/mock_adapter_client_callback.cc @@ -0,0 +1,44 @@ +#include "webfuse/mocks/mock_adapter_client_callback.hpp" +#include "webfuse/adapter/client.h" + +extern "C" +{ + +static void +webfuse_test_MockAdapterClientCallback_callback( + wf_client * client, + int reason, + void * args) +{ + void * user_data = wf_client_get_userdata(client); + auto * callback = reinterpret_cast(user_data); + + callback->Invoke(client, reason, args); +} + +} + +namespace webfuse_test +{ + +MockAdapterClientCallback::MockAdapterClientCallback() +{ + +} + +MockAdapterClientCallback::~MockAdapterClientCallback() +{ + +} + +void * MockAdapterClientCallback::GetUserData() +{ + return reinterpret_cast(this); +} + +wf_client_callback_fn * MockAdapterClientCallback::GetCallbackFn() +{ + return &webfuse_test_MockAdapterClientCallback_callback; +} + +} \ No newline at end of file diff --git a/test/webfuse/mocks/mock_adapter_client_callback.hpp b/test/webfuse/mocks/mock_adapter_client_callback.hpp new file mode 100644 index 0000000..cd66c7e --- /dev/null +++ b/test/webfuse/mocks/mock_adapter_client_callback.hpp @@ -0,0 +1,22 @@ +#ifndef WF_MOCK_ADAPTER_CLIENT_CALLBACK_HPP +#define WF_MOCK_ADAPTER_CLIENT_CALLBACK_HPP + +#include +#include "webfuse/adapter/client_callback.h" + +namespace webfuse_test +{ + +class MockAdapterClientCallback +{ +public: + MockAdapterClientCallback(); + virtual ~MockAdapterClientCallback(); + MOCK_METHOD3(Invoke, void (wf_client *, int, void *)); + void * GetUserData(); + wf_client_callback_fn * GetCallbackFn(); +}; + +} + +#endif diff --git a/test/webfuse/tests/adapter/test_client.cc b/test/webfuse/tests/adapter/test_client.cc index bc0923b..5b24a46 100644 --- a/test/webfuse/tests/adapter/test_client.cc +++ b/test/webfuse/tests/adapter/test_client.cc @@ -1,11 +1,15 @@ #include +#include #include "webfuse/adapter/client.h" #include "webfuse/adapter/credentials.h" #include "webfuse/core/protocol_names.h" #include "webfuse/utils/ws_server.h" +#include "webfuse/mocks/mock_adapter_client_callback.hpp" using webfuse_test::WsServer; +using webfuse_test::MockAdapterClientCallback; +using testing::_; namespace { @@ -67,33 +71,9 @@ void callback( } } -void callback2( - wf_client * client, - int reason, - void * args) -{ - auto * ctx = reinterpret_cast(wf_client_get_userdata(client)); - - switch (reason) - { - case WF_CLIENT_CREATED: - ctx->state = connection_state::connecting; - break; - case WF_CLIENT_CONNECTED: - ctx->state = connection_state::connected; - break; - case WF_CLIENT_DISCONNECTED: - ctx->state = connection_state::disconnected; - break; - default: - break; - } -} - - } -TEST(client, general_usage) +TEST(AdapterClient, GeneralUsage) { context ctx; ctx.state = connection_state::connecting; @@ -109,24 +89,46 @@ TEST(client, general_usage) wf_client_dispose(client); } -TEST(client, connect) +TEST(AdapterClient, CreateAndDispose) +{ + MockAdapterClientCallback callback; + + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_INIT, nullptr)).Times(1); + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CREATED, nullptr)).Times(1); + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_GET_TLS_CONFIG, _)).Times(1); + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CLEANUP, nullptr)).Times(1); + + wf_client * client = wf_client_create( + callback.GetCallbackFn(), callback.GetUserData()); + + wf_client_dispose(client); +} + +TEST(AdapterClient, Connect) { WsServer server(WF_PROTOCOL_NAME_PROVIDER_SERVER); + MockAdapterClientCallback callback; + + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_INIT, nullptr)).Times(1); + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CREATED, nullptr)).Times(1); + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_GET_TLS_CONFIG, _)).Times(1); + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CLEANUP, nullptr)).Times(1); + + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1); + EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1); - context ctx; - ctx.state = connection_state::connecting; wf_client * client = wf_client_create( - &callback2, reinterpret_cast(&ctx)); + callback.GetCallbackFn(), callback.GetUserData()); wf_client_connect(client, server.GetUrl().c_str()); - while (ctx.state != connection_state::connected) + while (!server.IsConnected()) { wf_client_service(client); } wf_client_disconnect(client); - while (ctx.state != connection_state::disconnected) + while (server.IsConnected()) { wf_client_service(client); }