mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	This patch introduces a set of functions that can create a display
and clients for tests.
On server side the user can use functions:
  display_create()
  display_destroy()
  create_client()
  display_run()
  display_resume()
and on client side the user can use:
  client_connect()
  client_disconnect()
  stop_display()
The stop_display() and display_resume() are functions that serve as a barrier
and also allow the display to take some action after the display_run() was called,
because after the display is stopped, it can run arbitrary code until it calls
display_resume().
client_connect() function connects to wayland display and creates a proxy to
test_compositor global object, so it can ask for stopping the display later
using stop_display().
An example:
  void
  client_main()
  {
        /* or client can use wl_display_connect(NULL)
         * and do all the stuff manually */
        struct client *c = client_connect();
        /* do some stuff, ... */
        /* stop the display so that it can
         * do some other stuff */
        stop_display(c, 1);
        /* ... */
        client_disconnect(c);
  }
  TEST(dummy_tst)
  {
       struct display *d = display_create();
       /* set up the display */
       wl_global_create(d->wl_display, ...);
       /* ... */
       create_client(d, client_main);
       display_run();
       /* if we are here, the display has been stopped
        * and we can do some code, i. e. create another global or so */
       wl_global_create(d->wl_display, ...);
       /* ... */
       display_resume(d); /* resume display and clients */
       display_destroy(d);
  }
v2:
  added/changed message in few asserts that were not clear
  fixed codying style issues and typo
  client_create_with_name: fixed a condition in an assert
  get_socket_name: use also pid
  check_error: fix errno -> err
[Pekka Paalanen: added test-compositor.h to SOURCES, added
WL_HIDE_DEPRECATED to get rid of deprecated defs and lots of warnings,
fixed one unchecked return value from write().]
Signed-off-by: Marek Chalupa <mchqwerty@gmail.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
		
	
			
		
			
				
	
	
		
			97 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2014 Red Hat, Inc.
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, distribute, and sell this software and its
 | 
						|
 * documentation for any purpose is hereby granted without fee, provided that
 | 
						|
 * the above copyright notice appear in all copies and that both that copyright
 | 
						|
 * notice and this permission notice appear in supporting documentation, and
 | 
						|
 * that the name of the copyright holders not be used in advertising or
 | 
						|
 * publicity pertaining to distribution of the software without specific,
 | 
						|
 * written prior permission.  The copyright holders make no representations
 | 
						|
 * about the suitability of this software for any purpose.  It is provided "as
 | 
						|
 * is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
						|
 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
						|
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
						|
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
						|
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 | 
						|
 * OF THIS SOFTWARE.
 | 
						|
 */
 | 
						|
 | 
						|
#include <unistd.h>
 | 
						|
 | 
						|
#include "wayland-server.h"
 | 
						|
#include "wayland-client.h"
 | 
						|
 | 
						|
/* info about a client on server side */
 | 
						|
struct client_info {
 | 
						|
	struct display *display;
 | 
						|
	struct wl_client *wl_client;
 | 
						|
	struct wl_listener destroy_listener;
 | 
						|
	const char *name; /* for debugging */
 | 
						|
 | 
						|
	int pipe;
 | 
						|
	pid_t pid;
 | 
						|
	int exit_code;
 | 
						|
 | 
						|
	struct wl_list link;
 | 
						|
	void *data; /* for arbitrary use */
 | 
						|
};
 | 
						|
 | 
						|
struct display {
 | 
						|
	struct wl_display *wl_display;
 | 
						|
 | 
						|
	struct wl_list clients;
 | 
						|
	uint32_t clients_no;
 | 
						|
	uint32_t clients_terminated_no;
 | 
						|
 | 
						|
	/* list of clients waiting for display_resumed event */
 | 
						|
	struct wl_list waiting_for_resume;
 | 
						|
	uint32_t wfr_num;
 | 
						|
};
 | 
						|
 | 
						|
/* This is a helper structure for clients.
 | 
						|
 * Instead of calling wl_display_connect() and all the other stuff,
 | 
						|
 * client can use client_connect and it will return this structure
 | 
						|
 * filled. */
 | 
						|
struct client {
 | 
						|
	struct wl_display *wl_display;
 | 
						|
	struct test_compositor *tc;
 | 
						|
 | 
						|
	int display_stopped;
 | 
						|
};
 | 
						|
 | 
						|
struct client *client_connect(void);
 | 
						|
void client_disconnect(struct client *);
 | 
						|
int stop_display(struct client *, int);
 | 
						|
 | 
						|
/**
 | 
						|
 * Usual workflow:
 | 
						|
 *
 | 
						|
 *    d = display_create();
 | 
						|
 *
 | 
						|
 *    wl_global_create(d->wl_display, ...);
 | 
						|
 *    ... other setups ...
 | 
						|
 *
 | 
						|
 *    client_create(d, client_main);
 | 
						|
 *    client_create(d, client_main2);
 | 
						|
 *
 | 
						|
 *    display_run(d);
 | 
						|
 *    display_destroy(d);
 | 
						|
 */
 | 
						|
struct display *display_create(void);
 | 
						|
void display_destroy(struct display *d);
 | 
						|
void display_run(struct display *d);
 | 
						|
 | 
						|
/* After n clients called stop_display(..., n), the display
 | 
						|
 * is stopped and can process the code after display_run().
 | 
						|
 * This function rerun the display again and send display_resumed
 | 
						|
 * event to waiting clients, so the clients will stop waiting and continue */
 | 
						|
void display_resume(struct display *d);
 | 
						|
 | 
						|
struct client_info *client_create_with_name(struct display *d,
 | 
						|
					    void (*client_main)(void),
 | 
						|
					    const char *name);
 | 
						|
#define client_create(d, c) client_create_with_name((d), (c), (#c))
 |