From 46b96a145cde14b7ecf4a9608173508aa877b9fa Mon Sep 17 00:00:00 2001 From: Aris Adamantiadis Date: Mon, 17 Mar 2008 02:31:22 +0000 Subject: preliminary test suite git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@153 7dcaeef0-15fb-0310-b436-a5af3365683c --- tests/Makefile | 9 ++++++ tests/authentication.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/connection.c | 31 ++++++++++++++++++++ tests/test_tunnel.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/tests.h | 8 ++++++ 5 files changed, 198 insertions(+) create mode 100644 tests/Makefile create mode 100644 tests/authentication.c create mode 100644 tests/connection.c create mode 100644 tests/test_tunnel.c create mode 100644 tests/tests.h diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 00000000..bebfe5b6 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,9 @@ +all: test_tunnel +CFLAGS=-I../include/ -g -Wall +LDFLAGS=-lssh -L../libssh/.libs + +test_tunnel: test_tunnel.o authentication.o connection.o + gcc -o $@ $^ $(LDFLAGS) + +clean: + rm -f *.o test_tunnel diff --git a/tests/authentication.c b/tests/authentication.c new file mode 100644 index 00000000..00abd052 --- /dev/null +++ b/tests/authentication.c @@ -0,0 +1,74 @@ +/* +This file is distributed in public domain. You can do whatever you want +with its content. +*/ + + +#include +#include +#include +#include + +#include + +#include "tests.h" +static int auth_kbdint(SSH_SESSION *session){ + int err=ssh_userauth_kbdint(session,NULL,NULL); + char *name,*instruction,*prompt,*ptr; + char buffer[128]; + int i,n; + char echo; + while (err==SSH_AUTH_INFO){ + name=ssh_userauth_kbdint_getname(session); + instruction=ssh_userauth_kbdint_getinstruction(session); + n=ssh_userauth_kbdint_getnprompts(session); + if(strlen(name)>0) + printf("%s\n",name); + if(strlen(instruction)>0) + printf("%s\n",instruction); + for(i=0;i +#include +#include "tests.h" +SSH_OPTIONS *set_opts(int argc, char **argv){ + SSH_OPTIONS *options=ssh_options_new(); + char *host=NULL; + if(ssh_options_getopt(options,&argc, argv)){ + fprintf(stderr,"error parsing command line :%s\n",ssh_get_error(options)); + return NULL; + } + int i; + while((i=getopt(argc,argv,""))!=-1){ + switch(i){ + default: + fprintf(stderr,"unknown option %c\n",optopt); + } + } + if(optind < argc) + host=argv[optind++]; + if(host==NULL){ + fprintf(stderr,"must provide an host name\n"); + return NULL; + } + ssh_options_set_host(options,host); + return options; +} diff --git a/tests/test_tunnel.c b/tests/test_tunnel.c new file mode 100644 index 00000000..5d1e7534 --- /dev/null +++ b/tests/test_tunnel.c @@ -0,0 +1,76 @@ +/* +This file is distributed in public domain. You can do whatever you want +with its content. +*/ +#include +#include +#include +#include "tests.h" +#define ECHO_PORT 7 +void do_connect(SSH_SESSION *session){ + int error=ssh_connect(session); + if(error != SSH_OK){ + fprintf(stderr,"Error at connection :%s\n",ssh_get_error(session)); + return; + } + printf("Connected\n"); + ssh_is_server_known(session); + // we don't care what happens here + error=authenticate(session); + if(error != SSH_AUTH_SUCCESS){ + fprintf(stderr,"Error at authentication :%s\n",ssh_get_error(session)); + return; + } + printf("Authenticated\n"); + CHANNEL *channel=channel_new(session); + error=channel_open_forward(channel,"localhost",ECHO_PORT,"localhost",42); + if(error!=SSH_OK){ + fprintf(stderr,"Error when opening forward:%s\n",ssh_get_error(session)); + return; + } + printf("Forward opened\n"); + int i=0; + char string[20]; + char buffer[20]; + for(i=0;i<2000;++i){ + sprintf(string,"%d\n",i); + channel_write(channel,string,strlen(string)); + do { + error=channel_poll(channel,0); + //if(error < strlen(string)) + //usleep(10); + } while(error < strlen(string) && error >= 0); + if(error>0){ + error=channel_read_nonblocking(channel,buffer,strlen(string),0); + if(error>=0){ + if(memcmp(buffer,string,strlen(string))!=0){ + fprintf(stderr,"Problem with answer: wanted %s got %s\n",string,buffer); + } else { + printf("."); + fflush(stdout); + } + } + + } + if(error==-1){ + fprintf(stderr,"Channel reading error : %s\n",ssh_get_error(session)); + break; + } + } + printf("\nChannel test finished\n"); + channel_close(channel); + channel_free(channel); +} + +int main(int argc, char **argv){ + SSH_OPTIONS *options=set_opts(argc, argv); + SSH_SESSION *session=ssh_new(); + if(options==NULL){ + return 1; + } + ssh_set_options(session,options); + do_connect(session); + ssh_disconnect(session); + ssh_finalize(); + return 0; +} diff --git a/tests/tests.h b/tests/tests.h new file mode 100644 index 00000000..dd001f1f --- /dev/null +++ b/tests/tests.h @@ -0,0 +1,8 @@ +/* +This file is distributed in public domain. You can do whatever you want +with its content. +*/ +#include +int authenticate (SSH_SESSION *session); +SSH_OPTIONS *set_opts(int argc, char **argv); + -- cgit