tests/test-clone-cgi.t
author Gregory Szorc <gregory.szorc@gmail.com>
Sat, 14 Apr 2018 16:36:15 -0700
changeset 37711 65a23cc8e75b
parent 37668 2a42ca2679e2
child 39707 5abc47d4ca6b
permissions -rw-r--r--
cborutil: implement support for streaming encoding, bytestring decoding The vendored cbor2 package is... a bit disappointing. On the encoding side, it insists that you pass it something with a write() to send data to. That means if you want to emit data to a generator, you have to construct an e.g. io.BytesIO(), write() to it, then get the data back out. There can be non-trivial overhead involved. The encoder also doesn't support indefinite types - bytestrings, arrays, and maps that don't have a known length. Again, this is really unfortunate because it requires you to buffer the entire source and destination in memory to encode large things. On the decoding side, it supports reading indefinite length types. But it buffers them completely before returning. More sadness. This commit implements "streaming" encoders for various CBOR types. Encoding emits a generator of hunks. So you can efficiently stream encoded data elsewhere. It also implements support for emitting indefinite length bytestrings, arrays, and maps. On the decoding side, we only implement support for decoding an indefinite length bytestring from a file object. It will emit a generator of raw chunks from the source. I didn't want to reinvent so many wheels. But profiling the wire protocol revealed that the overhead of constructing io.BytesIO() instances to temporarily hold results has a non-trivial overhead. We're talking >15% of execution time for operations like "transfer the fulltexts of all files in a revision." So I can justify this effort. Fortunately, CBOR is a relatively straightforward format. And we have a reference implementation in the repo we can test against. Differential Revision: https://phab.mercurial-scm.org/D3303
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22046
7a9cbb315d84 tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com>
parents: 18552
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
12410
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
     3
This is a test of the wire protocol over CGI-based hgweb.
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
     4
initialize repository
6922
1ec2d227a521 hgweb: fix WSGI iterators handling in CGI adapter (issue1254)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     5
12410
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
     6
  $ hg init test
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
     7
  $ cd test
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
     8
  $ echo a > a
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
     9
  $ hg ci -Ama
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    10
  adding a
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    11
  $ cd ..
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    12
  $ cat >hgweb.cgi <<HGWEB
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    13
  > #
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    14
  > # An example CGI script to use hgweb, edit as necessary
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    15
  > import cgitb
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    16
  > cgitb.enable()
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    17
  > from mercurial import demandimport; demandimport.enable()
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    18
  > from mercurial.hgweb import hgweb
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    19
  > from mercurial.hgweb import wsgicgi
37668
2a42ca2679e2 py3: add b'' prefixes to make values bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33262
diff changeset
    20
  > application = hgweb(b"test", b"Empty test repository")
12410
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    21
  > wsgicgi.launch(application)
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    22
  > HGWEB
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    23
  $ chmod 755 hgweb.cgi
6922
1ec2d227a521 hgweb: fix WSGI iterators handling in CGI adapter (issue1254)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    24
12410
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    25
try hgweb request
6922
1ec2d227a521 hgweb: fix WSGI iterators handling in CGI adapter (issue1254)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    26
13269
aa3f726a2bdb tests: remove duplication of the CGI environment variables
StevenGBrown
parents: 12410
diff changeset
    27
  $ . "$TESTDIR/cgienv"
12410
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    28
  $ QUERY_STRING="cmd=changegroup&roots=0000000000000000000000000000000000000000"; export QUERY_STRING
33262
8e6f4939a69a tests: replace yet more calls to `python` with $PYTHON
Augie Fackler <augie@google.com>
parents: 32940
diff changeset
    29
  $ $PYTHON hgweb.cgi >page1 2>&1
32940
75be14993fda cleanup: use $PYTHON to run python in many more tests
Augie Fackler <augie@google.com>
parents: 22046
diff changeset
    30
  $ $PYTHON "$TESTDIR/md5sum.py" page1
12410
2bfb335c7594 tests: unify test-clone-cgi
Matt Mackall <mpm@selenic.com>
parents: 11584
diff changeset
    31
  1f424bb22ec05c3c6bc866b6e67efe43  page1
18552
e8efcc8ff5c0 hgweb.cgi: fix internal WSGI emulation (issue3804)
Mads Kiilerich <madski@unity3d.com>
parents: 15567
diff changeset
    32
e8efcc8ff5c0 hgweb.cgi: fix internal WSGI emulation (issue3804)
Mads Kiilerich <madski@unity3d.com>
parents: 15567
diff changeset
    33
make sure headers are sent even when there is no body
e8efcc8ff5c0 hgweb.cgi: fix internal WSGI emulation (issue3804)
Mads Kiilerich <madski@unity3d.com>
parents: 15567
diff changeset
    34
33262
8e6f4939a69a tests: replace yet more calls to `python` with $PYTHON
Augie Fackler <augie@google.com>
parents: 32940
diff changeset
    35
  $ QUERY_STRING="cmd=listkeys&namespace=nosuchnamespace" $PYTHON hgweb.cgi
18552
e8efcc8ff5c0 hgweb.cgi: fix internal WSGI emulation (issue3804)
Mads Kiilerich <madski@unity3d.com>
parents: 15567
diff changeset
    36
  Status: 200 Script output follows\r (esc)
e8efcc8ff5c0 hgweb.cgi: fix internal WSGI emulation (issue3804)
Mads Kiilerich <madski@unity3d.com>
parents: 15567
diff changeset
    37
  Content-Type: application/mercurial-0.1\r (esc)
e8efcc8ff5c0 hgweb.cgi: fix internal WSGI emulation (issue3804)
Mads Kiilerich <madski@unity3d.com>
parents: 15567
diff changeset
    38
  Content-Length: 0\r (esc)
e8efcc8ff5c0 hgweb.cgi: fix internal WSGI emulation (issue3804)
Mads Kiilerich <madski@unity3d.com>
parents: 15567
diff changeset
    39
  \r (esc)