domo update rest server to new API
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
NADAL Jean-Baptiste
2020-02-21 11:37:32 +01:00
parent db0c855300
commit a5521f05f1
8 changed files with 209 additions and 119 deletions

View File

@@ -81,6 +81,7 @@ target_link_libraries (test_device
add_custom_command(TARGET test_device POST_BUILD add_custom_command(TARGET test_device POST_BUILD
COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/tests/index.html ${CMAKE_BINARY_DIR}/bin COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/tests/index.html ${CMAKE_BINARY_DIR}/bin
COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/tests/devices.json ${CMAKE_BINARY_DIR}/bin
COMMENT "Install test Files" COMMENT "Install test Files"
) )

View File

@@ -25,95 +25,82 @@
/*------------------------------- INCLUDES ----------------------------------*/ /*------------------------------- INCLUDES ----------------------------------*/
#include <event2/buffer.h>
#include <json.h> #include <json.h>
#include "devices/devices_manager.h" #include "devices/devices_manager.h"
#include "rest_devices_handlers.h"
#include "domo.h" #include "domo.h"
//#include "rest_devices_handlers.h"
// Code Description // Code Description
// 204 Success. No content. // 204 Success. No content.
// 400 Bad request // 400 Bad request
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
#if 0
int outlet_create_handler(short event, restd_conn_t *conn, void *userdata) 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;
printf("outlet_create_handler\n\n"); printf("outlet_create_handler\n\n");
if (event & RESTD_EVENT_WRITE)
data = restd_http_get_body(response);
if (data == NULL)
{ {
off_t data_size; restd_http_response(response, 400, "application/json", kerror_body);
data_size = restd_http_get_content_length(conn);
printf("1/data size: %ld\n", data_size);
if (data_size > 0)
{
char *data;
struct json_object *root_node = NULL;
data = restd_http_get_content(conn, 0, &data_size);
printf("2/data size: %ld\n", data_size);
printf("3/data size: %s\n", data);
#if 0
root_node = json_tokener_parse(data);
free(data);
if (root_node != NULL)
{
int ret;
devices_manager_t *dm;
ret = devices_manager_create(dm, kOutletEntry, root_node);
json_object_put(root_node);
if (ret == 0)
{
restd_http_response(conn, 204, "application/json", "{}", 2);
return RESTD_CLOSE;
}
}
#endif
restd_http_response(conn, 204, "application/json", "{}", 2);
return RESTD_CLOSE;
}
restd_http_response(conn, 400, "application/json", "{\"status\":\"error\"}", 18);
return RESTD_OK; 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 RESTD_OK;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int outlet_list_handler(short event, restd_conn_t *conn, void *userdata) int outlet_list_handler(restd_resp_t *response, void *arg)
{ {
printf("outlet_list_handler\n\n"); printf("outlet_list_handler\n\n");
restd_http_response(conn, 200, "application/json", "{}", 2); restd_http_response(response, 200, "application/json", kempty_body);
return RESTD_CLOSE; return RESTD_OK;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int outlet_get_handler(short event, restd_conn_t *conn, void *userdata) int outlet_get_handler(restd_resp_t *response, void *arg)
{ {
return 0; return 0;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int outlet_update_handler(short event, restd_conn_t *conn, void *userdata) int outlet_update_handler(restd_resp_t *response, void *arg)
{ {
return 0; return 0;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int outlet_remove_handler(short event, restd_conn_t *conn, void *userdata) int outlet_remove_handler(restd_resp_t *response, void *arg)
{ {
return 0; return 0;
} }
#endif

View File

@@ -30,11 +30,15 @@
#include <restd.h> #include <restd.h>
#define kerror_body "{ \"status\": \"error\" }"
#define kempty_body "{}"
// Outlets // Outlets
extern int outlet_create_handler(short event, restd_conn_t *conn, void *userdata); extern int outlet_create_handler(restd_resp_t *response, void *arg);
extern int outlet_list_handler(short event, restd_conn_t *conn, void *userdata); extern int outlet_list_handler(restd_resp_t *response, void *arg);
extern int outlet_get_handler(short event, restd_conn_t *conn, void *userdata); extern int outlet_get_handler(restd_resp_t *response, void *arg);
extern int outlet_update_handler(short event, restd_conn_t *conn, void *userdata); extern int outlet_update_handler(restd_resp_t *response, void *arg);
extern int outlet_remove_handler(short event, restd_conn_t *conn, void *userdata); extern int outlet_remove_handler(restd_resp_t *response, void *arg);
#endif /*_REST_DEVICES_HANDLERS_H */ #endif /*_REST_DEVICES_HANDLERS_H */

View File

@@ -28,57 +28,52 @@
/*------------------------------- INCLUDES ----------------------------------*/ /*------------------------------- INCLUDES ----------------------------------*/
//#include "rest_devices_handlers.h" #include "rest_devices_handlers.h"
#include "rest_server.h" #include "rest_server.h"
#if 0
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int my_error_handler(short event, restd_conn_t *conn, void *userdata) int my_error_handler(restd_resp_t *response, int reason, void *arg)
{ {
int http_code = 500; int http_code = 500;
if (event & RESTD_ERROR_METHOD_NOT_ALLOWED) if (reason == RESTD_ERROR_METHOD_NOT_ALLOWED)
{ {
http_code = 405; http_code = 405;
} }
else if (event & RESTD_ERROR_PATH_NOT_FOUND) else if (reason == RESTD_ERROR_PATH_NOT_FOUND)
{ {
http_code = 404; http_code = 404;
} }
restd_http_response(conn, http_code, "application/json", "{\"status\":\"error\"}", 18); restd_http_response(response, http_code, "application/json", kerror_body);
return RESTD_CLOSE; // Close connection.
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
#endif
int setup_rest_server(restd_server_t *rest_server, const char *port, const char *root_path, void *dm) int setup_rest_server(restd_server_t *rest_server, const char *port, const char *root_path, void *dm)
{ {
#if 0
restd_server_set_option(rest_server, "server.port", port); restd_server_set_option(rest_server, "server.port", port);
restd_server_set_option(rest_server, "server.root_path", root_path); restd_server_set_option(rest_server, "server.root_path", root_path);
printf (">>>>>>>>>>\n"); printf (">>>>>>>>>>\n");
//restd_server_register_request_handler(rest_server, restd_rest_handler); restd_server_register_error_handler(rest_server, my_error_handler, NULL);
restd_server_register_error_handler(rest_server, my_error_handler);
restd_server_register_call_hooks_handler(rest_server, restd_rest_handler); // Capabilities.
// restd_server_register_hook(rest_server, restd_http_handler, NULL); restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_GET, "/api/v1/capabilities", NULL, dm);
// Capabilities.
restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/capabilities", NULL, dm);
// Outlets // Outlets
restd_server_register_hook_on_path(rest_server, "POST", "/api/v1/outlets", outlet_create_handler, dm); restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_POST, "/api/v1/outlets", outlet_create_handler, dm);
restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/outlets", outlet_list_handler, dm); restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_GET, "/api/v1/outlets", outlet_list_handler, dm);
restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/outlets/:id", outlet_get_handler, dm); restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_GET, "/api/v1/outlets/:id", outlet_get_handler, dm);
restd_server_register_hook_on_path(rest_server, "PUT", "/api/v1/outlets/:id", outlet_update_handler, dm); restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_PUT, "/api/v1/outlets/:id", outlet_update_handler, dm);
restd_server_register_hook_on_path(rest_server, "DELETE", "/api/v1/outlets/:id", outlet_remove_handler, dm); restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_DELETE, "/api/v1/outlets/:id", outlet_remove_handler, dm);
// Outlets // Sprinkler
// Shutters // Shutters
#endif
return 0; return 0;
} }

5
src/tests/devices.json Normal file
View File

@@ -0,0 +1,5 @@
{
"outlets": [],
"shutters": [],
"sprinklers": []
}

75
src/tests/test_domo.c Normal file
View File

@@ -0,0 +1,75 @@
/*!
* test_domo.c
*
* 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
*
*/
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
TEST("Domo - Server - Create Free\t")
{
restd_server_t *rest_server;
rest_server = restd_server_new();
ASSERT_NOT_NULL(rest_server);
restd_server_free(rest_server);
}
/*--------------------------------------------------------------------------*/
TEST("Domo - Test API correct access\t")
{
struct event_base *ev_base;
restd_server_t *rest_server;
devices_manager_t *dm;
char *config_path;
int ret;
dm = devices_manager_new();
ASSERT_NOT_NULL(dm);
ev_base = event_base_new();
ASSERT_NOT_NULL(ev_base);
rest_server = restd_server_new();
ASSERT_NOT_NULL(rest_server);
ret = restd_server_attach_event_loop(rest_server, ev_base);
ASSERT_EQUAL_INT(ret, 0);
config_path = get_config_path();
ASSERT_NOT_NULL(config_path);
ret = setup_rest_server(rest_server, kserver_port, config_path, dm);
ASSERT_EQUAL_INT(ret, 0);
// TODO
restd_server_free(rest_server);
devices_manager_free(dm);
free(config_path);
}

View File

@@ -1,5 +1,5 @@
/*! /*!
* test_device.c * test_main.c
* *
* Copyright (c) 2015-2020, NADAL Jean-Baptiste. All rights reserved. * Copyright (c) 2015-2020, NADAL Jean-Baptiste. All rights reserved.
* *
@@ -32,8 +32,9 @@
#include <libgen.h> #include <libgen.h>
#include <unistd.h> #include <unistd.h>
#include <event2/event.h>
#include <qlibc/qlibc.h> #include <qlibc/qlibc.h>
#include <qlibc/extensions/qhttpclient.h>
#include <json.h> #include <json.h>
#include <curl/curl.h> #include <curl/curl.h>
@@ -44,8 +45,60 @@
#include "domo.h" #include "domo.h"
#include "devices/devices_manager.h" #include "devices/devices_manager.h"
#include "rest/rest_server.h"
QUNIT_START("Test Data Model"); /*--------------------------------------------------------------------------*/
#define k_max_path_len 200 /* make this larger if you need to. */
/*--------------------------------------------------------------------------*/
char *get_config_path(void)
{
int length;
char full_path[k_max_path_len];
char *working_path;
char *last_slash;
length = readlink("/proc/self/exe", full_path, sizeof(full_path));
/* Catch some errors: */
if (length < 0)
{
fprintf(stderr, "Error resolving symlink /proc/self/exe.\n");
return NULL;
}
if (length >= k_max_path_len)
{
fprintf(stderr, "Path too long. Truncated.\n");
return NULL;
}
/* I don't know why, but the string this readlink() function
* returns is appended with a '@'.
*/
full_path[length] = '\0'; /* Strip '@' off the end. */
working_path = dirname(full_path);
if (working_path == NULL)
return NULL;
return strdup(working_path);
}
/*--------------------------------------------------------------------------*/
QUNIT_START("Test Domo");
/*--------------------------------------------------------------------------*/
TEST("Get config path\t")
{
char *config_path;
config_path = get_config_path();
ASSERT_NOT_NULL(config_path);
free(config_path);
}
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
@@ -55,6 +108,7 @@ TEST("devices_manager create and free\t")
dm = devices_manager_new(); dm = devices_manager_new();
ASSERT_NOT_NULL(dm); ASSERT_NOT_NULL(dm);
devices_manager_free(dm); devices_manager_free(dm);
} }
@@ -63,5 +117,6 @@ TEST("devices_manager create and free\t")
#include "test_shutter.c" #include "test_shutter.c"
#include "test_outlet.c" #include "test_outlet.c"
#include "test_rest.c" #include "test_rest.c"
#include "test_domo.c"
QUNIT_END(); QUNIT_END();

View File

@@ -36,7 +36,6 @@
#define ksuccess_put_param1 "{ \"id\": 1 }" #define ksuccess_put_param1 "{ \"id\": 1 }"
#define ksuccess_put_param2 "{ \"year\": 1977, \"action\": \"todo\" }" #define ksuccess_put_param2 "{ \"year\": 1977, \"action\": \"todo\" }"
#define kserver_port "7777"
#define kapi_test_get "/api/v1/test_get" #define kapi_test_get "/api/v1/test_get"
#define kapi_test_put_id1 "/api/v1/test_put/:id" #define kapi_test_put_id1 "/api/v1/test_put/:id"
@@ -49,7 +48,7 @@
#define kput_method "PUT" #define kput_method "PUT"
#define kdelete_method "DELETE" #define kdelete_method "DELETE"
#define k_max_path_len 200 /* make this larger if you need to. */ #define kserver_port "7777"
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
@@ -350,39 +349,6 @@ bool found_special_route(restd_server_t *server, enum evhttp_cmd_type method, co
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
char *get_config_path(void)
{
int length;
char full_path[k_max_path_len];
char *working_path;
char *last_slash;
length = readlink("/proc/self/exe", full_path, sizeof(full_path));
/* Catch some errors: */
if (length < 0)
{
fprintf(stderr, "Error resolving symlink /proc/self/exe.\n");
return NULL;
}
if (length >= k_max_path_len)
{
fprintf(stderr, "Path too long. Truncated.\n");
return NULL;
}
/* I don't know why, but the string this readlink() function
* returns is appended with a '@'.
*/
full_path[length] = '\0'; /* Strip '@' off the end. */
working_path = dirname(full_path);
return working_path;
}
/*--------------------------------------------------------------------------*/
TEST("Rest - create free\t") TEST("Rest - create free\t")
{ {
restd_server_t *rest_server; restd_server_t *rest_server;
@@ -611,15 +577,16 @@ TEST("Rest - Test Web server part.\t")
{ {
int ret; int ret;
restd_server_t *rest_server; restd_server_t *rest_server;
char *root_path; char *config_path;
rest_server = restd_server_new(); rest_server = restd_server_new();
ASSERT_NOT_NULL(rest_server); ASSERT_NOT_NULL(rest_server);
root_path = get_config_path(); config_path = get_config_path();
ASSERT_NOT_NULL(config_path);
restd_server_set_option(rest_server, "server.port", kserver_port); restd_server_set_option(rest_server, "server.port", kserver_port);
restd_server_set_option(rest_server, "server.thread", "1"); restd_server_set_option(rest_server, "server.thread", "1");
restd_server_set_option(rest_server, "server.root_path", root_path); restd_server_set_option(rest_server, "server.root_path", config_path);
restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_GET, kapi_test_get, my_success_rest_get_handler, NULL); restd_server_register_hook_on_path(rest_server, EVHTTP_REQ_GET, kapi_test_get, my_success_rest_get_handler, NULL);
restd_server_register_error_handler(rest_server, my_error_handler, NULL); restd_server_register_error_handler(rest_server, my_error_handler, NULL);
@@ -639,4 +606,5 @@ TEST("Rest - Test Web server part.\t")
ASSERT_EQUAL_INT(ret, 0); ASSERT_EQUAL_INT(ret, 0);
restd_server_free(rest_server); restd_server_free(rest_server);
free(config_path);
} }