view tests/test-oldcgi.t @ 37212:f09a2eab11cf

server: add an error feedback mechanism for when the daemon fails to launch There's a recurring problem on Windows where `hg serve -d` will randomly fail to spawn a detached process. The reason for the failure is completely hidden, and it takes hours to get a single failure on my laptop. All this does is redirect stdout/stderr of the child to a file until the lock file is freed, and then the parent dumps it out if it fails to spawn. I chose to put the output into the lock file because that is always cleaned up. There's no way to report errors after that anyway. On Windows, killdaemons.py is roughly `kill -9`, so this ensures that junk won't pile up. This may end up being a case of EADDRINUSE. At least that's what I saw spit out a few times (among other odd errors and missing output on Windows). But I also managed to get the same thing on Fedora 26 by running test-hgwebdir.t with --loop -j10 for several hours. Running `netstat` immediately after killing that run printed a wall of sockets in the TIME_WAIT state, which were gone a couple seconds later. I couldn't match up ports that failed, because --loop doesn't print out the message about the port that was used. So maybe the fix is to rotate the use of HGPORT[12] in the tests. But, let's collect some more data first.
author Matt Harbison <matt_harbison@yahoo.com>
date Wed, 28 Mar 2018 00:11:09 -0400
parents 8e6f4939a69a
children 23b749b84b8a
line wrap: on
line source

#require no-msys # MSYS will translate web paths as if they were file paths

This tests if CGI files from before d0db3462d568 still work.

  $ hg init test
  $ cat >hgweb.cgi <<HGWEB
  > #!$PYTHON
  > #
  > # An example CGI script to use hgweb, edit as necessary
  > 
  > import cgitb, os, sys
  > cgitb.enable()
  > 
  > # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
  > from mercurial import hgweb
  > 
  > h = hgweb.hgweb("test", "Empty test repository")
  > h.run()
  > HGWEB

  $ chmod 755 hgweb.cgi

  $ cat >hgweb.config <<HGWEBDIRCONF
  > [paths]
  > test = test
  > HGWEBDIRCONF

  $ cat >hgwebdir.cgi <<HGWEBDIR
  > #!$PYTHON
  > #
  > # An example CGI script to export multiple hgweb repos, edit as necessary
  > 
  > import cgitb, sys
  > cgitb.enable()
  > 
  > # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
  > from mercurial import hgweb
  > 
  > # The config file looks like this.  You can have paths to individual
  > # repos, collections of repos in a directory tree, or both.
  > #
  > # [paths]
  > # virtual/path = /real/path
  > # virtual/path = /real/path
  > #
  > # [collections]
  > # /prefix/to/strip/off = /root/of/tree/full/of/repos
  > #
  > # collections example: say directory tree /foo contains repos /foo/bar,
  > # /foo/quux/baz.  Give this config section:
  > #   [collections]
  > #   /foo = /foo
  > # Then repos will list as bar and quux/baz.
  > 
  > # Alternatively you can pass a list of ('virtual/path', '/real/path') tuples
  > # or use a dictionary with entries like 'virtual/path': '/real/path'
  > 
  > h = hgweb.hgwebdir("hgweb.config")
  > h.run()
  > HGWEBDIR

  $ chmod 755 hgwebdir.cgi

  $ . "$TESTDIR/cgienv"
  $ $PYTHON hgweb.cgi > page1
  $ $PYTHON hgwebdir.cgi > page2

  $ PATH_INFO="/test/"
  $ PATH_TRANSLATED="/var/something/test.cgi"
  $ REQUEST_URI="/test/test/"
  $ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
  $ SCRIPT_URL="/test/test/"
  $ $PYTHON hgwebdir.cgi > page3

  $ grep -i error page1 page2 page3
  [1]