diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-07-28 21:22:40 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-08-02 15:09:32 +1000 |
commit | 91f6d649ae6151fd410511dc4c2117be87705dc3 (patch) | |
tree | 9628398bed9cef4f5abdc63f8d215a0c28867c17 | |
parent | d93d105a068ac5444c8633dd2f37633725d00c08 (diff) |
XST: implement a simple xinit equivalent
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | ILTest/XST/xinit.pm | 102 |
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: |