summaryrefslogtreecommitdiffstats
path: root/lib/Xconfig/test.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Xconfig/test.pm')
-rw-r--r--lib/Xconfig/test.pm140
1 files changed, 140 insertions, 0 deletions
diff --git a/lib/Xconfig/test.pm b/lib/Xconfig/test.pm
new file mode 100644
index 0000000..524530b
--- /dev/null
+++ b/lib/Xconfig/test.pm
@@ -0,0 +1,140 @@
+package Xconfig::test; # $Id$
+
+use diagnostics;
+use strict;
+
+use Xconfig::card;
+use run_program;
+use common;
+use log;
+
+
+my $tmpconfig = "/tmp/Xconfig";
+
+
+sub xtest {
+ my ($display) = @_;
+ eval {
+ require xf86misc::main;
+ xf86misc::main::Xtest($display);
+ };
+}
+
+sub test {
+ my ($in, $raw_X, $card, $auto, $skip_badcard) = @_;
+
+ my $bad_card = !Xconfig::card::check_bad_card($card);
+ return 1 if $skip_badcard && $bad_card;
+
+ if ($bad_card || !$auto) {
+ $in->ask_yesorno(N("Test of the configuration"),
+ N("Do you want to test the configuration?") . ($bad_card ? "\n" . N("Warning: testing this graphic card may freeze your computer") : ''),
+ !$bad_card) or return 1;
+ }
+
+ unlink "$::prefix/tmp/.X9-lock";
+
+ #- create a link from the non-prefixed /tmp/.X11-unix/X9 to the prefixed one
+ #- that way, you can talk to :9 without doing a chroot
+ #- but take care of non X11 install :-)
+ if (-d "/tmp/.X11-unix") {
+ symlinkf "$::prefix/tmp/.X11-unix/X9", "/tmp/.X11-unix/X9" if $::prefix;
+ } else {
+ symlinkf "$::prefix/tmp/.X11-unix", "/tmp/.X11-unix" if $::prefix;
+ }
+
+ #- ensure xfs is running
+ fuzzy_pidofs(qr/\bxfs\b/) or do { run_program::rooted($::prefix, "/etc/rc.d/init.d/xfs", $_) foreach 'stop', 'start' };
+ fuzzy_pidofs(qr/\bxfs\b/) or die "xfs is not running";
+
+ my $f = $::testing ? $tmpconfig : "/etc/X11/XF86Config.test";
+ $raw_X->write("$::prefix/$f");
+
+ my $f_err = common::secured_file($::prefix . ($ENV{TMPDIR} || "$ENV{HOME}/tmp") . '/.drakx.Xoutput');
+
+ my $pid;
+ unless ($pid = fork()) {
+ system("xauth add :9 . `mcookie`");
+ open STDERR, ">$f_err";
+ chroot $::prefix if $::prefix;
+ exec 'Xorg', '-xf86config', $f, ":9" or c::_exit(0);
+ }
+
+ do { sleep 1 } until xtest(":9") || waitpid($pid, c::WNOHANG());
+
+ my $_b = before_leaving { unlink $f_err };
+
+ my $warn_error = sub {
+ my ($error_msg) = @_;
+ $in->ask_warn('', [ N("An error occurred:\n%s\nTry to change some parameters", $error_msg) ]);
+ };
+
+ if (!xtest(":9")) {
+ open(my $F, $f_err);
+
+ local $_;
+ i: while (<$F>) {
+ if (/^\(EE\)/ && !/Disabling/ || /^Fatal\b/) {
+ my @msg = !/error/ && $_;
+ local $_;
+ while (<$F>) {
+ /reporting a problem/ and last;
+ $warn_error->(join('', @msg, $_));
+ return 0;
+ }
+ }
+ }
+ }
+
+ open(my $F, "|perl 2>/dev/null");
+ printf $F q(
+ use lib qw(%s);
+ BEGIN { $::no_ugtk_init = 1 }
+ require lang;
+ require ugtk2; #- help perl_checker
+ ugtk2->import(qw(:wrappers :helpers)); #- help perl_checker
+ use interactive::gtk;
+ use run_program;
+ use common;
+
+ $::prefix = "%s";
+
+ lang::bindtextdomain();
+
+ $ENV{DISPLAY} = ":9";
+ Gtk2->init;
+
+ gtkset_background(200 * 257, 210 * 257, 210 * 257);
+ my $text = Gtk2::Label->new;
+ my $time = 12;
+ Glib::Timeout->add(1000, sub {
+ $text->set(sprintf(translate("%s"), $time));
+ $time-- or Gtk2->main_quit;
+ 1;
+ });
+
+ eval { #- eval it so that missing pixmap will not break the test completely
+ my $root = gtkroot();
+ my $gc = Gtk2::Gdk::GC->new($root);
+ my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file("$::prefix/usr/share/mdk/xfdrake/xfdrake-test-card.png");
+ my ($w, $h) = ($pixbuf->get_width, $pixbuf->get_height);
+ my $pixmap = Gtk2::Gdk::Pixmap->new($root, $w, $h, $root->get_depth);
+ $pixbuf->render_to_drawable($pixmap, $gc, 0, 0, 0, 0, $w, $h, 'none', 0, 0);
+ $root->set_back_pixmap($pixmap, 0);
+ $root->clear;
+ };
+
+ my $in = interactive::gtk->new;
+ $in->exit($in->ask_yesorno('', [ translate("%s"), $text ], 0) ? 0 : 222);
+ ), join(' ', @INC), $::prefix, N_("Leaving in %d seconds"), N_("Is this the correct setting?");
+ my $rc = close $F;
+ my $err = $?;
+
+ $rc || $err == 222 << 8 or $warn_error->('');
+
+ unlink "$::prefix/$f", "$::prefix/$f-4";
+ unlink "/tmp/.X11-unix/X9" if $::prefix;
+ kill 2, $pid;
+
+ $rc;
+}