1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-07-29 13:01:13 +03:00

benchmarks: added raw_download test

This commit is contained in:
Aris Adamantiadis
2011-08-28 13:29:25 +03:00
parent a2c94abb92
commit 5d9cd8bf39
4 changed files with 130 additions and 15 deletions

View File

@ -109,13 +109,12 @@ int benchmarks_raw_up (ssh_session session, struct argument_s *args,
unsigned long bytes=0x1000000;
char *script=get_python_eater(bytes);
char cmd[128];
char buffer[1024];
static char buffer[0x10000];
int err;
ssh_channel channel;
struct timestamp_struct ts;
float ms=0.0;
unsigned long total=0;
(void)bps;
err=upload_script(session,"/tmp/eater.py",script);
free(script);
@ -144,8 +143,8 @@ int benchmarks_raw_up (ssh_session session, struct argument_s *args,
while(total < bytes){
unsigned long towrite = bytes - total;
int w;
if(towrite > 0x1000)
towrite = 0x1000;
if(towrite > 0x10000)
towrite = 32758;
w=ssh_channel_write(channel,buffer,towrite);
if(w == SSH_ERROR)
goto error;
@ -180,3 +179,100 @@ error:
}
return -1;
}
const char python_giver[] =
"#!/usr/bin/python\n"
"import sys\n"
"r=sys.stdin.read(2)\n"
"towrite=XXXXXXXXXX\n"
"wrote=0\n"
"while(wrote < towrite):\n"
" buffersize=towrite-wrote\n"
" if(buffersize > 4096):\n"
" buffersize=4096\n"
" sys.stdout.write('A'*buffersize)\n"
" wrote+=buffersize\n"
"sys.stdout.flush()\n";
static char *get_python_giver(unsigned long bytes){
char *giver=malloc(sizeof(python_giver));
char *ptr;
char buffer[12];
memcpy(giver,python_giver,sizeof(python_giver));
ptr=strstr(giver,"XXXXXXXXXX");
if(!ptr){
free(giver);
return NULL;
}
sprintf(buffer,"0x%.8lx",bytes);
memcpy(ptr,buffer,10);
return giver;
}
/** @internal
* @brief benchmarks a raw download (simple upload in a SSH channel) using an
* existing SSH session.
* @param[in] session Open SSH session
* @param[in] args Parsed command line arguments
* @param[out] bps The calculated bytes per second obtained via benchmark.
* @return 0 on success, -1 on error.
*/
int benchmarks_raw_down (ssh_session session, struct argument_s *args,
float *bps){
unsigned long bytes=0x1000000;
char *script=get_python_giver(bytes);
char cmd[128];
static char buffer[0x10000];
int err;
ssh_channel channel;
struct timestamp_struct ts;
float ms=0.0;
unsigned long total=0;
err=upload_script(session,"/tmp/giver.py",script);
free(script);
if(err<0)
return err;
channel=ssh_channel_new(session);
if(channel == NULL)
goto error;
if(ssh_channel_open_session(channel)==SSH_ERROR)
goto error;
snprintf(cmd,sizeof(cmd),"%s /tmp/giver.py", PYTHON_PATH);
if(ssh_channel_request_exec(channel,cmd)==SSH_ERROR)
goto error;
if((err=ssh_channel_write(channel,"go",2))==SSH_ERROR)
goto error;
if(args->verbose>0)
fprintf(stdout,"Starting download of %lu bytes now\n",bytes);
timestamp_init(&ts);
while(total < bytes){
unsigned long toread = bytes - total;
int r;
if(toread > sizeof(buffer))
toread = sizeof(buffer);
r=ssh_channel_read(channel,buffer,toread,0);
if(r == SSH_ERROR)
goto error;
total += r;
}
if(args->verbose>0)
fprintf(stdout,"Finished download\n");
ms=elapsed_time(&ts);
*bps=8000 * (float)bytes / ms;
if(args->verbose > 0)
fprintf(stdout,"Download took %f ms for %lu bytes, at %f bps\n",ms,
bytes,*bps);
ssh_channel_close(channel);
ssh_channel_free(channel);
return 0;
error:
fprintf(stderr,"Error during raw upload : %s\n",ssh_get_error(session));
if(channel){
ssh_channel_close(channel);
ssh_channel_free(channel);
}
return -1;
}