modified test port number to allow concurrent testing

This commit is contained in:
John Safranek 2013-03-26 22:00:39 -07:00
parent 8e53c7a62e
commit 7d287a6ba9
11 changed files with 170 additions and 38 deletions

2
.gitignore vendored
View File

@ -78,3 +78,5 @@ clang_output_*
internal.plist
cov-int
cyassl.tgz
*.log
*.trs

View File

@ -14,7 +14,7 @@ AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_TARGET
AC_USE_SYSTEM_EXTENSIONS
AM_INIT_AUTOMAKE([1.12 -Wall -Werror -Wno-portability foreign tar-ustar subdir-objects serial-tests])
AM_INIT_AUTOMAKE([1.12 -Wall -Werror -Wno-portability foreign tar-ustar subdir-objects])
AC_CANONICAL_HOST
AC_CANONICAL_BUILD

View File

@ -35,7 +35,7 @@
#include <cyassl/ctaocrypt/sha256.h>
#endif
#ifdef CYASSL_SHA384
#ifdef CYASSL_SHA512
#include <cyassl/ctaocrypt/sha512.h>
#endif

View File

@ -131,6 +131,7 @@
typedef struct tcp_ready {
int ready; /* predicate */
int port;
#ifdef _POSIX_THREADS
pthread_mutex_t mutex;
pthread_cond_t cond;
@ -454,14 +455,14 @@ static INLINE int tcp_select(SOCKET_T socketfd, int to_sec)
}
static INLINE void tcp_listen(SOCKET_T* sockfd, int port, int useAnyAddr,
static INLINE void tcp_listen(SOCKET_T* sockfd, int* port, int useAnyAddr,
int udp)
{
SOCKADDR_IN_T addr;
/* don't use INADDR_ANY by default, firewall may block, make user switch
on */
build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), port);
build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), *port);
tcp_socket(sockfd, udp);
#ifndef USE_WINDOWS_API
@ -480,6 +481,14 @@ static INLINE void tcp_listen(SOCKET_T* sockfd, int port, int useAnyAddr,
if (listen(*sockfd, 5) != 0)
err_sys("tcp listen failed");
}
#if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
if (*port == 0)
{
socklen_t len = sizeof(addr);
if (getsockname(*sockfd, (struct sockaddr*)&addr, &len) == 0)
*port = ntohs(addr.sin_port);
}
#endif
}
@ -504,12 +513,12 @@ static INLINE int udp_read_connect(SOCKET_T sockfd)
}
static INLINE void udp_accept(SOCKET_T* sockfd, int* clientfd, int useAnyAddr,
func_args* args)
int port, func_args* args)
{
SOCKADDR_IN_T addr;
(void)args;
build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), yasslPort);
build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), port);
tcp_socket(sockfd, 1);
@ -526,12 +535,22 @@ static INLINE void udp_accept(SOCKET_T* sockfd, int* clientfd, int useAnyAddr,
if (bind(*sockfd, (const struct sockaddr*)&addr, sizeof(addr)) != 0)
err_sys("tcp bind failed");
#if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
if (port == 0)
{
socklen_t len = sizeof(addr);
if (getsockname(*sockfd, (struct sockaddr*)&addr, &len) == 0)
port = ntohs(addr.sin_port);
}
#endif
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER)
/* signal ready to accept data */
{
tcp_ready* ready = args->signal;
pthread_mutex_lock(&ready->mutex);
ready->ready = 1;
ready->port = port;
pthread_cond_signal(&ready->cond);
pthread_mutex_unlock(&ready->mutex);
}
@ -547,11 +566,11 @@ static INLINE void tcp_accept(SOCKET_T* sockfd, int* clientfd, func_args* args,
socklen_t client_len = sizeof(client);
if (udp) {
udp_accept(sockfd, clientfd, useAnyAddr, args);
udp_accept(sockfd, clientfd, useAnyAddr, port, args);
return;
}
tcp_listen(sockfd, port, useAnyAddr, udp);
tcp_listen(sockfd, &port, useAnyAddr, udp);
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER)
/* signal ready to tcp_accept */
@ -559,6 +578,7 @@ static INLINE void tcp_accept(SOCKET_T* sockfd, int* clientfd, func_args* args,
tcp_ready* ready = args->signal;
pthread_mutex_lock(&ready->mutex);
ready->ready = 1;
ready->port = port;
pthread_cond_signal(&ready->cond);
pthread_mutex_unlock(&ready->mutex);
}

