use json_writer to write json data

pull/87/head
Falk Werner 4 years ago
parent 09c5195c0c
commit 547cd0d7a6

@ -77,7 +77,7 @@ wf_impl_client_protocol_receive(
static bool
wf_impl_client_protocol_send(
json_t * request,
struct wf_message * message,
void * user_data)
{
bool result = false;
@ -85,13 +85,13 @@ wf_impl_client_protocol_send(
if (NULL != protocol->wsi)
{
struct wf_message * message = wf_impl_message_create(request);
if (NULL != message)
{
wf_impl_slist_append(&protocol->messages, &message->item);
lws_callback_on_writable(protocol->wsi);
result = true;
}
wf_impl_slist_append(&protocol->messages, &message->item);
lws_callback_on_writable(protocol->wsi);
result = true;
}
else
{
wf_impl_message_dispose(message);
}
return result;
@ -330,14 +330,13 @@ wf_impl_client_protocol_authenticate(
wf_impl_credentials_init_default(&creds);
protocol->callback(protocol->user_data, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, &creds);
json_incref(creds.data);
wf_impl_jsonrpc_proxy_invoke(
protocol->proxy,
&wf_impl_client_protocol_on_authenticate_finished,
protocol,
"authenticate",
"sj",
creds.type, creds.data);
creds.type, &wf_impl_credentials_write, &creds);
wf_impl_credentials_cleanup(&creds);
}

@ -1,4 +1,5 @@
#include "webfuse/impl/credentials.h"
#include "webfuse/impl/json/writer.h"
#include <string.h>
void wf_impl_credentials_init_default(
@ -62,3 +63,19 @@ void wf_impl_credentials_add(
json_object_set_new(credentials->data, key, json_string(value));
}
void
wf_impl_credentials_write(
struct wf_json_writer * writer,
void * data)
{
struct wf_credentials * credentials = data;
char const * key;
json_t * value;
wf_impl_json_write_object_begin(writer);
json_object_foreach(credentials->data, key, value)
{
wf_impl_json_write_object_string(writer, key, json_string_value(value));
}
wf_impl_json_write_object_end(writer);
}

@ -8,6 +8,8 @@ extern "C"
{
#endif
struct wf_json_writer;
struct wf_credentials
{
char * type;
@ -41,6 +43,11 @@ extern void wf_impl_credentials_add(
char const * key,
char const * value);
extern void
wf_impl_credentials_write(
struct wf_json_writer * writer,
void * data);
#ifdef __cplusplus
}
#endif

@ -412,7 +412,7 @@ wf_impl_json_write_object_begin_object(
char const * key)
{
wf_impl_json_write_object_key(writer, key);
wf_impl_json_write_array_end(writer);
wf_impl_json_write_object_begin(writer);
}
// --

@ -2,12 +2,17 @@
#include "webfuse/impl/jsonrpc/proxy_request_manager.h"
#include "webfuse/impl/jsonrpc/response_intern.h"
#include "webfuse/impl/jsonrpc/error.h"
#include "webfuse/impl/json/writer.h"
#include "webfuse/impl/message.h"
#include "webfuse/status.h"
#include <libwebsockets.h>
#include <stdlib.h>
#include <string.h>
#define WF_JSONRPC_PROXY_DEFAULT_MESSAGE_SIZE 1024
struct wf_jsonrpc_proxy *
wf_impl_jsonrpc_proxy_create(
struct wf_timer_manager * manager,
@ -29,15 +34,17 @@ void wf_impl_jsonrpc_proxy_dispose(
}
static json_t * wf_impl_jsonrpc_request_create(
static struct wf_message *
wf_impl_jsonrpc_request_create(
char const * method,
int id,
char const * param_info,
va_list args)
{
json_t * request = json_object();
json_object_set_new(request, "method", json_string(method));
json_t * params = json_array();
struct wf_json_writer * writer = wf_impl_json_writer_create(WF_JSONRPC_PROXY_DEFAULT_MESSAGE_SIZE, LWS_PRE);
wf_impl_json_write_object_begin(writer);
wf_impl_json_write_object_string(writer, "method", method);
wf_impl_json_write_object_begin_array(writer, "params");
for (char const * param_type = param_info; '\0' != *param_type; param_type++)
{
@ -46,37 +53,41 @@ static json_t * wf_impl_jsonrpc_request_create(
case 's':
{
char const * const value = va_arg(args, char const *);
json_array_append_new(params, json_string(value));
wf_impl_json_write_string(writer, value);
}
break;
case 'i':
{
int const value = va_arg(args, int);
json_array_append_new(params, json_integer(value));
wf_impl_json_write_int(writer, value);
}
break;
case 'j':
{
json_t * const value = va_arg(args, json_t *);
json_array_append_new(params, value);
wf_jsonrpc_custom_write_fn * write = va_arg(args, wf_jsonrpc_custom_write_fn *);
void * data = va_arg(args, void *);
write(writer, data);
}
break;
default:
fprintf(stderr, "fatal: unknown param_type '%c'\n", *param_type);
json_decref(params);
json_decref(request);
return NULL;
fprintf(stderr, "fatal: unknown param_type '%c'\n", *param_type);
break;
}
}
wf_impl_json_write_array_end(writer);
json_object_set_new(request, "params", params);
if (0 != id)
{
json_object_set_new(request, "id", json_integer(id));
wf_impl_json_write_object_int(writer, "id", id);
}
wf_impl_json_write_object_end(writer);
return request;
size_t length;
char * message = wf_impl_json_writer_take(writer, &length);
wf_impl_json_writer_dispose(writer);
return wf_impl_message_create(message, length);
}
void wf_impl_jsonrpc_proxy_init(
@ -110,18 +121,13 @@ void wf_impl_jsonrpc_proxy_vinvoke(
int id = wf_impl_jsonrpc_proxy_request_manager_add_request(
proxy->request_manager, finished, user_data);
json_t * request = wf_impl_jsonrpc_request_create(method_name, id, param_info, args);
bool const is_send = ((NULL != request) && (proxy->send(request, proxy->user_data)));
struct wf_message * request = wf_impl_jsonrpc_request_create(method_name, id, param_info, args);
bool const is_send = proxy->send(request, proxy->user_data);
if (!is_send)
{
wf_impl_jsonrpc_proxy_request_manager_cancel_request(
proxy->request_manager, id, WF_BAD, "Bad: failed to send request");
}
if (NULL != request)
{
json_decref(request);
}
}
extern void wf_impl_jsonrpc_proxy_vnotify(
@ -130,13 +136,8 @@ extern void wf_impl_jsonrpc_proxy_vnotify(
char const * param_info,
va_list args)
{
json_t * request = wf_impl_jsonrpc_request_create(method_name, 0, param_info, args);
if (NULL != request)
{
proxy->send(request, proxy->user_data);
json_decref(request);
}
struct wf_message * request = wf_impl_jsonrpc_request_create(method_name, 0, param_info, args);
proxy->send(request, proxy->user_data);
}

@ -21,6 +21,12 @@ extern "C" {
struct wf_jsonrpc_proxy;
struct wf_timer_manager;
struct wf_json_writer;
typedef void
wf_jsonrpc_custom_write_fn(
struct wf_json_writer * writer,
void * data);
extern struct wf_jsonrpc_proxy *
wf_impl_jsonrpc_proxy_create(

@ -1,9 +1,15 @@
#include "webfuse/impl/jsonrpc/request.h"
#include "webfuse/impl/jsonrpc/error.h"
#include "webfuse/impl/json/writer.h"
#include "webfuse/impl/jsonrpc/response_writer.h"
#include "webfuse/impl/message.h"
#include <libwebsockets.h>
#include <stdlib.h>
struct wf_jsonrpc_request
{
struct wf_jsonrpc_response_writer * writer;
int id;
wf_jsonrpc_send_fn * send;
void * user_data;
@ -29,6 +35,7 @@ wf_impl_jsonrpc_request_create(
void * user_data)
{
struct wf_jsonrpc_request * request = malloc(sizeof(struct wf_jsonrpc_request));
request->writer = wf_impl_jsonrpc_response_writer_create(id);
request->id = id;
request->send = send;
request->user_data = user_data;
@ -40,6 +47,7 @@ void
wf_impl_jsonrpc_request_dispose(
struct wf_jsonrpc_request * request)
{
wf_impl_jsonrpc_response_writer_dispose(request->writer);
free(request);
}
@ -50,18 +58,21 @@ wf_impl_jsonrpc_request_get_userdata(
return request->user_data;
}
struct wf_jsonrpc_response_writer *
wf_impl_jsonrpc_request_get_response_writer(
struct wf_jsonrpc_request * request)
{
return request->writer;
}
void
wf_impl_jsonrpc_respond(
struct wf_jsonrpc_request * request,
json_t * result)
struct wf_jsonrpc_request * request)
{
json_t * response = json_object();
json_object_set_new(response, "result", result);
json_object_set_new(response, "id", json_integer(request->id));
struct wf_message * response = wf_impl_jsonrpc_response_writer_take_message(request->writer);
request->send(response, request->user_data);
json_decref(response);
wf_impl_jsonrpc_request_dispose(request);
}
@ -70,11 +81,21 @@ void wf_impl_jsonrpc_respond_error(
int code,
char const * message)
{
json_t * response = json_object();
json_object_set_new(response, "error", wf_impl_jsonrpc_error(code, message));
json_object_set_new(response, "id", json_integer(request->id));
struct wf_json_writer * writer = wf_impl_json_writer_create(128, LWS_PRE);
wf_impl_json_write_object_begin(writer);
wf_impl_json_write_object_begin_object(writer, "error");
wf_impl_json_write_object_int(writer, "code", code);
wf_impl_json_write_object_string(writer, "message", message);
wf_impl_json_write_object_end(writer);
wf_impl_json_write_object_int(writer, "id", request->id);
wf_impl_json_write_object_end(writer);
size_t length;
char * data = wf_impl_json_writer_take(writer, &length);
wf_impl_json_writer_dispose(writer);
struct wf_message * response = wf_impl_message_create(data, length);
request->send(response, request->user_data);
json_decref(response);
wf_impl_jsonrpc_request_dispose(request);
}

@ -20,6 +20,7 @@ extern "C"
#endif
struct wf_jsonrpc_request;
struct wf_jsonrpc_response_writer;
extern bool wf_impl_jsonrpc_is_request(
json_t * message);
@ -36,9 +37,12 @@ extern void wf_impl_jsonrpc_request_dispose(
extern void * wf_impl_jsonrpc_request_get_userdata(
struct wf_jsonrpc_request * request);
extern struct wf_jsonrpc_response_writer *
wf_impl_jsonrpc_request_get_response_writer(
struct wf_jsonrpc_request * request);
extern void wf_impl_jsonrpc_respond(
struct wf_jsonrpc_request * request,
json_t * result);
struct wf_jsonrpc_request * request);
extern void wf_impl_jsonrpc_respond_error(
struct wf_jsonrpc_request * request,

@ -0,0 +1,67 @@
#include "webfuse/impl/jsonrpc/response_writer.h"
#include "webfuse/impl/message.h"
#include "webfuse/impl/json/writer.h"
#include <libwebsockets.h>
#include <stdlib.h>
#define WF_RESPONSE_WRITER_DEFAULT_MESSAGE_SIZE 1024
struct wf_jsonrpc_response_writer
{
struct wf_json_writer * json_writer;
int id;
};
struct wf_jsonrpc_response_writer *
wf_impl_jsonrpc_response_writer_create(int id)
{
struct wf_jsonrpc_response_writer * writer = malloc(sizeof(struct wf_jsonrpc_response_writer));
writer->json_writer = wf_impl_json_writer_create(WF_RESPONSE_WRITER_DEFAULT_MESSAGE_SIZE, LWS_PRE);
writer->id = id;
wf_impl_json_write_object_begin(writer->json_writer);
wf_impl_json_write_object_begin_object(writer->json_writer, "result");
return writer;
}
void
wf_impl_jsonrpc_response_writer_dispose(
struct wf_jsonrpc_response_writer * writer)
{
wf_impl_json_writer_dispose(writer->json_writer);
free(writer);
}
struct wf_message *
wf_impl_jsonrpc_response_writer_take_message(
struct wf_jsonrpc_response_writer * writer)
{
wf_impl_json_write_object_end(writer->json_writer);
wf_impl_json_write_object_int(writer->json_writer, "id", writer->id);
wf_impl_json_write_object_end(writer->json_writer);
size_t length;
char * data = wf_impl_json_writer_take(writer->json_writer, &length);
return wf_impl_message_create(data, length);
}
void
wf_impl_jsonrpc_response_add_int(
struct wf_jsonrpc_response_writer * writer,
char const * key,
int value)
{
wf_impl_json_write_object_int(writer->json_writer, key, value);
}
void
wf_impl_jsonrpc_response_add_string(
struct wf_jsonrpc_response_writer * writer,
char const * key,
char const * value)
{
wf_impl_json_write_object_string(writer->json_writer, key, value);
}

@ -0,0 +1,40 @@
#ifndef WF_IMPL_JSONRPC_RESPONSE_WRITER_H
#define WF_IMPL_JSONRPC_RESPONSE_WRITER_H
#ifdef __cplusplus
extern "C"
{
#endif
struct wf_jsonrpc_response_writer;
struct wf_messge;
extern struct wf_jsonrpc_response_writer *
wf_impl_jsonrpc_response_writer_create(int id);
extern void
wf_impl_jsonrpc_response_writer_dispose(
struct wf_jsonrpc_response_writer * writer);
extern struct wf_message *
wf_impl_jsonrpc_response_writer_take_message(
struct wf_jsonrpc_response_writer * writer);
extern void
wf_impl_jsonrpc_response_add_int(
struct wf_jsonrpc_response_writer * writer,
char const * key,
int value);
extern void
wf_impl_jsonrpc_response_add_string(
struct wf_jsonrpc_response_writer * writer,
char const * key,
char const * value);
#ifdef __cplusplus
}
#endif
#endif

@ -5,15 +5,16 @@
#include <stdbool.h>
#endif
#include <jansson.h>
#ifdef __cplusplus
extern "C"
{
#endif
struct wf_message;
typedef bool wf_jsonrpc_send_fn(
json_t * request,
struct wf_message * request,
void * user_data);
#ifdef __cplusplus

@ -3,26 +3,23 @@
#include <stdlib.h>
#include <libwebsockets.h>
extern struct wf_message * wf_impl_message_create(json_t const * value)
extern struct wf_message *
wf_impl_message_create(
char * data,
size_t length)
{
struct wf_message * message = NULL;
size_t const length = json_dumpb(value, NULL, 0, JSON_COMPACT);
if (0 < length)
{
char * data = malloc(sizeof(struct wf_message) + LWS_PRE + length);
message = (struct wf_message *) data;
message->data = &data[sizeof(struct wf_message) + LWS_PRE];
message->length = length;
json_dumpb(value, message->data, length, JSON_COMPACT);
}
struct wf_message * message = malloc(sizeof(struct wf_message));
message->data = data;
message->length = length;
return message;
}
void wf_impl_message_dispose(
void
wf_impl_message_dispose(
struct wf_message * message)
{
char * raw_data = message->data - LWS_PRE;
free(raw_data);
free(message);
}

@ -8,7 +8,6 @@
using std::size_t;
#endif
#include <jansson.h>
#include "webfuse/impl/util/slist.h"
struct wf_message
@ -23,10 +22,13 @@ extern "C"
{
#endif
extern struct wf_message * wf_impl_message_create(
json_t const * value);
extern struct wf_message *
wf_impl_message_create(
char * value,
size_t length);
extern void wf_impl_message_dispose(
extern void
wf_impl_message_dispose(
struct wf_message * message);
#ifdef __cplusplus

@ -12,6 +12,7 @@
#include "webfuse/impl/status.h"
#include "webfuse/impl/jsonrpc/request.h"
#include "webfuse/impl/jsonrpc/response_writer.h"
#include "webfuse/impl/timer/manager.h"
#include "webfuse/impl/timer/timer.h"
@ -136,8 +137,7 @@ static void wf_impl_server_protocol_authenticate(
if (result)
{
json_t * result = json_object();
wf_impl_jsonrpc_respond(request, result);
wf_impl_jsonrpc_respond(request);
}
else
{
@ -198,9 +198,9 @@ static void wf_impl_server_protocol_add_filesystem(
if (WF_GOOD == status)
{
json_t * result = json_object();
json_object_set_new(result, "id", json_string(name));
wf_impl_jsonrpc_respond(request, result);
struct wf_jsonrpc_response_writer * writer = wf_impl_jsonrpc_request_get_response_writer(request);
wf_impl_jsonrpc_response_add_string(writer, "id", name);
wf_impl_jsonrpc_respond(request);
}
else
{

@ -20,15 +20,13 @@
#define WF_DEFAULT_MESSAGE_SIZE (8 * 1024)
static bool wf_impl_session_send(
json_t * request,
struct wf_message * message,
void * user_data)
{
struct wf_impl_session * session = user_data;
struct wf_message * message = wf_impl_message_create(request);
bool result = false;
bool result = (session->is_authenticated || wf_impl_jsonrpc_is_response(request)) && (NULL != session->wsi);
if (result)
if (NULL != session->wsi)
{
wf_impl_slist_append(&session->messages, &message->item);
lws_callback_on_writable(session->wsi);

@ -36,6 +36,7 @@ webfuse_static = static_library('webfuse',
'lib/webfuse/impl/jsonrpc/method.c',
'lib/webfuse/impl/jsonrpc/request.c',
'lib/webfuse/impl/jsonrpc/response.c',
'lib/webfuse/impl/jsonrpc/response_writer.c',
'lib/webfuse/impl/jsonrpc/error.c',
'lib/webfuse/impl/message.c',
'lib/webfuse/impl/message_queue.c',

@ -1,5 +1,6 @@
#include <gtest/gtest.h>
#include "webfuse/impl/jsonrpc/proxy.h"
#include "webfuse/impl/message.h"
#include "webfuse/status.h"
#include "webfuse/impl/timer/manager.h"
@ -40,22 +41,23 @@ namespace
~SendContext()
{
if (nullptr != response)
{
json_decref(response);
}
json_decref(response);
}
};
bool jsonrpc_send(
json_t * request,
wf_message * request,
void * user_data)
{
SendContext * context = reinterpret_cast<SendContext*>(user_data);
context->is_called = true;
context->response = request;
json_incref(request);
if (nullptr != context->response)
{
json_decref(context->response);
}
context->response = json_loadb(request->data, request->length, 0, nullptr);
wf_impl_message_dispose(request);
return context->result;
}
@ -199,7 +201,7 @@ TEST(wf_jsonrpc_proxy, invoke_if_another_request_is_pending)
wf_impl_timer_manager_dispose(timer_manager);
}
TEST(wf_jsonrpc_proxy, invoke_fails_if_request_is_invalid)
TEST(wf_jsonrpc_proxy, invoke_invalid_request)
{
struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create();
@ -211,10 +213,9 @@ TEST(wf_jsonrpc_proxy, invoke_fails_if_request_is_invalid)
void * finished_data = reinterpret_cast<void*>(&finished_context);
wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "?", "error");
ASSERT_FALSE(send_context.is_called);
ASSERT_TRUE(send_context.is_called);
ASSERT_TRUE(finished_context.is_called);
ASSERT_EQ(WF_BAD, jsonrpc_get_status(finished_context.error));
ASSERT_FALSE(finished_context.is_called);
wf_impl_jsonrpc_proxy_dispose(proxy);
wf_impl_timer_manager_dispose(timer_manager);
@ -368,7 +369,7 @@ TEST(wf_jsonrpc_proxy, notify)
wf_impl_timer_manager_dispose(timer_manager);
}
TEST(wf_jsonrpc_proxy, notify_dont_send_invalid_request)
TEST(wf_jsonrpc_proxy, notify_send_invalid_request)
{
struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create();
@ -378,7 +379,7 @@ TEST(wf_jsonrpc_proxy, notify_dont_send_invalid_request)
wf_impl_jsonrpc_proxy_notify(proxy, "foo", "?");
ASSERT_FALSE(send_context.is_called);
ASSERT_TRUE(send_context.is_called);
wf_impl_jsonrpc_proxy_dispose(proxy);
wf_impl_timer_manager_dispose(timer_manager);

@ -1,5 +1,6 @@
#include <gtest/gtest.h>
#include "webfuse/impl/jsonrpc/request.h"
#include "webfuse/impl/message.h"
#include "webfuse/status.h"
namespace
@ -7,17 +8,17 @@ namespace
struct Context
{
json_t * response;
std::string response;
};
bool jsonrpc_send(
json_t * request,
wf_message * request,
void * user_data)
{
Context * context = reinterpret_cast<Context*>(user_data);
context->response = request;
json_incref(request);
context->response = std::string(request->data, request->length);
wf_impl_message_dispose(request);
return true;
}
@ -25,7 +26,7 @@ bool jsonrpc_send(
TEST(wf_jsonrpc_request, create_dispose)
{
Context context{nullptr};
Context context;
void * user_data = reinterpret_cast<void*>(&context);
struct wf_jsonrpc_request * request =
@ -39,18 +40,15 @@ TEST(wf_jsonrpc_request, create_dispose)
TEST(wf_jsonrpc_request, respond)
{
Context context{nullptr};
Context context;
void * user_data = reinterpret_cast<void*>(&context);
struct wf_jsonrpc_request * request =
wf_impl_jsonrpc_request_create(42, &jsonrpc_send, user_data);
wf_impl_jsonrpc_respond(request, json_string("okay"));
wf_impl_jsonrpc_respond(request);
ASSERT_NE(nullptr, context.response);
json_t * response = reinterpret_cast<json_t*>(context.response);
json_t * response = json_loads(context.response.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * id = json_object_get(response, "id");
@ -58,8 +56,7 @@ TEST(wf_jsonrpc_request, respond)
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_TRUE(json_is_object(result));
ASSERT_EQ(nullptr, json_object_get(response, "error"));
@ -68,7 +65,7 @@ TEST(wf_jsonrpc_request, respond)
TEST(wf_jsonrpc_request, respond_error)
{
Context context{nullptr};
Context context;
void * user_data = reinterpret_cast<void*>(&context);
struct wf_jsonrpc_request * request =
@ -76,10 +73,7 @@ TEST(wf_jsonrpc_request, respond_error)
wf_impl_jsonrpc_respond_error(request, WF_BAD, "Bad");
ASSERT_NE(nullptr, context.response);
json_t * response = reinterpret_cast<json_t*>(context.response);
json_t * response = json_loads(context.response.c_str(), 0, nullptr);
ASSERT_TRUE(json_is_object(response));
json_t * id = json_object_get(response, "id");

@ -1,6 +1,7 @@
#include <gtest/gtest.h>
#include "webfuse/impl/jsonrpc/server.h"
#include "webfuse/impl/jsonrpc/request.h"
#include "webfuse/impl/message.h"
#include "webfuse/status.h"
namespace
@ -12,14 +13,14 @@ namespace
};
bool jsonrpc_send(
json_t * request,
wf_message * request,
void * user_data)
{
Context * context = reinterpret_cast<Context*>(user_data);
context->is_called = true;
context->response = request;
json_incref(request);
context->response = json_loadb(request->data, request->length, 0, nullptr);
wf_impl_message_dispose(request);
return true;
}
@ -33,8 +34,7 @@ namespace
(void) params;
(void) user_data;
json_t * result = json_string("Hello");
wf_impl_jsonrpc_respond(request, result);
wf_impl_jsonrpc_respond(request);
}
}
@ -61,15 +61,14 @@ TEST(wf_jsonrpc_server, process_request)
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));
ASSERT_TRUE(json_is_object(result));
json_decref(context.response);
json_decref(request);
wf_impl_jsonrpc_server_dispose(server);
}
TEST(wf_jsonrpc_server, process_request_with_oject_params)
TEST(wf_jsonrpc_server, process_request_with_object_params)
{
struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create();
wf_impl_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr);
@ -91,8 +90,7 @@ TEST(wf_jsonrpc_server, process_request_with_oject_params)
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));
ASSERT_TRUE(json_is_object(result));
json_decref(context.response);
json_decref(request);

@ -1,22 +1,22 @@
#include <gtest/gtest.h>
#include <cstring>
#include "webfuse/impl/message.h"
#include <cstring>
#include <cstdlib>
#include <libwebsockets.h>
#include <gtest/gtest.h>
TEST(wf_message, create)
{
json_t * value = json_object();
char * data = (char*) malloc(LWS_PRE + 2);
data[LWS_PRE ] = '{';
data[LWS_PRE + 1] = '}';
struct wf_message * message = wf_impl_message_create(value);
struct wf_message * message = wf_impl_message_create(&(data[LWS_PRE]), 2);
ASSERT_NE(nullptr, message);
ASSERT_EQ(2, message->length);
ASSERT_TRUE(0 == strncmp("{}", message->data, 2));
wf_impl_message_dispose(message);
json_decref(value);
}
TEST(wf_message, fail_to_create)
{
struct wf_message * message = wf_impl_message_create(nullptr);
ASSERT_EQ(nullptr, message);
}

@ -1,18 +1,23 @@
#include <gtest/gtest.h>
#include "webfuse/impl/message_queue.h"
#include "webfuse/impl/message.h"
#include "webfuse/impl/util/slist.h"
#include <gtest/gtest.h>
#include <libwebsockets.h>
#include <cstring>
#include <cstdlib>
namespace
{
struct wf_slist_item * create_message(char const * content)
{
json_t * value = json_object();
json_object_set_new(value, "content", json_string(content));
struct wf_message * message = wf_impl_message_create(value);
std::string json = std::string("{\"content\": \"") + content + "\"}";
char * data = (char*) malloc(LWS_PRE + json.size());
memcpy(&(data[LWS_PRE]), json.c_str(), json.size());
struct wf_message * message = wf_impl_message_create(&(data[LWS_PRE]), json.size());
json_decref(value);
return &message->item;
}

Loading…
Cancel
Save