removed dependency to libjansson

pull/87/head
Falk Werner 4 years ago
parent 017e04f77f
commit 3496c605d2

@ -2,6 +2,10 @@
## 0.5.0 _(unknown)_
### Features
* Removed dependency to libjansson
### Fixes
* Fix deadlock reading files larger that a few KBytes (Isseue #82)

@ -39,7 +39,6 @@ After that, you will find the API documentation in the doc/api subdirectory.
- [libfuse3](https://github.com/libfuse/libfuse/)
- [libwebsockets](https://libwebsockets.org/)
- [Jansson](https://jansson.readthedocs.io)
- [GoogleTest](https://github.com/google/googletest) *(optional)*
### Installation from source
@ -66,17 +65,6 @@ After that, you will find the API documentation in the doc/api subdirectory.
make
sudo make install
#### Jansson
wget -O libjansson-2.12.tar.gz https://github.com/akheron/jansson/archive/v2.12.tar.gz
tar -xf libjansson-2.12.tar.gz
cd jansson-2.12
mkdir .build
cd .build
cmake ..
make
sudo make install
#### GoogleTest
Installation of GoogleTest is optional webfuse library, but required to compile tests.

@ -9,7 +9,6 @@ if not libwebsockets_dep.found()
libwebsockets_dep = libwebsockets.dependency('websockets_shared')
endif
jansson_dep = dependency('jansson', version: '>=2.11', fallback: ['jansson', 'jansson_dep'])
libfuse_dep = dependency('fuse3', version: '>=3.8.0', fallback: ['fuse3', 'libfuse_dep'])
pkg_config = import('pkgconfig')
@ -68,31 +67,31 @@ webfuse_static = static_library('webfuse',
'lib/webfuse/impl/client_tlsconfig.c',
c_args: ['-fvisibility=hidden'],
include_directories: private_inc_dir,
dependencies: [libfuse_dep, libwebsockets_dep, jansson_dep])
dependencies: [libfuse_dep, libwebsockets_dep])
webfuse_static_dep = declare_dependency(
include_directories: inc_dir,
link_with: [webfuse_static],
dependencies: [libfuse_dep, libwebsockets_dep, jansson_dep])
dependencies: [libfuse_dep, libwebsockets_dep])
webfuse = shared_library('webfuse',
'lib/webfuse/api.c',
version: meson.project_version(),
c_args: ['-fvisibility=hidden', '-DWF_API=WF_EXPORT'],
include_directories: private_inc_dir,
dependencies: [webfuse_static_dep, libfuse_dep, libwebsockets_dep, jansson_dep],
dependencies: [webfuse_static_dep, libfuse_dep, libwebsockets_dep],
install: true)
webfuse_dep = declare_dependency(
include_directories: inc_dir,
link_with: [webfuse],
dependencies: [libfuse_dep, libwebsockets_dep, jansson_dep])
dependencies: [libfuse_dep, libwebsockets_dep])
install_subdir('include/webfuse', install_dir: 'include')
pkg_config.generate(
libraries: [webfuse],
requires: ['fuse3', 'libwebsockets', 'jansson'],
requires: ['fuse3', 'libwebsockets'],
subdirs: '.',
version: meson.project_version(),
name: 'libwebfuse',
@ -145,7 +144,6 @@ alltests = executable('alltests',
'test/webfuse/test_util/ws_client.cc',
'test/webfuse/test_util/adapter_client.cc',
'test/webfuse/test_util/file.cc',
'test/webfuse/test_util/jansson_test_environment.cc',
'test/webfuse/test_util/lws_test_environment.cc',
'test/webfuse/test_util/json_doc.cc',
'test/webfuse/mocks/mock_authenticator.cc',
@ -203,7 +201,6 @@ alltests = executable('alltests',
webfuse_static_dep,
libwebsockets_dep,
libfuse_dep,
jansson_dep,
gtest_dep,
gmock_main_dep,
test_certs_dep

@ -1,10 +0,0 @@
[wrap-file]
directory = jansson-2.11
source_url = http://www.digip.org/jansson/releases/jansson-2.11.tar.bz2
source_filename = jansson-2.11.tar.bz2
source_hash = 783132e2fc970feefc2fa54199ef65ee020bd8e0e991a78ea44b8586353a0947
patch_url = https://wrapdb.mesonbuild.com/v1/projects/jansson/2.11/3/get_zip
patch_filename = jansson-2.11-3-wrap.zip
patch_hash = 0bcac510994890048d42658c674e33dd7d88715fc1e3bf49d10012f57b0e0020

@ -1,31 +1,31 @@
#ifndef WF_GETATTR_MATCHER_HPP
#define WF_GETATTR_MATCHER_HPP
#include "webfuse/impl/json/node.h"
#include <gmock/gmock.h>
#include <jansson.h>
namespace webfuse_test
{
MATCHER_P(GetAttr, inode, "")
{
if (!json_is_array(arg))
if (!wf_impl_json_is_array(arg))
{
*result_listener << "json array expected";
return false;
}
json_t * inode_ = json_array_get(arg, 1);
if (!json_is_integer(inode_))
wf_json const * inode_ = wf_impl_json_array_get(arg, 1);
if (!wf_impl_json_is_int(inode_))
{
*result_listener << "inode is expectoed to an integer";
return false;
}
if (inode != json_integer_value(inode_))
if (inode != wf_impl_json_int_get(inode_))
{
*result_listener << "inode mismatch: expected" << inode
<< " but was " << json_integer_value(inode_);
<< " but was " << wf_impl_json_int_get(inode_);
return false;
}

@ -1,8 +1,8 @@
#ifndef WF_LOOKUP_MATCHER_HPP
#define WF_LOOKUP_MATCHER_HPP
#include "webfuse/impl/json/node.h"
#include <gmock/gmock.h>
#include <jansson.h>
#include <cstring>
namespace webfuse_test
@ -10,35 +10,35 @@ namespace webfuse_test
MATCHER_P2(Lookup, parent, name, "")
{
if (!json_is_array(arg))
if (!wf_impl_json_is_array(arg))
{
*result_listener << "json array expected";
return false;
}
json_t * parent_ = json_array_get(arg, 1);
if (!json_is_integer(parent_))
wf_json const * parent_ = wf_impl_json_array_get(arg, 1);
if (!wf_impl_json_is_int(parent_))
{
*result_listener << "parent is expected to be an integer";
return false;
}
if (parent != json_integer_value(parent_))
if (parent != wf_impl_json_int_get(parent_))
{
*result_listener << "parent mismatch: expected " << parent
<< " but was " << json_integer_value(parent_);
<< " but was " << wf_impl_json_int_get(parent_);
return false;
}
json_t * name_ = json_array_get(arg, 2);
if (!json_is_string(name_))
wf_json const * name_ = wf_impl_json_array_get(arg, 2);
if (!wf_impl_json_is_string(name_))
{
*result_listener << "name is expected to be a string";
return false;
}
if (0 != strcmp(name, json_string_value(name_)))
if (0 != strcmp(name, wf_impl_json_string_get(name_)))
{
*result_listener << "name mismatch: expected \"" << name
<< "\" but was \"" << json_string_value(name_) << "\"";
<< "\" but was \"" << wf_impl_json_string_get(name_) << "\"";
return false;
}

@ -10,7 +10,7 @@ namespace webfuse_test
class MockInvokationHander: public InvokationHandler
{
public:
MOCK_METHOD2(Invoke, std::string(char const * method, json_t * params));
MOCK_METHOD2(Invoke, std::string(char const * method, wf_json const * params));
};
}

@ -1,31 +1,31 @@
#ifndef WF_OPEN_MATCHER_HPP
#define WF_OPEN_MATCHER_HPP
#include "webfuse/impl/json/node.h"
#include <gmock/gmock.h>
#include <jansson.h>
namespace webfuse_test
{
MATCHER_P(Open, inode, "")
{
if (!json_is_array(arg))
if (!wf_impl_json_is_array(arg))
{
*result_listener << "json array expected";
return false;
}
json_t * inode_ = json_array_get(arg, 1);
if (!json_is_integer(inode_))
wf_json const * inode_ = wf_impl_json_array_get(arg, 1);
if (!wf_impl_json_is_int(inode_))
{
*result_listener << "inode is expectoed to an integer";
return false;
}
if (inode != json_integer_value(inode_))
if (inode != wf_impl_json_int_get(inode_))
{
*result_listener << "inode mismatch: expected" << inode
<< " but was " << json_integer_value(inode_);
<< " but was " << wf_impl_json_int_get(inode_);
return false;
}

@ -2,30 +2,30 @@
#define WF_READDIR_MATCHER_HPP
#include <gmock/gmock.h>
#include <jansson.h>
#include "webfuse/impl/json/node.h"
namespace webfuse_test
{
MATCHER_P(ReadDir, inode, "")
{
if (!json_is_array(arg))
if (!wf_impl_json_is_array(arg))
{
*result_listener << "json array expected";
return false;
}
json_t * inode_ = json_array_get(arg, 1);
if (!json_is_integer(inode_))
wf_json const * inode_ = wf_impl_json_array_get(arg, 1);
if (!wf_impl_json_is_int(inode_))
{
*result_listener << "inode is expectoed to an integer";
return false;
}
if (inode != json_integer_value(inode_))
if (inode != wf_impl_json_int_get(inode_))
{
*result_listener << "inode mismatch: expected" << inode
<< " but was " << json_integer_value(inode_);
<< " but was " << wf_impl_json_int_get(inode_);
return false;
}

@ -1,6 +1,3 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "webfuse/test_util/adapter_client.hpp"
#include "webfuse/client_tlsconfig.h"
#include "webfuse/credentials.h"
@ -13,8 +10,12 @@
#include "webfuse/mocks/open_matcher.hpp"
#include "webfuse/mocks/getattr_matcher.hpp"
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <future>
#include <chrono>
#include <sstream>
using webfuse_test::AdapterClient;
using webfuse_test::WsServer;
@ -148,8 +149,7 @@ TEST(AdapterClient, IgnoreInvalidJsonMessage)
client.Connect();
ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT));
json_t * invalid_request = json_object();
server.SendMessage(invalid_request);
server.SendMessage("{}");
client.Disconnect();
ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT));
@ -566,26 +566,21 @@ TEST(AdapterClient, ReadFile)
EXPECT_CALL(handler, Invoke(StrEq("open"), Open(2))).Times(1)
.WillOnce(Return("{\"handle\": 42}"));
EXPECT_CALL(handler, Invoke(StrEq("read"), _)).Times(AnyNumber())
.WillRepeatedly(Invoke([](char const *, json_t * params) {
int offset = json_integer_value(json_array_get(params, 3));
int length = json_integer_value(json_array_get(params, 4));
.WillRepeatedly(Invoke([](char const *, wf_json const * params) {
int offset = wf_impl_json_int_get(wf_impl_json_array_get(params, 3));
int length = wf_impl_json_int_get(wf_impl_json_array_get(params, 4));
int remaining = (offset < 4096) ? 4096 - offset : 0;
int count = (length < remaining) ? length : remaining;
std::string data = std::string(count, '*');
json_t * result = json_object();
json_object_set_new(result, "data", json_string(data.c_str()));
json_object_set_new(result, "format", json_string("identity"));
json_object_set_new(result, "count", json_integer(count));
char * result_text = json_dumps(result, 0);
std::string result_str = result_text;
free(result_text);
json_decref(result);
std::ostringstream result;
result << "{"
<< "\"data\": \"" << std::string(count, '*') << "\","
<< "\"format\": \"identity\","
<< "\"count\": " << count
<< "}";
return result_str;
return result.str();
}));
EXPECT_CALL(handler, Invoke(StrEq("close"), _)).Times(AtMost(1));
@ -641,26 +636,21 @@ TEST(AdapterClient, ReadLargeFile)
EXPECT_CALL(handler, Invoke(StrEq("open"), Open(2))).Times(1)
.WillOnce(Return("{\"handle\": 42}"));
EXPECT_CALL(handler, Invoke(StrEq("read"), _)).Times(AnyNumber())
.WillRepeatedly(Invoke([](char const *, json_t * params) {
int offset = json_integer_value(json_array_get(params, 3));
int length = json_integer_value(json_array_get(params, 4));
.WillRepeatedly(Invoke([](char const *, wf_json const * params) {
int offset = wf_impl_json_int_get(wf_impl_json_array_get(params, 3));
int length = wf_impl_json_int_get(wf_impl_json_array_get(params, 4));
int remaining = (offset < 102400) ? 102400 - offset : 0;
int count = (length < remaining) ? length : remaining;
std::string data = std::string(count, '*');
json_t * result = json_object();
json_object_set_new(result, "data", json_string(data.c_str()));
json_object_set_new(result, "format", json_string("identity"));
json_object_set_new(result, "count", json_integer(count));
char * result_text = json_dumps(result, 0);
std::string result_str = result_text;
free(result_text);
json_decref(result);
std::ostringstream result;
result << "{"
<< "\"data\": \"" << std::string(count, '*') << "\","
<< "\"format\": \"identity\","
<< "\"count\": " << count
<< "}";
return result_str;
return result.str();
}));
EXPECT_CALL(handler, Invoke(StrEq("close"), _)).Times(AtMost(1));

@ -2,7 +2,6 @@
#include "webfuse/impl/credentials.h"
#include "webfuse/test_util/json_doc.hpp"
#include <jansson.h>
#include <gtest/gtest.h>
using webfuse_test::JsonDoc;

@ -1,19 +1,20 @@
#include <gtest/gtest.h>
#include <jansson.h>
#include "webfuse/server.h"
#include "webfuse/server_config.h"
#include "webfuse/test_util/server.hpp"
#include "webfuse/test_util/ws_client.hpp"
#include "webfuse/test_util/file.hpp"
#include "webfuse/test_util/json_doc.hpp"
#include "webfuse/mocks/mock_invokation_handler.hpp"
#include "webfuse/protocol_names.h"
#include "webfuse/mocks/open_matcher.hpp"
#include "webfuse/mocks/getattr_matcher.hpp"
#include "webfuse/mocks/lookup_matcher.hpp"
#include "webfuse/mocks/readdir_matcher.hpp"
#include "webfuse/impl/json/node.h"
#include <gtest/gtest.h>
using webfuse_test::JsonDoc;
using webfuse_test::MockInvokationHander;
using webfuse_test::WsClient;
using webfuse_test::Server;
@ -85,13 +86,13 @@ TEST(server, add_filesystem)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
std::string base_dir = server.GetBaseDir();
ASSERT_TRUE(File(base_dir).isDirectory());
@ -112,13 +113,13 @@ TEST(server, add_filesystem_fail_missing_param)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -134,13 +135,13 @@ TEST(server, add_filesystem_fail_invalid_name_type)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [42], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -156,13 +157,13 @@ TEST(server, add_filesystem_fail_invalid_name)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"invalid_1/name\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -179,13 +180,13 @@ TEST(server, authenticate)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", {\"username\": \"bob\", \"password\": \"secret\"}], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -201,13 +202,13 @@ TEST(server, authenticate_fail_missing_params)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -223,13 +224,13 @@ TEST(server, authenticate_fail_invalid_type)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [42, {\"username\": \"bob\", \"password\": \"secret\"}], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -245,13 +246,13 @@ TEST(server, authenticate_fail_invalid_credentials)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", 42], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -267,13 +268,13 @@ TEST(server, authenticate_fail_missing_credentials)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
auto disconnected = client.Disconnect();
ASSERT_TRUE(disconnected);
@ -299,13 +300,13 @@ TEST(server, read)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
std::string base_dir = server.GetBaseDir();
ASSERT_TRUE(File(base_dir).isDirectory());
@ -330,26 +331,21 @@ TEST(server, read_large_file_contents)
EXPECT_CALL(handler, Invoke(StrEq("open"), Open(2))).Times(1)
.WillOnce(Return("{\"handle\": 42}"));
EXPECT_CALL(handler, Invoke(StrEq("read"), _)).Times(AnyNumber())
.WillRepeatedly(Invoke([](char const *, json_t * params) {
int offset = json_integer_value(json_array_get(params, 3));
int length = json_integer_value(json_array_get(params, 4));
.WillRepeatedly(Invoke([](char const *, wf_json const * params) {
int offset = wf_impl_json_int_get(wf_impl_json_array_get(params, 3));
int length = wf_impl_json_int_get(wf_impl_json_array_get(params, 4));
int remaining = (offset < 4096) ? 4096 - offset : 0;
int count = (length < remaining) ? length : remaining;
std::string data = std::string(count, '*');
std::ostringstream result;
result << "{"
<< "\"data\": \"" << std::string(count, '*') << "\","
<< "\"format\": \"identity\","
<< "\"count\": " << count
<< "}";
json_t * result = json_object();
json_object_set_new(result, "data", json_string(data.c_str()));
json_object_set_new(result, "format", json_string("identity"));
json_object_set_new(result, "count", json_integer(count));
char * result_text = json_dumps(result, 0);
std::string result_str = result_text;
free(result_text);
json_decref(result);
return result_str;
return result.str();
}));
EXPECT_CALL(handler, Invoke(StrEq("close"), _)).Times(AtMost(1));
WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT);
@ -358,13 +354,13 @@ TEST(server, read_large_file_contents)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
std::string base_dir = server.GetBaseDir();
ASSERT_TRUE(File(base_dir).isDirectory());
@ -390,26 +386,21 @@ TEST(server, read_large_file)
EXPECT_CALL(handler, Invoke(StrEq("open"), Open(2))).Times(1)
.WillOnce(Return("{\"handle\": 42}"));
EXPECT_CALL(handler, Invoke(StrEq("read"), _)).Times(AnyNumber())
.WillRepeatedly(Invoke([](char const *, json_t * params) {
int offset = json_integer_value(json_array_get(params, 3));
int length = json_integer_value(json_array_get(params, 4));
.WillRepeatedly(Invoke([](char const *, wf_json const * params) {
int offset = wf_impl_json_int_get(wf_impl_json_array_get(params, 3));
int length = wf_impl_json_int_get(wf_impl_json_array_get(params, 4));
int remaining = (offset < 1024000) ? 1024000 - offset : 0;
int count = (length < remaining) ? length : remaining;
std::string data = std::string(count, '*');
json_t * result = json_object();
json_object_set_new(result, "data", json_string(data.c_str()));
json_object_set_new(result, "format", json_string("identity"));
json_object_set_new(result, "count", json_integer(count));
char * result_text = json_dumps(result, 0);
std::string result_str = result_text;
free(result_text);
json_decref(result);
std::ostringstream result;
result << "{"
<< "\"data\": \"" << std::string(count, '*') << "\","
<< "\"format\": \"identity\","
<< "\"count\": " << count
<< "}";
return result_str;
return result.str();
}));
EXPECT_CALL(handler, Invoke(StrEq("close"), _)).Times(AtMost(1));
WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT);
@ -418,13 +409,13 @@ TEST(server, read_large_file)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
std::string base_dir = server.GetBaseDir();
ASSERT_TRUE(File(base_dir).isDirectory());
@ -450,13 +441,13 @@ TEST(server, readdir)
ASSERT_TRUE(connected);
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
std::string base_dir = server.GetBaseDir();
ASSERT_TRUE(File(base_dir).isDirectory());

@ -1,6 +1,8 @@
#include "webfuse/test_util/server_protocol.hpp"
#include "webfuse/test_util/ws_client.hpp"
#include "webfuse/test_util/file.hpp"
#include "webfuse/test_util/json_doc.hpp"
#include "webfuse/impl/json/node.h"
#include "webfuse/mocks/mock_invokation_handler.hpp"
#include "webfuse/mocks/getattr_matcher.hpp"
#include "webfuse/protocol_names.h"
@ -8,6 +10,7 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>
using webfuse_test::JsonDoc;
using webfuse_test::MockInvokationHander;
using webfuse_test::WsClient;
using webfuse_test::ServerProtocol;
@ -33,24 +36,24 @@ TEST(server_protocol, add_filesystem)
{
std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", {\"username\": \"bob\", \"password\": \"secret\"}], \"id\": 23}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(23, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(23, wf_impl_json_int_get(id));
}
{
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * result = json_object_get(response, "result");
ASSERT_TRUE(json_is_object(result));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * result = wf_impl_json_object_get(response, "result");
ASSERT_TRUE(wf_impl_json_is_object(result));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
}
std::string base_dir = server.GetBaseDir();
@ -76,13 +79,13 @@ TEST(server_protocol, add_filesystem_fail_without_authentication)
{
std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(42, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(42, wf_impl_json_int_get(id));
}
auto disconnected = client.Disconnect();
@ -103,13 +106,13 @@ TEST(server_protocol, authenticate_fail_wrong_credentials)
{
std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", {\"username\": \"alice\", \"password\": \"cheshire\"}], \"id\": 23}");
json_t * response = json_loads(response_text.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * error = json_object_get(response, "error");
ASSERT_TRUE(json_is_object(error));
json_t * id = json_object_get(response, "id");
ASSERT_EQ(23, json_integer_value(id));
json_decref(response);
JsonDoc doc(response_text);
wf_json const * response = doc.root();
ASSERT_TRUE(wf_impl_json_is_object(response));
wf_json const * error = wf_impl_json_object_get(response, "error");
ASSERT_TRUE(wf_impl_json_is_object(error));
wf_json const * id = wf_impl_json_object_get(response, "id");
ASSERT_EQ(23, wf_impl_json_int_get(id));
}
auto disconnected = client.Disconnect();

@ -1,9 +1,10 @@
#ifndef WF_TEST_UTIL_INVOKATION_HANDLER_HPP
#define WF_TEST_UTIL_INVOKATION_HANDLER_HPP
#include <jansson.h>
#include <string>
struct wf_json;
namespace webfuse_test
{
@ -11,7 +12,7 @@ class InvokationHandler
{
public:
virtual ~InvokationHandler() = default;
virtual std::string Invoke(char const * method, json_t * params) = 0;
virtual std::string Invoke(char const * method, wf_json const * params) = 0;
};
}

@ -1,20 +0,0 @@
#include <gtest/gtest.h>
#include <jansson.h>
namespace webfuse_test
{
class JanssonTestEnvironment: public ::testing::Environment
{
public:
~JanssonTestEnvironment() override { }
void SetUp() override
{
json_object_seed(0);
}
};
::testing::Environment * const jansson_env = ::testing::AddGlobalTestEnvironment(new JanssonTestEnvironment());
}

@ -1,9 +1,10 @@
#include "webfuse/test_util/ws_client.hpp"
#include "webfuse/test_util/invokation_handler.hpp"
#include "webfuse/test_util/json_doc.hpp"
#include "webfuse/impl/json/node.h"
#include "webfuse/status.h"
#include <libwebsockets.h>
#include <jansson.h>
#include <cstring>
#include <thread>
@ -11,6 +12,7 @@
#include <queue>
#include <condition_variable>
#include <chrono>
#include <sstream>
#define TIMEOUT (std::chrono::seconds(10))
@ -225,52 +227,33 @@ public:
{
lock.unlock();
json_t * request = json_loadb(data, length, 0, nullptr);
if (nullptr != request)
{
json_t * method = json_object_get(request, "method");
json_t * params = json_object_get(request, "params");
json_t * id = json_object_get(request, "id");
json_t * response = json_object();
try
{
std::string result_text = handler_.Invoke(json_string_value(method), params);
json_t * result = json_loads(result_text.c_str(), 0, nullptr);
if (nullptr != result)
{
json_object_set_new(response, "result", result);
}
else
{
json_t * error = json_object();
json_object_set_new(error, "code", json_integer(WF_BAD));
json_object_set_new(response, "error",error);
}
}
catch (...)
{
json_t * error = json_object();
json_object_set_new(error, "code", json_integer(WF_BAD));
json_object_set_new(response, "error",error);
}
json_object_set(response, "id", id);
JsonDoc doc(std::string(data, length));
wf_json const * request = doc.root();
wf_json const * method = wf_impl_json_object_get(request, "method");
wf_json const * params = wf_impl_json_object_get(request, "params");
wf_json const * id = wf_impl_json_object_get(request, "id");
char * response_text = json_dumps(response, 0);
lock.lock();
send_queue.push(response_text);
commands.push(command::send);
lock.unlock();
std::ostringstream response;
response << "{";
try
{
std::string result_text = handler_.Invoke(wf_impl_json_string_get(method), params);
if (result_text.empty()) { throw std::runtime_error("empty"); }
response << "\"result\": " << result_text;
}
catch (...)
{
response << "\"error\": {\"code\": 1}";
}
lws_cancel_service(context);
response << ", \"id\": " << wf_impl_json_int_get(id) << "}";
free(response_text);
lock.lock();
send_queue.push(response.str());
commands.push(command::send);
lock.unlock();
json_decref(response);
json_decref(request);
}
lws_cancel_service(context);
}
}

@ -1,6 +1,8 @@
#include "webfuse/test_util/ws_server.hpp"
#include "webfuse/test_util/invokation_handler.hpp"
#include "webfuse/impl/util/lws_log.h"
#include "webfuse/impl/json/node.h"
#include "webfuse/test_util/json_doc.hpp"
#include <libwebsockets.h>
#include <thread>
@ -9,6 +11,8 @@
#include <sstream>
#include <queue>
using webfuse_test::JsonDoc;
namespace
{
@ -85,7 +89,6 @@ public:
void OnWritable(struct lws * wsi) override;
void SendMessage(char const * message);
void SendMessage(json_t * message);
private:
static void Run(Private * self);
@ -127,12 +130,6 @@ void WsServer::SendMessage(char const * message)
d->SendMessage(message);
}
void WsServer::SendMessage(json_t * message)
{
d->SendMessage(message);
}
WsServer::Private::Private(
InvokationHandler & handler,
std::string const & protocol,
@ -264,45 +261,34 @@ void WsServer::Private::SendMessage(char const * message)
}
}
void WsServer::Private::SendMessage(json_t * message)
{
char* message_text = json_dumps(message, JSON_COMPACT);
SendMessage(message_text);
json_decref(message);
free(message_text);
}
void WsServer::Private::OnMessageReceived(struct lws * wsi, char const * data, size_t length)
{
(void) wsi;
json_t * request = json_loadb(data, length, JSON_DECODE_ANY, nullptr);
json_t * method = json_object_get(request, "method");
json_t * params = json_object_get(request, "params");
json_t * id = json_object_get(request, "id");
JsonDoc doc(std::string(data, length));
wf_json const * request = doc.root();
wf_json const * method = wf_impl_json_object_get(request, "method");
wf_json const * params = wf_impl_json_object_get(request, "params");
wf_json const * id = wf_impl_json_object_get(request, "id");
if (json_is_string(method) && json_is_array(params) && json_is_integer(id))
if (wf_impl_json_is_string(method) && wf_impl_json_is_array(params) && wf_impl_json_is_int(id))
{
json_t * response = json_object();
std::ostringstream response;
response << "{";
try
{
std::string result_text = handler_.Invoke(json_string_value(method), params);
json_t * result = json_loads(result_text.c_str(), JSON_DECODE_ANY, nullptr);
json_object_set_new(response, "result", result);
std::string result_text = handler_.Invoke(wf_impl_json_string_get(method), params);
response << "\"result\": " << result_text;
}
catch (...)
{
json_t * error = json_object();
json_object_set_new(error, "code", json_integer(1));
json_object_set_new(response, "error", error);
response << "\"error\": {\"code\": 1}";
}
response << ", \"id\": " << wf_impl_json_int_get(id) << "}";
json_object_set(response, "id", id);
SendMessage(response);
SendMessage(response.str().c_str());
}
json_decref(request);
}
std::string const & WsServer::Private::GetUrl() const

@ -1,7 +1,6 @@
#ifndef WF_TEST_UTIL_WS_SERVER2_HPP
#define WF_TEST_UTIL_WS_SERVER2_HPP
#include <jansson.h>
#include <string>
namespace webfuse_test
@ -22,7 +21,6 @@ public:
virtual ~WsServer();
std::string const & GetUrl() const;
void SendMessage(char const * message);
void SendMessage(json_t * message);
private:
class Private;
Private * d;

Loading…
Cancel
Save