/* * LibNoPoll: A websocket library * Copyright (C) 2013 Advanced Software Production Line, S.L. * * This program 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 program 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 program; if not, write to the Free * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * You may find a copy of the license under this software is released * at COPYING file. This is LGPL software: you are welcome to develop * proprietary applications using this library without any royalty or * fee but returning back any change, improvement or addition in the * form of source code, project image, documentation patches, etc. * * For commercial support on build Websocket enabled solutions * contact us: * * Postal address: * Advanced Software Production Line, S.L. * Edificio Alius A, Oficina 102, * C/ Antonio Suarez Nº 10, * Alcalá de Henares 28802 Madrid * Spain * * Email address: * info@aspl.es - http://www.aspl.es/nopoll */ #include #include "ssl/ssl_compat-1.0.h" #include "esp_common.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #if defined(__NOPOLL_PTHREAD_SUPPORT__) #include noPollPtr __nopoll_regtest_mutex_create (void) { pthread_mutex_t * mutex = nopoll_new (pthread_mutex_t, 1); if (mutex == NULL) return NULL; /* init the mutex using default values */ if (pthread_mutex_init (mutex, NULL) != 0) { return NULL; } /* end if */ return mutex; } void __nopoll_regtest_mutex_destroy (noPollPtr _mutex) { pthread_mutex_t * mutex = _mutex; if (mutex == NULL) return; if (pthread_mutex_destroy (mutex) != 0) { /* do some reporting */ return; } nopoll_free (mutex); return; } void __nopoll_regtest_mutex_lock (noPollPtr _mutex) { pthread_mutex_t * mutex = _mutex; /* lock the mutex */ if (pthread_mutex_lock (mutex) != 0) { /* do some reporting */ return; } /* end if */ return; } void __nopoll_regtest_mutex_unlock (noPollPtr _mutex) { pthread_mutex_t * mutex = _mutex; /* unlock mutex */ if (pthread_mutex_unlock (mutex) != 0) { /* do some reporting */ return; } /* end if */ return; } #endif nopoll_bool debug = nopoll_false; nopoll_bool show_critical_only = nopoll_false; #define local_host_name "iot.espressif.cn" #define local_host_url "v1/datastreams/tem_hum/datapoint" #define local_host_port "9000" #define local_host_ports "9443" nopoll_bool test_sending_and_check_echo (noPollConn * conn, const char * label, const char * msg) { char buffer[1024]; int length = strlen (msg); int bytes_read; /* wait for the reply */ while (nopoll_true) { if (nopoll_conn_is_ready (conn)) break; nopoll_sleep (10000); } /* end if */ /* send content text(utf-8) */ printf ("%s: sending content..\n", label); if (nopoll_conn_send_text (conn, msg, length) != length) { printf ("ERROR: Expected to find proper send operation..\n"); return nopoll_false; } /* wait for the reply (try to read 1024, blocking and with a 3 seconds timeout) */ bytes_read = nopoll_conn_read (conn, buffer, length, nopoll_true, 3000); if (bytes_read > 0) buffer[bytes_read] = 0; if (bytes_read != length) { printf ("ERROR: expected to find 14 bytes but found %d..\n", bytes_read); return nopoll_false; } /* end if */ /* check content received */ if (! nopoll_cmp (buffer, msg)) { printf ("ERROR: expected to find message 'This is a test' but something different was received: '%s'..\n", buffer); return nopoll_false; } /* end if */ printf ("%s: received reply and echo matches..\n", label); /* return that we sent and received the echo reply */ return nopoll_true; } void __report_critical (noPollCtx * ctx, noPollDebugLevel level, const char * log_msg, noPollPtr user_data) { if (level == NOPOLL_LEVEL_CRITICAL) { printf ("CRITICAL: %s\n", log_msg); } return; } noPollCtx * create_ctx (void) { /* create a context */ noPollCtx * ctx = nopoll_ctx_new (); nopoll_log_enable (ctx, debug); nopoll_log_color_enable (ctx, debug); /* configure handler */ if (show_critical_only) nopoll_log_set_handler (ctx, __report_critical, NULL); return ctx; } nopoll_bool test_01_strings (void) { /* check string compare functions */ if (! nopoll_ncmp ("GET ", "GET ", 4)) { printf ("ERROR (1): expected to find right equal comparison..\n"); return nopoll_false; } if (! nopoll_ncmp ("GET VALUE", "GET ", 4)) { printf ("ERROR (2): expected to find right equal comparison..\n"); return nopoll_false; } return nopoll_true; } nopoll_bool test_01_base64 (void) { char buffer[1024]; int size = 1024; int iterator = 0; /* call to produce base 64 (we do a loop to ensure we don't * leak through openssl (220) bytes */ while (iterator < 10) { size = 1024; if (! nopoll_base64_encode ("This is a test", 14, buffer, &size)) { printf ("ERROR: failed to encode this is a test..\n"); return nopoll_false; } /* end if */ /* check result */ if (! nopoll_cmp (buffer, "VGhpcyBpcyBhIHRlc3Q=")) { printf ("ERROR: expected to find encoded base64 string %s but found %s..\n", "VGhpcyBpcyBhIHRlc3Q=", buffer); return nopoll_false; } iterator++; } /* now decode content */ iterator = 0; while (iterator < 10) { size = 1024; if (! nopoll_base64_decode ("VGhpcyBpcyBhIHRlc3Q=", 20, buffer, &size)) { printf ("ERROR: failed to decode base64 content..\n"); } /* check result */ if (! nopoll_cmp (buffer, "This is a test")) { printf ("ERROR: expected to find encoded base64 string %s but found %s..\n", "This is a test", buffer); return nopoll_false; } /* end if */ iterator++; } return nopoll_true; } nopoll_bool test_01_masking (void) { char mask[4]; int mask_value; char buffer[1024]; noPollCtx * ctx; /* clear buffer */ memset (buffer, 0, 1024); /* create context */ ctx = create_ctx (); #if defined(NOPOLL_OS_WIN32) mask_value = rand (); #else mask_value = os_random (); #endif printf ("Test-01 masking: using masking value %d\n", mask_value); nopoll_set_32bit (mask_value, mask); memcpy (buffer, "This is a test value", 20); nopoll_conn_mask_content (ctx, buffer, 20, mask, 0); if (nopoll_ncmp (buffer, "This is a test value", 20)) { printf ("ERROR: expected to find different values after masking but found the same..\n"); return nopoll_false; } /* revert changes */ nopoll_conn_mask_content (ctx, buffer, 20, mask, 0); if (! nopoll_ncmp (buffer, "This is a test value", 20)) { printf ("ERROR: expected to find SAME values after masking but found the same..\n"); return nopoll_false; } /* end if */ /* now check transfering these values to the mask */ if (nopoll_get_32bit (mask) != mask_value) { printf ("ERROR: found failure while reading the mask from from buffer..\n"); return nopoll_false; } printf ("Test 01 masking: found mask in the buffer %d == %d\n", nopoll_get_32bit (mask), mask_value); nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_01 (void) { noPollCtx * ctx; noPollConn * conn; /* create context */ ctx = create_ctx (); /* check connections registered */ if (nopoll_ctx_conns (ctx) != 0) { printf ("ERROR: expected to find 0 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); return nopoll_false; } /* end if */ nopoll_ctx_unref (ctx); /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error (conn=%p, conn->session=%d, NOPOLL_INVALID_SOCKET=%d)..\n", conn, (int) nopoll_conn_socket (conn), (int) NOPOLL_INVALID_SOCKET); return nopoll_false; } /* check connections registered */ if (nopoll_ctx_conns (ctx) != 1) { printf ("ERROR: expected to find 1 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); return nopoll_false; } /* end if */ /* ensure connection status is ok */ if (! nopoll_conn_is_ok (conn)) { printf ("ERROR (3): expected to find proper connection status, but found failure.. (conn=%p, conn->session=%d, NOPOLL_INVALID_SOCKET=%d)..\n", conn, (int) nopoll_conn_socket (conn), (int) NOPOLL_INVALID_SOCKET); return nopoll_false; } printf ("Test 01: reference counting for the connection: %d\n", nopoll_conn_ref_count (conn)); /* check if the connection already finished its connection handshake */ while (! nopoll_conn_is_ready (conn)) { if (! nopoll_conn_is_ok (conn)) { printf ("ERROR (4.1 jkd412): expected to find proper connection handshake finished, but found connection is broken: session=%d, errno=%d : %s..\n", (int) nopoll_conn_socket (conn), errno, strerror (errno)); return nopoll_false; } /* end if */ /* wait a bit 10ms */ nopoll_sleep (100); } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_02 (void) { noPollCtx * ctx; noPollConn * conn; noPollMsg * msg; int iter; /* create context */ ctx = create_ctx (); /* check connections registered */ if (nopoll_ctx_conns (ctx) != 0) { printf ("ERROR: expected to find 0 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); return nopoll_false; } /* end if */ nopoll_ctx_unref (ctx); /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error.. (conn=%p, conn->session=%d, NOPOLL_INVALID_SOCKET=%d, errno=%d, strerr=%s)..\n", conn, (int) nopoll_conn_socket (conn), (int) NOPOLL_INVALID_SOCKET, errno, strerror (errno)); return nopoll_false; } printf ("Test 02: sending basic content..\n"); /* send content text(utf-8) */ if (nopoll_conn_send_text (conn, "This is a test", 14) != 14) { printf ("ERROR: Expected to find proper send operation..\n"); return nopoll_false; } /* wait for the reply */ iter = 0; while ((msg = nopoll_conn_get_msg (conn)) == NULL) { if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: received websocket connection close during wait reply..\n"); return nopoll_false; } nopoll_sleep (10000); if (iter > 10) break; } /* end if */ /* check content received */ if (! nopoll_cmp ((char*) nopoll_msg_get_payload (msg), "This is a test")) { printf ("ERROR: expected to find message 'This is a test' but something different was received: '%s'..\n", (const char *) nopoll_msg_get_payload (msg)); return nopoll_false; } /* end if */ /* unref message */ nopoll_msg_unref (msg); /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_03 (void) { noPollCtx * ctx; noPollConn * conn; char buffer[1024]; int bytes_read; memset (buffer, 0, 1024); /* create context */ ctx = create_ctx (); /* check connections registered */ if (nopoll_ctx_conns (ctx) != 0) { printf ("ERROR: expected to find 0 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); return nopoll_false; } /* end if */ nopoll_ctx_unref (ctx); /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } printf ("Test 03: sending basic content..\n"); /* send content text(utf-8) */ if (nopoll_conn_send_text (conn, "This is a test", 14) != 14) { printf ("ERROR: Expected to find proper send operation..\n"); return nopoll_false; } /* wait for the reply (try to read 1024, blocking and with a 3 seconds timeout) */ printf ("Test 03: now reading reply..\n"); bytes_read = nopoll_conn_read (conn, buffer, 14, nopoll_true, 3000); if (bytes_read != 14) { printf ("ERROR: expected to find 14 bytes but found %d..\n", bytes_read); return nopoll_false; } /* end if */ /* check content received */ if (! nopoll_ncmp (buffer, "This is a test", 14)) { printf ("ERROR: expected to find message 'This is a test' but something different was received: '%s'..\n", buffer); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } //nopoll_bool test_04 (int chunk_size) { // noPollCtx * ctx; // noPollConn * conn; // char buffer[1024]; // int bytes_read; // FILE * file; // struct stat stat_buf; // int total_read = 0; // const char * cmd; // int retries = 0; // // /* create context */ // ctx = create_ctx (); // // printf ("Test 04: running test with chunk_size=%d\n", chunk_size); // // /* check connections registered */ // if (nopoll_ctx_conns (ctx) != 0) { // printf ("ERROR: expected to find 0 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); // return nopoll_false; // } /* end if */ // // nopoll_ctx_unref (ctx); // // printf ("Test 04: creating connection to download file..\n"); // // /* reinit again */ // ctx = create_ctx (); // // /* call to create a connection */ // conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); // if (! nopoll_conn_is_ok (conn)) { // printf ("ERROR: Expected to find proper client connection status, but found error..\n"); // return nopoll_false; // } // // printf ("Test 04: sending get-file..\n"); // // /* send content text(utf-8) */ // if (nopoll_conn_send_text (conn, "get-file", 8) != 8) { // printf ("ERROR: Expected to find proper send operation..\n"); // return nopoll_false; // } // //#if defined(NOPOLL_OS_WIN32) // file = fopen ("tmp", "wb"); //#else // file = fopen ("tmp", "w"); //#endif // if (file == NULL) { // printf ("ERROR: unable to open file tmp for content comparision\n"); // return nopoll_false; // } /* end if */ // // stat ("nopoll-regression-client.c", &stat_buf); // // printf ("Test 04: stat file (nopoll-regression-client.c = %d bytes)\n", (int) stat_buf.st_size); // // retries = 0; // while (total_read < stat_buf.st_size) { // /* wait for the reply (try to read 1024, blocking) */ // bytes_read = nopoll_conn_read (conn, buffer, chunk_size, nopoll_true, 1000); // /* printf ("Test 04: read %d bytes over the connection %d\n", bytes_read, nopoll_conn_get_id (conn)); */ // // if (bytes_read < 0) { // printf ("ERROR: expected to find bytes from the connection but found: %d\n", bytes_read); // return nopoll_false; // } // // if (bytes_read == 0) { // retries ++; // if (retries > 100) { // printf ("Test 04: nothing found (0 bytes), total read %d, total requested: %ld, for %d retries\n", // total_read, stat_buf.st_size, retries); // return nopoll_false; // } /* end if */ // continue; // } /* end if */ // // /* write content */ // if (fwrite (buffer, 1, bytes_read, file) != bytes_read) // return nopoll_false; // // /* count total read bytes */ // total_read += bytes_read; // // } /* end while */ // fclose (file); // // /* now check both files */ // printf ("Test 04: checking content download (chunk_size=%d)...\n", chunk_size); // printf ("Test 04: about to run diff nopoll-regression-client.c tmp > /dev/null\n"); //#if defined(NOPOLL_OS_WIN32) // cmd = "diff -q nopoll-regression-client.c tmp"; //#else // cmd = "diff -q nopoll-regression-client.c tmp > /dev/null"; //#endif // if (system (cmd)) { // printf ("ERROR: failed to download file from server, content differs. Check: diff nopoll-regression-client.c tmp\n"); // return nopoll_false; // } /* end if */ // // /* finish connection */ // nopoll_conn_close (conn); // // /* finish */ // nopoll_ctx_unref (ctx); // // return nopoll_true; //} nopoll_bool test_04a (void) { noPollCtx * ctx; noPollConn * conn; char buffer[1024]; int result; /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* attempt to read without blocking */ printf ("Test 04-a: checking non-blocking API..\n"); result = nopoll_conn_read (conn, buffer, 1024, nopoll_false, 0); if (result != -1) { printf ("ERROR: expected return result -1(%d)\n", result); return nopoll_false; } printf ("Test 04-a: ok, operation not blocked, result %d\n", result); if (result != -1) { printf ("ERROR: expected return result -1(%d)\n", result); return nopoll_false; } result = nopoll_conn_read (conn, buffer, 1024, nopoll_false, 300); if (result != -1) { printf ("ERROR: expected return result -1(%d)\n", result); return nopoll_false; } printf ("Test 04-a: ok, operation not blocked, result %d\n", result); result = nopoll_conn_read (conn, buffer, 1024, nopoll_false, 1000); if (result != -1) { printf ("ERROR: expected return result -1(%d)\n", result); return nopoll_false; } printf ("Test 04-a: ok, operation not blocked, result %d\n", result); /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_04b (void) { noPollCtx * ctx; noPollConn * conn; int iterator; int length; int bytes_written; const char * msg = NULL; /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } printf ("Test 04-b: waiting until connection is ok\n"); nopoll_conn_wait_until_connection_ready (conn, 5); printf ("Test 04-b: sending was quick as possible to flood local buffers..\n"); /* get message length */ length = strlen (msg); iterator = 0; while (iterator < 100) { /* send a message */ if (nopoll_conn_send_text (conn, msg, length) != length) { if (errno == 0) { printf ("ERROR: expected to find errno value but found 0..\n"); } printf ("Test 04-b: found expected error, checking errno=%d..\n", errno); break; } /* end if */ /* next iterator */ iterator ++; } /* end while */ if (errno != NOPOLL_EWOULDBLOCK && errno != EINPROGRESS) { printf ("ERROR: expected to find errno=%d, but found errno=%d : %s\n", (int)NOPOLL_EWOULDBLOCK, (int)errno, strerror (errno)); return nopoll_false; } /* end if */ /* write pending content */ if (nopoll_conn_pending_write_bytes (conn) == 0) { printf ("ERROR: expected to have pending bytes to be written.. but found 0..\n"); return nopoll_false; } /* end if */ iterator = 0; while (iterator < 10) { printf ("Test 04-b: found pending write bytes=%d\n", nopoll_conn_pending_write_bytes (conn)); /* call to flush bytes */ nopoll_conn_complete_pending_write (conn); if (nopoll_conn_pending_write_bytes (conn) == 0) { printf ("Test 04-b: all bytes written..\n"); break; } /* end if */ /* sleep a bit */ nopoll_sleep (1000000); /* next iterator */ iterator++; } if (nopoll_conn_pending_write_bytes (conn) != 0) { printf ("Test 04-b: expected to find no pending bytes waiting to be written but found: %d\n", nopoll_conn_pending_write_bytes (conn)); return nopoll_false; } /* end if */ nopoll_conn_close (conn); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } printf ("Test 04-b: waiting until connection is ok\n"); nopoll_conn_wait_until_connection_ready (conn, 5); /* send a cleanup message */ bytes_written = nopoll_conn_send_text (conn, "release-message", 15); if (bytes_written != 15) { printf ("Test 04-b: unable to send release message, bytes_written=%d, but expected=%d..\n", bytes_written, 15); return nopoll_false; } /* end if */ printf ("Test 04-b: waiting a second before finishing test..\n"); nopoll_sleep (1000000); /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } //nopoll_bool test_04c (void) { // noPollCtx * ctx; // noPollConn * conn; // int length; // int bytes_written; // char buffer[4096]; // FILE * handle; // struct stat file_info; // int iterator; // char * cmd; // const char * file_checked; // const char * cmd_format; // int total_bytes = 0; // nopoll_bool flush_required = nopoll_false; // // /* reinit again */ // ctx = create_ctx (); // // /* call to create a connection */ // conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); // if (! nopoll_conn_is_ok (conn)) { // printf ("ERROR: Expected to find proper client connection status, but found error..\n"); // return nopoll_false; // } // // printf ("Test 04-c: waiting until connection is ok\n"); // nopoll_conn_wait_until_connection_ready (conn, 5); // // /* remove local file */ // if (stat ("copy-test-04c.txt", &file_info) == 0) { // printf ("Test 04-c: FILE exists, removing (copy-test-04c.txt)\n"); // /* remove file */ // unlink ("copy-test-04c.txt"); // } /* end if */ // // /* open file descriptor */ // bytes_written = nopoll_conn_send_text (conn, "open-file: copy-test-04c.txt", 28); // if (bytes_written != 28) { // printf ("Test 04-c: unable to send open file command, bytes_written=%d, but expected=%d..\n", // bytes_written, 15); // return nopoll_false; // } /* end if */ // // /* open the handle to send the content */ // file_checked = "/boot/vmlinuz-2.6.32-5-amd64"; //#if defined(NOPOLL_OS_WIN32) // handle = fopen (file_checked, "rb"); //#else // handle = fopen (file_checked, "r"); //#endif // if (handle == NULL) { // /* checking file */ // file_checked = "nopoll-regression-client.c"; //#if defined(NOPOLL_OS_WIN32) // handle = fopen (file_checked, "rb"); //#else // handle = fopen (file_checked, "r"); //#endif // if (handle == NULL) { // printf ("Test 04-c: failed to open file to be sent to the server..\n"); // return nopoll_false; // } /* end if */ // } /* end if */ // printf ("Test 04-c: running test with file: %s\n", file_checked); // // /* send content */ // while (nopoll_true) { // /* read content */ // length = fread (buffer, 1, 4096, handle); // // /* write content */ // if (length > 0) { // bytes_written = nopoll_conn_send_text (conn, buffer, length); // // /* check for flush required */ // if (nopoll_conn_pending_write_bytes (conn) > 0) // flush_required = nopoll_true; // // /* call to flush writes */ // bytes_written = nopoll_conn_flush_writes (conn, 10000000, bytes_written); // // if (bytes_written != length) { // printf ("ERROR: Failed to send bytes read from file %d, bytes written were=%d (errno=%d, pending bytes: %d, total bytes: %d)..\n", // length, bytes_written, errno, nopoll_conn_pending_write_bytes (conn), total_bytes); // return nopoll_false; // } /* end if */ // } /* end if */ // // if (bytes_written > 0) // total_bytes += bytes_written; // // if (length < 4096) { // printf ("Test 04-c: last read operation found length=%d\n", length); // break; // } /* end if */ // } /* end while */ // // fclose (handle); // // printf ("Test 04-c: pending bytes to be written are=%d\n", nopoll_conn_pending_write_bytes (conn)); // // /* send command to close file */ // bytes_written = nopoll_conn_send_text (conn, "close-file", 10); // if (bytes_written != 10) { // printf ("Test 04-c: unable to send close file command\n"); // return nopoll_false; // } /* end if */ // //#if defined(NOPOLL_OS_WIN32) // cmd_format = "diff -q copy-test-04c.txt %s"; //#else // cmd_format = "diff -q copy-test-04c.txt %s > /dev/null"; //#endif // cmd = nopoll_strdup_printf (cmd_format, file_checked); // // iterator = 0; // while (iterator < 50) { // /* checking file transferred */ // printf ("Test 04-c: checking file transfered, iterator=%d..\n", iterator); // if (system (cmd) == 0) // break; // // iterator++; // nopoll_sleep (500000); // } /* end if */ // // if (system (cmd) != 0) { // printf ("Test 04-c: file differs, test failing, run: diff copy-test-04c.txt %s\n", file_checked); // return nopoll_false; // } /* end if */ // // /* check total size */ // if (stat ("copy-test-04c.txt", &file_info) == 0 && file_info.st_size != total_bytes) { // printf ("Test 04-c: expected to find same total bytes written %d != %d\n", // (int) file_info.st_size, (int) total_bytes); // return nopoll_false; // } /* end if */ // // if (stat (file_checked, &file_info) == 0 && file_info.st_size != total_bytes) { // printf ("Test 04-c: expected to find same total bytes written %d != %d\n", // (int) file_info.st_size, (int) total_bytes); // return nopoll_false; // } /* end if */ // // printf ("Test 04-c: file ok (%d bytes written)..\n", total_bytes); // nopoll_free (cmd); // // if (! flush_required) { // printf (" *** \n"); // printf (" *** \n"); // printf (" *** ATTENTION: !! Flush operations weren't required so this test didn't check everything (file used to check transfers was: %s) \n", // file_checked); // printf (" *** \n"); // printf (" *** \n"); // } // // /* sleep half a second */ // nopoll_sleep (500000); // // /* finish connection */ // nopoll_conn_close (conn); // // /* finish */ // nopoll_ctx_unref (ctx); // // return nopoll_true; //} nopoll_bool test_05 (void) { noPollCtx * ctx; noPollConn * conn; char buffer[1024]; int bytes_read; const char * msg = " klasdfkla akldfj klafklajetqkljt kjlwergklwejry90246tkgwr kñljwrglkjdfg lksdjglskg slkg camión adsfasdf pruébasdfad España asdfaklsjdflk jasfkjaslfjetql tjñqgkjadgklj aglkjalk jafkjaslfkjaskj asjaslfkjasfklajg klajefñlqkjetrlkqj lqkj ñlskdfjañlk asldfjñlafj añlfj ñdfjkjt4ñqlkjt lkj34tlkjañlgjañlkgjañlkgjw"; memset (buffer, 0, 1024); /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } printf ("Test 05: sending UTF-8 content..\n"); /* send content text(utf-8) */ if (nopoll_conn_send_text (conn, msg, -1) <= 0) { printf ("ERROR: Expected to find proper send operation (nopoll_conn_send_test) returned less or 0..\n"); return nopoll_false; } /* wait for the reply (try to read 322, blocking and with a 3 seconds timeout) */ bytes_read = nopoll_conn_read (conn, buffer, 322, nopoll_true, 3000); if (bytes_read != 322) { printf ("ERROR: expected to receive 322 bytes, but received %d\n", bytes_read); return nopoll_false; } if (! nopoll_ncmp (buffer, msg, 322)) { printf ("ERROR: expected to receive another content....\n"); printf ("Expected: %s\n", msg); printf ("Received: %s\n", buffer); return nopoll_false; } /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_06 (void) { noPollCtx * ctx; noPollConn * conn; noPollConnOpts * opts; /* reinit again */ ctx = create_ctx (); /* disable verification */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false); /* call to create a connection */ conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, local_host_url, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* check if the connection already finished its connection handshake */ while (! nopoll_conn_is_ready (conn)) { if (! nopoll_conn_is_ok (conn)) { printf ("ERROR (4.1 jg72): expected to find proper connection handshake finished, but found connection is broken: session=%d, errno=%d : %s..\n", (int) nopoll_conn_socket (conn), errno, strerror (errno)); return nopoll_false; } /* end if */ /* wait a bit 10ms */ nopoll_sleep (100); } /* end if */ if (! nopoll_conn_is_tls_on (conn)) { printf ("ERROR (5): expected to find TLS enabled on the connection but found it isn't..\n"); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_07 (void) { noPollCtx * ctx; noPollConn * conn; noPollConnOpts * opts; /* reinit again */ ctx = create_ctx (); /* disable verification */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false); /* call to create a connection */ conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* end if */ /* check if the connection already finished its connection handshake */ while (! nopoll_conn_is_ready (conn)) { if (! nopoll_conn_is_ok (conn)) { printf ("ERROR (4.1 dk45): expected to find proper connection handshake finished, but found connection is broken: session=%d, errno=%d : %s..\n", (int) nopoll_conn_socket (conn), errno, strerror (errno)); return nopoll_false; } /* end if */ /* wait a bit 10ms */ nopoll_sleep (10000); } /* end if */ printf ("Test 07: testing sending TLS content over the wire..\n"); if (! test_sending_and_check_echo (conn, "Test 07", "This is a test")) return nopoll_false; /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_08 (void) { noPollCtx * ctx; noPollConn * conn; /* reinit again */ ctx = create_ctx (); /* call to connect to TLS port expecting non-TLS protocol */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); /* wait a bit 100ms */ nopoll_sleep (100000); if (nopoll_conn_is_ready (conn)) { printf ("ERROR: Expected a FAILING connection status, but found error..\n"); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_09 (void) { noPollCtx * ctx; noPollConn * conn; /* reinit again */ ctx = create_ctx (); /* setup the protocol version to see how it breaks (it should) */ nopoll_ctx_set_protocol_version (ctx, 12); /* call to connect to TLS port expecting non-TLS protocol */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); /* wait a bit 100ms */ nopoll_sleep (100000); if (nopoll_conn_is_ready (conn)) { printf ("ERROR: Expected a FAILING connection status due to protocol version error, but it working..\n"); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_10 (void) { noPollCtx * ctx; noPollConn * conn; /* reinit again */ ctx = create_ctx (); /* call to connect from an origining that shouldn't be allowed */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, "http://deny.aspl.es"); /* wait a bit 100ms */ nopoll_sleep (100000); if (nopoll_conn_is_ready (conn)) { printf ("ERROR: Expected a FAILING connection status due to origing denied, but it working..\n"); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_11 (void) { noPollCtx * ctx; noPollConn * conn; /* reinit again */ ctx = create_ctx (); /* create a working connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_wait_until_connection_ready (conn, 5)) { printf ("ERROR: Expected a FAILING connection status due to origing denied, but it working..\n"); return nopoll_false; } /* end if */ /* finish */ nopoll_ctx_unref (ctx); /* finish connection */ nopoll_conn_close (conn); return nopoll_true; } nopoll_bool test_12 (void) { noPollCtx * ctx; noPollConn * conn; int iterator; /* time tracking */ struct timeval start; struct timeval stop; struct timeval diff; /* reinit again */ ctx = create_ctx (); /* start */ #if defined(NOPOLL_OS_WIN32) nopoll_win32_gettimeofday (&start, NULL); #else gettimeofday (&start, NULL); #endif printf ("Test 12: creating 1000 connections...\n"); iterator = 0; while (iterator < 1000) { /* create a working connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_wait_until_connection_ready (conn, 5)) { printf ("ERROR: Expected NOT to find a FAILING connection status, errno is=%d..\n", errno); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); iterator++; } /* end while */ /* finish */ nopoll_ctx_unref (ctx); /* stop */ #if defined(NOPOLL_OS_UNIX) gettimeofday (&stop, NULL); #else nopoll_win32_gettimeofday (&stop, NULL); #endif nopoll_timeval_substract (&stop, &start, &diff); printf ("Test 12: created %d connections in %ld.%ld secs\n", iterator, diff.tv_sec, diff.tv_usec); return nopoll_true; } nopoll_bool test_13_test (noPollCtx * ctx, const char * serverName, const char * _certificateFile, const char * _privateKey) { const char * certificateFile; const char * privateKey; if (! nopoll_ctx_find_certificate (ctx, serverName, NULL, NULL, NULL)) { printf ("Test 13: it SHOULD find something about found.server.com but function reported failure status..\n"); return nopoll_false; } if (! nopoll_ctx_find_certificate (ctx, serverName, &certificateFile, &privateKey, NULL)) { printf ("Test 13: it SHOULD find something about found.server.com but function reported failure status..\n"); return nopoll_false; } if (! nopoll_cmp (certificateFile, _certificateFile)) { printf ("Test 13: expected to find certificate %s, but found %s\n", _certificateFile, certificateFile); return nopoll_false; } if (! nopoll_cmp (privateKey, _privateKey)) { printf ("Test 13: expected to find certificate %s, but found %s\n", _privateKey, privateKey); return nopoll_false; } return nopoll_true; } nopoll_bool test_13 (void) { noPollCtx * ctx; /* create ctx */ ctx = nopoll_ctx_new (); if (nopoll_ctx_find_certificate (ctx, "not-found", NULL, NULL, NULL)) { printf ("Test 13: it shouldn't find anything but function reported ok status..\n"); return nopoll_false; } /* register */ if (! nopoll_ctx_set_certificate (ctx, "found.server.com", "test.crt", "test.key", NULL)) { printf ("Test 13: unable to install certificate...\n"); return nopoll_false; } /* end if */ if (! test_13_test (ctx, "found.server.com", "test.crt", "test.key")) return nopoll_false; /* register */ if (! nopoll_ctx_set_certificate (ctx, "another.server.com", "another.test.crt", "another.test.key", NULL)) { printf ("Test 13: unable to install certificate (another.server.com)...\n"); return nopoll_false; } /* end if */ if (! test_13_test (ctx, "found.server.com", "test.crt", "test.key")) return nopoll_false; if (! test_13_test (ctx, "another.server.com", "another.test.crt", "another.test.key")) return nopoll_false; /* register */ if (! nopoll_ctx_set_certificate (ctx, "other.server.com", "other.test.crt", "other.test.key", NULL)) { printf ("Test 13: unable to install certificate (another.server.com)...\n"); return nopoll_false; } /* end if */ if (! test_13_test (ctx, "found.server.com", "test.crt", "test.key")) return nopoll_false; if (! test_13_test (ctx, "another.server.com", "another.test.crt", "another.test.key")) return nopoll_false; if (! test_13_test (ctx, "other.server.com", "other.test.crt", "other.test.key")) return nopoll_false; /* release ctx */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_14 (void) { noPollCtx * ctx; noPollConn * conn; noPollMsg * msg; int iter; /* create context */ ctx = create_ctx (); /* check connections registered */ if (nopoll_ctx_conns (ctx) != 0) { printf ("ERROR: expected to find 0 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); return nopoll_false; } /* end if */ nopoll_ctx_unref (ctx); /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } printf ("Test 14: sending partial frames (Hel..)..\n"); if (nopoll_conn_send_text_fragment (conn, "Hel", 3) != 3) { printf ("ERROR: expected to be able to send Hel frame..\n"); return nopoll_false; } printf ("Test 14: sending completing frame (..lo)..\n"); if (nopoll_conn_send_text (conn, "lo", 2) != 2) { printf ("ERROR: expected to be able to send lo completion frame..\n"); return nopoll_false; } /* wait for the reply */ iter = 0; while ((msg = nopoll_conn_get_msg (conn)) == NULL) { if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: received websocket connection close during wait reply..\n"); return nopoll_false; } nopoll_sleep (10000); if (iter > 10) break; } /* end if */ /* check content received */ if (! nopoll_cmp ((char*) nopoll_msg_get_payload (msg), "Hello")) { printf ("ERROR: expected to find message 'This is a test' but something different was received: '%s'..\n", (const char *) nopoll_msg_get_payload (msg)); return nopoll_false; } /* end if */ /* unref message */ nopoll_msg_unref (msg); /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_15 (void) { noPollCtx * ctx; noPollConn * conn; /* create context */ ctx = create_ctx (); /* check connections registered */ if (nopoll_ctx_conns (ctx) != 0) { printf ("ERROR: expected to find 0 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); return nopoll_false; } /* end if */ nopoll_ctx_unref (ctx); /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* wait for the reply */ while (nopoll_true) { if (nopoll_conn_is_ready (conn)) break; printf ("Test 15: not ready yet..\n"); nopoll_sleep (10000); } /* end if */ printf ("Test 15: setting non-blocking state..\n"); if (! nopoll_conn_set_sock_block (nopoll_conn_socket (conn), nopoll_false)) { printf ("ERROR: failed to configure non-blocking state to connection..\n"); return nopoll_false; } /* end if */ printf ("Test 15: attempting to read content..\n"); /* wait for the reply */ if (nopoll_conn_get_msg (conn)) { printf ("ERROR (1): expected to not be able to find a message..\n"); return nopoll_false; } if (nopoll_conn_get_msg (conn)) { printf ("ERROR (2): expected to not be able to find a message..\n"); return nopoll_false; } if (nopoll_conn_get_msg (conn)) { printf ("ERROR (3): expected to not be able to find a message..\n"); return nopoll_false; } printf ("Test 15: reads finished..\n"); /* check connection state */ if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: expected to find connection state ok, but failure found..\n"); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_16 (void) { noPollCtx * ctx; noPollConn * conn; int iterator; /* create context */ ctx = create_ctx (); /* check connections registered */ if (nopoll_ctx_conns (ctx) != 0) { printf ("ERROR: expected to find 0 registered connections but found: %d\n", nopoll_ctx_conns (ctx)); return nopoll_false; } /* end if */ nopoll_ctx_unref (ctx); /* reinit again */ ctx = create_ctx (); /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* wait for the reply */ while (nopoll_true) { if (nopoll_conn_is_ready (conn)) break; printf ("Test 16: not ready yet..\n"); nopoll_sleep (10000); } /* end if */ iterator = 0; while (iterator < 10) { printf ("Test 16: send sleep in header content (waiting 1000 ms, iterator=%d)..\n", iterator); if (__nopoll_conn_send_common (conn, "This is a test", 14, nopoll_true, 400000, NOPOLL_TEXT_FRAME) != 14) { printf ("ERROR: failed to send content..\n"); return nopoll_false; } /* end if */ iterator++; } /* end while */ printf ("Test 16: sends finished, now checking connection ..\n"); nopoll_sleep (100000); /* check connection state */ if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: expected to find connection state ok, but failure found..\n"); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_17_send_and_receive_test (noPollCtx * ctx, noPollConn * conn, noPollConn * listener, const char * message, int length, nopoll_bool read_in_the_middle, nopoll_bool read_after_header, nopoll_bool read_after_mask) { char buffer[1024]; char buffer2[1024]; NOPOLL_SOCKET _socket; char mask[4]; int desp; memset (buffer, 0, 1024); /* make it unblock */ nopoll_conn_set_sock_block (nopoll_conn_socket (listener), nopoll_false); /* now send partial content */ printf ("Test 17: sending normal message to test link..\n"); if (nopoll_conn_send_text (conn, message, length) != length) { printf ("ERROR: expected to properly send all bytes but it wasn't possible..\n"); return nopoll_false; } /* end if */ /* read reply */ if (nopoll_conn_read (listener, buffer, length, nopoll_true, 0) != length) { printf ("ERROR: expected read 22 bytes ...but there was a failure..\n"); return nopoll_false; } /* end if */ /* printf ("Test 17: sending partial content..\n"); */ _socket = nopoll_conn_socket (conn); buffer[0] = 129; buffer[1] = 150; send (_socket, buffer, 2, 0); if (read_after_header) { nopoll_sleep (1000000); printf ("Test 17: Reading after header..\n"); nopoll_conn_read (listener, buffer2, length, nopoll_false, 0); } /* send mask */ mask[0] = 23; mask[1] = 24; mask[2] = 25; mask[3] = 26; send (_socket, mask, 4, 0); if (read_after_mask) { nopoll_sleep (1000000); printf ("Test 17: Reading after mask..\n"); nopoll_conn_read (listener, buffer2, length, nopoll_false, 0); } memcpy (buffer, message, length); nopoll_conn_mask_content (ctx, buffer, length, mask, 0); send (_socket, buffer, 10, 0); printf ("Test 17: sent partial content...wait a bit (2 seconds)..\n"); nopoll_sleep (2000000); desp = 0; if (read_in_the_middle) { printf ("Test 17: reading in the middle (10 bytes)\n"); memset (buffer2, 0, 100); desp = nopoll_conn_read (listener, buffer2, length, nopoll_false, 0); if (desp != 10) { printf ("Test 17: failed to read some initial content (10), found %d bytes..\n", desp); return nopoll_false; } /* end if */ printf ("Test 17: read %d bytes..\n", desp); } printf ("Test 17: now send the rest..\n"); send (_socket, buffer + 10, length - 10, 0); /* copy content into original buffer */ if (read_in_the_middle) memcpy (buffer, buffer2, desp); printf ("Test 17: now read the content received..\n"); /* now read the content */ if (nopoll_conn_read (listener, buffer + desp, length - desp, nopoll_true, 0) != (length - desp)) { printf ("ERROR: expected to receive 22 bytes but found something different..\n"); return nopoll_false; } /* end if */ if (! nopoll_ncmp (buffer, message, length)) { printf ("ERROR: expected to receive test message but found: '%s'\n", buffer); return nopoll_false; } return nopoll_true; } nopoll_bool test_17 (void) { noPollCtx * ctx; noPollConn * conn; noPollConn * listener, * master; /* reinit again */ ctx = create_ctx (); /* create a listener */ master = nopoll_listener_new (ctx, "0.0.0.0", "22351"); printf ("Test 17: created master listener (conn-id=%d, status=%d)\n", nopoll_conn_get_id (master), nopoll_conn_is_ok (master)); if (! nopoll_conn_is_ok (master)) { printf ("ERROR: expected proper master listener at 0.0.0.0:2235 creation but a failure was found..\n"); return nopoll_false; } /* end if */ /* call to create a connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* end if */ /* wait for the reply */ printf ("Test 17: accepting listener..\n"); listener = nopoll_conn_accept (ctx, master); if (! nopoll_conn_is_ok (listener)) { printf ("ERROR: expected to find proper listener status (connection accepted), but found failure..\n"); return nopoll_false; } /* end if */ /** call test here **/ if (! test_17_send_and_receive_test (ctx, conn, listener, "This is a test message", 22, /* read in the middle */ nopoll_false, /* read after the header */ nopoll_false, /* read after the mask */ nopoll_false)) return nopoll_false; /** call test here **/ if (! test_17_send_and_receive_test (ctx, conn, listener, "This is a test message", 22, /* read in the middle */ nopoll_true, /* read after the header */ nopoll_false, /* read after the mask */ nopoll_false)) return nopoll_false; /** call test here **/ if (! test_17_send_and_receive_test (ctx, conn, listener, "This is a test message", 22, /* read in the middle */ nopoll_false, /* read after the header */ nopoll_true, /* read after the mask */ nopoll_false)) return nopoll_false; /** call test here **/ if (! test_17_send_and_receive_test (ctx, conn, listener, "This is a test message", 22, /* read in the middle */ nopoll_false, /* read after the header */ nopoll_false, /* read after the mask */ nopoll_true)) return nopoll_false; printf ("Test 17: closing connections..\n"); nopoll_conn_close (listener); nopoll_conn_close (master); nopoll_conn_close (conn); printf ("Test 17: finishing context..\n"); /* finish */ nopoll_ctx_unref (ctx); /* report finish */ return nopoll_true; } nopoll_bool test_18 (void) { noPollCtx * ctx; noPollConn * conn; noPollConnOpts * opts; /* reinit again */ ctx = create_ctx (); /* disable verification */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false); /* call to create a connection */ conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } printf ("Test 18: waiting on nopoll_loop_wait (1 seconds)...\n"); nopoll_loop_wait (ctx, 1); printf ("Test 18: waiting on nopoll_loop_wait (1 seconds)...\n"); nopoll_loop_wait (ctx, 1); /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); /* report finish */ return nopoll_true; } nopoll_bool test_19 (void) { noPollCtx * ctx; noPollConn * conn; noPollConnOpts * opts; /* reinit again */ ctx = create_ctx (); printf ("Test 19: testing SSLv23 connection...\n"); /* create options */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_SSLV23); /* create connection */ conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); /* check connection */ if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: failed to start listener connection..\n"); return nopoll_false; } /* end if */ if (! test_sending_and_check_echo (conn, "Test 19", "This is a test...checking SSL with different values...")) return nopoll_false; /* finish connection */ nopoll_conn_close (conn); printf ("Test 19: testing SSLv23 connection with TLSv1 server...\n"); /* create options */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_SSLV23); /* create connection */ conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); /* check connection */ if (! nopoll_conn_is_ok (conn)) { printf ("WARNING: failed to create connection (2)..unable to connect to TLSv1 server with NOPOLL_METHOD_SSLV23\n"); } else { if (! test_sending_and_check_echo (conn, "Test 19", "This is a test...checking SSL with different values...")) return nopoll_false; } /* end if */ nopoll_conn_close (conn); printf ("Test 19: perfect, got it working..\n"); /* create options */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_SSLV3); /* create connection */ printf ("Test 19: checking SSLv3 with TLSv1..\n"); conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); /* check connection */ if (nopoll_conn_is_ok (conn)) { printf ("ERROR: expected a connection failure..\n"); return nopoll_false; } /* end if */ printf (" ... it does not work, but this is expected..\n"); nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); /* report finish */ return nopoll_true; } #if defined(__NOPOLL_PTHREAD_SUPPORT__) nopoll_bool test_20 (void) { noPollPtr * mutex; int iterator = 0; while (iterator < 10) { /* call to create mutex */ mutex = __nopoll_regtest_mutex_create (); if (mutex == NULL) return nopoll_false; /* call to lock */ __nopoll_regtest_mutex_lock (mutex); __nopoll_regtest_mutex_unlock (mutex); /* call to destroy */ __nopoll_regtest_mutex_destroy (mutex); /* next operation */ iterator++; } return nopoll_true; } #endif /* * Use gen-certificates-test-21.sh to rebuild certificates. * Reg test to check client auth certificate. */ nopoll_bool test_21 (void) { noPollCtx * ctx; noPollConn * conn; noPollConnOpts * opts; /* reinit again */ ctx = create_ctx (); /* call to create a connection */ printf ("Test 21: check ssl connection (with auth certificate)..\n"); conn = nopoll_conn_tls_new (ctx, NULL, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); if (nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to FAILURE client connection status, but ok..\n"); return nopoll_false; } nopoll_conn_close (conn); /* try again configuring conection certificates */ printf ("Test 21: checking to connect again with client provided certificates..\n"); opts = nopoll_conn_opts_new (); nopoll_conn_opts_set_ssl_certs (opts, /* certificate */ "client.pem", /* private key */ "client.pem", NULL, /* ca certificate */ "root.pem"); conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); if (! test_sending_and_check_echo (conn, "Test 21", "This is a test")) { printf ("ERROR: it should WORK, client certificate isn't working..\n"); return nopoll_false; } /* end if */ /* finish connection */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool __test_22_on_close_signal = nopoll_false; void __test_22_on_close (noPollCtx * ctx, noPollConn * conn, noPollPtr user_data) { printf ("Test --: called on connection close for conn-id=%d\n", nopoll_conn_get_id (conn)); __test_22_on_close_signal = nopoll_true; return; } nopoll_bool test_22 (void) { noPollCtx * ctx; noPollConn * conn; NOPOLL_SOCKET _socket; noPollMsg * msg; noPollConnOpts * opts; printf ("Test 22: testing connection close notification for regular connections (client side)..\n"); /* init context */ ctx = create_ctx (); /* create connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* set connection close */ nopoll_conn_set_on_close (conn, __test_22_on_close, NULL); /* call to close connection as we had lost the connection */ _socket = nopoll_conn_socket (conn); nopoll_close_socket (_socket); /* call to get content (we shouldn't get anythign) */ msg = nopoll_conn_get_msg (conn); if (msg) { printf ("ERROR: we shouldn't get a msg frame, but a well defined pointer was found..\n"); return nopoll_false; } /* end if */ if (nopoll_conn_is_ok (conn)) { printf ("ERROR: we shouldn't get an ok value from nopoll_conn_is_ok (conn)..\n"); return nopoll_false; } /* end if */ if (! __test_22_on_close_signal) { printf ("ERROR: connection close should've been called but it wasn't..\n"); return nopoll_false; } /* end if */ /* close the connection */ nopoll_conn_close (conn); __test_22_on_close_signal = nopoll_false; printf ("Test 22: test close connection close notification for WSS:// (ssl connections), (client side)..\n"); /* disable verification */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false); /* call to create a connection */ conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* set connection close */ nopoll_conn_set_on_close (conn, __test_22_on_close, NULL); /* call to close connection as we had lost the connection */ _socket = nopoll_conn_socket (conn); nopoll_close_socket (_socket); /* call to get content (we shouldn't get anythign) */ msg = nopoll_conn_get_msg (conn); if (msg) { printf ("ERROR: we shouldn't get a msg frame, but a well defined pointer was found..\n"); return nopoll_false; } /* end if */ if (nopoll_conn_is_ok (conn)) { printf ("ERROR: we shouldn't get an ok value from nopoll_conn_is_ok (conn)..\n"); return nopoll_false; } /* end if */ if (! __test_22_on_close_signal) { printf ("ERROR: connection close should've been called but it wasn't..\n"); return nopoll_false; } /* end if */ /* close the connection */ nopoll_conn_close (conn); nopoll_ctx_unref (ctx); return nopoll_true; } /* end if */ int test_23_get_connection_close_count (noPollCtx * ctx, noPollConn * conn) { int count_before_closing; noPollMsg * msg; /* wait for the reply */ while (nopoll_true) { if (nopoll_conn_is_ready (conn)) break; nopoll_sleep (10000); } /* end if */ /* send package to get number of connection close detected */ if (nopoll_conn_send_text (conn, "get-connection-close-count", 26) != 26) { printf ("ERROR: Expected to find proper send operation..\n"); return nopoll_false; } /* call to get content (we shouldn't get anythign) */ while (nopoll_true) { msg = nopoll_conn_get_msg (conn); if (msg) break; nopoll_sleep (10000); } /* end if */ count_before_closing = strtol ((const char *) nopoll_msg_get_payload (msg), NULL, 10); printf ("Test 23: Message received: %d..\n", count_before_closing); /* release message */ nopoll_msg_unref (msg); return count_before_closing; } nopoll_bool test_23 (void) { noPollCtx * ctx; noPollConn * conn; int count_before_closing; int count_before_closing2; noPollConnOpts * opts; printf ("Test 23: testing connection close notification for regular connections (client side)..\n"); /* init context */ ctx = create_ctx (); /* create connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* get connection close before closing */ if ((count_before_closing = test_23_get_connection_close_count (ctx, conn)) == -1) return nopoll_false; printf ("Test 23: current connection close is: %d\n", count_before_closing); /* close the connection cleanly and check connection close is not called */ nopoll_conn_close (conn); /* create connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } if ((count_before_closing2 = test_23_get_connection_close_count (ctx, conn)) == -1) return nopoll_false; printf ("Test 23: current connection close is: %d\n", count_before_closing2); if (count_before_closing == count_before_closing2) { printf ("ERROR: expected connection close notification ...but same values were found..\n"); return nopoll_false; } /* end if */ /* close the connection cleanly and check connection close is not called */ nopoll_conn_close (conn); printf ("Test 23: now test TLS connections connection close..\n"); /* disable verification */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false); /* call to create a connection */ conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* get connection close before closing */ if ((count_before_closing = test_23_get_connection_close_count (ctx, conn)) == -1) return nopoll_false; /* close the connection */ nopoll_conn_close (conn); /* call to create a connection second connection */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false); conn = nopoll_conn_tls_new (ctx, opts, local_host_name, local_host_ports, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } if ((count_before_closing2 = test_23_get_connection_close_count (ctx, conn)) == -1) return nopoll_false; /* close the connection */ nopoll_conn_close (conn); if (count_before_closing == count_before_closing2) { printf ("ERROR: expected connection close notification ...but same values were found..\n"); return nopoll_false; } /* end if */ nopoll_ctx_unref (ctx); return nopoll_true; } /* end if */ nopoll_bool test_24 (void) { noPollCtx * ctx; noPollConn * conn; noPollConnOpts * opts; noPollMsg * msg; printf ("Test 24: test cookie support (set client and receive on server..)\n"); /* init context */ ctx = create_ctx (); /* configure cookie */ opts = nopoll_conn_opts_new (); nopoll_conn_opts_set_cookie (opts, "theme=light; sessionToken=abc123"); /* create connection */ conn = nopoll_conn_new_opts (ctx, opts, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* send package to get number of connection close detected */ if (nopoll_conn_send_text (conn, "get-cookie", 10) != 10) { printf ("ERROR: Expected to find proper send operation..\n"); return nopoll_false; } /* call to get content (we shouldn't get anythign) */ while (nopoll_true) { msg = nopoll_conn_get_msg (conn); if (msg) break; if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: connection failure found during message wait..\n"); return nopoll_false; } nopoll_sleep (10000); } /* end if */ printf ("Test 24: received header set on server side: %s\n", nopoll_msg_get_payload (msg)); if (! nopoll_cmp ((const char *) nopoll_msg_get_payload (msg), "theme=light; sessionToken=abc123")) { printf ("ERROR: expected to receive different header, error was: %s\n", nopoll_msg_get_payload (msg)); return nopoll_false; } /* release message */ nopoll_msg_unref (msg); /* close the connection */ nopoll_conn_close (conn); nopoll_ctx_unref (ctx); return nopoll_true; } /* end if */ nopoll_bool test_25_check_cookie (noPollCtx * ctx, const char * cookie) { noPollConn * conn; noPollConnOpts * opts; /* configure cookie */ opts = nopoll_conn_opts_new (); /* set a cookie bigger than 1044 */ nopoll_conn_opts_set_cookie (opts, cookie); /* create connection */ conn = nopoll_conn_new_opts (ctx, opts, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* close the connection */ nopoll_conn_close (conn); return nopoll_true; } nopoll_bool test_25 (void) { noPollCtx * ctx; printf ("Test 25: test cookie support (set client and receive on server..)\n"); /* init context */ ctx = create_ctx (); if (! test_25_check_cookie (ctx, "theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b theme=light; sessionToken=abc123 lkjsadfkljasdf lkjaseflkawjet klajw glkajy240u 4234lkj y3j 3q5yñkl aegar glkejry b ")) return nopoll_false; if (! test_25_check_cookie (ctx, "222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444asd35555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555affffffffff-23345")) return nopoll_false; if (! test_25_check_cookie (ctx, "222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444asd35555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555affffffffff-233")) return nopoll_false; if (! test_25_check_cookie (ctx, "222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444asd35555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555afffffff")) return nopoll_false; if (! test_25_check_cookie (ctx, "22222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444222222222222222222222211111111111111111111111133333333333333333333333334444444444444444444444444asd35555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555afffffff")) return nopoll_false; nopoll_ctx_unref (ctx); return nopoll_true; } /* end if */ nopoll_bool test_26 (void) { noPollConn * conn; noPollCtx * ctx; /* init context */ ctx = create_ctx (); /* create connection */ conn = nopoll_conn_new (ctx, "echo.websocket.org", "80", NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* end if */ /* check test */ if (! test_sending_and_check_echo (conn, "Test 26", "This is a test")) return nopoll_false; /* close the connection */ nopoll_conn_close (conn); /* release context */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_27 (void) { noPollConn * conn; noPollCtx * ctx; /* init context */ ctx = create_ctx (); /* create connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, "/", "chat-protocol", "http://www.aspl.es"); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* end if */ /* check test */ if (! test_sending_and_check_echo (conn, "Test 27", "This is a test")) return nopoll_false; /* check accepted protocol */ if (! nopoll_cmp ("chat-protocol", nopoll_conn_get_accepted_protocol (conn))) { printf ("ERROR: expected to find [chat-protocol] but found something: %s\n", nopoll_conn_get_accepted_protocol (conn)); return nopoll_false; } /* end if */ printf ("Test 27: accepted protocol by the server: %s\n", nopoll_conn_get_accepted_protocol (conn)); /* close the connection */ nopoll_conn_close (conn); /* create connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, "/", "hello-protocol", "http://www.aspl.es"); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* end if */ /* check test */ if (! test_sending_and_check_echo (conn, "Test 27", "This is a test")) return nopoll_false; /* check accepted protocol */ if (! nopoll_cmp ("hello-protocol-response", nopoll_conn_get_accepted_protocol (conn))) { printf ("ERROR: expected to find [chat-protocol] but found something: %s\n", nopoll_conn_get_accepted_protocol (conn)); return nopoll_false; } /* end if */ printf ("Test 27: accepted protocol by the server: %s\n", nopoll_conn_get_accepted_protocol (conn)); /* close the connection */ nopoll_conn_close (conn); /* release context */ nopoll_ctx_unref (ctx); return nopoll_true; } nopoll_bool test_28 (void) { noPollConn * conn; noPollCtx * ctx; noPollMsg * msg; /* init context */ ctx = create_ctx (); /* create connection */ conn = nopoll_conn_new (ctx, local_host_name, local_host_port, NULL, NULL, NULL, NULL); if (! nopoll_conn_is_ok (conn)) { printf ("ERROR: Expected to find proper client connection status, but found error..\n"); return nopoll_false; } /* end if */ /* wait until it is connected */ nopoll_conn_wait_until_connection_ready (conn, 5); /* send a message to request connection close with a particular message */ if (nopoll_conn_send_text (conn, "close with message", 18) != 18) { printf ("ERROR: failed to send close with message.."); return nopoll_false; } /* end while */ /* wait for the reply */ while ((msg = nopoll_conn_get_msg (conn)) == NULL) { if (! nopoll_conn_is_ok (conn)) { /* connection was closed by remote side */ break; } /* end if */ nopoll_sleep (10000); } /* end if */ printf ("Test 28: close reason received, statud=%d, message=%s\n", nopoll_conn_get_close_status (conn), nopoll_conn_get_close_reason (conn)); if (nopoll_conn_get_close_status (conn) != 1048) { printf ("ERROR: expected different error code..\n"); return nopoll_false; } if (! nopoll_cmp (nopoll_conn_get_close_reason (conn), "Hey, this is a very reasonable error message")) { printf ("ERROR: expected different error message..\n"); return nopoll_false; } /* end if */ /* close connection */ nopoll_conn_close (conn); /* release context */ nopoll_ctx_unref (ctx); return nopoll_true; } LOCAL int websocket_main (char *argv) { int iterator = *argv; printf ("** NoPoll: Websocket toolkit (regression test).\n"); printf ("** Copyright (C) 2013 Advanced Software Production Line, S.L.\n**\n"); printf ("** To gather information about time performance you can use:\n**\n"); printf ("** >> time ./nopoll-regression-client [--debug,--show-critical-only]\n**\n"); printf ("** To gather information about memory consumed (and leaks) use:\n**\n"); printf ("** >> libtool --mode=execute valgrind --leak-check=yes --error-limit=no ./nopoll-regression-client\n**\n"); printf ("**\n"); printf ("** Report bugs to:\n**\n"); printf ("** noPoll mailing list\n**\n"); switch (iterator) { case 1: if (test_01_strings()) { printf("Test 01-strings: Library strings support [ OK ]\n"); } else { printf("Test 01-strings: Library strings support [ FAILED ]\n"); // return -1; } break; case 2: if (test_02()) { printf("Test 02: Simple request/reply [ OK ]\n"); } else { printf("Test 02: Simple request/reply [ FAILED ]\n"); // return -1; } break; case 3: /* test streaming api */ if (test_03()) { printf("Test 03: test streaming api [ OK ]\n"); } else { printf("Test 03: test streaming api [ FAILED ]\n"); // return -1; } break; case 4: if (test_04a()) { printf( "Test 04-a: check non-blocking streaming and message based API [ OK ]\n"); } else { printf( "Test 04-a: check non-blocking streaming and message based API [ FAILED ]\n"); // return -1; } if (test_04b()) { printf( "Test 04-b: try to overflow write access and recover from it [ OK ]\n"); } else { printf( "Test 04-b: try to overflow write access and recover from it [ FAILED ]\n"); // return -1; } break; case 5: if (test_05()) { printf("Test 05: sending utf-8 content [ OK ]\n"); } else { printf("Test 05: sending utf-8 content [ FAILED ]\n"); // return -1; } break; case 6: if (test_06()) { printf("Test 06: testing basic TLS connect [ OK ]\n"); } else { printf("Test 06: testing basic TLS connect [ FAILED ]\n"); // return -1; } break; case 7: if (test_07()) { printf("Test 07: testing TLS request/reply [ OK ]\n"); } else { printf("Test 07: testing TLS request/reply [ FAILED ]\n"); // return -1; } break; case 8: if (test_08()) { printf("Test 08: test normal connect to TLS port [ OK ]\n"); } else { printf("Test 08: test normal connect to TLS port [ FAILED ]\n"); // return -1; } break; case 9: if (test_09()) { printf( "Test 09: ensure we only support Sec-WebSocket-Version: 13 [ OK ]\n"); } else { printf( "Test 09: ensure we only support Sec-WebSocket-Version: 13 [ FAILED ]\n"); // return -1; } break; case 10: if (test_10()) { printf( "Test 10: test checking origing in on open and denying it [ OK ]\n"); } else { printf( "Test 10: test checking origing in on open and denying it [ FAILED ]\n"); // return -1; } break; case 11: if (test_11()) { printf("Test 11: release context after connection [ OK ]\n"); } else { printf("Test 11: release context after connection [ FAILED ]\n"); // return -1; } break; case 12: if (test_12()) { printf( "Test 12: create huge amount of connections in a short time [ OK ]\n"); } else { printf( "Test 12: create huge amount of connections in a short time [ FAILED ]\n"); // return -1; } break; case 13: if (test_13()) { printf("Test 13: testing certificate storage [ OK ]\n"); } else { printf("Test 13: testing certificate storage [ FAILED ]\n"); // return -1; } break; case 14: if (test_14()) { printf( "Test 14: testing sending frame with few content as indicated by header [ OK ]\n"); } else { printf( "Test 14: testing sending frame with few content as indicated by header [ FAILED ]\n"); // return -1; } break; case 15: if (test_15()) { printf( "Test 15: checking non-blocking calls to get messages when no content is available [ OK ]\n"); } else { printf( "Test 15: checking non-blocking calls to get messages when no content is available [ FAILED ]\n"); // return -1; } break; case 16: if (test_16()) { printf( "Test 16: check sending frames with sleep in header [ OK ]\n"); } else { printf( "Test 16: check sending frames with sleep in header [ FAILED ]\n"); // return -1; } break; case 17: if (test_17()) { printf("Test 17: check partial frame reception [ OK ]\n"); } else { printf("Test 17: check partial frame reception [ FAILED ]\n"); // return -1; } break; case 18: if (test_18()) { printf( "Test 18: check nopoll_loop_wait (second call) [ OK ]\n"); } else { printf( "Test 18: check nopoll_loop_wait (second call) [ FAILED ]\n"); // return -1; } break; case 19: if (test_19()) { printf( "Test 19: support different SSL methods (SSLv23, SSLv3, TLSv1 [ OK ]\n"); } else { printf( "Test 19: support different SSL methods (SSLv23, SSLv3, TLSv1 [ FAILED ]\n"); // return -1; } break; case 20: #if defined(__NOPOLL_PTHREAD_SUPPORT__) if (test_20 ()) { printf ("Test 20: check mutex support [ OK ]\n"); } else { printf ("Test 20: check mutex support [ FAILED ]\n"); return -1; } #endif break; case 21: if (test_21()) { printf( "Test 21: client side ssl certificates verification [ OK ]\n"); } else { printf( "Test 21: client side ssl certificates verification [ FAILED ]\n"); // return -1; } /* end if */ break; case 22: if (test_22()) { printf( "Test 22: test connection close trigger (client side) [ OK ]\n"); } else { printf( "Test 22: test connection close trigger (client side) [ FAILED ]\n"); // return -1; } /* end if */ break; case 23: if (test_23()) { printf( "Test 23: test connection close trigger (server side) [ OK ]\n"); } else { printf( "Test 23: test connection close trigger (server side) [ FAILED ]\n"); // return -1; } /* end if */ break; case 24: if (test_24()) { printf( "Test 24: check cookie support (client and server side) [ OK ]\n"); } else { printf( "Test 24: check cookie support (client and server side) [ FAILED ]\n"); // return -1; } /* end if */ break; case 25: if (test_25()) { printf("Test 25: check cookie attack [ OK ]\n"); } else { printf("Test 25: check cookie attack [ FAILED ]\n"); // return -1; } /* end if */ break; case 26: if (test_26()) { printf("Test 26: checking echo.websocket.org [ OK ]\n"); } else { printf("Test 26: chekcing echo.websocket.org [ FAILED ]\n"); // return -1; } /* end if */ break; case 27: if (test_27()) { printf("Test 27: checking setting protocol [ OK ]\n"); } else { printf("Test 27: chekcing setting protocol [ FAILED ]\n"); // return -1; } /* end if */ break; case 28: if (test_28()) { printf("Test 28: checking setting protocol [ OK ]\n"); } else { printf("Test 28: chekcing setting protocol [ FAILED ]\n"); // return -1; } /* end if */ break; default: break; } #if 0 iterator = 1; // while (iterator < argc) { /* check for debug */ printf ("Checking agument: %s\n", argv[iterator]); if (nopoll_cmp (argv[iterator], "--debug")) { printf ("Activating debug..\n"); debug = nopoll_true; } /* end if */ if (nopoll_cmp (argv[iterator], "--show-critical-only")) { printf ("Activating reporting of critical messages..\n"); show_critical_only = nopoll_true; } /* end if */ /* next position */ iterator++; // } //printf ("INFO: starting tests with pid: %d\n", getpid ()); if (test_01_strings ()) { printf ("Test 01-strings: Library strings support [ OK ]\n"); } else { printf ("Test 01-strings: Library strings support [ FAILED ]\n"); // return -1; } if (test_01_base64 ()) { printf ("Test 01-bas64: Library bas64 support [ OK ]\n"); }else { printf ("Test 01-bas64: Library bas64 support [ FAILED ]\n"); // return -1; } if (test_01_masking ()) { printf ("Test 01-masking: Library websocket content masking support [ OK ]\n"); }else { printf ("Test 01-masking: Library websocket content masking support [ FAILED ]\n"); // return -1; } if (test_01 ()) { printf ("Test 01: Simple connect and disconnect [ OK ]\n"); }else { printf ("Test 01: Simple connect and disconnect [ FAILED ]\n"); // return -1; } if (test_02 ()) { printf ("Test 02: Simple request/reply [ OK ]\n"); }else { printf ("Test 02: Simple request/reply [ FAILED ]\n"); // return -1; } /* test streaming api */ if (test_03 ()) { printf ("Test 03: test streaming api [ OK ]\n"); }else { printf ("Test 03: test streaming api [ FAILED ]\n"); // return -1; } // if (test_04 (1024)) { // printf ("Test 04: test streaming api (II) [ OK ]\n"); // }else { // printf ("Test 04: test streaming api (II) [ FAILED ]\n"); //// return -1; // } // if (test_04 (512)) { // printf ("Test 04-a: test streaming api (III) [ OK ]\n"); // }else { // printf ("Test 04-a: test streaming api (III) [ FAILED ]\n"); //// return -1; // } // if (test_04 (137)) { // printf ("Test 04-b: test streaming api (IV) [ OK ]\n"); // }else { // printf ("Test 04-b: test streaming api (IV) [ FAILED ]\n"); //// return -1; // } // // if (test_04 (17)) { // printf ("Test 04-c: test streaming api (V) [ OK ]\n"); // }else { // printf ("Test 04-c: test streaming api (V) [ FAILED ]\n"); //// return -1; // } if (test_04a ()) { printf ("Test 04-a: check non-blocking streaming and message based API [ OK ]\n"); } else { printf ("Test 04-a: check non-blocking streaming and message based API [ FAILED ]\n"); // return -1; } if (test_04b ()) { printf ("Test 04-b: try to overflow write access and recover from it [ OK ]\n"); } else { printf ("Test 04-b: try to overflow write access and recover from it [ FAILED ]\n"); // return -1; } // if (test_04c ()) { // printf ("Test 04-c: send a file and try to overflow (but retry) [ OK ]\n"); // } else { // printf ("Test 04-c: send a file and try to overflow (but retry) [ FAILED ]\n"); //// return -1; // } if (test_05 ()) { printf ("Test 05: sending utf-8 content [ OK ]\n"); } else { printf ("Test 05: sending utf-8 content [ FAILED ]\n"); // return -1; } if (test_06 ()) { printf ("Test 06: testing basic TLS connect [ OK ]\n"); } else { printf ("Test 06: testing basic TLS connect [ FAILED ]\n"); // return -1; } if (test_07 ()) { printf ("Test 07: testing TLS request/reply [ OK ]\n"); } else { printf ("Test 07: testing TLS request/reply [ FAILED ]\n"); // return -1; } if (test_08 ()) { printf ("Test 08: test normal connect to TLS port [ OK ]\n"); } else { printf ("Test 08: test normal connect to TLS port [ FAILED ]\n"); // return -1; } if (test_09 ()) { printf ("Test 09: ensure we only support Sec-WebSocket-Version: 13 [ OK ]\n"); } else { printf ("Test 09: ensure we only support Sec-WebSocket-Version: 13 [ FAILED ]\n"); // return -1; } if (test_10 ()) { printf ("Test 10: test checking origing in on open and denying it [ OK ]\n"); } else { printf ("Test 10: test checking origing in on open and denying it [ FAILED ]\n"); // return -1; } if (test_11 ()) { printf ("Test 11: release context after connection [ OK ]\n"); } else { printf ("Test 11: release context after connection [ FAILED ]\n"); // return -1; } if (test_12 ()) { printf ("Test 12: create huge amount of connections in a short time [ OK ]\n"); } else { printf ("Test 12: create huge amount of connections in a short time [ FAILED ]\n"); // return -1; } if (test_13 ()) { printf ("Test 13: testing certificate storage [ OK ]\n"); } else { printf ("Test 13: testing certificate storage [ FAILED ]\n"); // return -1; } if (test_14 ()) { printf ("Test 14: testing sending frame with few content as indicated by header [ OK ]\n"); } else { printf ("Test 14: testing sending frame with few content as indicated by header [ FAILED ]\n"); // return -1; } if (test_15 ()) { printf ("Test 15: checking non-blocking calls to get messages when no content is available [ OK ]\n"); } else { printf ("Test 15: checking non-blocking calls to get messages when no content is available [ FAILED ]\n"); // return -1; } if (test_16 ()) { printf ("Test 16: check sending frames with sleep in header [ OK ]\n"); } else { printf ("Test 16: check sending frames with sleep in header [ FAILED ]\n"); // return -1; } if (test_17 ()) { printf ("Test 17: check partial frame reception [ OK ]\n"); } else { printf ("Test 17: check partial frame reception [ FAILED ]\n"); // return -1; } if (test_18 ()) { printf ("Test 18: check nopoll_loop_wait (second call) [ OK ]\n"); } else { printf ("Test 18: check nopoll_loop_wait (second call) [ FAILED ]\n"); // return -1; } if (test_19 ()) { printf ("Test 19: support different SSL methods (SSLv23, SSLv3, TLSv1 [ OK ]\n"); } else { printf ("Test 19: support different SSL methods (SSLv23, SSLv3, TLSv1 [ FAILED ]\n"); // return -1; } #if defined(__NOPOLL_PTHREAD_SUPPORT__) if (test_20 ()) { printf ("Test 20: check mutex support [ OK ]\n"); } else { printf ("Test 20: check mutex support [ FAILED ]\n"); return -1; } #endif if (test_21 ()) { printf ("Test 21: client side ssl certificates verification [ OK ]\n"); } else { printf ("Test 21: client side ssl certificates verification [ FAILED ]\n"); // return -1; } /* end if */ if (test_22 ()) { printf ("Test 22: test connection close trigger (client side) [ OK ]\n"); } else { printf ("Test 22: test connection close trigger (client side) [ FAILED ]\n"); // return -1; } /* end if */ if (test_23 ()) { printf ("Test 23: test connection close trigger (server side) [ OK ]\n"); } else { printf ("Test 23: test connection close trigger (server side) [ FAILED ]\n"); // return -1; } /* end if */ if (test_24 ()) { printf ("Test 24: check cookie support (client and server side) [ OK ]\n"); } else { printf ("Test 24: check cookie support (client and server side) [ FAILED ]\n"); // return -1; } /* end if */ if (test_25 ()) { printf ("Test 25: check cookie attack [ OK ]\n"); } else { printf ("Test 25: check cookie attack [ FAILED ]\n"); // return -1; } /* end if */ if (test_26 ()) { printf ("Test 26: checking echo.websocket.org [ OK ]\n"); } else { printf ("Test 26: chekcing echo.websocket.org [ FAILED ]\n"); // return -1; } /* end if */ if (test_27 ()) { printf ("Test 27: checking setting protocol [ OK ]\n"); } else { printf ("Test 27: chekcing setting protocol [ FAILED ]\n"); // return -1; } /* end if */ if (test_28 ()) { printf ("Test 28: checking setting protocol [ OK ]\n"); } else { printf ("Test 28: chekcing setting protocol [ FAILED ]\n"); // return -1; } /* end if */ /* add support to reply with redirect 301 to an opening * request: page 19 and 22 */ /* add support for basic HTTP auth before proceding with the * handshake. The the possibility to use htpasswd tools. Page 19 and 22 */ /* add support to define cookies by the server: page 20 */ /* update the library to split message frames into smaller * complete frames when bigger messages are received. */ /* add support for proxy mode */ /* check control files aren't flagged as fragmented */ /* upload a file to the server ...*/ /* more streaming api testing, get bigger content as a * consequence of receiving several messages */ /* test streaming API when it timeouts */ /* test sending wrong mime headers */ /* test sending missing mime headers */ /* test injecting wrong bytes */ /* test sending lot of MIME headers (really lot of * information) */ /* test checking protocols and denying it */ /* test sending ping */ /* test sending pong (without ping) */ /* test sending frames 126 == ( 65536) */ /* test sending frames 127 == ( more than 65536) */ /* test applying limits to incoming content */ /* test splitting into several frames content bigger */ /* test wrong UTF-8 content received on text frames */ /* add support to sending close frames with status code and a * textual indication as defined by page 36 */ #endif /* call to cleanup */ nopoll_cleanup_library (); printf ("All tests ok!!\n"); return 0; } LOCAL xQueueHandle Web_QueueStop = NULL; LOCAL void websocket_task(void *pvParameters) { bool ValueFromReceive = false; portBASE_TYPE xStatus; websocket_main((char*)pvParameters); while (1) { xStatus = xQueueReceive(Web_QueueStop,&ValueFromReceive,0); if (xStatus == pdPASS && ValueFromReceive == true){ printf("websocket_task exit signal\n"); break; } vTaskDelay(200 / portTICK_RATE_MS); printf("websocket_task\n"); } vQueueDelete(Web_QueueStop); Web_QueueStop = NULL; vTaskDelete(NULL); printf("delete the websocket_task\n"); } /*start the websocket task*/ void websocket_start(void *optarg) { if (Web_QueueStop == NULL) Web_QueueStop = xQueueCreate(1,1); if (Web_QueueStop != NULL) xTaskCreate(websocket_task, "websocket_task", 512, optarg, 4, NULL); } /*stop the websocket task*/ sint8 websocket_stop(void) { bool ValueToSend = true; portBASE_TYPE xStatus; if (Web_QueueStop == NULL) return -1; xStatus = xQueueSend(Web_QueueStop,&ValueToSend,0); if (xStatus != pdPASS) return -1; else return pdPASS; } /* end-of-file-found */