From 9bfec4362916ca79314265af464a096706a1c963 Mon Sep 17 00:00:00 2001 From: Martin Schanzenbach Date: Thu, 5 May 2016 10:17:37 +0000 Subject: - refactor jsonpi utils, add test --- src/jsonapi/Makefile.am | 16 ++++++++++++--- src/jsonapi/jsonapi_document.c | 43 ++++++++++++++++++++++++++++++----------- src/jsonapi/jsonapi_error.c | 36 ++++++++++++++++++++++++++++++++++ src/jsonapi/jsonapi_resource.c | 2 +- src/jsonapi/test_jsonapi.c | 44 ++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 124 insertions(+), 17 deletions(-) (limited to 'src/jsonapi') diff --git a/src/jsonapi/Makefile.am b/src/jsonapi/Makefile.am index 7e881acbd..22ae7dac5 100644 --- a/src/jsonapi/Makefile.am +++ b/src/jsonapi/Makefile.am @@ -7,13 +7,24 @@ if USE_COVERAGE endif lib_LTLIBRARIES = \ - libgnunetjsonapi.la + libgnunetjsonapi.la \ + libgnunetjsonapiutils.la + +libgnunetjsonapiutils_la_LDFLAGS = \ + -version-info 0:0:0 \ + -no-undefined +libgnunetjsonapiutils_la_SOURCES = \ + jsonapi.c +libgnunetjsonapiutils_la_LIBADD = \ + $(top_builddir)/src/util/libgnunetutil.la \ + $(top_builddir)/src/jsonapi/libgnunetjsonapi.la \ + $(top_builddir)/src/rest/libgnunetrest.la \ + $(XLIB) libgnunetjsonapi_la_LDFLAGS = \ -version-info 0:0:0 \ -no-undefined libgnunetjsonapi_la_SOURCES = \ - jsonapi.c \ jsonapi_document.c \ jsonapi_resource.c \ jsonapi_error.c \ @@ -21,7 +32,6 @@ libgnunetjsonapi_la_SOURCES = \ libgnunetjsonapi_la_LIBADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/json/libgnunetjson.la \ - $(top_builddir)/src/rest/libgnunetrest.la \ -ljansson \ $(XLIB) diff --git a/src/jsonapi/jsonapi_document.c b/src/jsonapi/jsonapi_document.c index 4837ee2be..b99a7a4fe 100644 --- a/src/jsonapi/jsonapi_document.c +++ b/src/jsonapi/jsonapi_document.c @@ -286,19 +286,18 @@ GNUNET_JSONAPI_document_resource_remove (struct GNUNET_JSONAPI_Document *resp, * @return GNUNET_SYSERR on error else GNUNET_OK */ int -GNUNET_JSONAPI_document_serialize (const struct GNUNET_JSONAPI_Document *doc, - char **result) +GNUNET_JSONAPI_document_to_json (const struct GNUNET_JSONAPI_Document *doc, + json_t **root_json) { struct GNUNET_JSONAPI_Resource *res; struct GNUNET_JSONAPI_Error *error; - json_t *root_json; json_t *res_json; json_t *res_json_tmp; if ((NULL == doc)) return GNUNET_SYSERR; - root_json = json_object (); + *root_json = json_object (); //Check for errors first if (doc->err_count != 0) @@ -313,7 +312,9 @@ GNUNET_JSONAPI_document_serialize (const struct GNUNET_JSONAPI_Document *doc, &res_json_tmp)); json_array_append (res_json, res_json_tmp); } - json_object_set (root_json, GNUNET_JSONAPI_KEY_ERRORS, res_json); + json_object_set_new (*root_json, + GNUNET_JSONAPI_KEY_ERRORS, + res_json); } else { switch (doc->res_count) { @@ -338,14 +339,34 @@ GNUNET_JSONAPI_document_serialize (const struct GNUNET_JSONAPI_Document *doc, } break; } - json_object_set (root_json, GNUNET_JSONAPI_KEY_DATA, res_json); + json_object_set_new (*root_json, + GNUNET_JSONAPI_KEY_DATA, + res_json); } + json_object_set (*root_json, + GNUNET_JSONAPI_KEY_META, + doc->meta); + return GNUNET_OK; +} + +/** + * String serialze jsonapi primary data + * + * @param data the JSON API primary data + * @param result where to store the result + * @return GNUNET_SYSERR on error else GNUNET_OK + */ +int +GNUNET_JSONAPI_document_serialize (const struct GNUNET_JSONAPI_Document *doc, + char **result) +{ + json_t *json_doc; + if (GNUNET_OK != GNUNET_JSONAPI_document_to_json (doc, + &json_doc)) + return GNUNET_SYSERR; - //Add meta - json_object_set (root_json, GNUNET_JSONAPI_KEY_META, doc->meta); - *result = json_dumps (root_json, JSON_INDENT(2)); - json_decref (root_json); - json_decref (res_json); + *result = json_dumps (json_doc, JSON_INDENT(2)); + json_decref (json_doc); return GNUNET_OK; } diff --git a/src/jsonapi/jsonapi_error.c b/src/jsonapi/jsonapi_error.c index d91f0a650..b7fc08d72 100644 --- a/src/jsonapi/jsonapi_error.c +++ b/src/jsonapi/jsonapi_error.c @@ -131,6 +131,42 @@ parse_jsonapierror (void *cls, return GNUNET_OK; } +/** + * Create a JSON API error + * + * @param res the JSON error + */ +struct GNUNET_JSONAPI_Error* +GNUNET_JSONAPI_error_new (const char *id, + const char *status, + const char *code, + const char *title, + const char *detail, + json_t *links, + json_t *source, + json_t *meta) +{ + struct GNUNET_JSONAPI_Error *error; + error = GNUNET_new (struct GNUNET_JSONAPI_Error); + + GNUNET_assert (NULL != id); + error->id = GNUNET_strdup (id); + GNUNET_assert (NULL != status); + error->status = GNUNET_strdup (status); + GNUNET_assert (NULL != code); + error->code = GNUNET_strdup (code); + GNUNET_assert (NULL != title); + error->title = GNUNET_strdup (title); + GNUNET_assert (NULL != detail); + error->detail = GNUNET_strdup (detail); + GNUNET_assert (NULL != links); + error->links = json_deep_copy (links); + GNUNET_assert (NULL != source); + error->source = json_deep_copy (source); + GNUNET_assert (NULL != meta); + error->meta = json_deep_copy (meta); + return error; +} /** * Delete a JSON API error * diff --git a/src/jsonapi/jsonapi_resource.c b/src/jsonapi/jsonapi_resource.c index 09217279a..d1d811482 100644 --- a/src/jsonapi/jsonapi_resource.c +++ b/src/jsonapi/jsonapi_resource.c @@ -145,7 +145,7 @@ GNUNET_JSONAPI_resource_add_attr (struct GNUNET_JSONAPI_Resource *resource, return GNUNET_SYSERR; if (NULL == resource->attr_obj) resource->attr_obj = json_object (); - json_object_set (resource->attr_obj, key, json); + json_object_set_new (resource->attr_obj, key, json); return GNUNET_OK; } diff --git a/src/jsonapi/test_jsonapi.c b/src/jsonapi/test_jsonapi.c index 8b0b13566..b5f4d4cba 100644 --- a/src/jsonapi/test_jsonapi.c +++ b/src/jsonapi/test_jsonapi.c @@ -24,11 +24,47 @@ #include "gnunet_jsonapi_lib.h" #include "gnunet_json_lib.h" +#define TEST_JSONAPI_DOCUMENT "{\"data\":{\"id\":\"1\",\"type\":\"bar\",\"attributes\":{\"foo\":\"bar\"}}}" + +static int +test_document () +{ + struct GNUNET_JSONAPI_Document *obj; + struct GNUNET_JSONAPI_Resource *res; + json_t *doc_json; + json_t *data_js; + json_error_t err; + + obj = GNUNET_JSONAPI_document_new (); + res = GNUNET_JSONAPI_resource_new ("bar", + "1"); + + GNUNET_assert (GNUNET_OK == + GNUNET_JSONAPI_resource_add_attr (res, + "foo", + json_string ("bar"))); + + GNUNET_JSONAPI_document_resource_add (obj, + res); + + GNUNET_assert (GNUNET_OK == + GNUNET_JSONAPI_document_to_json (obj, + &doc_json)); + data_js = json_loads (TEST_JSONAPI_DOCUMENT, + JSON_DECODE_ANY, + &err); + GNUNET_assert (NULL != data_js); + GNUNET_assert (0 != json_equal (data_js, doc_json)); + GNUNET_JSONAPI_document_delete (obj); + json_decref (data_js); + json_decref (doc_json); + return 0; +} + static int test_serialize () { struct GNUNET_JSONAPI_Document *obj; - char* data = "{\"data\":{\"id\":\"1\",\"type\":\"bar\", \"attributes\":{\"foo\":\"bar\"}}}"; char* tmp_data; json_t* data_js; json_t* tmp_data_js; @@ -37,7 +73,9 @@ test_serialize () GNUNET_JSON_spec_jsonapi_document (&obj), GNUNET_JSON_spec_end() }; - data_js = json_loads (data, JSON_DECODE_ANY, &err); + data_js = json_loads (TEST_JSONAPI_DOCUMENT, + JSON_DECODE_ANY, + &err); GNUNET_assert (NULL != data_js); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (data_js, jsonapispec, @@ -98,6 +136,8 @@ main(int argc, return 1; if (0 != test_serialize ()) return 1; + if (0 != test_document ()) + return 1; return 0; } -- cgit v1.2.3