tests/test-archive-symlinks.t
author Gregory Szorc <gregory.szorc@gmail.com>
Tue, 28 Aug 2018 15:02:48 -0700
changeset 39411 aeb551a3bb8a
parent 29844 c4d03b6d9576
permissions -rw-r--r--
cborutil: implement sans I/O decoder The vendored CBOR package decodes by calling read(n) on an object. There are a number of disadvantages to this: * Uses blocking I/O. If sufficient data is not available, the decoder will hang until it is. * No support for partial reads. If the read(n) returns less data than requested, the decoder raises an error. * Requires the use of a file like object. If the original data is in say a buffer, we need to "cast" it to e.g. a BytesIO to appease the decoder. In addition, the vendored CBOR decoder doesn't provide flexibility that we desire. Specifically: * It buffers indefinite length bytestrings instead of streaming them. * It doesn't allow limiting the set of types that can be decoded. This property is useful when implementing a "hardened" decoder that is less susceptible to abusive input. * It doesn't provide sufficient "hook points" and introspection to institute checks around behavior. These are useful for implementing a "hardened" decoder. This all adds up to a reasonable set of justifications for writing our own decoder. So, this commit implements our own CBOR decoder. At the heart of the decoder is a function that decodes a single "item" from a buffer. This item can be a complete simple value or a special value, such as "start of array." Using this function, we can build a decoder that effectively iterates over the stream of decoded items and builds up higher-level values, such as arrays, maps, sets, and indefinite length bytestrings. And we can do this without performing I/O in the decoder itself. The core of the sans I/O decoder will probably not be used directly. Instead, it is expected that we'll build utility functions for invoking the decoder given specific input types. This will allow extreme flexibility in how data is delivered to the decoder. I'm pretty happy with the state of the decoder modulo the TODO items to track wanted features to help with a "hardened" decoder. The one thing I could be convinced to change is the handling of semantic tags. Since we only support a single semantic tag (sets), I thought it would be easier to handle them inline in decodeitem(). This is simpler now. But if we add support for other semantic tags, it will likely be easier to move semantic tag handling outside of decodeitem(). But, properly supporting semantic tags opens up a whole can of worms, as many semantic tags imply new types. I'm optimistic we won't need these in Mercurial. But who knows. I'm also pretty happy with the test coverage. Writing comprehensive tests for partial decoding did flush out a handful of bugs. One general improvement to testing would be fuzz testing for partial decoding. I may implement that later. I also anticipate switching the wire protocol code to this new decoder will flush out any lingering bugs. Differential Revision: https://phab.mercurial-scm.org/D4414
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22046
7a9cbb315d84 tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com>
parents: 21216
diff changeset
     1
#require symlink
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
     2
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
     3
  $ origdir=`pwd`
4831
6f08bc1bd00b archive: add symlink support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
     4
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
     5
  $ hg init repo
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
     6
  $ cd repo
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
     7
  $ ln -s nothing dangling
4831
6f08bc1bd00b archive: add symlink support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
     8
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
     9
avoid tar warnings about old timestamp
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    10
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    11
  $ hg ci -d '2000-01-01 00:00:00 +0000' -qAm 'add symlink'
4831
6f08bc1bd00b archive: add symlink support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
    12
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    13
  $ hg archive -t files ../archive
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    14
  $ hg archive -t tar -p tar ../archive.tar
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    15
  $ hg archive -t zip -p zip ../archive.zip
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    16
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    17
files
4831
6f08bc1bd00b archive: add symlink support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
    18
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    19
  $ cd "$origdir"
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    20
  $ cd archive
25472
4d2b9b304ad0 tests: drop explicit $TESTDIR from executables
Matt Mackall <mpm@selenic.com>
parents: 22046
diff changeset
    21
  $ readlink.py dangling
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    22
  dangling -> nothing
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    23
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    24
tar
4831
6f08bc1bd00b archive: add symlink support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
    25
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    26
  $ cd "$origdir"
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    27
  $ tar xf archive.tar
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    28
  $ cd tar
25472
4d2b9b304ad0 tests: drop explicit $TESTDIR from executables
Matt Mackall <mpm@selenic.com>
parents: 22046
diff changeset
    29
  $ readlink.py dangling
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    30
  dangling -> nothing
4831
6f08bc1bd00b archive: add symlink support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
    31
29844
c4d03b6d9576 tests: guard test-archive-symlink with unziplinks check
Augie Fackler <augie@google.com>
parents: 25472
diff changeset
    32
#if unziplinks
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    33
zip
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    34
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    35
  $ cd "$origdir"
21216
6d632cf8a811 tests: suppress spurious lchmod error from unzip (issue4088)
Matt Mackall <mpm@selenic.com>
parents: 16913
diff changeset
    36
  $ unzip archive.zip > /dev/null 2>&1
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    37
  $ cd zip
25472
4d2b9b304ad0 tests: drop explicit $TESTDIR from executables
Matt Mackall <mpm@selenic.com>
parents: 22046
diff changeset
    38
  $ readlink.py dangling
11854
aa2abde72da1 tests: unify test-archive-symlinks
Martin Geisler <mg@lazybytes.net>
parents: 5683
diff changeset
    39
  dangling -> nothing
29844
c4d03b6d9576 tests: guard test-archive-symlink with unziplinks check
Augie Fackler <augie@google.com>
parents: 25472
diff changeset
    40
#endif
16913
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 16350
diff changeset
    41
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 16350
diff changeset
    42
  $ cd ..