add non blocking testing and better support for non blocking edge cases

pull/134/head
Jacob Barthelmeh 2019-01-24 15:48:34 -07:00
parent 0cefa074fb
commit b8ae2fab59
4 changed files with 49 additions and 7 deletions

View File

@ -753,6 +753,12 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
} }
myoptind = 0; /* reset for test cases */ myoptind = 0; /* reset for test cases */
#ifdef WOLFSSH_TEST_BLOCK
if (!nonBlock) {
err_sys("Use -N when testing forced non blocking");
}
#endif
if (wolfSSH_Init() != WS_SUCCESS) { if (wolfSSH_Init() != WS_SUCCESS) {
fprintf(stderr, "Couldn't initialize wolfSSH.\n"); fprintf(stderr, "Couldn't initialize wolfSSH.\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);

View File

@ -937,6 +937,13 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
if (username == NULL) if (username == NULL)
err_sys("client requires a username parameter."); err_sys("client requires a username parameter.");
#ifdef WOLFSSH_TEST_BLOCK
if (!nonBlock) {
err_sys("Use -N when testing forced non blocking");
}
#endif
ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL); ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL);
if (ctx == NULL) if (ctx == NULL)
err_sys("Couldn't create wolfSSH client context."); err_sys("Couldn't create wolfSSH client context.");

View File

@ -38,6 +38,16 @@
#include <stddef.h> #include <stddef.h>
#endif #endif
#ifdef WOLFSSH_TEST_BLOCK
#define WOLFSSH_TEST_SERVER
#include "wolfssh/test.h"
/* percent of time that forced want read/write is done */
#ifndef WOLFSSH_BLOCK_PROB
#define WOLFSSH_BLOCK_PROB 75
#endif
#endif
/* allow I/O callback handlers whether user I/O or not */ /* allow I/O callback handlers whether user I/O or not */
@ -300,7 +310,6 @@ static INLINE int LastError(void)
#endif #endif
} }
/* The receive embedded callback /* The receive embedded callback
* return : nb bytes read, or error * return : nb bytes read, or error
*/ */
@ -311,6 +320,14 @@ int wsEmbedRecv(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
int sd = *(int*)ctx; int sd = *(int*)ctx;
char* buf = (char*)data; char* buf = (char*)data;
#ifdef WOLFSSH_TEST_BLOCK
if (tcp_select(sd, 1) == WS_SELECT_RECV_READY &&
(rand() % 100) < WOLFSSH_BLOCK_PROB) {
printf("Forced read block\n");
return WS_CBIO_ERR_WANT_READ;
}
#endif
recvd = (int)RECV_FUNCTION(sd, buf, sz, ssh->rflags); recvd = (int)RECV_FUNCTION(sd, buf, sz, ssh->rflags);
recvd = TranslateReturnCode(recvd, sd); recvd = TranslateReturnCode(recvd, sd);
@ -363,6 +380,13 @@ int wsEmbedSend(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
int err; int err;
char* buf = (char*)data; char* buf = (char*)data;
#ifdef WOLFSSH_TEST_BLOCK
if ((rand() % 100) < WOLFSSH_BLOCK_PROB) {
printf("Forced write block\n");
return WS_CBIO_ERR_WANT_WRITE;
}
#endif
WLOG(WS_LOG_DEBUG,"Embed Send trying to send %d", sz); WLOG(WS_LOG_DEBUG,"Embed Send trying to send %d", sz);
#ifdef MICROCHIP_MPLAB_HARMONY #ifdef MICROCHIP_MPLAB_HARMONY

View File

@ -277,7 +277,8 @@ int wolfSSH_accept(WOLFSSH* ssh)
if (ssh->acceptState != ACCEPT_SERVER_VERSION_SENT && if (ssh->acceptState != ACCEPT_SERVER_VERSION_SENT &&
ssh->acceptState != ACCEPT_SERVER_USERAUTH_ACCEPT_SENT && ssh->acceptState != ACCEPT_SERVER_USERAUTH_ACCEPT_SENT &&
ssh->acceptState != ACCEPT_SERVER_KEXINIT_SENT && ssh->acceptState != ACCEPT_SERVER_KEXINIT_SENT &&
ssh->acceptState != ACCEPT_KEYED) { ssh->acceptState != ACCEPT_KEYED &&
ssh->acceptState != ACCEPT_SERVER_CHANNEL_ACCEPT_SENT) {
WLOG(WS_LOG_DEBUG, "Advancing accept state"); WLOG(WS_LOG_DEBUG, "Advancing accept state");
ssh->acceptState++; ssh->acceptState++;
} }
@ -439,8 +440,6 @@ int wolfSSH_accept(WOLFSSH* ssh)
continue; continue;
} }
#endif #endif
ssh->acceptState = ACCEPT_CLIENT_SESSION_ESTABLISHED;
WLOG(WS_LOG_DEBUG, acceptState, "CLIENT_SESSION_ESTABLISHED");
#if defined(WOLFSSH_SFTP) && !defined(NO_WOLFSSH_SERVER) #if defined(WOLFSSH_SFTP) && !defined(NO_WOLFSSH_SERVER)
{ {
const char* cmd = wolfSSH_GetSessionCommand(ssh); const char* cmd = wolfSSH_GetSessionCommand(ssh);
@ -452,6 +451,8 @@ int wolfSSH_accept(WOLFSSH* ssh)
} }
} }
#endif /* WOLFSSH_SFTP and !NO_WOLFSSH_SERVER */ #endif /* WOLFSSH_SFTP and !NO_WOLFSSH_SERVER */
ssh->acceptState = ACCEPT_CLIENT_SESSION_ESTABLISHED;
WLOG(WS_LOG_DEBUG, acceptState, "CLIENT_SESSION_ESTABLISHED");
break; break;
#ifdef WOLFSSH_SCP #ifdef WOLFSSH_SCP
@ -505,7 +506,6 @@ int wolfSSH_connect(WOLFSSH* ssh)
ssh->connectState != CONNECT_CLIENT_CHANNEL_OPEN_SESSION_SENT && ssh->connectState != CONNECT_CLIENT_CHANNEL_OPEN_SESSION_SENT &&
ssh->connectState != CONNECT_CLIENT_CHANNEL_REQUEST_SENT) { ssh->connectState != CONNECT_CLIENT_CHANNEL_REQUEST_SENT) {
WLOG(WS_LOG_DEBUG, "Advancing connect state"); WLOG(WS_LOG_DEBUG, "Advancing connect state");
printf("advance connect state\n");
ssh->connectState++; ssh->connectState++;
} }
@ -670,8 +670,13 @@ int wolfSSH_connect(WOLFSSH* ssh)
} }
if ( (ssh->error = if ( (ssh->error =
SendChannelOpenSession(ssh, newChannel)) < WS_SUCCESS) { SendChannelOpenSession(ssh, newChannel)) < WS_SUCCESS) {
if (ssh->error == WS_WANT_WRITE ||
ssh->error == WS_WANT_READ) {
ChannelAppend(ssh, newChannel);
}
else {
ChannelDelete(newChannel, ssh->ctx->heap); ChannelDelete(newChannel, ssh->ctx->heap);
}
WLOG(WS_LOG_DEBUG, connectError, WLOG(WS_LOG_DEBUG, connectError,
"SERVER_USERAUTH_ACCEPT_DONE", ssh->error); "SERVER_USERAUTH_ACCEPT_DONE", ssh->error);
return WS_FATAL_ERROR; return WS_FATAL_ERROR;