summaryrefslogtreecommitdiff
path: root/testsuite/timeout/timeout.hs
Commit message (Collapse)AuthorAgeFilesLines
* testsuite/timeout: Fix windows specific errors.Andreas Klebinger2020-10-091-19/+22
| | | | | | | | We now seem to use -Werror there. Which caused some long standing warnings to become errors. I applied changes to remove the warnings allowing the testsuite to run on windows as well.
* Adds CTRL-C handler in Windows's timeout (trac issue #12721)ARJANEN Loïc Jean David2018-05-121-23/+32
| | | | | | | | | | | | | | | | | | | Summary: Uses Win32's System.Win32.Console.CtrlHandler.withConsoleCtrlHandler to add to Windows's version of the timeout executable a CTRL-C/CTRL-BREAK handler which does the close IO port/kill job cleanup, just in case. Signed-off-by: ARJANEN Loïc Jean David <arjanen.loic@gmail.com> Reviewers: Phyx, bgamari Reviewed By: Phyx Subscribers: dfeuer, thomie, carter GHC Trac Issues: #12721 Differential Revision: https://phabricator.haskell.org/D4631
* Fix various issues with testsuite code on WindowsTamar Christina2016-12-281-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Summary: Previously we would make direct calls to `diff` using `os.system`. On Windows `os.system` is implemented using the standard idiom `CreateProcess .. WaitForSingleObject ..`. This again runs afoul with the `_exec` behaviour on Windows. So we ran into some trouble where sometimes `diff` would return before it's done. On tests which run multiple ways, such as `8086` what happens is that we think the diff is done and continue. The next way tries to set things up again by removing any previous directory. This would then fail with and error saying the directory can't be removed. Which is true, because the previous diff code/child is still running. We shouldn't make any external calls to anything using `os.system`. Instead just use `runCmd` which uses `timeout`. This also ensures that if we hit the cygwin bug where diff or any other utility hangs, we kill it and continue and not hang the entire test and leave hanging processes. Further more we also: Ignore error lines from `removeFile` from tools in the testsuite. This is a rather large hammer to work around the fact that `hsc2hs` often tries to remove it's own file too early. When this is patched the workaround can be removed. See Trac #9775 We mark `prog003` as skip. Since this test randomly fails and passes. For stability it's disabled but it is a genuine bug which we should find. It's something with interface files being overwritten. See Trac #11317 when `rmtree` hits a readonly file, the `onerror` handler is raised afterwards but not during the tree walk. It doesn't allow you to recover and continue as we thought. Instead you have to explicitly start again. This is why sometimes even though we call `cleanup` before `os.mkdirs`, it would sometimes fail with an error that the folder already exists. So we now do a second walk. A new verbosity level (4) will strip the silent flags from `MAKE` invocations so you can actually see what's going on. Test Plan: ./validate on build bots. Reviewers: bgamari, austin Reviewed By: bgamari Subscribers: mpickering, thomie, #ghc_windows_task_force Differential Revision: https://phabricator.haskell.org/D2894 GHC Trac Issues: #12661, #11317, #9775
* Expand I/O CP in commentsJoachim Breitner2016-12-271-2/+2
| | | | | as suggested by @gracjan at https://github.com/ghc/ghc/commit/efc4a1661f0fc1004a4b7b0914f3d3a08c2e791a#commitcomment-20284337
* Allow timeout to kill entire process tree.Tamar Christina2016-12-231-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | Summary: we spawn the child processes with handle inheritance on. So they inherit the std handles. The problem is that the job handle gets inherited too. So the `JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE` doesn't get used since there are open handles to the job in the children. We then terminate the top level process which is `sh` but leaves the children around. This explicitly disallows the inheritance of the job and events handle. Test Plan: ./validate Reviewers: austin, bgamari Reviewed By: bgamari Subscribers: thomie, #ghc_windows_task_force Differential Revision: https://phabricator.haskell.org/D2895 GHC Trac Issues: #13004
* Fix testsuite threading, timeout, encoding and performance issues on WindowsTamar Christina2016-11-291-7/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In a land far far away, a project called Cygwin was born. Cygwin used newlib as it's standard C library implementation. But Cygwin wanted to emulate POSIX systems as closely as possible. So it implemented `execv` using the Windows function `spawnve`. Specifically ``` spawnve (_P_OVERLAY, path, argv, cur_environ ()) ``` `_P_OVERLAY` is crucial, as it makes the function behave *sort of* like execv on linux. the child process replaces the original process. With one major difference because of the difference in process models on Windows: the original process signals the caller that it's done. this is why the file is still locked. because it's still running, control was returned because the parent process was destroyed, but the child is still running. I think it's just pure dumb luck, that the older runtimes are slow enough to give the process time to terminate before we tried deleting the file. Which explains why you do have sporadic failures even on older runtimes like 2.5.0, of a test or two (like T7307). So this patch fixes a couple of things. I leverage the existing `timeout.exe` to implement a workaround for this issue. a) The old timeout used to start the process then assign it to the job. This is slightly faulty since child processes are only assigned to a job is their parent were assigned at the time they started. So this was a race condition. I now create the process suspended, assign it to the job and then resume it. Which means all child processes are not running under the same job. b) First things, Is to prevent dangling child processes. I mark the job with `JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE` so when the last process in the job is done, it insures all processes under the job are killed. c) Secondly, I change the way we wait for results. Instead of waiting for the parent process to terminate, I wait for the job itself to terminate. There's a slight subtlety there, we can't wait on the job itself. Instead we have to create an I/O Completion port and wait for signals on it. See https://blogs.msdn.microsoft.com/oldnewthing/20130405-00/?p=4743 This fixes the issues on all runtimes for me and makes T7307 pass consistenly. The threading was also simplified by hiding all the locking in a single semaphore and a completion class. Futhermore some additional error reporting was added. For encoding the testsuite now no longer passes a file handle to the subprocess since on windows, sh.exe seems to acquire a lock on the file that is not released in a timely fashion. I suspect this because cygwin seems to emulate console handles by creating file handles and using those for std handles. So when we give it an existing file handle it just locks the file. I what's happening is that it's not releasing the handle until all shared cygwin processes are dead. Which explains why it worked in single threaded mode. So now instead we pass a pipe and do not interpret the resulting data. Any bytes written to stdin or read out of stdout/stderr are done so in binary mode and we do not interpret the data. The reason for this is that we have encoding tests in GHC which pass invalid utf-8. If we try to handle the data as text then python will throw an exception instead of a test comparison failing. Also I have fixed the ability to override `PYTHON` when calling `make tests`. This now works the same as with `.\validate`. Finally, after cleaning up the locks I was able to make the abort behavior work correctly as I believe it was intended: when you press Ctrl+C and send an interrupt signal, the testsuite finishes the active tests and then gracefully exits showing you a report of the progress it did make. So using Ctrl+C will not just *die* as it did before. These changes lift the restriction on which python version you use (msys/mingw) or which runtime or python 3 or python 2. All combinations should now be supported. Test Plan: PATH=/usr/local/bin:/mingw64/bin:$APPDATA/cabal/bin:$PATH && PYTHON=/usr/bin/python THREADS=9 make test THREADS=9 make test PATH=/usr/local/bin:/mingw64/bin:$APPDATA/cabal/bin:$PATH && PYTHON=/usr/bin/python ./validate --quiet --testsuite-only Reviewers: erikd, RyanGlScott, bgamari, austin Subscribers: jrtc27, mpickering, thomie, #ghc_windows_task_force Differential Revision: https://phabricator.haskell.org/D2684 GHC Trac Issues: #12725, #12554, #12661, #12004
* testsuite/timeout: Ensure that processes are cleaned up on WindowsBen Gamari2016-10-171-16/+19
| | | | | | | | | | | | | | Previously if the test is interrupted (e.g. with Ctrl-C) any processes which it spawned may not be properly terminated. Here we catch any exception and ensure that we job is terminated. Test Plan: Validate on Windows Reviewers: Phyx, austin Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D2599
* Testsuite: do not print timeout messageThomas Miedema2016-06-281-6/+1
| | | | | This is a followup to e1293bbfb1fa1fdeb56446a7b957d6f628042e71, but then for Windows timeout.
* testsuite: Show killed command line on timeoutBen Gamari2015-07-211-4/+4
|
* Remove the definition of die, which is now provided by System.ExitSimon Peyton Jones2014-04-281-4/+0
|
* Fix the timeout program following the changes to baseIan Lynagh2012-06-201-2/+0
|
* cleaning of testsuiteDavid Terei2011-11-151-1/+2
|
* Fix passing spaces to tests on Windows, and add a test for itIan Lynagh2011-10-181-2/+6
|
* Add some diagnostics to timeoutIan Lynagh2009-10-131-3/+9
|
* Do not use System.Process on Posix systemsSimon Marlow2008-12-221-27/+27
| | | | | | We were using System.Process.Internals, which isn't safe in general. Also, when the child process dies with a signal, we now raise the same signal ourselves.
* Change the timeout program to use exceptions properlyIan Lynagh2008-08-031-19/+30
| | | | We now don't eat any type of exception, e.g. the user pressing ^C
* Follow extensible exception changesIan Lynagh2008-06-231-6/+7
|
* Fix #1599: Improve timeout on WindowsIan Lynagh2008-01-201-43/+52
| | | | | We now run programs in a Job, which means that we can kill a process and all of its children when a timeout happens.
* Print something to stderr when a timeout happensIan Lynagh2007-03-041-109/+111
| | | | Also fixes whitespace.
* Allow testsuite to run under MSYS/MinGW using native Python (not Cygwin Python).brianlsmith2006-09-171-2/+5
| | | | | | | | | | | | | This patch is based on a similar one "Enable timeout in Windows and don't require cygwin python" by Esa Ilari Vuokko. It seems like timeout is always built on Windows so I rearranged the logic there to make the code clearer, Esa's patch required the user to uncomment the MinGW-specific logic in order for it to work; this patch does not have the MinGW-specific logic commented out. I tested this on the trunk in Ubuntu 6.06 on i686 (VMWare). I tested this on the trunk and ghc-6.6 branch on Windows i686.
* attempt to work around restrictions with fork() & pthreadsSimon Marlow2006-03-231-5/+12
| | | | | | | | | In the child process, call exec() directly instead of using System.Cmd.system, which involves another fork()/exec() and a non-blocking wait. The problem is that in a forked child of a threaded process, it isn't safe to do much except exec() according to POSIX. In fact calling pthread_create() in the child causes the pthread library to fail with an error on FreeBSD.
* [project @ 2005-11-23 11:47:16 by simonmar]simonmar2005-11-231-10/+11
| | | | Fix up to compile after recent changes to System.Process.Internals
* [project @ 2005-11-11 12:02:40 by simonmar]simonmar2005-11-111-5/+34
| | | | Make it work on Windows again.
* [project @ 2005-08-04 12:22:17 by simonmar]simonmar2005-08-041-25/+69
| | | | | | | | | | | | A better timeout. This one starts a new session for the child process, and attempts to kill the entire group when the time expires (previously we only killed the direct child, if the child itself had spawned more processes these would continue to run). The new scheme is only for Unix, presumably we have to do something different on Windows. Code partly from Ian Lynagh.
* [project @ 2005-02-04 10:59:55 by simonmar]simonmar2005-02-041-0/+25
Add a timeout to test runs, using a wrapper program (written in Haskell, using System.Process of course!).