From 04794000cf849e0c03a9e056222fb4758a55b04b Mon Sep 17 00:00:00 2001 From: Slaven Rezic Date: Sun, 27 Apr 2014 21:06:21 +0200 Subject: [PATCH 06/10] fix race condition in errordialog.t MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test used to fail if the afterIdle callback with the die() was executed after the checking callback. This could happen on slow (e.g. remote) X11 connections. Signed-off-by: Petr Písař --- t/errordialog.t | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/t/errordialog.t b/t/errordialog.t index 3036e5b..ffd1b71 100755 --- a/t/errordialog.t +++ b/t/errordialog.t @@ -27,21 +27,13 @@ use_ok 'Tk::ErrorDialog'; my $mw = tkinit; $mw->geometry("+10+10"); -my $errmsg = "Intentional error."; -$mw->afterIdle(sub { die "$errmsg\n" }); - my $ed; -$mw->after(100, sub { - my $dialog = search_error_dialog($mw); - isa_ok($dialog, "Tk::Dialog", "dialog"); - $ed = $dialog; - my $error_stacktrace_toplevel = search_error_stacktrace_toplevel($mw); - isa_ok($error_stacktrace_toplevel, 'Tk::ErrorDialog', 'Found stacktrace window'); - is($error_stacktrace_toplevel->state, 'withdrawn', 'Stacktrace not visible'); - $error_stacktrace_toplevel->geometry('+0+0'); # for WMs with interactive placement - $dialog->SelectButton('Stack trace'); - second_error(); - }); + +my $errmsg = "Intentional error."; +$mw->afterIdle(sub { + $mw->after(100, \&first_error); + die "$errmsg\n"; + }); $mw->after(20*1000, sub { if (Tk::Exists($mw)) { @@ -51,6 +43,19 @@ $mw->after(20*1000, sub { }); MainLoop; +# fills $ed +sub first_error { + my $dialog = search_error_dialog($mw); + isa_ok($dialog, "Tk::Dialog", "dialog"); + $ed = $dialog; + my $error_stacktrace_toplevel = search_error_stacktrace_toplevel($mw); + isa_ok($error_stacktrace_toplevel, 'Tk::ErrorDialog', 'Found stacktrace window'); + is($error_stacktrace_toplevel->state, 'withdrawn', 'Stacktrace not visible'); + $error_stacktrace_toplevel->geometry('+0+0'); # for WMs with interactive placement + $dialog->SelectButton('Stack trace'); + second_error(); +} + sub second_error { $mw->afterIdle(sub { die "$errmsg\n" }); $mw->after(100, sub { -- 1.9.3