mercurial/testing/__init__.py
author Matt Harbison <matt_harbison@yahoo.com>
Tue, 01 Oct 2024 15:00:39 -0400
changeset 51930 bc9ed92d4753
parent 51863 f4733654f144
permissions -rw-r--r--
util: make `mmapread()` work on Windows again 522b4d729e89 started referencing `mmap.MAP_PRIVATE`, but that's not available on Windows, so `hg version` worked, but `make local` did not. That commit also started calling the constructor with the fine-grained `flags` and `prot` args, but those aren't available on Windows either[1] (though the backing C code doesn't seem conditionalized to disallow usage of them). I assume the change away from from the `access` arg was to provide the same options, plus `MAP_POPULATE`. Looking at the source code[2], they're not quite the same- `ACCESS_READ` is equivalent to `flags = MAP_SHARED` and `prot = PROT_READ`. `MAP_PRIVATE` is only used with `ACCESS_COPY`, which allows read and write. Therefore, we can't quite get the same baseline flags on Windows, but this was the status quo ante and `MAP_POPULATE` is a Linux thing, so presumably it works. I realize that typically the OS differences are abstracted into the platform modules, but I'm leaving it here so that it is obvious what the differences are between the platforms. [1] https://docs.python.org/3/library/mmap.html#mmap.mmap [2] https://github.com/python/cpython/blob/5e0abb47886bc665eefdcc19fde985f803e49d4c/Modules/mmapmodule.c#L1539
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 50214
diff changeset
     1
from __future__ import annotations
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 50214
diff changeset
     2
46984
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
     3
import os
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
     4
import time
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
     5
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
     6
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
     7
# work around check-code complains
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
     8
#
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
     9
# This is a simple log level module doing simple test related work, we can't
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    10
# import more things, and we do not need it.
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    11
environ = getattr(os, 'environ')
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    12
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    13
50214
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    14
def wait_on_cfg(ui, cfg, timeout=10):
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    15
    """synchronize on the `cfg` config path
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    16
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    17
    Use this to synchronize commands during race tests.
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    18
    """
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    19
    full_config = b'sync.' + cfg
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    20
    wait_config = full_config + b'-timeout'
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    21
    sync_path = ui.config(b'devel', full_config)
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    22
    if sync_path is not None:
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    23
        timeout = ui.config(b'devel', wait_config)
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    24
        ready_path = sync_path + b'.waiting'
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    25
        write_file(ready_path)
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    26
        wait_file(sync_path, timeout=timeout)
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    27
8e0d823ef182 testing: introduce util function to synchronize concurrent commands on files
Raphaël Gomès <rgomes@octobus.net>
parents: 48875
diff changeset
    28
46984
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    29
def _timeout_factor():
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    30
    """return the current modification to timeout"""
47493
2dac94edd98d testing: fix _timeout_factor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46985
diff changeset
    31
    default = int(environ.get('HGTEST_TIMEOUT_DEFAULT', 360))
46984
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    32
    current = int(environ.get('HGTEST_TIMEOUT', default))
47493
2dac94edd98d testing: fix _timeout_factor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46985
diff changeset
    33
    if current == 0:
2dac94edd98d testing: fix _timeout_factor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46985
diff changeset
    34
        return 1
46984
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    35
    return current / float(default)
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    36
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    37
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    38
def wait_file(path, timeout=10):
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    39
    timeout *= _timeout_factor()
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    40
    start = time.time()
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    41
    while not os.path.exists(path):
47657
1bad89a67745 testing: do not stop waiting if timeout is 0 (issue6541)
Cédric Krier <ced@b2ck.com>
parents: 47493
diff changeset
    42
        if timeout and time.time() - start > timeout:
46984
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    43
            raise RuntimeError(b"timed out waiting for file: %s" % path)
99c629101b73 testing: add a utility function to wait for file create
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39772
diff changeset
    44
        time.sleep(0.01)
46985
52cee44aa1a0 testing: add a `write_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46984
diff changeset
    45
52cee44aa1a0 testing: add a `write_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46984
diff changeset
    46
52cee44aa1a0 testing: add a `write_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46984
diff changeset
    47
def write_file(path, content=b''):
47804
5ad37164a8fe testing: make sure write_file is "atomic"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47657
diff changeset
    48
    if content:
5ad37164a8fe testing: make sure write_file is "atomic"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47657
diff changeset
    49
        write_path = b'%s.tmp' % path
5ad37164a8fe testing: make sure write_file is "atomic"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47657
diff changeset
    50
    else:
5ad37164a8fe testing: make sure write_file is "atomic"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47657
diff changeset
    51
        write_path = path
5ad37164a8fe testing: make sure write_file is "atomic"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47657
diff changeset
    52
    with open(write_path, 'wb') as f:
46985
52cee44aa1a0 testing: add a `write_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46984
diff changeset
    53
        f.write(content)
47804
5ad37164a8fe testing: make sure write_file is "atomic"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47657
diff changeset
    54
    if path != write_path:
5ad37164a8fe testing: make sure write_file is "atomic"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47657
diff changeset
    55
        os.rename(write_path, path)