doubao_chat/lib/net/nopoll/test/nopoll-regression-client.c

3448 lines
114 KiB
C

/*
* LibNoPoll: A websocket library
* Copyright (C) 2017 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.
* Av. Juan Carlos I, Nº13, 2ºC
* Alcalá de Henares 28806 Madrid
* Spain
*
* Email address:
* info@aspl.es - http://www.aspl.es/nopoll
*/
#include <nopoll-regression-common.h>
#include <nopoll.h>
nopoll_bool debug = nopoll_false;
nopoll_bool show_critical_only = nopoll_false;
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, nopoll_base64_encode 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 = rand32();
#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, "localhost", "1234", 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(10000);
} /* 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, "localhost", "1234", 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_02a(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 */
printf("Test 02a: connecting IPv6 (::1:2234)..\n");
conn = nopoll_conn_new6(ctx, "::1", "2234", 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 02a: 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_02b(void)
{
noPollCtx *ctx;
noPollConn *conn;
/* create context */
ctx = create_ctx();
/* call to create a connection */
printf("Test 02-b: creating connection localhost:1234 (errno=%d)\n", errno);
conn = nopoll_conn_new(ctx, "localhost", "1234", 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-b: waiting until connection is ok (errno=%d)\n", errno);
if (! nopoll_conn_wait_until_connection_ready(conn, 5)) {
printf("ERROR: failed to fully establish connection nopoll_conn_wait_until_connection_ready (conn, 5) failed..\n");
}
/* sending echo */
if (! test_sending_and_check_echo(conn, "Test 02-b", "This is a test")) {
return nopoll_false;
}
printf("Test 02-b: connection ready, sending PING frame (errno=%d)..\n", errno);
if (! nopoll_conn_send_ping(conn)) {
printf("ERROR: failed to send ping frame..\n");
return nopoll_false;
} /* end if */
/* sending echo */
if (! test_sending_and_check_echo(conn, "Test 02-b", "This is a test")) {
return nopoll_false;
}
/* 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, "localhost", "1234", 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, "localhost", "1234", 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, (long) 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, "localhost", "1234", 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 = "1234-1) 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 1234-2) 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 1234-3) 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 1234-4) 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 1234-5) 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 1234-6) 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 1234-7) 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 1234-8) 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 1234-9) 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 1234-10) 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 1234-11) 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 1234-12) 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 1234-13) 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 1234-14) 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";
/* reinit again */
ctx = create_ctx();
/* call to create a connection */
conn = nopoll_conn_new(ctx, "localhost", "1234", 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 !defined(ETIMEDOUT)
#define ETIMEDOUT 0
#endif
if (errno != NOPOLL_EWOULDBLOCK && errno != EINPROGRESS && errno != ETIMEDOUT) {
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("WARNING: expected to have pending bytes to be written.. but found %d..\n",
nopoll_conn_pending_write_bytes(conn));
/* 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, "localhost", "1234", 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;
}
#if 0
nopoll_bool test_04c(void)
{
noPollCtx *ctx;
noPollConn *conn;
int length;
int bytes_written, bytes_written_orig;
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, "localhost", "1234", 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;
}
if (bytes_written != length) {
/* check pending bytes plus bytes
written equals to requested bytes
(length) */
if ((nopoll_conn_pending_write_bytes(conn) + bytes_written) != length) {
printf("ERROR: after bytes_written(%d) = nopoll_conn_send_text (conn, buffer, length(%d)), but nopoll_conn_pending_write_bytes (conn)=%d do not match\n",
bytes_written, length, nopoll_conn_pending_write_bytes(conn));
return nopoll_false;
} /* end if */
printf("Test 04-c: requesting to flush (bytes_written=%d, requested=%d, pending=%d)\n",
bytes_written, length, nopoll_conn_pending_write_bytes(conn));
/* call to flush writes */
bytes_written_orig = bytes_written;
bytes_written = nopoll_conn_flush_writes(conn, 10000000, bytes_written);
}
if (bytes_written != length) {
printf("ERROR: Failed to flush bytes read from file %d, bytes written were=%d, bytes written after flushing=%d (errno=%d : %s, pending bytes: %d, total bytes: %d)..\n",
length, bytes_written_orig, bytes_written, errno, strerror(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;
}
#endif
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, "localhost", "1234", 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, "localhost", "1235", 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;
}
/* 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(10000);
} /* 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_06a(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_new6(ctx, opts, "::1", "2235", 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;
}
/* 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(10000);
} /* 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, "localhost", "1235", 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, "localhost", "1235", 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, "localhost", "1234", 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, "localhost", "1234", 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, "localhost", "1234", 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;
}
#if 0
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 4000 connections...\n");
iterator = 0;
while (iterator < 4000) {
/* create a working connection */
conn = nopoll_conn_new(ctx, "localhost", "1234", 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, (long) diff.tv_sec, (long) diff.tv_usec);
return nopoll_true;
}
#endif
#if 0
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;
}
#endif
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, "localhost", "1234", 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, "localhost", "1234", 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, "localhost", "1234", 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;
int value;
memset(buffer, 0, 1024);
memset(buffer2, 0, 1024);
/* make it unblock */
nopoll_conn_set_sock_block(nopoll_conn_socket(listener), nopoll_false);
/* now send partial content */
printf("Test 17: 1. CLIENT >> 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 */
printf("Test 17: 2. SERVER << reading content..\n");
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: 3. CLIENT >> sending partial content..\n");
_socket = nopoll_conn_socket(conn);
/* NOTE: the following values has to be 129 and 150. They has
be this way because they represent the right WebSocket
header initialization for this test */
buffer[0] = 129; /* buffer[0]) = 0 1 1 1 1 1 1 0 */
buffer[1] = 150; /* buffer[0]) = 0 1 1 1 1 1 1 1 */
send(_socket, buffer, 2, 0);
nopoll_show_byte(ctx, buffer[0], "CLIENT >> buffer[0]");
nopoll_show_byte(ctx, buffer[1], "CLIENT >> buffer[0]");
if (read_after_header) {
nopoll_sleep(1000000);
printf("Test 17: 3.1 SERVER << Reading after header..\n");
nopoll_conn_read(listener, buffer2, length, nopoll_false, 0);
}
/* send mask */
printf("Test 17: 4. CLIENT >> sending content..\n");
mask[0] = 23;
mask[1] = 24;
mask[2] = 25;
mask[3] = 26;
send(_socket, mask, 4, 0);
nopoll_show_byte(ctx, mask[0], "CLIENT >> mask[0]");
nopoll_show_byte(ctx, mask[1], "CLIENT >> mask[1]");
nopoll_show_byte(ctx, mask[2], "CLIENT >> mask[2]");
nopoll_show_byte(ctx, mask[3], "CLIENT >> mask[3]");
if (read_after_mask) {
nopoll_sleep(1000000);
printf("Test 17: 4.1 SERVER << 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: 5. CLIENT >> sent partial content...wait a bit (2 seconds)..\n");
nopoll_sleep(2000000);
desp = 0;
if (read_in_the_middle) {
printf("Test 17: 5.1 SERVER << 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: 6. CLIENT >> 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: 7. SERVER << now read the content received..\n");
/* now read the content */
value = nopoll_conn_read(listener, buffer + desp, length - desp, nopoll_true, 0);
if (value != (length - desp)) {
printf("ERROR: expected to receive nopoll_conn_read (listener, buffer + desp, length - desp, nopoll_true, 0)=%d bytes but found something different (length - desp)=%d..\n",
value, (length - desp));
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, "localhost", "22351", 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 **/
printf("Test 17: sending first 'This is a test message'..\n");
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 **/
printf("Test 17: sending second 'This is a test message'..\n");
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 **/
printf("Test 17: sending third 'This is a test message'..\n");
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 **/
printf("Test 17: sending fourth 'This is a test message'..\n");
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, "localhost", "1235", 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;
}
#if 0
nopoll_bool test_19(void)
{
noPollCtx *ctx;
noPollConn *conn;
noPollConnOpts *opts;
/* reinit again */
ctx = create_ctx();
#if defined (NOPOLL_HAVE_SSLv23_ENABLED) && OPENSSL_VERSION_NUMBER < 0x10100000L
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, "localhost", "1236", 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);
#endif
#if defined (NOPOLL_HAVE_SSLv23_ENABLED) && OPENSSL_VERSION_NUMBER < 0x10100000L
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, "localhost", "1235", 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);
#endif
#if defined (NOPOLL_HAVE_SSLv3_ENABLED) && OPENSSL_VERSION_NUMBER < 0x10100000L
printf("Test 19: perfect, got it working (OPENSSL_VERSION_NUMBER=%ld)..\n", (OPENSSL_VERSION_NUMBER));
/* 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, "localhost", "1234", 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);
#endif
/***
* The following versions do not support the following test:
*
* - OPENSSL_VERSION_NUMBER=0x1000114fL (jessie)
*/
#if defined (NOPOLL_HAVE_TLSv10_ENABLED) && OPENSSL_VERSION_NUMBER < 0x1000114fL
printf("Test 19: testing TLSv1.0 connection...(OPENSSL_VERSION_NUMBER=%ld)..\n", (OPENSSL_VERSION_NUMBER));
/* create options */
opts = nopoll_conn_opts_new();
nopoll_conn_opts_set_ssl_protocol(opts, NOPOLL_METHOD_TLSV1);
/* create connection */
conn = nopoll_conn_tls_new(ctx, opts, "localhost", "1235", 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);
#endif
#if defined (NOPOLL_HAVE_TLSv11_ENABLED)
printf("Test 19: testing TLSv1.1 connection...\n");
/* create options */
opts = nopoll_conn_opts_new();
nopoll_conn_opts_set_ssl_protocol(opts, NOPOLL_METHOD_TLSV1_1);
/* create connection */
conn = nopoll_conn_tls_new(ctx, opts, "localhost", "1238", 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-a: testing TLSv1.1 (IPv6) connection...\n");
/* create options */
opts = nopoll_conn_opts_new();
nopoll_conn_opts_set_ssl_protocol(opts, NOPOLL_METHOD_TLSV1_1);
/* create connection */
conn = nopoll_conn_tls_new6(ctx, opts, "::1", "2238", 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 19a", "This is a test...checking SSL with different values...")) {
return nopoll_false;
}
/* finish connection */
nopoll_conn_close(conn);
#endif
#if defined (NOPOLL_HAVE_TLSv12_ENABLED)
printf("Test 19: testing TLSv1.2 connection...\n");
/* create options */
opts = nopoll_conn_opts_new();
nopoll_conn_opts_set_ssl_protocol(opts, NOPOLL_METHOD_TLSV1_2);
/* create connection */
conn = nopoll_conn_tls_new(ctx, opts, "localhost", "1240", 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);
#endif
/* finish */
nopoll_ctx_unref(ctx);
/* report finish */
return nopoll_true;
}
#endif
#if defined(__NOPOLL_PTHREAD_SUPPORT__)
nopoll_bool test_20(void)
{
noPollPtr *mutex;
int iterator = 0;
printf("Test 20: checking default API mutex used by the tests..\n");
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++;
} /* end while */
return nopoll_true;
}
#endif
#if 0
/*
* 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, "localhost", "1239", 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);
/* NOTE: the following test needs client.pem, server.pem and
* root.epm used by nopoll-regression-client.c and
* nopoll-regression-listener.c to be synchronized and
* updated.
*
* If you have problems running this test, run it with:
*
* >> ./nopoll-regression-client --show-critical-only
*
* or with full debug enabled:
*
* >> ./nopoll-regression-client --debug
*
* There is a script that allows to generate and refresh
* certificates used by this test:
*
* >> ./gen-certificates-test-21.sh
*
* You can use to see how to generate a root.pem CA
* certificate an a couple of certificates for client.pem and
* server.pem
*/
/* 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, "localhost", "1239", 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;
}
#endif
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, "localhost", "1234", 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, "localhost", "1235", 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 = strtod((const char *) nopoll_msg_get_payload(msg), NULL);
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, "localhost", "1234", 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, "localhost", "1234", 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, "localhost", "1235", 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, "localhost", "1235", 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, "localhost", "1234", 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, "localhost", "1234", 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, "localhost", "1234", 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, "localhost", "1234", 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, "localhost", "1234", 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;
}
nopoll_bool test_29(void)
{
noPollConn *conn;
noPollCtx *ctx;
noPollConnOpts *opts;
/* init context */
ctx = create_ctx();
/* configure extra headers */
opts = nopoll_conn_opts_new();
nopoll_conn_opts_set_extra_headers(opts, "\r\nfoo: bar");
/* create connection */
conn = nopoll_conn_new_opts(ctx, opts, "localhost", "1234", 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);
/* close connection */
nopoll_conn_close(conn);
/* release context */
nopoll_ctx_unref(ctx);
return nopoll_true;
}
/**** DO NOT INCLUDE THIS HEADER IN PRODUCTION: this header is
included in this regression test just for testing purposes. Any
code developed using this include might failure in future
relases ****/
#include <nopoll_private.h>
nopoll_bool test_30_common_header_stop(const char *label, int bytes_to_send_before_stop)
{
noPollConn *conn;
noPollCtx *ctx;
const char *msg = "This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...This is content to check this regression test 30, content for a reply that send a header that is partially sent...";
int length;
noPollMsg *msg_ref;
int tries;
/* init context */
ctx = create_ctx();
/* create connection */
conn = nopoll_conn_new(ctx, "localhost", "1234", 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 */
printf("Test %s: waiting until connection is ready..\n", label);
/* wait until it is connected */
nopoll_conn_wait_until_connection_ready(conn, 5);
printf("Test %s: ok..\n", label);
/* send a message to request connection close with a particular message */
conn->__force_stop_after_header = bytes_to_send_before_stop;
length = strlen(msg);
printf("Test %s: sending first message (of %d bytes, sending broken header of %d, pausing then, and then sending the rest..)\n",
label, length, bytes_to_send_before_stop);
if (nopoll_conn_send_text(conn, msg, length) != length) {
printf("ERROR: failed to send message..");
return nopoll_false;
} /* end while */
/* call to get status */
if (! nopoll_conn_is_ok(conn)) {
printf("ERROR: connection failure found after send operation with broken header....\n");
return nopoll_false;
} /* end if */
printf("Test %s: getting reply to the message..\n", label);
tries = 10;
while (tries > 0) {
/* get message */
msg_ref = nopoll_conn_get_msg(conn);
if (msg_ref) {
break;
}
nopoll_sleep(500000);
tries--;
}
if (msg_ref == NULL) {
printf("ERROR: expected to find reply message...but NULL was received..\n");
return nopoll_false;
} /* end if */
if (! nopoll_cmp((const char *) nopoll_msg_get_payload(msg_ref), msg)) {
printf("ERROR: expected to find message equal content but found something different..\n");
return nopoll_false;
} /* end if */
/* release message */
nopoll_msg_unref(msg_ref);
printf("Test %s: sending second message (of %d bytes, sending broken header of %d, pausing then, and then sending the rest..)\n",
label, length, bytes_to_send_before_stop);
if (nopoll_conn_send_text(conn, msg, length) != length) {
printf("ERROR: failed to send message..");
return nopoll_false;
} /* end while */
printf("Test %s: getting reply to the message (to the second message)..\n", label);
tries = 10;
while (tries > 0) {
/* get message */
msg_ref = nopoll_conn_get_msg(conn);
if (msg_ref) {
break;
}
nopoll_sleep(500000);
tries--;
}
if (msg_ref == NULL) {
printf("ERROR: expected to find reply message...but NULL was received..\n");
return nopoll_false;
} /* end if */
if (! nopoll_cmp((const char *) nopoll_msg_get_payload(msg_ref), msg)) {
printf("ERROR: expected to find message equal content but found something different..\n");
return nopoll_false;
} /* end if */
/* release message */
nopoll_msg_unref(msg_ref);
/* close connection */
nopoll_conn_close(conn);
/* release context */
nopoll_ctx_unref(ctx);
return nopoll_true;
}
nopoll_bool test_30(void)
{
/* call to test send 1 byte and stop */
return test_30_common_header_stop("30", 2);
}
nopoll_bool test_31(void)
{
/* call to test send 1 byte and stop */
return test_30_common_header_stop("31", 1);
}
nopoll_bool test_32(void)
{
/* call to test send 1 byte and stop */
return test_30_common_header_stop("32", 3);
}
nopoll_bool test_33(void)
{
/* call to test send 1 byte and stop */
return test_30_common_header_stop("33", 4);
}
nopoll_bool test_34(void)
{
/* call to test send 1 byte and stop */
return test_30_common_header_stop("34", 5);
}
nopoll_bool test_35(void)
{
/* call to test send 1 byte and stop */
return test_30_common_header_stop("35", 8);
}
nopoll_bool test_36(void)
{
noPollCtx *ctx;
noPollConn *conn;
noPollConn *conn2;
printf("Test 36: force connection timeout artificially..\n");
/* init again */
ctx = create_ctx();
/* call to create a connection */
conn = nopoll_conn_new(ctx, "localhost", "1234", NULL, NULL, NULL, NULL);
if (! nopoll_conn_is_ok(conn)) {
printf("ERROR: not expected connection error but found connection ok..\n");
return nopoll_false;
}
/* send content text(utf-8) */
if (nopoll_conn_send_text(conn, "set-broken-socket", 17) != 17) {
printf("ERROR: Expected to find proper send operation..\n");
return nopoll_false;
}
nopoll_sleep(100000);
printf("Test 36: connecting again to ensure listener is working..\n");
/* call to create a connection */
conn2 = nopoll_conn_new(ctx, "localhost", "1234", NULL, NULL, NULL, NULL);
if (! nopoll_conn_is_ok(conn2)) {
printf("ERROR: not expected connection error but found connection ok..\n");
return nopoll_false;
}
/* send content text(utf-8) */
nopoll_conn_send_text(conn2, "This is a test", 14);
/* finish connection */
nopoll_conn_close(conn);
nopoll_conn_close(conn2);
/* finish */
nopoll_ctx_unref(ctx);
return nopoll_true;
}
int nopoll_main(int argc, char **argv)
{
int iterator;
printf("** NoPoll: Websocket toolkit (regression test).\n");
printf("** Copyright (C) 2015 Advanced Software Production Line, S.L.\n**\n");
//printf ("** NoPoll regression tests: version=%s\n**\n",
//VERSION);
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@lists.aspl.es> noPoll mailing list\n**\n");
printf("** <info@aspl.es> ASPL's contact \n**\n");
#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++;
}
#endif
#if defined(__NOPOLL_PTHREAD_SUPPORT__)
printf("INFO: install default threading functions to check noPoll locking code..\n");
nopoll_thread_handlers(__nopoll_regtest_mutex_create,
__nopoll_regtest_mutex_destroy,
__nopoll_regtest_mutex_lock,
__nopoll_regtest_mutex_unlock);
#endif
//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-base64: Library base64 support [ OK ]\n");
} else {
printf("Test 01-base64: Library base64 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;
}
if (test_02a()) {
printf("Test 02a: Simple request/reply (IPv6) [ OK ]\n");
} else {
printf("Test 02a: Simple request/reply (IPv6) [ FAILED ]\n");
return -1;
}
/* test sending ping */
if (test_02b()) {
printf("Test 02b: test sending ping [ OK ]\n");
} else {
printf("Test 02a: test sending ping [ FAILED ]\n");
return -1;
}
/* test sending pong (without ping) */
/* 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 0
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;
}
#endif
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_06a()) {
printf("Test 06a: testing basic TLS connect (IPv6) [ OK ]\n");
} else {
printf("Test 06a: testing basic TLS connect (IPv6) [ 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 0
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;
}
#endif
#if 0
if (test_13()) {
printf("Test 13: testing certificate storage [ OK ]\n");
} else {
printf("Test 13: testing certificate storage [ FAILED ]\n");
return -1;
}
#endif
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 0
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;
}
#endif
#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 0
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 */
#endif
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: checking echo.websocket.org [ FAILED ]\n");
return -1;
} /* end if */
if (test_27()) {
printf("Test 27: checking setting protocol [ OK ]\n");
} else {
printf("Test 27: checking setting protocol [ FAILED ]\n");
return -1;
} /* end if */
if (test_28()) {
printf("Test 28: checking setting protocol [ OK ]\n");
} else {
printf("Test 28: checking setting protocol [ FAILED ]\n");
return -1;
} /* end if */
if (test_29()) {
printf("Test 29: checking extra http headers [ OK ]\n");
} else {
printf("Test 29: checking extra http headers [ FAILED ]\n");
return -1;
} /* end if */
if (test_30()) {
printf("Test 30: simulate stop in the middle of the header send [ OK ]\n");
} else {
printf("Test 30: simulate stop in the middle of the header send [ FAILED ]\n");
return -1;
} /* end if */
if (test_31()) {
printf("Test 31: simulate stop in the middle of the header send (II) [ OK ]\n");
} else {
printf("Test 31: simulate stop in the middle of the header send (II) [ FAILED ]\n");
return -1;
} /* end if */
if (test_32()) {
printf("Test 32: simulate stop in the middle of the header send (III) [ OK ]\n");
} else {
printf("Test 32: simulate stop in the middle of the header send (III) [ FAILED ]\n");
return -1;
} /* end if */
if (test_33()) {
printf("Test 33: simulate stop in the middle of the header send (IV) [ OK ]\n");
} else {
printf("Test 33: simulate stop in the middle of the header send (IV) [ FAILED ]\n");
return -1;
} /* end if */
if (test_34()) {
printf("Test 34: simulate stop in the middle of the header send (V) [ OK ]\n");
} else {
printf("Test 34: simulate stop in the middle of the header send (V) [ FAILED ]\n");
return -1;
} /* end if */
if (test_35()) {
printf("Test 35: simulate stop in the middle of the header send (VI) [ OK ]\n");
} else {
printf("Test 35: simulate stop in the middle of the header send (VI) [ FAILED ]\n");
return -1;
} /* end if */
if (test_36()) {
printf("Test 36: check dead-lock on connection timeout (23/02/2016) [ OK ]\n");
} else {
printf("Test 36: check dead-lock on connection timeout (23/02/2016) [ 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 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 */
/* call to cleanup */
nopoll_cleanup_library();
printf("All tests ok!!\n");
return 0;
}
/* end-of-file-found */