2020-06-09 20:41:38 +00:00
|
|
|
#include <gtest/gtest.h>
|
2020-06-12 17:00:28 +00:00
|
|
|
#include <gmock/gmock.h>
|
2020-06-09 20:41:38 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
#include "webfuse/utils/adapter_client.hpp"
|
|
|
|
|
2020-06-12 18:38:20 +00:00
|
|
|
#include "webfuse/adapter/credentials.h"
|
2020-06-12 14:48:15 +00:00
|
|
|
#include "webfuse/core/protocol_names.h"
|
2020-06-13 12:59:58 +00:00
|
|
|
#include "webfuse/utils/ws_server2.hpp"
|
2020-06-12 17:00:28 +00:00
|
|
|
#include "webfuse/mocks/mock_adapter_client_callback.hpp"
|
2020-06-13 12:59:58 +00:00
|
|
|
#include "webfuse/mocks/mock_invokation_handler.hpp"
|
2020-06-12 17:05:10 +00:00
|
|
|
#include "webfuse/utils/timeout_watcher.hpp"
|
2020-06-11 20:57:56 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
using webfuse_test::AdapterClient;
|
2020-06-13 12:59:58 +00:00
|
|
|
using webfuse_test::WsServer2;
|
|
|
|
using webfuse_test::MockInvokationHander;
|
2020-06-12 17:00:28 +00:00
|
|
|
using webfuse_test::MockAdapterClientCallback;
|
2020-06-12 17:05:10 +00:00
|
|
|
using webfuse_test::TimeoutWatcher;
|
2020-06-12 17:00:28 +00:00
|
|
|
using testing::_;
|
2020-06-12 18:38:20 +00:00
|
|
|
using testing::Invoke;
|
2020-06-13 09:36:02 +00:00
|
|
|
using testing::AnyNumber;
|
2020-06-13 12:59:58 +00:00
|
|
|
using testing::Return;
|
|
|
|
using testing::Throw;
|
|
|
|
using testing::StrEq;
|
2020-06-09 20:41:38 +00:00
|
|
|
|
2020-06-13 12:59:58 +00:00
|
|
|
#define TIMEOUT (std::chrono::milliseconds(30 * 1000))
|
2020-06-12 17:05:10 +00:00
|
|
|
|
2020-06-09 20:41:38 +00:00
|
|
|
namespace
|
|
|
|
{
|
|
|
|
|
2020-06-12 18:38:20 +00:00
|
|
|
void GetCredentials(wf_client *, int, void * arg)
|
|
|
|
{
|
|
|
|
auto * creds = reinterpret_cast<wf_credentials*>(arg);
|
|
|
|
wf_credentials_set_type(creds, "username");
|
|
|
|
wf_credentials_add(creds, "username", "Bob");
|
|
|
|
wf_credentials_add(creds, "password", "secret");
|
|
|
|
}
|
|
|
|
|
2020-06-11 20:57:56 +00:00
|
|
|
}
|
|
|
|
|
2020-06-12 17:00:28 +00:00
|
|
|
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)
|
2020-06-11 20:57:56 +00:00
|
|
|
{
|
2020-06-12 17:05:10 +00:00
|
|
|
TimeoutWatcher watcher(TIMEOUT);
|
|
|
|
|
2020-06-13 12:59:58 +00:00
|
|
|
MockInvokationHander handler;
|
|
|
|
WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER);
|
|
|
|
EXPECT_CALL(handler, Invoke(_,_)).Times(0);
|
2020-06-12 17:00:28 +00:00
|
|
|
|
2020-06-13 12:59:58 +00:00
|
|
|
MockAdapterClientCallback callback;
|
2020-06-12 17:00:28 +00:00
|
|
|
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);
|
2020-06-11 20:57:56 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl());
|
2020-06-11 20:57:56 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Connect();
|
2020-06-12 17:00:28 +00:00
|
|
|
while (!server.IsConnected())
|
2020-06-09 20:41:38 +00:00
|
|
|
{
|
2020-06-12 17:05:10 +00:00
|
|
|
watcher.check();
|
2020-06-11 20:57:56 +00:00
|
|
|
}
|
2020-06-09 20:41:38 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Disconnect();
|
2020-06-12 17:00:28 +00:00
|
|
|
while (server.IsConnected())
|
2020-06-11 20:57:56 +00:00
|
|
|
{
|
2020-06-12 17:05:10 +00:00
|
|
|
watcher.check();
|
2020-06-09 20:41:38 +00:00
|
|
|
}
|
2020-06-12 18:38:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(AdapterClient, Authenticate)
|
|
|
|
{
|
|
|
|
TimeoutWatcher watcher(TIMEOUT);
|
|
|
|
|
2020-06-13 12:59:58 +00:00
|
|
|
MockInvokationHander handler;
|
|
|
|
WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER);
|
|
|
|
EXPECT_CALL(handler, Invoke(StrEq("authenticate"),_)).Times(1)
|
|
|
|
.WillOnce(Return("{}"));
|
2020-06-12 18:38:20 +00:00
|
|
|
|
2020-06-13 12:59:58 +00:00
|
|
|
MockAdapterClientCallback callback;
|
2020-06-13 09:36:02 +00:00
|
|
|
EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber());
|
2020-06-12 18:38:20 +00:00
|
|
|
EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, _)).Times(1)
|
|
|
|
.WillOnce(Invoke(GetCredentials));
|
|
|
|
bool called = false;
|
|
|
|
EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATED, nullptr)).Times(1)
|
2020-06-13 09:36:02 +00:00
|
|
|
.WillOnce(Invoke([&called] (wf_client *, int, void *) mutable {
|
|
|
|
called = true;
|
2020-06-12 18:38:20 +00:00
|
|
|
}));
|
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl());
|
2020-06-13 12:59:58 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Connect();
|
2020-06-12 18:38:20 +00:00
|
|
|
while (!server.IsConnected())
|
|
|
|
{
|
|
|
|
watcher.check();
|
|
|
|
}
|
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Authenticate();
|
2020-06-13 12:59:58 +00:00
|
|
|
while (!called) {
|
|
|
|
watcher.check();
|
|
|
|
}
|
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Disconnect();
|
2020-06-13 12:59:58 +00:00
|
|
|
while (server.IsConnected())
|
2020-06-12 18:38:20 +00:00
|
|
|
{
|
|
|
|
watcher.check();
|
|
|
|
}
|
2020-06-13 12:59:58 +00:00
|
|
|
}
|
|
|
|
|
2020-06-13 15:08:05 +00:00
|
|
|
TEST(AdapterClient, AuthenticateFailedWithoutConnect)
|
|
|
|
{
|
|
|
|
TimeoutWatcher watcher(TIMEOUT);
|
|
|
|
|
|
|
|
MockAdapterClientCallback callback;
|
|
|
|
EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber());
|
|
|
|
EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, _)).Times(1)
|
|
|
|
.WillOnce(Invoke(GetCredentials));
|
|
|
|
bool called = false;
|
|
|
|
EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATION_FAILED, nullptr)).Times(1)
|
|
|
|
.WillOnce(Invoke([&called] (wf_client *, int, void *) mutable {
|
|
|
|
called = true;
|
|
|
|
}));
|
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), "");
|
2020-06-13 15:08:05 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Authenticate();
|
2020-06-13 15:08:05 +00:00
|
|
|
while (!called) {
|
|
|
|
watcher.check();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-13 12:59:58 +00:00
|
|
|
TEST(AdapterClient, AuthenticationFailed)
|
|
|
|
{
|
|
|
|
TimeoutWatcher watcher(TIMEOUT);
|
|
|
|
|
|
|
|
MockInvokationHander handler;
|
|
|
|
WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER);
|
|
|
|
EXPECT_CALL(handler, Invoke(StrEq("authenticate"),_)).Times(1)
|
|
|
|
.WillOnce(Throw(std::runtime_error("authentication failed")));
|
|
|
|
|
|
|
|
MockAdapterClientCallback callback;
|
|
|
|
EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber());
|
|
|
|
EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, _)).Times(1)
|
|
|
|
.WillOnce(Invoke(GetCredentials));
|
|
|
|
bool called = false;
|
|
|
|
EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATION_FAILED, nullptr)).Times(1)
|
|
|
|
.WillOnce(Invoke([&called] (wf_client *, int, void *) mutable {
|
|
|
|
called = true;
|
|
|
|
}));
|
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl());
|
2020-06-13 12:59:58 +00:00
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Connect();
|
2020-06-13 12:59:58 +00:00
|
|
|
while (!server.IsConnected())
|
|
|
|
{
|
|
|
|
watcher.check();
|
|
|
|
}
|
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Authenticate();
|
2020-06-12 18:38:20 +00:00
|
|
|
while (!called) {
|
|
|
|
watcher.check();
|
|
|
|
}
|
|
|
|
|
2020-06-13 16:24:45 +00:00
|
|
|
client.Disconnect();
|
2020-06-12 18:38:20 +00:00
|
|
|
while (server.IsConnected())
|
|
|
|
{
|
|
|
|
watcher.check();
|
|
|
|
}
|
2020-06-13 16:24:45 +00:00
|
|
|
}
|