Add Sprinkler Test.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
NADAL Jean-Baptiste
2020-02-25 18:44:00 +01:00
parent dfed6f6478
commit 5a5df0969f
4 changed files with 202 additions and 69 deletions

View File

@@ -965,8 +965,8 @@ bool manage_hook(restd_hook_t *hook, restd_resp_t *response, const char *request
{ {
int list_size; int list_size;
bool result = true; bool result = true;
// printf("Avec param... %s\n", request_path);
qlist_t *uri_fragments = qstrtokenizer(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); list_size = qlist_size(hook->path_fragments);
if (list_size == qlist_size(uri_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_hook.data);
free(obj_uri.data); free(obj_uri.data);
if (result == false) if (result == false)
{
qlist_free(uri_fragments);
return false; return false;
} }
}
response->has_parameter = true; response->has_parameter = true;
response->parameter_name = strdup(hook->parameter_name); response->parameter_name = strdup(hook->parameter_name);
if (hook->action_name != NULL) if (hook->action_name != NULL)
response->action = strdup(hook->action_name); response->action = strdup(hook->action_name);
hook->cb(response, hook->userdata); hook->cb(response, hook->userdata);
qlist_free(uri_fragments); qlist_free(uri_fragments);
return true; return true;

View File

@@ -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 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); 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) 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; devices_manager_t *dm = (devices_manager_t *)arg;
data = restd_http_get_body(response); return create_device(response, dm, kOutletEntry);
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;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
@@ -110,40 +86,17 @@ int outlet_create_handler(restd_resp_t *response, void *arg)
int outlet_list_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; devices_manager_t *dm = (devices_manager_t *)arg;
char *data;
data = devices_manager_get(dm, kOutletEntry); return list_device(response, 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;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int outlet_get_handler(restd_resp_t *response, void *arg) 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; devices_manager_t *dm = (devices_manager_t *)arg;
if (response->has_parameter == false) return get_device(response, dm, kOutletEntry);
{
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;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
@@ -168,24 +121,27 @@ int outlet_remove_handler(restd_resp_t *response, void *arg)
int sprinkler_create_handler(restd_resp_t *response, void *arg) int sprinkler_create_handler(restd_resp_t *response, void *arg)
{ {
#warning TODO devices_manager_t *dm = (devices_manager_t *)arg;
return RESTD_OK;
return create_device(response, dm, kSprinklerEntry);
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int sprinkler_list_handler(restd_resp_t *response, void *arg) int sprinkler_list_handler(restd_resp_t *response, void *arg)
{ {
#warning TODO devices_manager_t *dm = (devices_manager_t *)arg;
return RESTD_OK;
return list_device(response, dm, kSprinklerEntry);
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int sprinkler_get_handler(restd_resp_t *response, void *arg) int sprinkler_get_handler(restd_resp_t *response, void *arg)
{ {
#warning TODO devices_manager_t *dm = (devices_manager_t *)arg;
return RESTD_OK;
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) int shutter_create_handler(restd_resp_t *response, void *arg)
{ {
#warning TODO devices_manager_t *dm = (devices_manager_t *)arg;
return RESTD_OK;
return create_device(response, dm, kShutterEntry);
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int shutter_list_handler(restd_resp_t *response, void *arg) int shutter_list_handler(restd_resp_t *response, void *arg)
{ {
#warning TODO devices_manager_t *dm = (devices_manager_t *)arg;
return RESTD_OK;
return list_device(response, dm, kShutterEntry);
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int shutter_get_handler(restd_resp_t *response, void *arg) int shutter_get_handler(restd_resp_t *response, void *arg)
{ {
#warning TODO devices_manager_t *dm = (devices_manager_t *)arg;
return RESTD_OK;
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); 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) int remove_device(restd_resp_t *response, devices_manager_t *dm, const char *capability)
{ {
struct json_object *root_node = NULL;
int ret; int ret;
if (response->has_parameter == false) if (response->has_parameter == false)

View File

@@ -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_outlet_list_empty "[ ]"
#define k_create_outlet_1 "{\"name\":\"outlet_1\", \"sender\": 12797322, \"switch\": 4}" #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_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_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 }" #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 */

View File

@@ -139,8 +139,6 @@ TEST("Domo - Test API /api/v1/outlets - correct access\t")
sleep(1); sleep(1);
// Outlets
// Get All Devices. Should be empty. // Get All Devices. Should be empty.
ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/outlets", 200, "", k_outlet_list_empty, false); ret = exec_request(kget_method, "http://localhost:" kserver_port "/api/v1/outlets", 200, "", k_outlet_list_empty, false);
ASSERT_EQUAL_INT(ret, 0); ASSERT_EQUAL_INT(ret, 0);
@@ -180,3 +178,59 @@ TEST("Domo - Test API /api/v1/outlets - correct access\t")
restd_server_free(rest_server); restd_server_free(rest_server);
devices_manager_free(dm); 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);
}