1. 09 Dec, 2016 1 commit
    • Rufflewind's avatar
      testsuite: make tests respond to SIGINT properly · ca593c7d
      Rufflewind authored
      The `std*_buffer` need to be bytes to avoid breaking Python 3.
      
      Also, using a blanket `except` in Python without specifying the
      exception types will catch special exceptions such as
      `KeyboardInterrupt`, which can prevent the program from being
      interrupted properly.
      
      Test Plan: validate
      
      Reviewers: thomie, austin, bgamari
      
      Reviewed By: bgamari
      
      Differential Revision: https://phabricator.haskell.org/D2805
      ca593c7d
  2. 01 Dec, 2016 1 commit
  3. 30 Nov, 2016 2 commits
    • Ben Gamari's avatar
      testsuite: Use python3 by default · 605bb9b4
      Ben Gamari authored
      Summary:
      It turns out that Phyx's fix for #12554 (D2684) still fails with mingw-w64
      python 2.7. However, Python 3 (both msys2 and mingw-w64) work fine. Given that
      supporting Python 2 has already become rather tiresome (as @thomie warned it
      would), let's just move to python3 by default.
      
      Test Plan: Validate
      
      Reviewers: austin, Phyx
      
      Reviewed By: Phyx
      
      Subscribers: Phyx, thomie
      
      Differential Revision: https://phabricator.haskell.org/D2766
      
      GHC Trac Issues: #12554
      605bb9b4
    • Tamar Christina's avatar
      Fix testsuite threading, timeout, encoding and performance issues on Windows · 0ce59be3
      Tamar Christina authored
      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
      0ce59be3
  4. 25 Nov, 2016 1 commit
  5. 17 Nov, 2016 2 commits
    • Ben Gamari's avatar
      testsuite: Rip out hack for #12554 · 4d4f3533
      Ben Gamari authored
      @Phyx is working on correctly fixing (pun intended) the underlying issue
      that prompted this hack. It turns out that `timeout` it the culprit.
      Moreover, this hack breaks on msys python builds, which don't export
      `WindowsError`.
      
      Test Plan: Validate on Windows with `msys` python.
      
      Reviewers: Phyx, austin
      
      Subscribers: thomie, Phyx
      
      Differential Revision: https://phabricator.haskell.org/D2724
      
      GHC Trac Issues: #12554
      4d4f3533
    • Edward Z. Yang's avatar
      Test for type synonym loops on TyCon. · 31398fbc
      Edward Z. Yang authored
      
      
      Summary:
      Previously, we tested for type synonym loops by doing
      a syntactic test on the literal type synonym declarations.
      However, in some cases, loops could go through hs-boot
      files, leading to an infinite loop (#12042); a similar
      situation can occur when signature merging.
      
      This commit replaces the syntactic test with a test on
      TyCon, simply by walking down all type synonyms until
      we bottom out, or find we've looped back.  It's a lot
      simpler.
      Signed-off-by: default avatarEdward Z. Yang <ezyang@cs.stanford.edu>
      
      Test Plan: validate
      
      Reviewers: simonpj, austin, bgamari
      
      Subscribers: goldfire, thomie
      
      Differential Revision: https://phabricator.haskell.org/D2656
      
      GHC Trac Issues: #12042
      31398fbc
  6. 16 Nov, 2016 1 commit
  7. 02 Nov, 2016 1 commit
    • Ben Gamari's avatar
      testsuite: Simplify kernel32 glue logic · cc4710af
      Ben Gamari authored
      On Windows the testsuite driver calls kernel32 to set the current
      terminal codepage. The previous implementation of this was significantly
      more complex than necessary, and was wrong in the case of MSYS2, which
      requires that we explicitly load the library using the name of its
      DLL, including its file extension.
      
      Test Plan: Validate on Windows
      
      Reviewers: austin, RyanGlScott, Phyx
      
      Reviewed By: RyanGlScott, Phyx
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D2641
      
      GHC Trac Issues: #12661
      cc4710af
  8. 19 Oct, 2016 1 commit
  9. 18 Oct, 2016 1 commit
  10. 17 Oct, 2016 4 commits
    • Ben Gamari's avatar
      testsuite/driver: Allow threading on Windows · 2864ad79
      Ben Gamari authored
      It seems that threading now works fine. The only caveat here is that it
      makes some race conditions more likely (e.g. #12554), although these
      also appear to affect single-threaded runs.
      
      Test Plan: Validate on Windows
      
      Reviewers: austin, Phyx
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D2600
      
      GHC Trac Issues: #10510
      2864ad79
    • Ben Gamari's avatar
      testsuite/driver: More Unicode awareness · 7d2df320
      Ben Gamari authored
      Explicitly specify utf8 encoding in a few spots which were failing on
      Windows with Python 3.
      
      Test Plan: Validate
      
      Reviewers: austin, thomie
      
      Differential Revision: https://phabricator.haskell.org/D2602
      
      GHC Trac Issues: #9184
      7d2df320
    • Ben Gamari's avatar
      testsuite/driver: Never symlink on Windows · 8bb960ef
      Ben Gamari authored
      While msys' mingw Python 3 does indeed export `os.symlink`, it is
      unusable since creating symbolic links on Windows requires permissions
      that essentially no one has.
      
      Test Plan: Validate on Windows
      
      Reviewers: austin, Phyx, thomie
      
      Differential Revision: https://phabricator.haskell.org/D2604
      8bb960ef
    • Ben Gamari's avatar
      testsuite: Work around #12554 · 9cb44598
      Ben Gamari authored
      It seems that Python 2.7.11 and "recent" msys2 releases are broken,
      holding open file locks unexpected. This causes rmtree to intermittently
      fail. Even worse, it would fail silently (since we pass
      ignore_errors=True), causing makedirs to fail later.
      
      We now explicitly check for the existence of the test directory before
      attempting to delete it and disable ignore_errors. Moreover, on Windows
      we now try multiple times to rmtree the testdir, working around the
      apparently msys bug.
      
      This is all just terrible, but Phyx and I spent several hours trying to
      track down the issue to no available. The workaround is better than
      nothing.
      9cb44598
  11. 08 Oct, 2016 2 commits
  12. 01 Oct, 2016 1 commit
    • Ryan Scott's avatar
      Implement deriving strategies · 9e862765
      Ryan Scott authored
      Allows users to explicitly request which approach to `deriving` to use
      via keywords, e.g.,
      
      ```
      newtype Foo = Foo Bar
        deriving Eq
        deriving stock    Ord
        deriving newtype Show
      ```
      
      Fixes #10598. Updates haddock submodule.
      
      Test Plan: ./validate
      
      Reviewers: hvr, kosmikus, goldfire, alanz, bgamari, simonpj, austin,
      erikd, simonmar
      
      Reviewed By: alanz, bgamari, simonpj
      
      Subscribers: thomie, mpickering, oerjan
      
      Differential Revision: https://phabricator.haskell.org/D2280
      
      GHC Trac Issues: #10598
      9e862765
  13. 04 Sep, 2016 1 commit
  14. 31 Aug, 2016 1 commit
  15. 21 Aug, 2016 2 commits
    • Edward Z. Yang's avatar
      We also need to retypecheck before when we do parallel make. · e528061e
      Edward Z. Yang authored
      
      
      Summary:
      Kept this seperate from the previous patch for clarity.
      Comes with a test.
      Signed-off-by: default avatarEdward Z. Yang <ezyang@cs.stanford.edu>
      
      Test Plan: validate
      
      Reviewers: simonpj, austin, bgamari
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D2220
      
      GHC Trac Issues: #12035
      e528061e
    • Edward Z. Yang's avatar
      Axe initIfaceTc, tie the knot through HPT (or if_rec_types). · e907e1f1
      Edward Z. Yang authored
      
      
      Summary:
      initIfaceTc was originally used to make sure when we typecheck
      an interface, it can find the TyThings for things it itself
      defined.  However, in the case of retypecheckLoop, this wasn't
      necessary because we ALREADY tied the knot through the HPT.
      
      This commit removes initIfaceTc, instead relying on the HPT
      to tie the knot.  genModDetails' caller needed to be modified
      to tie the knot, but there are not that many call-sites of
      typecheckIface so the change is quite reasonable.
      
      We also introduce a new 'initIfaceLoad', which does
      NOT set up 'if_rec_types'.  It's used when we're
      typechecking old, up-to-date interfaces in, since we're
      never going to update the type environment.
      
      The full details are in Note [Knot-tying typecheckIface].
      Displeasingly, we need a special case to handle DFuns in
      the case of tcHiBootIface, see
      Note [DFun knot-tying special case] for the gory details.
      
      I also added another test which tickles a bug in a buggy
      version of this patch (see "Why the seq?")
      Signed-off-by: default avatarEdward Z. Yang <ezyang@cs.stanford.edu>
      
      Test Plan: validate
      
      Reviewers: simonpj, austin, bgamari
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D2349
      e907e1f1
  16. 05 Aug, 2016 1 commit
  17. 30 Jun, 2016 2 commits
    • niteria's avatar
      Add a new determinism test · 9854f14e
      niteria authored
      This is one of the testcases that I forgot to commit
      9854f14e
    • thomie's avatar
      Testsuite: do not depend on sys.stdout.encoding · e8d62711
      thomie authored
      The cause of #12213 is in dump_stdout and dump_stderr:
      
            print(read_no_crs(<filename>))
      
      Commit 6f6f5154 changed read_no_crs to
      return a unicode string. Printing a unicode strings works fine as long
      as sys.stdout.encoding is 'UTF-8'.
      
      There are two reasons why sys.stdout.encoding might not be 'UTF-8'.
      
      * When output is going to a file, sys.stdout and sys.stdout do not respect
        the locale:
      
        $ LC_ALL=en_US.utf8 python -c 'import sys; print(sys.stderr.encoding)'
        UTF-8
        $ LC_ALL=en_US.utf8 python -c 'import sys; print(sys.stderr.encoding)' 2>/dev/null
        None
      
      * When output is going to the terminal, explicitly reopening sys.stdout has
        the side-effect of changing sys.stdout.encoding from 'UTF-8' to 'None'.
      
            sys.stdout = os.fdopen(sys.__stdout__.fileno(), "w", 0)
      
        We currently do this to set a buffersize of 0 (the actual
        buffersize used is irrelevant for the sys.stdout.encoding problem).
      
      Solution: fix dump_stdout and dump_stderr to not use read_no_crs.
      e8d62711
  18. 29 Jun, 2016 2 commits
  19. 28 Jun, 2016 4 commits
    • thomie's avatar
      Testsuite: framework failure improvements (#11165) · 782cacf5
      thomie authored
      * add framework failures to unexpected results list
      * report errors in .T files as framework failures (show in summary)
      * don't report missing tests when framework failures in .T files
      782cacf5
    • thomie's avatar
      Testsuite: cleanup printing of summary · d8e9b876
      thomie authored
      Just use a simple list of tuples, instead of a nested map.
      
      -90 lines of code.
      d8e9b876
    • thomie's avatar
      Testsuite: open/close stdin/stdout/stderr explicitly · 58f0086b
      thomie authored
      This allows run_command's to contain `|`, and `no_stdin` isn't necessary
      anymore.
      
      Unfortunately it doesn't fix T7037 on Windows which I had hoped it would
      (testsuite driver tries to read a file that it just created itself, but
      the OS says it doesn't exist).
      
      The only drawback of this commit is that the command that the testsuite
      prints to the terminal (for debugging purposes) doesn't mention the
      files that stdout and stderr are redirected to anymore. This is probably
      ok.
      
      Update submodule unix.
      
      Differential Revision: https://phabricator.haskell.org/D1234
      58f0086b
    • thomie's avatar
      Testsuite: simplify extra_file handling · 206b4a1d
      thomie authored
      Before, `extra_files(['.hpc/Main.mix'])` meant copy `Main.mix` to
      `<testdir>/.hpc/Main.mix`. This feature wasn't really necessary, so now
      it just means copy `Main.mix` to `<testdir>/Main.mix`. This simplifies
      the implementation.
      
      Some small other cleanups as well. -40 lines of code.
      206b4a1d
  20. 27 Jun, 2016 3 commits
  21. 24 Jun, 2016 1 commit
  22. 20 Jun, 2016 5 commits