aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2011-08-28 13:29:25 +0300
committerAris Adamantiadis <aris@0xbadc0de.be>2011-09-02 11:43:05 +0300
commit5d9cd8bf39cac07fb674a4bb8c7667dba1773ba2 (patch)
tree08faf1862ca40a5c64e2e5ac86b945fd6586d959
parenta2c94abb92ead1503a0d6284609af41e53bef402 (diff)
downloadlibssh-5d9cd8bf39cac07fb674a4bb8c7667dba1773ba2.tar.gz
libssh-5d9cd8bf39cac07fb674a4bb8c7667dba1773ba2.tar.xz
libssh-5d9cd8bf39cac07fb674a4bb8c7667dba1773ba2.zip
benchmarks: added raw_download test
-rw-r--r--tests/benchmarks/bench_raw.c104
-rw-r--r--tests/benchmarks/benchmarks.c32
-rw-r--r--tests/benchmarks/benchmarks.h7
-rw-r--r--tests/benchmarks/latency.c2
4 files changed, 130 insertions, 15 deletions
diff --git a/tests/benchmarks/bench_raw.c b/tests/benchmarks/bench_raw.c
index c870942a..431659c5 100644
--- a/tests/benchmarks/bench_raw.c
+++ b/tests/benchmarks/bench_raw.c
@@ -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;
+}
diff --git a/tests/benchmarks/benchmarks.c b/tests/benchmarks/benchmarks.c
index 7ff6172e..647e5e7e 100644
--- a/tests/benchmarks/benchmarks.c
+++ b/tests/benchmarks/benchmarks.c
@@ -28,8 +28,8 @@
#include <stdio.h>
const char *libssh_benchmarks_names[]={
- "null",
- "benchmark_raw_upload"
+ "benchmark_raw_upload",
+ "benchmark_raw_download"
};
#ifdef HAVE_ARGP_H
@@ -63,6 +63,14 @@ static struct argp_option options[] = {
.group = 0
},
{
+ .name = "raw-download",
+ .key = '2',
+ .arg = NULL,
+ .flags = 0,
+ .doc = "Download raw data using channel",
+ .group = 0
+ },
+ {
.name = "host",
.key = 'h',
.arg = "HOST",
@@ -85,7 +93,8 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
switch (key) {
case '1':
- arguments->benchmarks[key - '1' + 1] = 1;
+ case '2':
+ arguments->benchmarks[key - '1'] = 1;
arguments->ntests ++;
break;
case 'v':
@@ -185,13 +194,20 @@ static void do_benchmarks(ssh_session session, struct argument_s *arguments,
if(err==0){
fprintf(stdout, "SSH RTT : %f ms\n",ssh_rtt);
}
- if(arguments->benchmarks[BENCHMARK_RAW_UPLOAD-1]){
+ if(arguments->benchmarks[BENCHMARK_RAW_UPLOAD]){
err=benchmarks_raw_up(session,arguments,&bps);
if(err==0){
fprintf(stdout, "%s : %s : %s\n",hostname,
libssh_benchmarks_names[BENCHMARK_RAW_UPLOAD], network_speed(bps));
}
}
+ if(arguments->benchmarks[BENCHMARK_RAW_DOWNLOAD]){
+ err=benchmarks_raw_down(session,arguments,&bps);
+ if(err==0){
+ fprintf(stdout, "%s : %s : %s\n",hostname,
+ libssh_benchmarks_names[BENCHMARK_RAW_DOWNLOAD], network_speed(bps));
+ }
+ }
}
int main(int argc, char **argv){
@@ -207,9 +223,9 @@ int main(int argc, char **argv){
}
if (arguments.ntests==0){
for(i=1; i < BENCHMARK_NUMBER ; ++i){
- arguments.benchmarks[i-1]=1;
+ arguments.benchmarks[i]=1;
}
- arguments.ntests=BENCHMARK_NUMBER-1;
+ arguments.ntests=BENCHMARK_NUMBER;
}
if (arguments.verbose > 0){
fprintf(stdout, "Will try hosts ");
@@ -217,9 +233,9 @@ int main(int argc, char **argv){
fprintf(stdout,"\"%s\" ", arguments.hosts[i]);
}
fprintf(stdout,"with benchmarks ");
- for(i=0;i<BENCHMARK_NUMBER-1;++i){
+ for(i=0;i<BENCHMARK_NUMBER;++i){
if(arguments.benchmarks[i])
- fprintf(stdout,"\"%s\" ",libssh_benchmarks_names[i+1]);
+ fprintf(stdout,"\"%s\" ",libssh_benchmarks_names[i]);
}
fprintf(stdout,"\n");
}
diff --git a/tests/benchmarks/benchmarks.h b/tests/benchmarks/benchmarks.h
index 065625ed..3c51a743 100644
--- a/tests/benchmarks/benchmarks.h
+++ b/tests/benchmarks/benchmarks.h
@@ -30,13 +30,14 @@
#define MAX_HOSTS_CONNECT 20
enum libssh_benchmarks {
- BENCHMARK_RAW_UPLOAD=1,
+ BENCHMARK_RAW_UPLOAD=0,
+ BENCHMARK_RAW_DOWNLOAD,
BENCHMARK_NUMBER
};
struct argument_s {
const char *hosts[MAX_HOSTS_CONNECT];
- char benchmarks[BENCHMARK_NUMBER -1];
+ char benchmarks[BENCHMARK_NUMBER];
int verbose;
int nhosts;
int ntests;
@@ -58,5 +59,7 @@ float elapsed_time(struct timestamp_struct *ts);
int benchmarks_raw_up (ssh_session session, struct argument_s *args,
float *bps);
+int benchmarks_raw_down (ssh_session session, struct argument_s *args,
+ float *bps);
#endif /* BENCHMARKS_H_ */
diff --git a/tests/benchmarks/latency.c b/tests/benchmarks/latency.c
index 849c39cd..09c50a04 100644
--- a/tests/benchmarks/latency.c
+++ b/tests/benchmarks/latency.c
@@ -137,7 +137,7 @@ int benchmarks_ssh_latency(ssh_session session, float *average){
ssh_channel_close(channel);
ssh_channel_free(channel);
channel=NULL;
- printf("Times : %f ms ; %f ms ; %f ms\n", times[0], times[1], times[2]);
+ printf("SSH request times : %f ms ; %f ms ; %f ms\n", times[0], times[1], times[2]);
*average=(times[0]+times[1]+times[2])/3;
return 0;
error: