tests/test-newercgi.t
author Gregory Szorc <gregory.szorc@gmail.com>
Fri, 13 Apr 2018 11:02:34 -0700
changeset 37631 2f626233859b
parent 33262 8e6f4939a69a
child 39637 23b749b84b8a
permissions -rw-r--r--
wireproto: implement batching on peer executor interface This is a bit more complicated than non-batch requests because we need to buffer sends until the last request arrives *and* we need to support resolving futures as data arrives from the remote. In a classical concurrent.futures executor model, the future "starts" as soon as it is submitted. However, we have nothing to start until the last command is submitted. If we did nothing, calling result() would deadlock, since the future hasn't "started." So in the case where we queue the command, we return a special future type whose result() will trigger sendcommands(). This eliminates the deadlock potential. It also serves as a check against callers who may be calling result() prematurely, as it will prevent any subsequent callcommands() from working. This behavior is slightly annoying and a bit restrictive. But it's the world that half duplex connections forces on us. In order to support streaming responses, we were previously using a generator. But with a futures-based API, we're using futures and not generators. So in order to get streaming, we need a background thread to read data from the server. The approach taken in this patch is to leverage the ThreadPoolExecutor from concurrent.futures for managing a background thread. We create an executor and future that resolves when all response data is processed (or an error occurs). When exiting the context manager, we wait on that background reading before returning. I was hoping we could manually spin up a threading.Thread and this would be simple. But I ran into a few deadlocks when implementing. After looking at the source code to concurrent.futures, I figured it would just be easier to use a ThreadPoolExecutor than implement all the code needed to manually manage a thread. To prove this works, a use of the batch API in discovery has been updated. Differential Revision: https://phab.mercurial-scm.org/D3269
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22046
7a9cbb315d84 tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com>
parents: 15567
diff changeset
     1
#require no-msys # MSYS will translate web paths as if they were file paths
15567
8b84d040d9f9 tests: introduce 'hghave msys' to skip tests that would fail because of msys
Mads Kiilerich <mads@kiilerich.com>
parents: 13269
diff changeset
     2
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     3
This is a rudimentary test of the CGI files as of d74fc8dec2b4.
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     4
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     5
  $ hg init test
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     6
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     7
  $ cat >hgweb.cgi <<HGWEB
32956
b6776b34e44e tests: use $PYTHON in #! so we always use the right Python
Augie Fackler <augie@google.com>
parents: 22046
diff changeset
     8
  > #!$PYTHON
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     9
  > #
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    10
  > # An example CGI script to use hgweb, edit as necessary
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    11
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    12
  > import cgitb
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    13
  > cgitb.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    14
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    15
  > from mercurial import demandimport; demandimport.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    16
  > from mercurial.hgweb import hgweb
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    17
  > from mercurial.hgweb import wsgicgi
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    18
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    19
  > application = hgweb("test", "Empty test repository")
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    20
  > wsgicgi.launch(application)
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    21
  > HGWEB
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    22
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    23
  $ chmod 755 hgweb.cgi
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    24
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    25
  $ cat >hgweb.config <<HGWEBDIRCONF
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    26
  > [paths]
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    27
  > test = test
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    28
  > HGWEBDIRCONF
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    29
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    30
  $ cat >hgwebdir.cgi <<HGWEBDIR
32956
b6776b34e44e tests: use $PYTHON in #! so we always use the right Python
Augie Fackler <augie@google.com>
parents: 22046
diff changeset
    31
  > #!$PYTHON
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    32
  > #
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    33
  > # An example CGI script to export multiple hgweb repos, edit as necessary
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    34
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    35
  > import cgitb
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    36
  > cgitb.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    37
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    38
  > from mercurial import demandimport; demandimport.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    39
  > from mercurial.hgweb import hgwebdir
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    40
  > from mercurial.hgweb import wsgicgi
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    41
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    42
  > application = hgwebdir("hgweb.config")
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    43
  > wsgicgi.launch(application)
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    44
  > HGWEBDIR
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    45
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    46
  $ chmod 755 hgwebdir.cgi
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    47
13269
aa3f726a2bdb tests: remove duplication of the CGI environment variables
StevenGBrown
parents: 12471
diff changeset
    48
  $ . "$TESTDIR/cgienv"
33262
8e6f4939a69a tests: replace yet more calls to `python` with $PYTHON
Augie Fackler <augie@google.com>
parents: 32956
diff changeset
    49
  $ $PYTHON hgweb.cgi > page1
8e6f4939a69a tests: replace yet more calls to `python` with $PYTHON
Augie Fackler <augie@google.com>
parents: 32956
diff changeset
    50
  $ $PYTHON hgwebdir.cgi > page2
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    51
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    52
  $ PATH_INFO="/test/"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    53
  $ PATH_TRANSLATED="/var/something/test.cgi"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    54
  $ REQUEST_URI="/test/test/"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    55
  $ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    56
  $ SCRIPT_URL="/test/test/"
33262
8e6f4939a69a tests: replace yet more calls to `python` with $PYTHON
Augie Fackler <augie@google.com>
parents: 32956
diff changeset
    57
  $ $PYTHON hgwebdir.cgi > page3
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    58
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    59
  $ grep -i error page1 page2 page3
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    60
  [1]