diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 83ae5eb..b3b1b22 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required (VERSION 3.0) project (librestd) add_definitions (-g -DBUILD_DEBUG) +add_definitions("-fprofile-arcs -ftest-coverage") include_directories (${CMAKE_SOURCE_DIR}/../libevent/include) include_directories (${CMAKE_BINARY_DIR}/libevent/include) diff --git a/lib/src/restd_http_handler.c b/lib/src/restd_http_handler.c index 04eab25..dac23fa 100644 --- a/lib/src/restd_http_handler.c +++ b/lib/src/restd_http_handler.c @@ -681,16 +681,19 @@ static int parse_requestline(restd_http_t *http, char *line) char *uri = strtok_r(NULL, " ", &saveptr); char *httpver = strtok_r(NULL, " ", &saveptr); char *tmp = strtok_r(NULL, " ", &saveptr); + printf("=============parse_requestline\n"); if (method == NULL || uri == NULL || httpver == NULL || tmp != NULL) { DEBUG("Invalid request line. %s", line); + printf("=============pInvalid request line. %s\n", line); return RESTD_HTTP_ERROR; } // Set request method http->request.method = qstrupper(strdup(method)); - + printf("============= SAVE METHOD HTTP: %s\n", http->request.method); + // Set HTTP version http->request.httpver = qstrupper(strdup(httpver)); if (strcmp(http->request.httpver, HTTP_PROTOCOL_09) && strcmp(http->request.httpver, HTTP_PROTOCOL_10) && strcmp(http->request.httpver, HTTP_PROTOCOL_11)) diff --git a/lib/src/restd_rest_handler.c b/lib/src/restd_rest_handler.c index 632ef22..715fc55 100644 --- a/lib/src/restd_rest_handler.c +++ b/lib/src/restd_rest_handler.c @@ -240,8 +240,12 @@ int restd_rest_handler(short event, restd_conn_t *conn) conn->id = atoi(buffer); return hook->cb(event, conn, hook->userdata); } - else if (strcmp(hook->path, http->request.path) == 0) + else + { + int rett = strcmp(hook->path, http->request.path); + if (rett == 0) return hook->cb(event, conn, hook->userdata); + } } } } @@ -270,7 +274,9 @@ int restd_rest_handler(short event, restd_conn_t *conn) } } - return conn->server->error_handler(reason, conn, NULL); + if (conn->server->error_handler != NULL) + return conn->server->error_handler(reason, conn, NULL); + return RESTD_CLOSE; } BUG_EXIT(); diff --git a/src/tests/test_devices.c b/src/tests/test_devices.c index 9f7a575..4c5b43c 100644 --- a/src/tests/test_devices.c +++ b/src/tests/test_devices.c @@ -23,9 +23,6 @@ * */ -// This is an independent project of an individual developer. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com - /*--------------------------------------------------------------------------*/ void device_create_set_state_free(const char *capability, const char *test_name_true, const char *test_name_false) diff --git a/src/tests/test_main.c b/src/tests/test_main.c index 5965a32..6190b3f 100644 --- a/src/tests/test_main.c +++ b/src/tests/test_main.c @@ -23,9 +23,6 @@ * */ -// This is an independent project of an individual developer. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com - #include #include diff --git a/src/tests/test_outlet.c b/src/tests/test_outlet.c index f5593d8..d90a3cd 100644 --- a/src/tests/test_outlet.c +++ b/src/tests/test_outlet.c @@ -23,9 +23,6 @@ * */ -// This is an independent project of an individual developer. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com - #define kOutletTestNameTrue "{ \"id\": 1, \"name\": \"test_name\", \"state\": true, \"zone\": \"\", \"sender\": 0, \"switch\": 0 }" #define kOutletTestNameFalse "{ \"id\": 1, \"name\": \"test_name\", \"state\": false, \"zone\": \"\", \"sender\": 0, \"switch\": 0 }" #define kOutletTestNameFullFalse "{ \"id\": 1, \"name\": \"test_name\", \"speech_name\": \"speech_name\", \"state\": false, \"zone\": \"zone\", \"sender\": 123456, \"switch\": 77 }" diff --git a/src/tests/test_rest.c b/src/tests/test_rest.c index 387a2a8..012ff43 100644 --- a/src/tests/test_rest.c +++ b/src/tests/test_rest.c @@ -23,11 +23,18 @@ * */ -// This is an independent project of an individual developer. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com +/*--------------------------------------------------------------------------*/ +#define ksuccesGet_body "{\"status\":\"ok\"}" +#define ksuccesDelete_body "{\"status\":\"delete\"}" -#define ksuccess_body "{\"status\":\"ok\"}" +#define kServerPort "7777" +#define kApiTestGet "/api/v1/test_get" + +#define kPostMethod "POST" +#define kGetMethod "GET" +#define kPutMethod "PUT" +#define kDeleteMethod "DELETE" /*--------------------------------------------------------------------------*/ @@ -39,11 +46,11 @@ int my_error_handler(short event, restd_conn_t *conn, void *userdata) /*--------------------------------------------------------------------------*/ -int my_success_handler(short event, restd_conn_t *conn, void *userdata) +int my_success_http_handler(short event, restd_conn_t *conn, void *userdata) { if (event & RESTD_EVENT_READ) { - restd_http_response(conn, 200, "application/json", ksuccess_body, 15); + restd_http_response(conn, 200, "application/json", ksuccesGet_body, strlen(ksuccesGet_body)); return RESTD_CLOSE; // Close connection. } return RESTD_OK; @@ -51,6 +58,22 @@ int my_success_handler(short event, restd_conn_t *conn, void *userdata) /*--------------------------------------------------------------------------*/ +int my_success_rest_handler(short event, restd_conn_t *conn, void *userdata) +{ + restd_http_response(conn, 200, "application/json", ksuccesGet_body, strlen(ksuccesDelete_body)); + return RESTD_CLOSE; // Close connection. +} + +/*--------------------------------------------------------------------------*/ + +int my_success_rest_delete_handler(short event, restd_conn_t *conn, void *userdata) +{ + restd_http_response(conn, 200, "application/json", ksuccesDelete_body, strlen(ksuccesDelete_body)); + return RESTD_CLOSE; // Close connection. +} + +/*--------------------------------------------------------------------------*/ + size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) { size_t body_size = 0; @@ -81,6 +104,76 @@ size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) /*--------------------------------------------------------------------------*/ +int exec_request(const char *request, const char *path, int expected_code, const char *expected_body) +{ + int ret; + CURL *curl_handle; + CURLcode res; + char *body = NULL; + long http_result_code; + + printf ("\n\nexec_request: %s\n", request); + /* init libcurl */ + curl_global_init(CURL_GLOBAL_ALL); + + /* init the curl session */ + curl_handle = curl_easy_init(); + + /* specify URL and method */ + curl_easy_setopt(curl_handle, CURLOPT_URL, path); + + if (strcmp(request, kGetMethod) == 0) + { + printf("method GET\n"); + curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1); + } + else if (strcmp(request, kDeleteMethod) == 0) + { + printf("method Delete\n"); + curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 0); + curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, kDeleteMethod); + } + else if (strcmp(request, kPutMethod) == 0) + { + printf("method PUT\n"); + curl_easy_setopt(curl_handle, CURLOPT_PUT, 0); + } + else if (strcmp(request, kPostMethod) == 0) + { + printf("method POST\n"); + curl_easy_setopt(curl_handle, CURLOPT_POST, 0); + } + + curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1); + + /* send all data to this function */ + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &body); + curl_easy_setopt(curl_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); + + /* get it! */ + res = curl_easy_perform(curl_handle); + ASSERT_EQUAL_INT(res, CURLE_OK); + + curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &http_result_code); + ASSERT_EQUAL_INT(http_result_code, expected_code); + + res = strcmp(expected_body, body); + ASSERT_EQUAL_INT(res, 0); + + free(body); + + /* cleanup curl stuff */ + curl_easy_cleanup(curl_handle); + + /* we're done with libcurl, so clean it up */ + curl_global_cleanup(); + + return 0; +} + +/*--------------------------------------------------------------------------*/ + bool found_route(restd_server_t *server, const char *method, const char *path) { qlist_t *hooks = server->hooks; @@ -194,20 +287,20 @@ TEST("Rest - create access regular route free\t") restd_server_set_option(rest_server, "server.port", "7777"); - restd_server_register_hook_on_path(rest_server, "POST", "/api/v1/test", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "POST", "/api/v1/test", my_success_http_handler, NULL); ASSERT_TRUE(found_route(rest_server, "POST", "/api/v1/test")); ASSERT_FALSE(found_route(rest_server, "POST", "/api/v1/notfound")); - restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test", my_success_http_handler, NULL); ASSERT_TRUE(found_route(rest_server, "GET", "/api/v1/test")); - restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test", my_success_http_handler, NULL); ASSERT_TRUE(found_route(rest_server, "GET", "/api/v1/test")); - restd_server_register_hook_on_path(rest_server, "PUT", "/api/v1/test", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "PUT", "/api/v1/test", my_success_http_handler, NULL); ASSERT_TRUE(found_route(rest_server, "PUT", "/api/v1/test")); - restd_server_register_hook_on_path(rest_server, "DELETE", "/api/v1/test", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "DELETE", "/api/v1/test", my_success_http_handler, NULL); ASSERT_TRUE(found_route(rest_server, "DELETE", "/api/v1/test")); restd_server_free(rest_server); @@ -222,9 +315,9 @@ TEST("Rest - create access route with param free\t") rest_server = restd_server_new(); ASSERT_NOT_NULL(rest_server); - restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/klong/:id", my_success_handler, NULL); - restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/donkey", my_success_handler, NULL); - restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test/:id", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/klong/:id", my_success_http_handler, NULL); + restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/donkey", my_success_http_handler, NULL); + restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test/:id", my_success_http_handler, NULL); ASSERT_FALSE(found_special_route(rest_server, "GET", "/api/v1/notfound/77", &id)); @@ -247,7 +340,7 @@ TEST("Rest - create start free\t") restd_server_set_option(rest_server, "server.port", "7777"); restd_server_set_option(rest_server, "server.thread", "1"); - restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test/:id", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test/:id", my_success_http_handler, NULL); ret = restd_server_start(rest_server); ASSERT_EQUAL_INT(ret, 0); @@ -257,58 +350,65 @@ TEST("Rest - create start free\t") /*--------------------------------------------------------------------------*/ -TEST("Rest - create start access route free\t") +TEST("Rest - create start access http hook free\t") { - restd_server_t *rest_server; int ret; - CURL *curl_handle; - CURLcode res; - char *body = NULL; - long http_result_code; + restd_server_t *rest_server; rest_server = restd_server_new(); ASSERT_NOT_NULL(rest_server); - restd_server_set_option(rest_server, "server.port", "7777"); + restd_server_set_option(rest_server, "server.port", kServerPort); restd_server_set_option(rest_server, "server.thread", "1"); restd_server_register_hook(rest_server, restd_http_handler, NULL); - restd_server_register_hook_on_path(rest_server, "GET", "/api/v1/test/", my_success_handler, NULL); + restd_server_register_hook_on_path(rest_server, "GET", kApiTestGet, my_success_http_handler, NULL); ret = restd_server_start(rest_server); ASSERT_EQUAL_INT(ret, 0); - /* init libcurl */ - curl_global_init(CURL_GLOBAL_ALL); - - /* init the curl session */ - curl_handle = curl_easy_init(); - - /* specify URL to get */ - curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost:7777/api/v1/test/"); - - /* send all data to this function */ - curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); - curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &body); - curl_easy_setopt(curl_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); - - /* get it! */ - res = curl_easy_perform(curl_handle); - ASSERT_EQUAL_INT(res, CURLE_OK); - - curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &http_result_code); - ASSERT_EQUAL_INT(http_result_code, 200); - - res = strcmp(ksuccess_body, body); - ASSERT_EQUAL_INT(res, 0); - - /* cleanup curl stuff */ - curl_easy_cleanup(curl_handle); - - free(body); - - /* we're done with libcurl, so clean it up */ - curl_global_cleanup(); + ret = exec_request(kGetMethod, "http://localhost:"kServerPort kApiTestGet, 200, ksuccesGet_body); + ASSERT_EQUAL_INT(ret, 0); + + restd_server_free(rest_server); +} + +/*--------------------------------------------------------------------------*/ + +TEST("Rest - create start access rest hook free\t") +{ + int ret; + restd_server_t *rest_server; + + rest_server = restd_server_new(); + ASSERT_NOT_NULL(rest_server); + + restd_log_level(RESTD_LOG_DEBUG); + + restd_server_set_option(rest_server, "server.port", kServerPort); + restd_server_set_option(rest_server, "server.thread", "1"); + + restd_server_register_call_hooks_handler(rest_server, restd_rest_handler); + + restd_server_register_hook_on_path(rest_server, "GET", kApiTestGet, my_success_rest_handler, NULL); + //restd_server_register_hook_on_path(rest_server, "PUT", kApiTestGet, my_success_rest_handler, NULL); + restd_server_register_hook_on_path(rest_server, "DELETE", kApiTestGet, my_success_rest_delete_handler, NULL); + + ret = restd_server_start(rest_server); + ASSERT_EQUAL_INT(ret, 0); + + + ret = exec_request(kGetMethod, "http://localhost:"kServerPort kApiTestGet, 200, ksuccesGet_body); + ASSERT_EQUAL_INT(ret, 0); + printf("======================\n"); + ret = exec_request(kDeleteMethod, "http://localhost:"kServerPort kApiTestGet, 200, ksuccesDelete_body); + ASSERT_EQUAL_INT(ret, 0); + +// ret = exec_request(kPutMethod, "http://localhost:"kServerPort kApiTestGet, 200, ksuccess_body); +// ASSERT_EQUAL_INT(ret, 0); + + + restd_server_free(rest_server); } diff --git a/src/tests/test_shutter.c b/src/tests/test_shutter.c index e2d9d4a..62a3db3 100644 --- a/src/tests/test_shutter.c +++ b/src/tests/test_shutter.c @@ -23,9 +23,6 @@ * */ -// This is an independent project of an individual developer. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com - #define kShutterTestNameTrue "{ \"id\": 1, \"name\": \"test_name\", \"state\": true, \"zone\": \"\", \"sender\": 0, \"switch\": 0, \"speed_up\": 0, \"speed_down\": 0 }" #define kShutterTestNameFalse "{ \"id\": 1, \"name\": \"test_name\", \"state\": false, \"zone\": \"\", \"sender\": 0, \"switch\": 0, \"speed_up\": 0, \"speed_down\": 0 }" #define kShutterTestNameFullFalse "{ \"id\": 1, \"name\": \"test_name\", \"state\": false, \"zone\": \"zone\", \"sender\": 123456, \"switch\": 77, \"speed_up\": 50, \"speed_down\": 60 }" diff --git a/src/tests/test_sprinkler.c b/src/tests/test_sprinkler.c index 7b2be6b..b672e06 100644 --- a/src/tests/test_sprinkler.c +++ b/src/tests/test_sprinkler.c @@ -23,10 +23,6 @@ * */ -// This is an independent project of an individual developer. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com - - #define kSprinklerTestNameTrue "{ \"id\": 1, \"name\": \"test_name\", \"state\": true }" #define kSprinklerTestNameFalse "{ \"id\": 1, \"name\": \"test_name\", \"state\": false }" #define kSprinklerTestNameFull "[ { \"id\": 1, \"name\": \"test1\", \"state\": false }, { \"id\": 2, \"name\": \"test2\", \"state\": false }, { \"id\": 3, \"name\": \"test3\", \"state\": false } ]"