diff --git a/cyassl/test.h b/cyassl/test.h index 667476ed2..67002ebef 100644 --- a/cyassl/test.h +++ b/cyassl/test.h @@ -34,6 +34,14 @@ #define SNPRINTF _snprintf #elif defined(CYASSL_MDK_ARM) #include +#elif defined(TIRTOS) + #include + #include + #include + #include + #include + #include + #define SOCKET_T int #else #include #include @@ -119,6 +127,10 @@ typedef unsigned int THREAD_RETURN; typedef int THREAD_TYPE; #define CYASSL_THREAD + #elif defined(TIRTOS) + typedef void THREAD_RETURN; + typedef Task_Handle THREAD_TYPE; + #define CYASSL_THREAD #else typedef unsigned int THREAD_RETURN; typedef intptr_t THREAD_TYPE; @@ -467,6 +479,9 @@ static INLINE void tcp_socket(SOCKET_T* sockfd, int udp) #ifdef USE_WINDOWS_API if (*sockfd == INVALID_SOCKET) err_sys("socket failed\n"); +#elif defined(TIRTOS) + if (*sockfd == -1) + err_sys("socket failed\n"); #else if (*sockfd < 0) err_sys("socket failed\n"); @@ -481,7 +496,7 @@ static INLINE void tcp_socket(SOCKET_T* sockfd, int udp) if (res < 0) err_sys("setsockopt SO_NOSIGPIPE failed\n"); } -#elif defined(CYASSL_MDK_ARM) +#elif defined(CYASSL_MDK_ARM) || defined (TIRTOS) /* nothing to define */ #else /* no S_NOSIGPIPE */ signal(SIGPIPE, SIG_IGN); @@ -529,7 +544,7 @@ enum { }; -#if !defined(CYASSL_MDK_ARM) +#if !defined(CYASSL_MDK_ARM) && !defined(TIRTOS) static INLINE int tcp_select(SOCKET_T socketfd, int to_sec) { fd_set recvfds, errfds; @@ -555,6 +570,11 @@ static INLINE int tcp_select(SOCKET_T socketfd, int to_sec) return TEST_SELECT_FAIL; } +#elif defined(TIRTOS) +static INLINE int tcp_select(SOCKET_T socketfd, int to_sec) +{ + return TEST_RECV_READY; +} #endif /* !CYASSL_MDK_ARM */ @@ -665,6 +685,11 @@ static INLINE void udp_accept(SOCKET_T* sockfd, SOCKET_T* clientfd, pthread_cond_signal(&ready->cond); pthread_mutex_unlock(&ready->mutex); } +#elif defined (TIRTOS) + /* Need mutex? */ + tcp_ready* ready = args->signal; + ready->ready = 1; + ready->port = port; #endif *clientfd = udp_read_connect(*sockfd); @@ -694,6 +719,11 @@ static INLINE void tcp_accept(SOCKET_T* sockfd, SOCKET_T* clientfd, pthread_cond_signal(&ready->cond); pthread_mutex_unlock(&ready->mutex); } +#elif defined (TIRTOS) + /* Need mutex? */ + tcp_ready* ready = args->signal; + ready->ready = 1; + ready->port = port; #endif *clientfd = accept(*sockfd, (struct sockaddr*)&client, @@ -715,7 +745,7 @@ static INLINE void tcp_set_nonblocking(SOCKET_T* sockfd) int ret = ioctlsocket(*sockfd, FIONBIO, &blocking); if (ret == SOCKET_ERROR) err_sys("ioctlsocket failed"); - #elif defined(CYASSL_MDK_ARM) + #elif defined(CYASSL_MDK_ARM) || defined (TIRTOS) /* non blocking not suppported, for now */ #else int flags = fcntl(*sockfd, F_GETFL, 0); @@ -798,6 +828,8 @@ static INLINE unsigned int my_psk_server_cb(CYASSL* ssl, const char* identity, return (double)count.QuadPart / freq.QuadPart; } +#elif defined(TIRTOS) + extern double current_time(); #else #if !defined(CYASSL_MDK_ARM) @@ -1035,6 +1067,7 @@ static INLINE int CurrentDir(const char* str) #elif defined(CYASSL_MDK_ARM) /* KEIL-RL File System does not support relative directry */ +#elif defined(TIRTOS) #else #ifndef MAX_PATH @@ -1702,7 +1735,7 @@ static INLINE void SetupPkCallbacks(CYASSL_CTX* ctx, CYASSL* ssl) -#if defined(__hpux__) || defined(__MINGW32__) +#if defined(__hpux__) || defined(__MINGW32__) || defined (TIRTOS) /* HP/UX doesn't have strsep, needed by test/suites.c */ static INLINE char* strsep(char **stringp, const char *delim) diff --git a/examples/client/client.c b/examples/client/client.c index a47201652..f0107dec1 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -712,6 +712,8 @@ THREAD_RETURN CYASSL_THREAD client_test(void* args) SOCKADDR_IN_T addr; #ifdef USE_WINDOWS_API Sleep(500); + #elif defined(TIRTOS) + Task_sleep(1); #else sleep(1); #endif @@ -752,6 +754,8 @@ THREAD_RETURN CYASSL_THREAD client_test(void* args) /* give server a chance to bounce a message back to client */ #ifdef USE_WINDOWS_API Sleep(500); + #elif defined(TIRTOS) + Task_sleep(1); #else sleep(1); #endif @@ -781,7 +785,9 @@ THREAD_RETURN CYASSL_THREAD client_test(void* args) ShowMemoryTracker(); #endif /* USE_CYASSL_MEMORY */ +#if !defined(TIRTOS) return 0; +#endif } diff --git a/examples/echoclient/echoclient.c b/examples/echoclient/echoclient.c index 29e062e7f..f402ca239 100644 --- a/examples/echoclient/echoclient.c +++ b/examples/echoclient/echoclient.c @@ -254,11 +254,12 @@ void echoclient_test(void* args) #if defined(DEBUG_CYASSL) && !defined(CYASSL_MDK_SHELL) CyaSSL_Debugging_ON(); #endif - +#ifndef TIRTOS if (CurrentDir("echoclient")) ChangeDirBack(2); else if (CurrentDir("Debug") || CurrentDir("Release")) ChangeDirBack(3); +#endif echoclient_test(&args); CyaSSL_Cleanup(); diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index 945fc1269..612b045ab 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -107,12 +107,18 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) #endif #if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API) && \ - !defined(CYASSL_SNIFFER) && !defined(CYASSL_MDK_SHELL) + !defined(CYASSL_SNIFFER) && !defined(CYASSL_MDK_SHELL) && \ + !defined(TIRTOS) port = 0; #endif #if defined(USE_ANY_ADDR) useAnyAddr = 1; #endif + +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + tcp_listen(&sockfd, &port, useAnyAddr, doDTLS); #if defined(CYASSL_DTLS) @@ -313,7 +319,14 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) #endif ((func_args*)args)->return_code = 0; + +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif + +#ifndef TIRTOS return 0; +#endif } diff --git a/examples/server/server.c b/examples/server/server.c index 85058caca..2b11e7efd 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -187,6 +187,10 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) (void)trackMemory; (void)pkCallbacks; +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + while ((ch = mygetopt(argc, argv, "?dbstnNufPp:v:l:A:c:k:S:oO:")) != -1) { switch (ch) { case '?' : @@ -519,6 +523,8 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) #if defined(CYASSL_MDK_SHELL) && defined(HAVE_MDK_RTX) os_dly_wait(500) ; + #elif defined (TIRTOS) + Task_yield(); #endif SSL_shutdown(ssl); @@ -533,7 +539,13 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) ShowMemoryTracker(); #endif /* USE_CYASSL_MEMORY */ +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif + +#ifndef TIRTOS return 0; +#endif } diff --git a/tests/api.c b/tests/api.c index 200fca2e1..642115db7 100644 --- a/tests/api.c +++ b/tests/api.c @@ -738,8 +738,10 @@ int test_CyaSSL_CTX_load_verify_locations(void) "CyaSSL_CTX_load_verify_locations(ctx, NULL, NULL)"); test_lvl(NULL, caCert, NULL, SSL_FAILURE, "CyaSSL_CTX_load_verify_locations(ctx, NULL, NULL)"); +#ifndef TIRTOS test_lvl(ctx, caCert, bogusFile, SSL_FAILURE, "CyaSSL_CTX_load_verify_locations(ctx, caCert, bogusFile)"); +#endif /* Add a test for the certs directory path loading. */ /* There is a leak here. If you load a second cert, the first one is lost. */ @@ -925,6 +927,10 @@ static int test_CyaSSL_read_write(void) func_args server_args; THREAD_TYPE serverThread; +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + StartTCP(); InitTcpReady(&ready); @@ -948,6 +954,9 @@ static int test_CyaSSL_read_write(void) FreeTcpReady(&ready); +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif return test_result; } @@ -966,13 +975,17 @@ THREAD_RETURN CYASSL_THREAD test_server_nofail(void* args) char msg[] = "I hear you fa shizzle!"; char input[1024]; int idx; - + +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif ((func_args*)args)->return_code = TEST_FAIL; method = CyaSSLv23_server_method(); ctx = CyaSSL_CTX_new(method); #if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API) && \ - !defined(CYASSL_SNIFFER) && !defined(CYASSL_MDK_SHELL) + !defined(CYASSL_SNIFFER) && !defined(CYASSL_MDK_SHELL) && \ + !defined(TIRTOS) port = 0; #endif @@ -1033,9 +1046,17 @@ THREAD_RETURN CYASSL_THREAD test_server_nofail(void* args) if (CyaSSL_write(ssl, msg, sizeof(msg)) != sizeof(msg)) { /*err_sys("SSL_write failed");*/ +#ifdef TIRTOS + return; +#else return 0; +#endif } +#ifdef TIRTOS + Task_yield(); +#endif + done: CyaSSL_shutdown(ssl); CyaSSL_free(ssl); @@ -1043,7 +1064,13 @@ done: CloseSocket(clientfd); ((func_args*)args)->return_code = TEST_SUCCESS; + +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif +#ifndef TIRTOS return 0; +#endif } void test_client_nofail(void* args) @@ -1059,6 +1086,10 @@ void test_client_nofail(void* args) int input; int msgSz = (int)strlen(msg); +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + ((func_args*)args)->return_code = TEST_FAIL; method = CyaSSLv23_client_method(); ctx = CyaSSL_CTX_new(method); @@ -1119,6 +1150,10 @@ done2: CloseSocket(sockfd); ((func_args*)args)->return_code = TEST_SUCCESS; + +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif return; } @@ -1135,6 +1170,10 @@ void run_cyassl_client(void* args) char input[1024]; int idx; +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + ((func_args*)args)->return_code = TEST_FAIL; #ifdef OPENSSL_EXTRA @@ -1181,6 +1220,10 @@ void run_cyassl_client(void* args) CyaSSL_CTX_free(ctx); CloseSocket(sfd); ((func_args*)args)->return_code = TEST_SUCCESS; + +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif } THREAD_RETURN CYASSL_THREAD run_cyassl_server(void* args) @@ -1198,10 +1241,14 @@ THREAD_RETURN CYASSL_THREAD run_cyassl_server(void* args) char input[1024]; int idx; +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif ((func_args*)args)->return_code = TEST_FAIL; #if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API) && \ - !defined(CYASSL_SNIFFER) && !defined(CYASSL_MDK_SHELL) + !defined(CYASSL_SNIFFER) && !defined(CYASSL_MDK_SHELL) && \ + !defined(TIRTOS) port = 0; #endif @@ -1255,7 +1302,9 @@ THREAD_RETURN CYASSL_THREAD run_cyassl_server(void* args) } AssertIntEQ(len, CyaSSL_write(ssl, msg, len)); - +#ifdef TIRTOS + Task_yield(); +#endif CyaSSL_shutdown(ssl); } @@ -1268,7 +1317,12 @@ THREAD_RETURN CYASSL_THREAD run_cyassl_server(void* args) ((func_args*)args)->return_code = TEST_SUCCESS; +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif +#ifndef TIRTOS return 0; +#endif } void test_CyaSSL_client_server(callback_functions* client_callbacks, @@ -1284,6 +1338,10 @@ void test_CyaSSL_client_server(callback_functions* client_callbacks, client_args.callbacks = client_callbacks; server_args.callbacks = server_callbacks; +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + /* RUN Server side */ InitTcpReady(&ready); server_args.signal = &ready; @@ -1296,6 +1354,9 @@ void test_CyaSSL_client_server(callback_functions* client_callbacks, join_thread(serverThread); FreeTcpReady(&ready); +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif } #endif /* SINGLE_THREADED*/ diff --git a/tests/suites.c b/tests/suites.c index aeb4fd24d..7cd3e911a 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -121,8 +121,17 @@ static int execute_test_case(int svr_argc, char** svr_argv, int cli_argc, char** cli_argv, int addNoVerify, int addNonBlocking) { +#ifdef TIRTOS + func_args cliArgs = {0}; + func_args svrArgs = {0}; + cliArgs.argc = cli_argc; + cliArgs.argv = cli_argv; + svrArgs.argc = svr_argc; + svrArgs.argv = svr_argv; +#else func_args cliArgs = {cli_argc, cli_argv, 0, NULL, NULL}; func_args svrArgs = {svr_argc, svr_argv, 0, NULL, NULL}; +#endif tcp_ready ready; THREAD_TYPE serverThread; @@ -183,7 +192,7 @@ static int execute_test_case(int svr_argc, char** svr_argv, strcat(commandLine, flagSep); } } - #ifndef USE_WINDOWS_API + #if !defined(USE_WINDOWS_API) && !defined(TIRTOS) /* add port 0 */ if (svr_argc + 2 > MAX_ARGS) printf("cannot add the magic port number flag to server\n"); @@ -222,11 +231,15 @@ static int execute_test_case(int svr_argc, char** svr_argv, InitTcpReady(&ready); +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + /* start server */ svrArgs.signal = &ready; start_thread(server_test, &svrArgs, &serverThread); wait_tcp_ready(&svrArgs); - #ifndef USE_WINDOWS_API + #if !defined(USE_WINDOWS_API) && !defined(TIRTOS) if (ready.port != 0) { if (cli_argc + 2 > MAX_ARGS) @@ -255,6 +268,9 @@ static int execute_test_case(int svr_argc, char** svr_argv, exit(EXIT_FAILURE); } +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif FreeTcpReady(&ready); return 0; diff --git a/tests/unit.c b/tests/unit.c index 287ad3cf7..74cb0ab3e 100644 --- a/tests/unit.c +++ b/tests/unit.c @@ -11,9 +11,16 @@ int myoptind = 0; char* myoptarg = NULL; +int unit_test(int argc, char** argv); - +#ifndef NO_TESTSUITE_MAIN_DRIVER int main(int argc, char** argv) +{ + return unit_test(argc, argv); +} +#endif + +int unit_test(int argc, char** argv) { int ret; @@ -27,10 +34,12 @@ int main(int argc, char** argv) err_sys("Cavium OpenNitroxDevice failed"); #endif /* HAVE_CAVIUM */ +#ifndef TIRTOS if (CurrentDir("tests") || CurrentDir("_build")) ChangeDirBack(1); else if (CurrentDir("Debug") || CurrentDir("Release")) ChangeDirBack(3); +#endif if ( (ret = ApiTest()) != 0) { printf("api test failed with %d\n", ret); @@ -85,6 +94,17 @@ void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread) #elif defined(_POSIX_THREADS) && !defined(__MINGW32__) pthread_create(thread, 0, fun, args); return; +#elif defined (TIRTOS) + /* Initialize the defaults and set the parameters. */ + Task_Params taskParams; + Task_Params_init(&taskParams); + taskParams.arg0 = (UArg)args; + taskParams.stackSize = 65535; + *thread = Task_create((Task_FuncPtr)fun, &taskParams, NULL); + if (*thread == NULL) { + printf("Failed to create new Task\n"); + } + Task_yield(); #else *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0); #endif @@ -97,6 +117,14 @@ void join_thread(THREAD_TYPE thread) (void)thread; #elif defined(_POSIX_THREADS) && !defined(__MINGW32__) pthread_join(thread, 0); +#elif defined (TIRTOS) + while(1) { + if (Task_getMode(thread) == Task_Mode_TERMINATED) { + Task_sleep(5); + break; + } + Task_yield(); + } #else int res = WaitForSingleObject((HANDLE)thread, INFINITE); assert(res == WAIT_OBJECT_0); diff --git a/testsuite/testsuite.c b/testsuite/testsuite.c index 419704f0c..51b23b7e2 100644 --- a/testsuite/testsuite.c +++ b/testsuite/testsuite.c @@ -57,7 +57,14 @@ enum { int myoptind = 0; char* myoptarg = NULL; +#ifndef NO_TESTSUITE_MAIN_DRIVER int main(int argc, char** argv) +{ + return testsuite_test(argc, argv); +} +#endif + +int testsuite_test(int argc, char** argv) { func_args server_args; @@ -80,6 +87,7 @@ int main(int argc, char** argv) CyaSSL_Debugging_ON(); #endif +#if !defined(TIRTOS) if (CurrentDir("testsuite") || CurrentDir("_build")) ChangeDirBack(1); else if (CurrentDir("Debug") || CurrentDir("Release")) @@ -87,6 +95,12 @@ int main(int argc, char** argv) /* Derived Data Advanced -> Custom */ /* Relative to Workspace, Build/Products */ /* Debug or Release */ +#endif + +#ifdef TIRTOS + fdOpenSession(TaskSelf()); +#endif + server_args.signal = &ready; InitTcpReady(&ready); @@ -155,6 +169,10 @@ int main(int argc, char** argv) CyaSSL_Cleanup(); FreeTcpReady(&ready); +#ifdef TIRTOS + fdCloseSession(TaskSelf()); +#endif + #ifdef HAVE_CAVIUM CspShutdown(CAVIUM_DEV_ID); #endif @@ -205,7 +223,8 @@ void simple_test(func_args* args) cliArgs.return_code = 0; strcpy(svrArgs.argv[0], "SimpleServer"); - #if !defined(USE_WINDOWS_API) && !defined(CYASSL_SNIFFER) + #if !defined(USE_WINDOWS_API) && !defined(CYASSL_SNIFFER) && \ + !defined(TIRTOS) strcpy(svrArgs.argv[svrArgs.argc++], "-p"); strcpy(svrArgs.argv[svrArgs.argc++], "0"); #endif @@ -263,6 +282,17 @@ void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread) #if defined(_POSIX_THREADS) && !defined(__MINGW32__) pthread_create(thread, 0, fun, args); return; +#elif defined(TIRTOS) + /* Initialize the defaults and set the parameters. */ + Task_Params taskParams; + Task_Params_init(&taskParams); + taskParams.arg0 = (UArg)args; + taskParams.stackSize = 65535; + *thread = Task_create((Task_FuncPtr)fun, &taskParams, NULL); + if (*thread == NULL) { + printf("Failed to create new Task\n"); + } + Task_yield(); #else *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0); #endif @@ -273,6 +303,14 @@ void join_thread(THREAD_TYPE thread) { #if defined(_POSIX_THREADS) && !defined(__MINGW32__) pthread_join(thread, 0); +#elif defined(TIRTOS) + while(1) { + if (Task_getMode(thread) == Task_Mode_TERMINATED) { + Task_sleep(5); + break; + } + Task_yield(); + } #else int res = WaitForSingleObject((HANDLE)thread, INFINITE); assert(res == WAIT_OBJECT_0);