summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-07-28 21:22:40 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-08-02 15:09:32 +1000
commit91f6d649ae6151fd410511dc4c2117be87705dc3 (patch)
tree9628398bed9cef4f5abdc63f8d215a0c28867c17
parentd93d105a068ac5444c8633dd2f37633725d00c08 (diff)
XST: implement a simple xinit equivalent
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--ILTest/XST/xinit.pm102
1 files changed, 102 insertions, 0 deletions
diff --git a/ILTest/XST/xinit.pm b/ILTest/XST/xinit.pm
index b580e7d..77030a5 100644
--- a/ILTest/XST/xinit.pm
+++ b/ILTest/XST/xinit.pm
@@ -19,15 +19,117 @@
# Authors: Peter Hutterer <peter.hutterer@redhat.com>
+=head1 NAME
+
+ILtest::XST::xinit - ILTest X.Org X server starter
+
+=head1 DESCRIPTION
+
+This ILTest::TestCase starts an X Server in the C<run> phase and shuts it
+down again in the C<post> phase. If another server is already running,
+C<pre> fails.
+
+=cut
+
package ILTest::XST::xinit;
use ILTest::TestCase;
+use ILTest::Error;
+use POSIX ":sys_wait_h";
use warnings;
use strict;
+my @xserver_params = ("-retro", ":0");
our @ISA = qw(ILTest::TestCase);
+sub pre {
+ my $self = shift;
+
+ if ($self->already_running) {
+ return ILTest::Error->new(msg => "An X server seems to be running already.\n");
+ }
+
+ $self->iltest->file_backup("/etc/X11/xorg.conf");
+
+ return undef;
+}
+
+sub run {
+ my $self = shift;
+ my $rc;
+
+ $rc = $self->start_server;
+ return $rc if defined $rc;
+
+ return undef;
+}
+
+sub post {
+ my $self = shift;
+ my $xserver_pid = $self->{xserver_pid};
+
+ if ($xserver_pid) {
+ kill 15, $xserver_pid;
+ waitpid($xserver_pid, WNOHANG);
+ my $i = 0;
+ my $status;
+ do {
+ $status = kill 0, $xserver_pid;
+ waitpid($xserver_pid, WNOHANG);
+ } while ($i < 5 && $status); # give it 5 sec to shut down
+ if ($i >= 5) {
+ kill 9, $xserver_pid;
+ }
+ undef $self->{xserver_pid};
+ }
+
+ $self->iltest->file_restore("/etc/X11/xorg.conf");
+
+ return undef;
+}
+
+sub already_running {
+ my $self = shift;
+
+ my $pid = `pidof Xorg`;
+
+ return ($pid ne "");
+}
+
+sub start_server {
+ my $self = shift;
+ my $xserver_pid = fork;
+
+ # Parent
+ if ($xserver_pid) {
+ my $i = 0;
+ my $status;
+ do {
+ sleep 1;
+ $status = kill 0, $xserver_pid;
+ } while ($i++ < 5 && !$status);
+
+ if (!$status) {
+ return ILTest::Error->new(msg => "Failed to start X Server.\n");
+ }
+
+ $self->{xserver_pid} = $xserver_pid;
+ $self->iltest->println(8, "XServer pid: $xserver_pid\n");
+ return undef;
+ }
+
+ my $cmd = "Xorg ";
+ for (@xserver_params) {
+ $cmd .= " $_";
+ }
+ $self->iltest->println(6, $cmd);
+
+ # child
+ open STDERR, '>', '/dev/null';
+ exec "Xorg", @xserver_params;
+}
+
1;
# vim: set noexpandtab shiftwidth=8 tabstop=8: