]> git.sur5r.net Git - i3/i3/commitdiff
add testcase for the startup notification protocol
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 9 Oct 2011 23:24:29 +0000 (00:24 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 10 Oct 2011 14:54:17 +0000 (15:54 +0100)
testcases/Makefile.PL
testcases/t/175-startup-notification.t [new file with mode: 0644]

index 4b3f1ade4fc43db84c8ea7c61ef598b61d850625..da0c15707ce44b43e8cbdaa19273b2dae95dd87a 100755 (executable)
@@ -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 (file)
index 0000000..2257b3e
--- /dev/null
@@ -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 <xcb/xcb.h>
+
+#define SN_API_NOT_YET_FROZEN 1
+#include <libsn/sn-common.h>
+#include <libsn/sn-launchee.h>
+
+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;