diff --git a/lib/src/restd.c b/lib/src/restd.c index d677508..a9c7072 100644 --- a/lib/src/restd.c +++ b/lib/src/restd.c @@ -965,8 +965,8 @@ bool manage_hook(restd_hook_t *hook, restd_resp_t *response, const char *request { int list_size; bool result = true; - // printf("Avec param... %s\n", request_path); qlist_t *uri_fragments = qstrtokenizer(request_path, "/"); + // printf("Avec param... %s %p\n", request_path, uri_fragments); list_size = qlist_size(hook->path_fragments); if (list_size == qlist_size(uri_fragments)) { @@ -997,12 +997,16 @@ bool manage_hook(restd_hook_t *hook, restd_resp_t *response, const char *request free(obj_hook.data); free(obj_uri.data); if (result == false) + { + qlist_free(uri_fragments); return false; + } } response->has_parameter = true; response->parameter_name = strdup(hook->parameter_name); if (hook->action_name != NULL) response->action = strdup(hook->action_name); + hook->cb(response, hook->userdata); qlist_free(uri_fragments); return true; diff --git a/src/rest/rest_devices_handlers.c b/src/rest/rest_devices_handlers.c index ded7094..85592ed 100644 --- a/src/rest/rest_devices_handlers.c +++ b/src/rest/rest_devices_handlers.c @@ -41,6 +41,9 @@ /*--------------------------------------------------------------------------*/ +int create_device(restd_resp_t *response, devices_manager_t *dm, const char *capability); +int list_device(restd_resp_t *response, devices_manager_t *dm, const char *capability); +int get_device(restd_resp_t *response, devices_manager_t *dm, const char *capability); int update_device(restd_resp_t *response, devices_manager_t *dm, const char *capability); int remove_device(restd_resp_t *response, devices_manager_t *dm, const char *capability); @@ -73,36 +76,9 @@ int capabilities_handler(restd_resp_t *response, void *arg) int outlet_create_handler(restd_resp_t *response, void *arg) { - struct json_object *root_node = NULL; - char *data; devices_manager_t *dm = (devices_manager_t *)arg; - data = restd_http_get_body(response); - - if (data == NULL) - { - restd_http_response(response, 400, "application/json", kerror_body); - return RESTD_OK; - } - - root_node = json_tokener_parse(data); - free(data); - - if (root_node != NULL) - { - int ret; - - ret = devices_manager_create(dm, kOutletEntry, root_node); - json_object_put(root_node); - if (ret == 0) - { - restd_http_response(response, 204, "application/json", kempty_body); - return RESTD_OK; - } - } - - restd_http_response(response, 400, "application/json", kerror_body); - return RESTD_OK; + return create_device(response, dm, kOutletEntry); } /*--------------------------------------------------------------------------*/ @@ -110,40 +86,17 @@ int outlet_create_handler(restd_resp_t *response, void *arg) int outlet_list_handler(restd_resp_t *response, void *arg) { devices_manager_t *dm = (devices_manager_t *)arg; - char *data; - data = devices_manager_get(dm, kOutletEntry); - if (data == NULL) - { - restd_http_response(response, 500, "application/json", kempty_body); - return RESTD_OK; - } - - restd_http_response(response, 200, "application/json", data); - free(data); - - return RESTD_OK; + return list_device(response, dm, kOutletEntry); } /*--------------------------------------------------------------------------*/ int outlet_get_handler(restd_resp_t *response, void *arg) { - struct json_object *root_node = NULL; - char *data; devices_manager_t *dm = (devices_manager_t *)arg; - if (response->has_parameter == false) - { - restd_http_response(response, 500, "application/json", kerror_body); - return RESTD_OK; - } - - data = devices_manager_get_by_id(dm, kOutletEntry, response->parameter_value); - restd_http_response(response, 200, "application/json", data); - free(data); - - return RESTD_OK; + return get_device(response, dm, kOutletEntry); } /*--------------------------------------------------------------------------*/ @@ -168,24 +121,27 @@ int outlet_remove_handler(restd_resp_t *response, void *arg) int sprinkler_create_handler(restd_resp_t *response, void *arg) { -#warning TODO - return RESTD_OK; + devices_manager_t *dm = (devices_manager_t *)arg; + + return create_device(response, dm, kSprinklerEntry); } /*--------------------------------------------------------------------------*/ int sprinkler_list_handler(restd_resp_t *response, void *arg) { -#warning TODO - return RESTD_OK; + devices_manager_t *dm = (devices_manager_t *)arg; + + return list_device(response, dm, kSprinklerEntry); } /*--------------------------------------------------------------------------*/ int sprinkler_get_handler(restd_resp_t *response, void *arg) { -#warning TODO - return RESTD_OK; + devices_manager_t *dm = (devices_manager_t *)arg; + + return get_device(response, dm, kSprinklerEntry); } /*--------------------------------------------------------------------------*/ @@ -211,24 +167,27 @@ int sprinkler_remove_handler(restd_resp_t *response, void *arg) int shutter_create_handler(restd_resp_t *response, void *arg) { -#warning TODO - return RESTD_OK; + devices_manager_t *dm = (devices_manager_t *)arg; + + return create_device(response, dm, kShutterEntry); } /*--------------------------------------------------------------------------*/ int shutter_list_handler(restd_resp_t *response, void *arg) { -#warning TODO - return RESTD_OK; + devices_manager_t *dm = (devices_manager_t *)arg; + + return list_device(response, dm, kShutterEntry); } /*--------------------------------------------------------------------------*/ int shutter_get_handler(restd_resp_t *response, void *arg) { -#warning TODO - return RESTD_OK; + devices_manager_t *dm = (devices_manager_t *)arg; + + return get_device(response, dm, kShutterEntry); } /*--------------------------------------------------------------------------*/ @@ -250,6 +209,78 @@ int shutter_remove_handler(restd_resp_t *response, void *arg) return remove_device(response, dm, kShutterEntry); } +/*--------------------------------------------------------------------------*/ + +int create_device(restd_resp_t *response, devices_manager_t *dm, const char *capability) +{ + struct json_object *root_node = NULL; + char *data; + + data = restd_http_get_body(response); + + if (data == NULL) + { + restd_http_response(response, 400, "application/json", kerror_body); + return RESTD_OK; + } + + root_node = json_tokener_parse(data); + free(data); + + if (root_node != NULL) + { + int ret; + + ret = devices_manager_create(dm, capability, root_node); + json_object_put(root_node); + if (ret == 0) + { + restd_http_response(response, 204, "application/json", kempty_body); + return RESTD_OK; + } + } + + restd_http_response(response, 400, "application/json", kerror_body); + return RESTD_OK; +} + +/*--------------------------------------------------------------------------*/ + +int list_device(restd_resp_t *response, devices_manager_t *dm, const char *capability) +{ + char *data; + + data = devices_manager_get(dm, capability); + if (data == NULL) + { + restd_http_response(response, 500, "application/json", kempty_body); + return RESTD_OK; + } + + restd_http_response(response, 200, "application/json", data); + free(data); + + return RESTD_OK; +} + +/*--------------------------------------------------------------------------*/ + +int get_device(restd_resp_t *response, devices_manager_t *dm, const char *capability) +{ + char *data; + + if (response->has_parameter == false) + { + restd_http_response(response, 500, "application/json", kerror_body); + return RESTD_OK; + } + + data = devices_manager_get_by_id(dm, capability, response->parameter_value); + restd_http_response(response, 200, "application/json", data); + free(data); + + return RESTD_OK; +} /*--------------------------------------------------------------------------*/ @@ -297,7 +328,6 @@ int update_device(restd_resp_t *response, devices_manager_t *dm, const char *cap int remove_device(restd_resp_t *response, devices_manager_t *dm, const char *capability) { - struct json_object *root_node = NULL; int ret; if (response->has_parameter == false) diff --git a/src/tests/dump_domo.h b/src/tests/dump_domo.h index c691089..c863661 100644 --- a/src/tests/dump_domo.h +++ b/src/tests/dump_domo.h @@ -1,3 +1,33 @@ +/*! + * dump_domo.h + * + * Copyright (c) 2015-2020, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 21/02/2020 + * + */ + +#ifndef _DUMP_DOMO_H +#define _DUMP_DOMO_H + +/* Outlets */ + #define k_outlet_list_empty "[ ]" #define k_create_outlet_1 "{\"name\":\"outlet_1\", \"sender\": 12797322, \"switch\": 4}" @@ -8,3 +38,18 @@ #define k_outlet_list_one_elem "[ { \"id\": 1, \"name\": \"outlet_1\", \"state\": false, \"zone\": \"\", \"sender\": 12797322, \"switch\": 4 } ]" #define k_outlet_list_two_elem "[ { \"id\": 1, \"name\": \"outlet_1\", \"state\": false, \"zone\": \"\", \"sender\": 12797322, \"switch\": 4 }, { \"id\": 2, \"name\": \"outlet_2\", \"state\": false, \"zone\": \"pool\", \"sender\": 87654321, \"switch\": 2 } ]" #define k_outlet_list_elem_2 "{ \"id\": 2, \"name\": \"updated_name\", \"state\": true, \"zone\": \"desk\", \"sender\": 12345678, \"switch\": 3 }" + +/* sprinklers */ + +#define k_sprinkler_list_empty "[ ]" + +#define k_create_sprinkler_1 "{\"name\":\"sprinkler_1\" }" +#define k_create_sprinkler_2 "{\"name\":\"sprinkler_2\" }" + +#define k_update_sprinkler_2 "{\"name\":\"updated_name\", \"state\": true}" + +#define k_sprinkler_list_one_elem "[ { \"id\": 1, \"name\": \"sprinkler_1\", \"state\": false } ]" +#define k_sprinkler_list_two_elem "[ { \"id\": 1, \"name\": \"sprinkler_1\", \"state\": false }, { \"id\": 2, \"name\": \"sprinkler_2\", \"state\": false } ]" +#define k_sprinkler_list_elem_2 "{ \"id\": 2, \"name\": \"updated_name\", \"state\": true }" + +#endif /*_DUMP_DOMO_H */ diff --git a/src/tests/test_domo.c b/src/tests/test_domo.c index 33ffa4c..47b6ce7 100644 --- a/src/tests/test_domo.c +++ b/src/tests/test_domo.c @@ -139,8 +139,6 @@ TEST("Domo - Test API /api/v1/outlets - correct access\t") sleep(1); - // Outlets - // Get All Devices. Should be empty. ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/outlets", 200, "", k_outlet_list_empty, false); ASSERT_EQUAL_INT(ret, 0); @@ -180,3 +178,59 @@ TEST("Domo - Test API /api/v1/outlets - correct access\t") restd_server_free(rest_server); devices_manager_free(dm); } + +/*--------------------------------------------------------------------------*/ + +TEST("Domo - Test API /api/v1/sprinklers - correct access\t") +{ + restd_server_t *rest_server; + devices_manager_t *dm; + int ret; + + dm = devices_manager_new(); + ASSERT_NOT_NULL(dm); + + rest_server = setup_server(dm); + ASSERT_NOT_NULL(rest_server); + + sleep(1); + + // Get All Devices. Should be empty. + ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/sprinklers", 200, "", k_sprinkler_list_empty, false); + ASSERT_EQUAL_INT(ret, 0); + + // Create An Outlet. Should be empty. + ret = exec_request(kpost_method, "http://localhost:" kserver_port "/api/v1/sprinklers", 204, k_create_sprinkler_1, "", false); + ASSERT_EQUAL_INT(ret, 0); + + // Get All Devices. Should Contain One Device. + ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/sprinklers", 200, "", k_sprinkler_list_one_elem, false); + ASSERT_EQUAL_INT(ret, 0); + + // Create A second Outlet. Should Contain two Device. + ret = exec_request(kpost_method, "http://localhost:" kserver_port "/api/v1/sprinklers", 204, k_create_sprinkler_2, "", false); + ASSERT_EQUAL_INT(ret, 0); + + // Get All Devices. Should Contain two Devices. + ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/sprinklers", 200, "", k_sprinkler_list_two_elem, false); + ASSERT_EQUAL_INT(ret, 0); + + // Update the second Outlet. Device should contain. + ret = exec_request(kput_method, "http://localhost:" kserver_port "/api/v1/sprinklers/2", 204, k_update_outlet_2, "", false); + ASSERT_EQUAL_INT(ret, 0); + + // Get Device 2 only. Should Contain Device two updated. + ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/sprinklers/2", 200, "", k_sprinkler_list_elem_2, false); + ASSERT_EQUAL_INT(ret, 0); + + // Delete Device 2. + ret = exec_request(kdelete_method, "http://localhost:" kserver_port "/api/v1/sprinklers/2", 204, "", "", false); + ASSERT_EQUAL_INT(ret, 0); + + // Get All Devices. Should Contain One Device. + ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/sprinklers", 200, "", k_sprinkler_list_one_elem, false); + ASSERT_EQUAL_INT(ret, 0); + + restd_server_free(rest_server); + devices_manager_free(dm); +}