From: Michael Stapelberg Date: Sun, 9 Oct 2011 23:24:29 +0000 (+0100) Subject: add testcase for the startup notification protocol X-Git-Tag: 4.1~104^2~11 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=198f16ece93e029600cf3e592a7769345e82fb0c;p=i3%2Fi3 add testcase for the startup notification protocol --- diff --git a/testcases/Makefile.PL b/testcases/Makefile.PL index 4b3f1ade..da0c1570 100755 --- a/testcases/Makefile.PL +++ b/testcases/Makefile.PL @@ -12,6 +12,7 @@ WriteMakefile( 'Test::Most' => 0, 'Test::Deep' => 0, 'EV' => 0, + 'Inline' => 0, }, # don't install any files from this directory PM => {}, diff --git a/testcases/t/175-startup-notification.t b/testcases/t/175-startup-notification.t new file mode 100644 index 00000000..2257b3e4 --- /dev/null +++ b/testcases/t/175-startup-notification.t @@ -0,0 +1,117 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Test for the startup notification protocol. +# + +use i3test; +use POSIX qw(mkfifo); +use File::Temp qw(:POSIX); + +my $x = X11::XCB::Connection->new; +use ExtUtils::PkgConfig; + +# setup dependency on libstartup-notification using pkg-config +my %sn_config; +BEGIN { + %sn_config = ExtUtils::PkgConfig->find('libstartup-notification-1.0'); +} + +use Inline C => Config => LIBS => $sn_config{libs}, CCFLAGS => $sn_config{cflags}; +use Inline C => <<'END_OF_C_CODE'; + +#include + +#define SN_API_NOT_YET_FROZEN 1 +#include +#include + +static SnDisplay *sndisplay; +static SnLauncheeContext *ctx; + +// TODO: this should use $x +void init_ctx() { + int screen; + xcb_connection_t *conn; + if ((conn = xcb_connect(NULL, &screen)) == NULL || + xcb_connection_has_error(conn)) + errx(1, "x11 conn failed"); + + printf("screen = %d\n", screen); + sndisplay = sn_xcb_display_new(conn, NULL, NULL); + ctx = sn_launchee_context_new_from_environment(sndisplay, screen); +} + +const char *get_startup_id() { + return sn_launchee_context_get_startup_id(ctx); +} + +void mark_window(int window) { + sn_launchee_context_setup_window(ctx, (Window)window); +} + +void complete_startup() { + /* mark the startup process complete */ + sn_launchee_context_complete(ctx); +} +END_OF_C_CODE + +my $first_ws = fresh_workspace; + +is(@{get_ws_content($first_ws)}, 0, 'no containers on this workspace yet'); + +###################################################################### +# 1) initiate startup, switch workspace, create window +# (should be placed on the original workspace) +###################################################################### + +# Start a new process via i3 (to initialize a new startup notification +# context), then steal its DESKTOP_STARTUP_ID variable. We handle the startup +# notification in the testcase from there on. +# +# This works by setting up a FIFO in which the process (started by i3) will +# echo its $DESKTOP_STARTUP_ID. We (blockingly) read the variable into +# $startup_id in the testcase. +my $tmp = tmpnam(); +mkfifo($tmp, 0600) or die "Could not create FIFO in $tmp"; + +cmd qq|exec echo \$DESKTOP_STARTUP_ID >$tmp|; + +open(my $fh, '<', $tmp); +chomp(my $startup_id = <$fh>); +close($fh); + +unlink($tmp); + +$ENV{DESKTOP_STARTUP_ID} = $startup_id; + +# Create a new libstartup-notification launchee context +init_ctx(); + +# Make sure the context was set up successfully +is(get_startup_id(), $startup_id, 'libstartup-notification returns the same id'); + +my $second_ws = fresh_workspace; + +is(@{get_ws_content($second_ws)}, 0, 'no containers on the second workspace yet'); + +my $win = open_window($x); +mark_window($win->id); + +is(@{get_ws_content($second_ws)}, 0, 'still no containers on the second workspace'); +is(@{get_ws_content($first_ws)}, 1, 'one container on the first workspace'); + +# TODO: the same thing, but in a CLIENT_LEADER situation + +###################################################################### +# 2) open another window after the startup process is completed +# (should be placed on the current workspace) +###################################################################### + +complete_startup(); +sync_with_i3($x); + +my $otherwin = open_window($x); +is(@{get_ws_content($second_ws)}, 1, 'one container on the second workspace'); + +done_testing;