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 */
#ifdef WOLFSSH_TEST_BLOCK
if (!nonBlock) {
err_sys("Use -N when testing forced non blocking");
}
#endif
if (wolfSSH_Init() != WS_SUCCESS) {
fprintf(stderr, "Couldn't initialize wolfSSH.\n");
exit(EXIT_FAILURE);

View File

@ -937,6 +937,13 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
if (username == NULL)
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);
if (ctx == NULL)
err_sys("Couldn't create wolfSSH client context.");

View File

@ -38,6 +38,16 @@
#include <stddef.h>
#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 */
@ -300,7 +310,6 @@ static INLINE int LastError(void)
#endif
}
/* The receive embedded callback
* return : nb bytes read, or error
*/
@ -311,6 +320,14 @@ int wsEmbedRecv(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
int sd = *(int*)ctx;
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 = TranslateReturnCode(recvd, sd);
@ -363,6 +380,13 @@ int wsEmbedSend(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
int err;
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);
#ifdef MICROCHIP_MPLAB_HARMONY

View File

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