From fc43948780c06edf531e272531a81e20da3612e0 Mon Sep 17 00:00:00 2001 From: Bill Williams Date: Fri, 13 Jan 2017 17:38:38 -0800 Subject: [PATCH] Add libpd_test --- CMakeLists.txt | 14 +- tests/CMakeLists.txt | 13 ++ tests/curl_parodus.py | 118 +++++++++++++ tests/libpd_test.c | 397 ++++++++++++++++++++++++++++++++++++++++++ tests/rq3.txt | 3 + 5 files changed, 543 insertions(+), 2 deletions(-) create mode 100644 tests/curl_parodus.py create mode 100644 tests/libpd_test.c create mode 100644 tests/rq3.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index a29be64..76c1102 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,8 @@ include_directories(${INCLUDE_DIR} ${INCLUDE_DIR}/nopoll ${INCLUDE_DIR}/msgpack ${INCLUDE_DIR}/trower-base64 - ${INCLUDE_DIR}/wrp-c + ${INCLUDE_DIR}/wrp-c + ${INCLUDE_DIR}/libparodus ) # Compile options/flags @@ -140,6 +141,16 @@ ExternalProject_Add(wrp-c add_library(libwrp-c STATIC SHARED IMPORTED) add_dependencies(libwrp-c wrp-c) +# libparodus external dependency +#------------------------------------------------------------------------------- +ExternalProject_Add(libparodus + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/libparodus + GIT_REPOSITORY https://github.com/Comcast/libparodus.git + CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} +) +add_library(liblibparodus STATIC SHARED IMPORTED) +add_dependencies(liblibparodus libparodus) + endif () link_directories ( ${LIBRARY_DIR} ${LIBRARY_DIR64}) @@ -149,4 +160,3 @@ if (BUILD_TESTING) add_subdirectory(tests) endif (BUILD_TESTING) -add_subdirectory(lib) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ec29068..eb532fd 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -41,6 +41,19 @@ add_test(NAME test_nopoll_helpers COMMAND test_nopoll_helpers) add_executable(test_nopoll_helpers test_nopoll_helpers.c ../src/nopoll_helpers.c ../src/wss_mgr.c ../src/networking.c ../src/string_helpers.c ../src/mutex.c ../src/time.c ../src/config.c ../src/connection.c ../src/spin_thread.c) target_link_libraries (test_nopoll_helpers ${PARODUS_COMMON_LIBS} -lnanomsg) +add_executable (libpd_test libpd_test.c) + +target_link_libraries (libpd_test + cunit + -llibparodus + -lwrp-c + -lmsgpackc + -ltrower-base64 + -lnanomsg + -lm + -lpthread + -lrt) + if (NOT EXCLUDE_SIMPLE) #------------------------------------------------------------------------------- # simple test diff --git a/tests/curl_parodus.py b/tests/curl_parodus.py new file mode 100644 index 0000000..6a18627 --- /dev/null +++ b/tests/curl_parodus.py @@ -0,0 +1,118 @@ +#----------------------------------------------------------------- +# curl_parodus.py +#----------------------------------------------------------------- + +import subpro as SUBP +import datetime as DT +import time +import sys, os + +HEADER_AUTH = "Authorization" + +SERVICE_NAME = "config" + +if len(sys.argv) < 3: + print "Expecting 2 arguments:" + print " 1) device_id" + print " 2) command file" + sys.exit (4) + +device_id = sys.argv[1] +file_name = sys.argv[2] + +if len(sys.argv) > 3: + SERVICE_NAME = sys.argv[3] + +if len(device_id) != 12: + print "Expecting 12 digit mac address" + sys.exit(4) + +auth_str = os.environ.get ("WEBPA_AUTH_HEADER", "") +if not auth_str: + print "Missing environment variable WEBPA_AUTH_HEADER" + sys.exit(4) + +BASIC_AUTH_VALUE = "Basic " + auth_str + +try: + fin = open (file_name, "r") +except StandardError, e: + print "Error opening file", file_name + print e + sys.exit(4) + +def get_errno(e): + if hasattr (e, "errno"): + return e.errno + if hasattr (e, "args"): + return e.args[0] + return -1 + +def timestamp(): + dt = DT.datetime.now() + return "%04d/%02d/%02d %02d:%02d:%02d " % \ + (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) +#end def + +set_list = [] +for line in fin: + line = line.strip() + if line.endswith ('\n'): + line = line[0:-1] + line = line.strip() + if line.endswith (','): + line = line[0:-1] + set_list.append (line) +#end for + +payload_str = ",".join (set_list) + +url_base = "https://api-beta.webpa.comcast.net:8090/api/v2/device/" + +cmd_url = "%smac:%s/%s?names=%s" % (url_base, device_id, SERVICE_NAME, payload_str) +#print cmd_url +#print + +auth_str = "%s: %s" % (HEADER_AUTH, BASIC_AUTH_VALUE) + +cmd = ["curl", "-H", auth_str, "-k", "--max-time", "10", cmd_url] +#cmd = ["curl", "-H", auth_str, "-k", +# "--connect-timeout", "150", "--max-time", "180", cmd_url] +err_cnt = 0 + +time.sleep (1.0) +try: + while True: + rtn = SUBP.call (cmd, abort=False) + if rtn == 0: + print "\n%s Timeout Errors %d" % (timestamp(), err_cnt) + elif rtn == 28: + print "Command timed out" + err_cnt += 1 + else: + break + time.sleep (5.0) + #sub_pro = SUBP.TSubProc (cmd) + #if sub_pro.errors: + #open_err_cnt += 1 + #continue + #for line in sub_pro.read_stdout (show_lines=False): + #sys.stdout.write (timestamp() + line) + #if sub_pro.errors: + #read_err_cnt += 1 + #end while +except KeyboardInterrupt, e: + print e + print "Timeout Errors", err_cnt +except StandardError, e: + print e + print "Timeout Errors", err_cnt + + +#req = URL.Request (cmd_url) +#req.add_header (HEADER_AUTH, BASIC_AUTH_VALUE) + +#f = URL.urlopen (req) + + +# -k https://scytale-beta.webpa.comcast.net:8090/api/v2/device/mac:14cfe213e1d2/config?names= diff --git a/tests/libpd_test.c b/tests/libpd_test.c new file mode 100644 index 0000000..b0e97ea --- /dev/null +++ b/tests/libpd_test.c @@ -0,0 +1,397 @@ +/** + * Copyright 2010-2016 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define SEND_EVENT_MSGS 1 + +//#define TCP_URL(ip) "tcp://" ip + +#define GOOD_CLIENT_URL "tcp://127.0.0.1:6667" +//#define PARODUS_URL "ipc:///tmp/parodus_server.ipc" +#define GOOD_PARODUS_URL "tcp://127.0.0.1:6666" +//#define CLIENT_URL "ipc:///tmp/parodus_client.ipc" + + +static void initEndKeypressHandler(); +static void *endKeypressHandlerTask(); + +static pthread_t endKeypressThreadId; + +static const char *service_name = "iot"; +//static const char *service_name = "config"; + +static bool no_mock_send_only_test = false; + +// libparodus functions to be tested +extern int flush_wrp_queue (uint32_t delay_ms); +extern int connect_receiver (const char *rcv_url); +extern int connect_sender (const char *send_url); +extern void shutdown_socket (int *sock); + +extern bool is_auth_received (void); +extern int libparodus_receive__ (wrp_msg_t **msg, uint32_t ms); + +// libparodus_log functions to be tested +extern int get_valid_file_num (const char *file_name, const char *date); +extern int get_last_file_num_in_dir (const char *date, const char *log_dir); + +extern const char *wrp_queue_name; +extern const char *parodus_url; +extern const char *client_url; +extern volatile int keep_alive_count; +extern volatile int reconnect_count; + + +void show_src_dest_payload (char *src, char *dest, void *payload, size_t payload_size) +{ + size_t i; + char *payload_str = (char *) payload; + printf (" SOURCE: %s\n", src); + printf (" DEST : %s\n", dest); + printf (" PAYLOAD: "); + for (i=0; isource, msg->dest, msg->payload, msg->payload_size); +} + +void show_wrp_event_msg (struct wrp_event_msg *msg) +{ + show_src_dest_payload (msg->source, msg->dest, msg->payload, msg->payload_size); +} + +void show_wrp_msg (wrp_msg_t *wrp_msg) +{ + printf ("Received WRP Msg type %d\n", wrp_msg->msg_type); + if (wrp_msg->msg_type == WRP_MSG_TYPE__REQ) { + show_wrp_req_msg (&wrp_msg->u.req); + return; + } + if (wrp_msg->msg_type == WRP_MSG_TYPE__EVENT) { + show_wrp_event_msg (&wrp_msg->u.event); + return; + } + return; +} + +void send_reply (wrp_msg_t *wrp_msg) +{ + size_t i; + size_t payload_size = wrp_msg->u.req.payload_size; + char *payload = (char *) wrp_msg->u.req.payload; + char *temp; + // swap source and dest + temp = wrp_msg->u.req.source; + wrp_msg->u.req.source = wrp_msg->u.req.dest; + wrp_msg->u.req.dest = temp; + // Alter the payload + for (i=0; imsg_type = WRP_MSG_TYPE__EVENT; + new_msg->u.event.source = new_str (src); + new_msg->u.event.dest = new_str (dest); + new_msg->u.event.headers = NULL; + new_msg->u.event.metadata = NULL; + payload_buf = new_str (payload); + insert_number_into_buf (payload_buf, event_num); + new_msg->u.event.payload = (void*) payload_buf; + new_msg->u.event.payload_size = strlen (payload) + 1; + printf ("Sending event msg %u\n", event_num); + rtn = libparodus_send (new_msg); + //printf ("Freeing event msg\n"); + wrp_free_struct (new_msg); + //printf ("Freed event msg\n"); + return rtn; +} + +int send_event_msgs (unsigned *msg_num, unsigned *event_num, int count) +{ + int i; + unsigned msg_num_mod; + +#ifndef SEND_EVENT_MSGS + return 0; +#endif + if (NULL != msg_num) { + (*msg_num)++; + msg_num_mod = (*msg_num) % 3; + if (msg_num_mod != 0) + return 0; + } + for (i=0; i='0') && (c<='9')) { + if (num == -1) + num = c - '0'; + else + num = 10*num + (c - '0'); + } + } + return num; +} + +static int flush_queue_count = 0; + +void qfree (void * msg) +{ + flush_queue_count++; + free (msg); +} + +void delay_ms(unsigned int secs, unsigned int msecs) +{ + struct timespec ts; + ts.tv_sec = (time_t) secs; + ts.tv_nsec = (long) msecs * 1000000L; + nanosleep (&ts, NULL); +} + +void dbg_log_err (const char *fmt, ...) +{ + char errbuf[100]; + + va_list arg_ptr; + va_start(arg_ptr, fmt); + vprintf(fmt, arg_ptr); + va_end(arg_ptr); + printf ("LIBPD_TEST: %s\n", strerror_r (errno, errbuf, 100)); +} + +void wait_auth_received (void) +{ + if (!is_auth_received ()) { + printf ("Waiting for auth received\n"); + sleep(1); + } + if (!is_auth_received ()) { + printf ("Waiting for auth received\n"); + sleep(1); + } + CU_ASSERT (is_auth_received ()); +} + +void test_send_only (void) +{ + unsigned event_num = 0; + + CU_ASSERT (libparodus_init_ext (service_name, NULL, "C") == 0); + CU_ASSERT (send_event_msgs (NULL, &event_num, 10) == 0); + CU_ASSERT (libparodus_shutdown () == 0); +} + + void test_1(void) +{ + unsigned msgs_received_count = 0; + int rtn; + wrp_msg_t *wrp_msg; + unsigned event_num = 0; + unsigned msg_num = 0; + + CU_ASSERT_FATAL (log_init (".", NULL) == 0); + + if (no_mock_send_only_test) { + test_send_only (); + return; + } + + CU_ASSERT (libparodus_init (service_name, NULL) == 0); + printf ("LIBPD_TEST: libparodus_init successful\n"); + initEndKeypressHandler (); + + wait_auth_received (); + + printf ("LIBPD_TEST: starting msg receive loop\n"); + while (true) { + rtn = libparodus_receive (&wrp_msg, 2000); + if (rtn == 1) { + printf ("LIBPD_TEST: Timed out waiting for msg\n"); + if (msgs_received_count > 0) + if (send_event_msgs (&msg_num, &event_num, 5) != 0) + break; + continue; + } + if (rtn != 0) + break; + show_wrp_msg (wrp_msg); + msgs_received_count++; + if (wrp_msg->msg_type == WRP_MSG_TYPE__REQ) + send_reply (wrp_msg); + wrp_free_struct (wrp_msg); + if (send_event_msgs (&msg_num, &event_num, 5) != 0) + break; + } + printf ("Messages received %u\n", msgs_received_count); + CU_ASSERT (libparodus_shutdown () == 0); +} + +/* + * @brief To initiate end keypress handler + */ +static void initEndKeypressHandler() +{ + int err = 0; + err = pthread_create(&endKeypressThreadId, NULL, endKeypressHandlerTask, NULL); + if (err != 0) + { + libpd_log (LEVEL_ERROR, err, "Error creating End Keypress Handler thread\n"); + } + else + { + printf ("End Keypress handler Thread created successfully\n"); + printf ("\n--->> Press to shutdown the test. ---\n"); + } +} + +/* + * @brief To handle End Keypress + */ +static void *endKeypressHandlerTask() +{ + char inbuf[10]; + memset(inbuf, 0, 10); + while (true) { + fgets (inbuf, 10, stdin); + if ((inbuf[0] != '\n') && (inbuf[0] != '\0')) { + printf ("endKeyPressHandler exiting\n"); + break; + } + } + libparodus_close_receiver (); + return NULL; +} + + +void add_suites( CU_pSuite *suite ) +{ + *suite = CU_add_suite( "libparodus tests", NULL, NULL ); + CU_add_test( *suite, "Test 1", test_1 ); +} + +/*----------------------------------------------------------------------------*/ +/* External Functions */ +/*----------------------------------------------------------------------------*/ +int main( int argc, char **argv __attribute__((unused)) ) +{ + unsigned rv = 1; + CU_pSuite suite = NULL; + + if (argc > 1) { + const char *arg = argv[1]; + if ((arg[0] == 's') || (arg[0] == 'S')) + no_mock_send_only_test = true; + } + + if( CUE_SUCCESS == CU_initialize_registry() ) { + add_suites( &suite ); + + if( NULL != suite ) { + CU_basic_set_mode( CU_BRM_VERBOSE ); + CU_basic_run_tests(); + printf( "\n" ); + CU_basic_show_failures( CU_get_failure_list() ); + printf( "\n\n" ); + rv = CU_get_number_of_tests_failed(); + } + + CU_cleanup_registry(); + } + + if( 0 != rv ) { + return 1; + } + return 0; +} diff --git a/tests/rq3.txt b/tests/rq3.txt new file mode 100644 index 0000000..c138786 --- /dev/null +++ b/tests/rq3.txt @@ -0,0 +1,3 @@ + Device.WiFi.SSID.10001.Enable, + Device.WiFi.SSID.10001.Name, + Device.DeviceInfo.X_COMCAST_COM_xfinitywifiEnable