[Spice-devel] [PATCH] server: tests: add basic tests with working do nothing server

Hans de Goede hdegoede at redhat.com
Thu Nov 4 07:09:17 PDT 2010


Ack.

I still think a README (in the tests dir) with some short
words on how to use these would be good :)

Regards,

Hans


On 11/04/2010 02:19 PM, Alon Levy wrote:
> ---
>   configure.ac                                       |    1 +
>   server/Makefile.am                                 |    2 +
>   server/tests/Makefile.am                           |   25 +++
>   server/tests/basic_event_loop.c                    |  144 ++++++++++++++++++
>   server/tests/basic_event_loop.h                    |    9 +
>   server/tests/template_basic_event_loop_no_timers.c |  154 ++++++++++++++++++++
>   server/tests/test_empty_success.c                  |   57 +++++++
>   server/tests/test_fail_on_null_core_interface.c    |   13 ++
>   server/tests/test_just_sockets_no_ssl.c            |   19 +++
>   9 files changed, 424 insertions(+), 0 deletions(-)
>   create mode 100644 server/tests/Makefile.am
>   create mode 100644 server/tests/basic_event_loop.c
>   create mode 100644 server/tests/basic_event_loop.h
>   create mode 100644 server/tests/template_basic_event_loop_no_timers.c
>   create mode 100644 server/tests/test_empty_success.c
>   create mode 100644 server/tests/test_fail_on_null_core_interface.c
>   create mode 100644 server/tests/test_just_sockets_no_ssl.c
>
> diff --git a/configure.ac b/configure.ac
> index 0ab6dd8..8742fab 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -394,6 +394,7 @@ common/win/Makefile
>   common/win/my_getopt-1.5/Makefile
>   python_modules/Makefile
>   server/Makefile
> +server/tests/Makefile
>   client/Makefile
>   client/x11/Makefile
>   client/x11/images/Makefile
> diff --git a/server/Makefile.am b/server/Makefile.am
> index af6dd0e..20c2610 100644
> --- a/server/Makefile.am
> +++ b/server/Makefile.am
> @@ -1,3 +1,5 @@
> +SUBDIRS = . tests
> +
>   NULL =
>
>   INCLUDES = \
> diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am
> new file mode 100644
> index 0000000..dbae555
> --- /dev/null
> +++ b/server/tests/Makefile.am
> @@ -0,0 +1,25 @@
> +NULL =
> +
> +INCLUDES = 	\
> +	-I..		\
> +	$(PROTOCOL_CFLAGS) \
> +	$(SPICE_NONPKGCONFIG_CFLAGS)			\
> +	$(NULL)
> +
> +LDFLAGS = -L../.libs -lspice-server
> +
> +bin_PROGRAMS = test_just_sockets_no_ssl test_empty_success test_fail_on_null_core_interface
> +
> +test_just_sockets_no_ssl_SOURCES = test_just_sockets_no_ssl.c basic_event_loop.c
> +
> +test_just_sockets_no_ssl_LDFLAGS = $(LDFLAGS)
> +
> +test_empty_success_SOURCES = test_empty_success.c
> +
> +test_empty_success_LDFLAGS = $(LDFLAGS)
> +
> +test_fail_on_null_core_interface_SOURCES = test_fail_on_null_core_interface.c
> +
> +test_fail_on_null_core_interface_LDFLAGS = $(LDFLAGS)
> +
> +
> diff --git a/server/tests/basic_event_loop.c b/server/tests/basic_event_loop.c
> new file mode 100644
> index 0000000..14dec51
> --- /dev/null
> +++ b/server/tests/basic_event_loop.c
> @@ -0,0 +1,144 @@
> +#include<stdlib.h>
> +#include<stdio.h>
> +
> +#include "basic_event_loop.h"
> +
> +#define NOT_IMPLEMENTED printf("%s not implemented\n", __func__);
> +
> +static SpiceCoreInterface core;
> +
> +static SpiceTimer* timer_add(SpiceTimerFunc func, void *opaque)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +static void timer_start(SpiceTimer *timer, uint32_t ms)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +static void timer_cancel(SpiceTimer *timer)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +static void timer_remove(SpiceTimer *timer)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +struct SpiceWatch {
> +    int id;
> +};
> +
> +typedef struct Watch {
> +    SpiceWatch id;
> +    int fd;
> +    int event_mask;
> +    SpiceWatchFunc func;
> +    void *opaque;
> +} Watch;
> +
> +Watch watches[100];
> +int watch_count = 0;
> +int next_id = 1;
> +
> +static SpiceWatch *watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
> +{
> +    watches[watch_count].fd = fd;
> +    watches[watch_count].event_mask = event_mask;
> +    watches[watch_count].func = func;
> +    watches[watch_count].opaque = opaque;
> +    watches[watch_count].id.id = next_id++;
> +    return&watches[watch_count++].id;
> +}
> +
> +static void watch_update_mask(SpiceWatch *watch, int event_mask)
> +{
> +    int i;
> +    Watch *my_watch;
> +
> +    for (i = 0 ; i<  watch_count; ++i) {
> +        if (watches[i].id.id == watch->id) {
> +            my_watch =&watches[i];
> +            if (my_watch->event_mask != event_mask) {
> +                my_watch->event_mask = event_mask;
> +            }
> +            return;
> +        }
> +    }
> +}
> +
> +static void watch_remove(SpiceWatch *watch)
> +{
> +    int i;
> +
> +    for (i = 0 ; i<  watch_count ; ++i) {
> +        if (watches[i].id.id == watch->id) {
> +            watches[i] = watches[--watch_count];
> +            return;
> +        }
> +    }
> +}
> +
> +static void channel_event(int event, SpiceChannelEventInfo *info)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +void basic_event_loop_mainloop(void)
> +{
> +    fd_set rfds, wfds;
> +    int max_fd = -1;
> +    int i;
> +    int retval;
> +
> +    while (1) {
> +        FD_ZERO(&rfds);
> +        FD_ZERO(&wfds);
> +        for (i = 0 ; i<  watch_count; ++i) {
> +            Watch* watch =&watches[i];
> +            if (watch->event_mask&  SPICE_WATCH_EVENT_READ) {
> +                FD_SET(watch->fd,&rfds);
> +                max_fd = watch->fd>  max_fd ? watch->fd : max_fd;
> +            }
> +            if (watch->event_mask&  SPICE_WATCH_EVENT_WRITE) {
> +                FD_SET(watch->fd,&wfds);
> +                max_fd = watch->fd>  max_fd ? watch->fd : max_fd;
> +            }
> +        }
> +        retval = select(max_fd + 1,&rfds,&wfds, NULL, NULL);
> +        if (retval == -1) {
> +            printf("error in select - exiting\n");
> +            exit(-1);
> +        }
> +        if (retval) {
> +            for (i = 0 ; i<  watch_count; ++i) {
> +                Watch* watch =&watches[i];
> +                if ((watch->event_mask&  SPICE_WATCH_EVENT_READ)&&  FD_ISSET(watch->fd,&rfds)) {
> +                    watch->func(watch->fd, SPICE_WATCH_EVENT_READ, watch->opaque);
> +                }
> +                if ((watch->event_mask&  SPICE_WATCH_EVENT_WRITE)&&  FD_ISSET(watch->fd,&wfds)) {
> +                    watch->func(watch->fd, SPICE_WATCH_EVENT_WRITE, watch->opaque);
> +                }
> +            }
> +        }
> +    }
> +}
> +
> +SpiceCoreInterface *basic_event_loop_init(void)
> +{
> +    bzero(&core, sizeof(core));
> +    core.base.major_version = SPICE_INTERFACE_CORE_MAJOR;
> +    core.base.minor_version = SPICE_INTERFACE_CORE_MINOR; // anything less then 3 and channel_event isn't called
> +    core.timer_add = timer_add;
> +    core.timer_start = timer_start;
> +    core.timer_cancel = timer_cancel;
> +    core.timer_remove = timer_remove;
> +    core.watch_add = watch_add;
> +    core.watch_update_mask = watch_update_mask;
> +    core.watch_remove = watch_remove;
> +    core.channel_event = channel_event;
> +    return&core;
> +}
> +
> diff --git a/server/tests/basic_event_loop.h b/server/tests/basic_event_loop.h
> new file mode 100644
> index 0000000..5f6ebe7
> --- /dev/null
> +++ b/server/tests/basic_event_loop.h
> @@ -0,0 +1,9 @@
> +#ifndef __BASIC_EVENT_LOOP_H__
> +#define __BASIC_EVENT_LOOP_H__
> +
> +#include<spice.h>
> +
> +SpiceCoreInterface *basic_event_loop_init(void);
> +void basic_event_loop_mainloop(void);
> +
> +#endif // __BASIC_EVENT_LOOP_H__
> diff --git a/server/tests/template_basic_event_loop_no_timers.c b/server/tests/template_basic_event_loop_no_timers.c
> new file mode 100644
> index 0000000..4b15e94
> --- /dev/null
> +++ b/server/tests/template_basic_event_loop_no_timers.c
> @@ -0,0 +1,154 @@
> +#include<strings.h>
> +#include<stdio.h>
> +#include<stdlib.h>
> +//#include<unistd.h>
> +//#include<sys/types.h>
> +#include<sys/select.h>
> +#include<spice.h>
> +
> +#define NOT_IMPLEMENTED printf("%s not implemented\n", __func__);
> +
> +SpiceTimer* timer_add(SpiceTimerFunc func, void *opaque)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +void timer_start(SpiceTimer *timer, uint32_t ms)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +void timer_cancel(SpiceTimer *timer)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +void timer_remove(SpiceTimer *timer)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +struct SpiceWatch {
> +    int id;
> +};
> +
> +typedef struct Watch {
> +    SpiceWatch id;
> +    int fd;
> +    int event_mask;
> +    SpiceWatchFunc func;
> +    void *opaque;
> +} Watch;
> +
> +Watch watches[100];
> +int watch_count = 0;
> +int next_id = 1;
> +
> +SpiceWatch *watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
> +{
> +    watches[watch_count].fd = fd;
> +    watches[watch_count].event_mask = event_mask;
> +    watches[watch_count].func = func;
> +    watches[watch_count].opaque = opaque;
> +    watches[watch_count].id.id = next_id++;
> +    return&watches[watch_count++].id;
> +}
> +
> +void watch_update_mask(SpiceWatch *watch, int event_mask)
> +{
> +    int i;
> +    Watch *my_watch;
> +
> +    for (i = 0 ; i<  watch_count; ++i) {
> +        if (watches[i].id.id == watch->id) {
> +            my_watch =&watches[i];
> +            if (my_watch->event_mask != event_mask) {
> +                my_watch->event_mask = event_mask;
> +            }
> +            return;
> +        }
> +    }
> +}
> +
> +void watch_remove(SpiceWatch *watch)
> +{
> +    int i;
> +
> +    for (i = 0 ; i<  watch_count ; ++i) {
> +        if (watches[i].id.id == watch->id) {
> +            watches[i] = watches[--watch_count];
> +            return;
> +        }
> +    }
> +}
> +
> +void channel_event(int event, SpiceChannelEventInfo *info)
> +{
> +    NOT_IMPLEMENTED
> +}
> +
> +void mainloop()
> +{
> +    fd_set rfds, wfds;
> +    int max_fd = -1;
> +    int i;
> +    int retval;
> +
> +    while (1) {
> +        FD_ZERO(&rfds);
> +        FD_ZERO(&wfds);
> +        for (i = 0 ; i<  watch_count; ++i) {
> +            Watch* watch =&watches[i];
> +            if (watch->event_mask&  SPICE_WATCH_EVENT_READ) {
> +                FD_SET(watch->fd,&rfds);
> +                max_fd = watch->fd>  max_fd ? watch->fd : max_fd;
> +            }
> +            if (watch->event_mask&  SPICE_WATCH_EVENT_WRITE) {
> +                FD_SET(watch->fd,&wfds);
> +                max_fd = watch->fd>  max_fd ? watch->fd : max_fd;
> +            }
> +        }
> +        retval = select(max_fd + 1,&rfds,&wfds, NULL, NULL);
> +        if (retval == -1) {
> +            printf("error in select - exiting\n");
> +            exit(-1);
> +        }
> +        if (retval) {
> +            for (int i = 0 ; i<  watch_count; ++i) {
> +                Watch* watch =&watches[i];
> +                if ((watch->event_mask&  SPICE_WATCH_EVENT_READ)&&  FD_ISSET(watch->fd,&rfds)) {
> +                    watch->func(watch->fd, SPICE_WATCH_EVENT_READ, watch->opaque);
> +                }
> +                if ((watch->event_mask&  SPICE_WATCH_EVENT_WRITE)&&  FD_ISSET(watch->fd,&wfds)) {
> +                    watch->func(watch->fd, SPICE_WATCH_EVENT_WRITE, watch->opaque);
> +                }
> +            }
> +        }
> +    }
> +}
> +
> +int main()
> +{
> +    SpiceServer *server = spice_server_new();
> +    SpiceCoreInterface core;
> +
> +    bzero(&core, sizeof(core));
> +    core.base.major_version = SPICE_INTERFACE_CORE_MAJOR;
> +    core.timer_add = timer_add;
> +    core.timer_start = timer_start;
> +    core.timer_cancel = timer_cancel;
> +    core.timer_remove = timer_remove;
> +    core.watch_add = watch_add;
> +    core.watch_update_mask = watch_update_mask;
> +    core.watch_remove = watch_remove;
> +    core.channel_event = channel_event;
> +
> +    spice_server_set_port(server, 5911);
> +    spice_server_set_noauth(server);
> +    spice_server_init(server,&core);
> +
> +    mainloop();
> +
> +    return 0;
> +}
> +
> diff --git a/server/tests/test_empty_success.c b/server/tests/test_empty_success.c
> new file mode 100644
> index 0000000..e747e40
> --- /dev/null
> +++ b/server/tests/test_empty_success.c
> @@ -0,0 +1,57 @@
> +#include<strings.h>
> +#include<spice.h>
> +
> +SpiceTimer* timer_add(SpiceTimerFunc func, void *opaque)
> +{
> +}
> +
> +void timer_start(SpiceTimer *timer, uint32_t ms)
> +{
> +}
> +
> +void timer_cancel(SpiceTimer *timer)
> +{
> +}
> +
> +void timer_remove(SpiceTimer *timer)
> +{
> +}
> +
> +SpiceWatch *watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
> +{
> +}
> +
> +void watch_update_mask(SpiceWatch *watch, int event_mask)
> +{
> +}
> +
> +void watch_remove(SpiceWatch *watch)
> +{
> +}
> +
> +void channel_event(int event, SpiceChannelEventInfo *info)
> +{
> +}
> +
> +int main()
> +{
> +    SpiceServer *server = spice_server_new();
> +    SpiceCoreInterface core;
> +
> +    bzero(&core, sizeof(core));
> +    core.base.major_version = SPICE_INTERFACE_CORE_MAJOR;
> +    core.timer_add = timer_add;
> +    core.timer_start = timer_start;
> +    core.timer_cancel = timer_cancel;
> +    core.timer_remove = timer_remove;
> +    core.watch_add = watch_add;
> +    core.watch_update_mask = watch_update_mask;
> +    core.watch_remove = watch_remove;
> +    core.channel_event = channel_event;
> +
> +    spice_server_set_port(server, 5911);
> +    spice_server_init(server,&core);
> +
> +    return 0;
> +}
> +
> diff --git a/server/tests/test_fail_on_null_core_interface.c b/server/tests/test_fail_on_null_core_interface.c
> new file mode 100644
> index 0000000..699b2a2
> --- /dev/null
> +++ b/server/tests/test_fail_on_null_core_interface.c
> @@ -0,0 +1,13 @@
> +#include<spice.h>
> +
> +int main()
> +{
> +    SpiceServer *server = spice_server_new();
> +    SpiceCoreInterface core;
> +
> +    spice_server_init(server,&core);
> +    spice_server_set_port(server, 5911);
> +
> +    return 0;
> +}
> +
> diff --git a/server/tests/test_just_sockets_no_ssl.c b/server/tests/test_just_sockets_no_ssl.c
> new file mode 100644
> index 0000000..38d3a63
> --- /dev/null
> +++ b/server/tests/test_just_sockets_no_ssl.c
> @@ -0,0 +1,19 @@
> +#include<strings.h>
> +#include<sys/select.h>
> +#include<spice.h>
> +#include "basic_event_loop.h"
> +
> +int main()
> +{
> +    SpiceServer *server = spice_server_new();
> +    SpiceCoreInterface *core = basic_event_loop_init();
> +
> +    spice_server_set_port(server, 5912);
> +    spice_server_set_noauth(server);
> +    spice_server_init(server, core);
> +
> +    basic_event_loop_mainloop();
> +
> +    return 0;
> +}
> +


More information about the Spice-devel mailing list