tests/test-ui-color.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 20 May 2019 10:06:53 +0200
branchstable
changeset 42167 d2c871b78c36
parent 37986 32bc3815efae
child 43076 2372284d9457
permissions -rw-r--r--
bookmark: add a test for a race condition on push Bookmark pointing to unknown nodes are ignored. Later these ignored bookmarks are dropped when writing the file back on disk. On paper, this behavior should be fine, but with the current implementation, it can lead to unexpected bookmark deletions. In theory, to make sure writer as a consistent view, taking the lock also invalidate bookmark data we already loaded into memory. However this invalidation is incomplete. The data are stored in a `filecache` that preserve them if the bookmark related file are untouched. In practice, the bookmark data in memory also depends of the changelog content, because of the step checking if the bookmarks refers to a node known to the changelog. So if the bookmark data were loaded from an up to date bookmark file but filtered with an outdated changelog file this go undetected. This condition is fairly specific, but can occurs very often in practice. We introduce a test recreating the situation. The test comes in an independant changeset to show it actually reproduce the situation. The fix will come soon after. A large share of the initial investigation of this race condition was made by Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28915
40afa22bee9b tests: make test-ui-color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28682
diff changeset
     1
from __future__ import absolute_import, print_function
40afa22bee9b tests: make test-ui-color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28682
diff changeset
     2
19322
ff1586a3adc5 cleanup: remove unused imports
Simon Heimberg <simohe@besonet.ch>
parents: 17956
diff changeset
     3
import os
28915
40afa22bee9b tests: make test-ui-color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28682
diff changeset
     4
from mercurial import (
40afa22bee9b tests: make test-ui-color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28682
diff changeset
     5
    dispatch,
40afa22bee9b tests: make test-ui-color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28682
diff changeset
     6
    ui as uimod,
40afa22bee9b tests: make test-ui-color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28682
diff changeset
     7
)
37969
b8c2004a8d2b tests: port test-ui-color.py to Python 3
Augie Fackler <augie@google.com>
parents: 36370
diff changeset
     8
from mercurial.utils import (
b8c2004a8d2b tests: port test-ui-color.py to Python 3
Augie Fackler <augie@google.com>
parents: 36370
diff changeset
     9
    stringutil,
b8c2004a8d2b tests: port test-ui-color.py to Python 3
Augie Fackler <augie@google.com>
parents: 36370
diff changeset
    10
)
11732
386e56ecfb78 color: call correct superclass method in write_err
Brodie Rao <brodie@bitheap.org>
parents:
diff changeset
    11
386e56ecfb78 color: call correct superclass method in write_err
Brodie Rao <brodie@bitheap.org>
parents:
diff changeset
    12
# ensure errors aren't buffered
31112
b4cb86ab4c71 color: drop the 'colorui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30564
diff changeset
    13
testui = uimod.ui()
11732
386e56ecfb78 color: call correct superclass method in write_err
Brodie Rao <brodie@bitheap.org>
parents:
diff changeset
    14
testui.pushbuffer()
36369
236596a67a54 py3: add b'' to test-ui-color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31112
diff changeset
    15
testui.write((b'buffered\n'))
236596a67a54 py3: add b'' to test-ui-color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31112
diff changeset
    16
testui.warn((b'warning\n'))
236596a67a54 py3: add b'' to test-ui-color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31112
diff changeset
    17
testui.write_err(b'error\n')
37986
32bc3815efae stringutil: flip the default of pprint() to bprefix=False
Yuya Nishihara <yuya@tcha.org>
parents: 37969
diff changeset
    18
print(stringutil.pprint(testui.popbuffer(), bprefix=True).decode('ascii'))
14516
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    19
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    20
# test dispatch.dispatch with the same ui object
36370
0f36926b2651 py3: make sure we open file in bytes mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36369
diff changeset
    21
hgrc = open(os.environ["HGRCPATH"], 'wb')
36369
236596a67a54 py3: add b'' to test-ui-color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31112
diff changeset
    22
hgrc.write(b'[extensions]\n')
236596a67a54 py3: add b'' to test-ui-color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31112
diff changeset
    23
hgrc.write(b'color=\n')
14516
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    24
hgrc.close()
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    25
30564
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 28915
diff changeset
    26
ui_ = uimod.ui.load()
36369
236596a67a54 py3: add b'' to test-ui-color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31112
diff changeset
    27
ui_.setconfig(b'ui', b'formatted', b'True')
14516
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    28
14614
afccc64eea73 ui: use I/O descriptors internally
Idan Kamara <idankk86@gmail.com>
parents: 14516
diff changeset
    29
# we're not interested in the output, so write that to devnull
36370
0f36926b2651 py3: make sure we open file in bytes mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36369
diff changeset
    30
ui_.fout = open(os.devnull, 'wb')
14614
afccc64eea73 ui: use I/O descriptors internally
Idan Kamara <idankk86@gmail.com>
parents: 14516
diff changeset
    31
14516
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    32
# call some arbitrary command just so we go through
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    33
# color's wrapped _runcommand twice.
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    34
def runcmd():
36369
236596a67a54 py3: add b'' to test-ui-color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31112
diff changeset
    35
    dispatch.dispatch(dispatch.request([b'version', b'-q'], ui_))
14516
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    36
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    37
runcmd()
31112
b4cb86ab4c71 color: drop the 'colorui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30564
diff changeset
    38
print("colored? %s" % (ui_._colormode is not None))
14516
842a9179132c color: check if ui is already a subclass of colorui before wrapping it
Idan Kamara <idankk86@gmail.com>
parents: 12865
diff changeset
    39
runcmd()
31112
b4cb86ab4c71 color: drop the 'colorui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30564
diff changeset
    40
print("colored? %s" % (ui_._colormode is not None))