View File

@ -94,7 +94,7 @@ static void Usage(void)
" NOTE: All files relative to CyaSSL home dir\n");
printf("-? Help, print this usage\n");
printf("-h <host> Host to connect to, default %s\n", yasslIP);
printf("-p <num> Port to connect on, default %d\n", yasslPort);
printf("-p <num> Port to connect on, not 0, default %d\n", yasslPort);
printf("-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default %d\n",
CLIENT_DEFAULT_VERSION);
printf("-l <str> Cipher list\n");
@ -206,6 +206,10 @@ void client_test(void* args)
case 'p' :
port = atoi(myoptarg);
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
if (port == 0)
err_sys("port number cannot be 0");
#endif
break;
case 'v' :

View File

@ -50,6 +50,7 @@ void echoclient_test(void* args)
int sendSz;
int argc = 0;
char** argv = 0;
int port = yasslPort;
((func_args*)args)->return_code = -1; /* error state */
argc = ((func_args*)args)->argc;
@ -79,6 +80,10 @@ void echoclient_test(void* args)
doPSK = 1;
#endif
#if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
port = ((func_args*)args)->signal->port;
#endif
#if defined(CYASSL_DTLS)
method = DTLSv1_client_method();
#elif !defined(NO_TLS)
@ -128,12 +133,12 @@ void echoclient_test(void* args)
if (doDTLS) {
SOCKADDR_IN_T addr;
build_addr(&addr, yasslIP, yasslPort);
build_addr(&addr, yasslIP, port);
CyaSSL_dtls_set_peer(ssl, &addr, sizeof(addr));
tcp_socket(&sockfd, 1);
}
else {
tcp_connect(&sockfd, yasslIP, yasslPort, 0);
tcp_connect(&sockfd, yasslIP, port, 0);
}
SSL_set_fd(ssl, sockfd);

View File

@ -38,7 +38,7 @@
#endif
static void SignalReady(void* args)
static void SignalReady(void* args, int port)
{
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER)
/* signal ready to tcp_accept */
@ -46,10 +46,12 @@ static void SignalReady(void* args)
tcp_ready* ready = server_args->signal;
pthread_mutex_lock(&ready->mutex);
ready->ready = 1;
ready->port = port;
pthread_cond_signal(&ready->cond);
pthread_mutex_unlock(&ready->mutex);
#endif
(void)args;
(void)port;
}
@ -64,6 +66,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
int outCreated = 0;
int shutDown = 0;
int useAnyAddr = 0;
int port = yasslPort;
int argc = ((func_args*)args)->argc;
char** argv = ((func_args*)args)->argv;
@ -93,7 +96,10 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
doPSK = 1;
#endif
tcp_listen(&sockfd, yasslPort, useAnyAddr, doDTLS);
#if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
port = 0;
#endif
tcp_listen(&sockfd, &port, useAnyAddr, doDTLS);
#if defined(CYASSL_DTLS)
method = CyaDTLSv1_server_method();
@ -176,7 +182,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
#endif
}
SignalReady(args);
SignalReady(args, port);
while (!shutDown) {
CYASSL* ssl = 0;
@ -279,8 +285,8 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
CyaSSL_free(ssl);
CloseSocket(clientfd);
#ifdef CYASSL_DTLS
tcp_listen(&sockfd, yasslPort, useAnyAddr, doDTLS);
SignalReady(args);
tcp_listen(&sockfd, &port, useAnyAddr, doDTLS);
SignalReady(args, port);
#endif
}

View File

@ -93,7 +93,7 @@ static void Usage(void)
printf("server " LIBCYASSL_VERSION_STRING
" NOTE: All files relative to CyaSSL home dir\n");
printf("-? Help, print this usage\n");
printf("-p <num> Port to listen on, default %d\n", yasslPort);
printf("-p <num> Port to listen on, not 0, default %d\n", yasslPort);
printf("-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default %d\n",
SERVER_DEFAULT_VERSION);
printf("-l <str> Cipher list\n");
@ -182,6 +182,10 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
case 'p' :
port = atoi(myoptarg);
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
if (port == 0)
err_sys("port number cannot be 0");
#endif
break;
case 'v' :

