mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-28 04:10:16 +00:00
server: tests: add basic tests with working do nothing server
This commit is contained in:
parent
6dbea1bda1
commit
0ede43e893
@ -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
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
SUBDIRS = . tests
|
||||
|
||||
NULL =
|
||||
|
||||
INCLUDES = \
|
||||
|
||||
25
server/tests/Makefile.am
Normal file
25
server/tests/Makefile.am
Normal file
@ -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)
|
||||
|
||||
|
||||
24
server/tests/README
Normal file
24
server/tests/README
Normal file
@ -0,0 +1,24 @@
|
||||
What is here
|
||||
============
|
||||
|
||||
This directory will contain a testsuite for the server including tetris drawing.
|
||||
|
||||
Unfortunately tetris and most of the tests are not here right now. You can however run all the tests and use libtool to debug any of them thus:
|
||||
|
||||
libtool --mode=execute gdb test_just_sockets_no_ssl
|
||||
|
||||
Overview of tests
|
||||
=================
|
||||
|
||||
test_just_sockets_no_ssl
|
||||
A complete server, only provides the main and inputs channels. Doesn't actually produce anything on the channels. Essentially a test of the regular link code (reds.c), good for multiple connect/disconnect tests.
|
||||
|
||||
test_empty_success
|
||||
tests calling
|
||||
|
||||
test_fail_on_null_core_interface
|
||||
should abort when run (when spice tries to watch_add)
|
||||
|
||||
basic_event_loop.c
|
||||
used by test_just_sockets_no_ssl, can be used by other tests. very crude event loop. Should probably use libevent for better tests, but this is self contained.
|
||||
|
||||
144
server/tests/basic_event_loop.c
Normal file
144
server/tests/basic_event_loop.c
Normal file
@ -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;
|
||||
}
|
||||
|
||||
9
server/tests/basic_event_loop.h
Normal file
9
server/tests/basic_event_loop.h
Normal file
@ -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__
|
||||
57
server/tests/test_empty_success.c
Normal file
57
server/tests/test_empty_success.c
Normal file
@ -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;
|
||||
}
|
||||
|
||||
13
server/tests/test_fail_on_null_core_interface.c
Normal file
13
server/tests/test_fail_on_null_core_interface.c
Normal file
@ -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;
|
||||
}
|
||||
|
||||
19
server/tests/test_just_sockets_no_ssl.c
Normal file
19
server/tests/test_just_sockets_no_ssl.c
Normal file
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user