View File

@ -43,8 +43,15 @@
CYASSL_CTX* cipherSuiteCtx = NULL;
char nonblockFlag[] = "-N";
char noVerifyFlag[] = "-d";
char portFlag[] = "-p";
char flagSep[] = " ";
char svrPort[] = "0";
#ifdef USE_WINDOWS_API
#define SNPRINTF _snprintf
#else
#define SNPRINTF snprintf
#endif
#ifdef NO_OLD_TLS
/* if the protocol version is less than tls 1.2 return 1, else 0 */
@ -125,6 +132,7 @@ static int execute_test_case(int svr_argc, char** svr_argv,
int i;
size_t added = 0;
static int tests = 1;
char portNumber[6];
commandLine[0] = '\0';
for (i = 0; i < svr_argc; i++) {
@ -156,11 +164,10 @@ static int execute_test_case(int svr_argc, char** svr_argv,
if (addNoVerify) {
printf("repeating test with client cert request off\n");
added += 4; /* -d plus space plus terminator */
if (added >= MAX_COMMAND_SZ)
if (added >= MAX_COMMAND_SZ || svr_argc >= MAX_ARGS)
printf("server command line too long\n");
else {
svr_argv[svr_argc] = noVerifyFlag;
svr_argc++;
svr_argv[svr_argc++] = noVerifyFlag;
svrArgs.argc = svr_argc;
strcat(commandLine, noVerifyFlag);
strcat(commandLine, flagSep);
@ -169,16 +176,24 @@ static int execute_test_case(int svr_argc, char** svr_argv,
if (addNonBlocking) {
printf("repeating test with non blocking on\n");
added += 4; /* -N plus terminator */
if (added >= MAX_COMMAND_SZ)
if (added >= MAX_COMMAND_SZ || svr_argc >= MAX_ARGS)
printf("server command line too long\n");
else {
svr_argv[svr_argc] = nonblockFlag;
svr_argc++;
svr_argv[svr_argc++] = nonblockFlag;
svrArgs.argc = svr_argc;
strcat(commandLine, nonblockFlag);
strcat(commandLine, flagSep);
}
}
/* add port 0 */
if (svr_argc + 2 > MAX_ARGS)
printf("cannot add the magic port number flag to server\n");
else
{
svr_argv[svr_argc++] = portFlag;
svr_argv[svr_argc++] = svrPort;
svrArgs.argc = svr_argc;
}
printf("trying server command line[%d]: %s\n", tests, commandLine);
commandLine[0] = '\0';
@ -199,7 +214,6 @@ static int execute_test_case(int svr_argc, char** svr_argv,
else {
cli_argv[cli_argc] = nonblockFlag;
cli_argc++;
cliArgs.argc = cli_argc;
strcat(commandLine, nonblockFlag);
strcat(commandLine, flagSep);
}
@ -212,7 +226,17 @@ static int execute_test_case(int svr_argc, char** svr_argv,
svrArgs.signal = &ready;
start_thread(server_test, &svrArgs, &serverThread);
wait_tcp_ready(&svrArgs);
if (ready.port != 0)
{
if (cli_argc + 2 > MAX_ARGS)
printf("cannot add the magic port number flag to client\n");
else {
SNPRINTF(portNumber, sizeof(portNumber), "%d", ready.port);
cli_argv[cli_argc++] = portFlag;
cli_argv[cli_argc++] = portNumber;
cliArgs.argc = cli_argc;
}
}
/* start client */
client_test(&cliArgs);

View File

@ -94,6 +94,7 @@ void join_thread(THREAD_TYPE thread)
void InitTcpReady(tcp_ready* ready)
{
ready->ready = 0;
ready->port = 0;
#ifdef _POSIX_THREADS
pthread_mutex_init(&ready->mutex, 0);
pthread_cond_init(&ready->cond, 0);

View File

@ -39,10 +39,18 @@
#include "examples/server/server.h"
#include "ctaocrypt/test/test.h"
#ifdef USE_WINDOWS_API
#define SNPRINTF _snprintf
#else
#define SNPRINTF snprintf
#endif
void client_test(void*);
void file_test(const char* file, byte* hash);
void simple_test(func_args*);
enum {
NUMARGS = 3
};
@ -54,7 +62,6 @@ char* myoptarg = NULL;
int main(int argc, char** argv)
{
func_args args;
func_args server_args;
tcp_ready ready;
@ -68,8 +75,8 @@ int main(int argc, char** argv)
StartTCP();
args.argc = server_args.argc = argc;
args.argv = server_args.argv = argv;
server_args.argc = argc;
server_args.argv = argv;
CyaSSL_Init();
#if defined(DEBUG_CYASSL) && !defined(HAVE_VALGRIND)
@ -81,19 +88,15 @@ int main(int argc, char** argv)
else if (CurrentDir("build")) /* Xcode->Preferences->Locations->Build */
ChangeDirBack(2); /* Location "Place build product in locations
specified by targets", uses build/Debug */
server_args.signal = &ready;
InitTcpReady(&ready);
/* CTaoCrypt test */
ctaocrypt_test(&args);
if (args.return_code != 0) return args.return_code;
ctaocrypt_test(&server_args);
if (server_args.return_code != 0) return server_args.return_code;
/* Simple CyaSSL client server test */
InitTcpReady(&ready);
server_args.signal = &ready;
start_thread(server_test, &server_args, &serverThread);
wait_tcp_ready(&server_args);
client_test(&args);
if (args.return_code != 0) return args.return_code;
join_thread(serverThread);
simple_test(&server_args);
if (server_args.return_code != 0) return server_args.return_code;
/* Echo input yaSSL client server test */
@ -119,6 +122,9 @@ int main(int argc, char** argv)
strcpy(echo_args.argv[2], "output");
remove("output");
/* Share the signal, it has the new port number in it. */
echo_args.signal = server_args.signal;
/* make sure OK */
echoclient_test(&echo_args);
if (echo_args.return_code != 0) return echo_args.return_code;
@ -157,6 +163,65 @@ int main(int argc, char** argv)
return EXIT_SUCCESS;
}
void simple_test(func_args* args)
{
THREAD_TYPE serverThread;
func_args svrArgs;
char *svrArgv[NUMARGS];
char argc0s[32];
char argc1s[32];
char argc2s[32];
func_args cliArgs;
char *cliArgv[NUMARGS];
char argc0c[32];
char argc1c[32];
char argc2c[32];
svrArgv[0] = argc0s;
svrArgv[1] = argc1s;
svrArgv[2] = argc2s;
cliArgv[0] = argc0c;
cliArgv[1] = argc1c;
cliArgv[2] = argc2c;
svrArgs.argc = 1;
svrArgs.argv = svrArgv;
svrArgs.return_code = 0;
cliArgs.argc = 1;
cliArgs.argv = cliArgv;
cliArgs.return_code = 0;
strcpy(svrArgs.argv[0], "SimpleServer");
#ifndef USE_WINDOWS_API
svrArgs.argc = NUMARGS;
strcpy(svrArgs.argv[1], "-p");
strcpy(svrArgs.argv[2], "0");
#endif
/* Set the last arg later, when it is known. */
args->return_code = 0;
svrArgs.signal = args->signal;
start_thread(server_test, &svrArgs, &serverThread);
wait_tcp_ready(&svrArgs);
/* Setting the actual port number. */
strcpy(cliArgs.argv[0], "SimpleClient");
#ifndef USE_WINDOWS_API
cliArgs.argc = NUMARGS;
strcpy(cliArgs.argv[1], "-p");
SNPRINTF(cliArgs.argv[2], sizeof(argc2c), "%d", svrArgs.signal->port);
#endif
client_test(&cliArgs);
if (cliArgs.return_code != 0) {
args->return_code = cliArgs.return_code;
return;
}
join_thread(serverThread);
if (svrArgs.return_code != 0) args->return_code = svrArgs.return_code;
}
void wait_tcp_ready(func_args* args)
@ -200,6 +265,7 @@ void join_thread(THREAD_TYPE thread)
void InitTcpReady(tcp_ready* ready)
{
ready->ready = 0;
ready->port = 0;
#ifdef _POSIX_THREADS
pthread_mutex_init(&ready->mutex, 0);
pthread_cond_init(&ready->cond, 0);