view tests/test-propertycache.py @ 48598:a6f16ec07ed7

stream-clone: add a explicit test for format change during stream clone They are different kind of requirements, the one which impact the data storage and are relevant to the files being streamed and the one which does not. For example some requirements are only relevant to the working copy, like sparse, or dirstate-v2. Since they are irrelevant to the content being streamed, they do not prevent the receiving side to use streaming clone and mercurial skip adverting them over the wire and, ideally, within the bundle. In addition, this let the client decide to use whichever format it desire for the part that does not affect the store itself. So the configuration related to these format are used as normal when doing a streaming clone. In practice, the feature was not really tested and is badly broken with bundle-2, since the requirements are not filtered out from the stream bundle. So we start with adding simple tests as a good base before the fix and adjust the feature. Differential Revision: https://phab.mercurial-scm.org/D12029
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 17 Jan 2022 18:51:47 +0100
parents 2372284d9457
children 6000f5b25c9b
line wrap: on
line source

"""test behavior of propertycache and unfiltered propertycache

The repoview overlay is quite complex. We test the behavior of
property cache of both localrepo and repoview to prevent
regression."""

from __future__ import absolute_import, print_function
import os
import subprocess

from mercurial import (
    hg,
    localrepo,
    pycompat,
    ui as uimod,
    util,
)

from mercurial.utils import procutil

# create some special property cache that trace they call

calllog = []


@util.propertycache
def testcachedfoobar(repo):
    name = repo.filtername
    if name is None:
        name = ''
    val = len(name)
    calllog.append(val)
    return val


unficalllog = []


@localrepo.unfilteredpropertycache
def testcachedunfifoobar(repo):
    name = repo.filtername
    if name is None:
        name = ''
    val = 100 + len(name)
    unficalllog.append(val)
    return val


# plug them on repo
localrepo.localrepository.testcachedfoobar = testcachedfoobar
localrepo.localrepository.testcachedunfifoobar = testcachedunfifoobar


# Create an empty repo and instantiate it. It is important to run
# these tests on the real object to detect regression.
repopath = pycompat.fsencode(os.path.join(os.environ['TESTTMP'], 'repo'))
assert (
    subprocess.call(
        pycompat.rapply(procutil.tonativestr, [b'hg', b'init', repopath])
    )
    == 0
)

ui = uimod.ui.load()
repo = hg.repository(ui, path=repopath).unfiltered()


print('')
print('=== property cache ===')
print('')
print('calllog:', calllog)
print(
    'cached value (unfiltered):', vars(repo).get('testcachedfoobar', 'NOCACHE')
)

print('')
print('= first access on unfiltered, should do a call')
print('access:', repo.testcachedfoobar)
print('calllog:', calllog)
print(
    'cached value (unfiltered):', vars(repo).get('testcachedfoobar', 'NOCACHE')
)

print('')
print('= second access on unfiltered, should not do call')
print('access', repo.testcachedfoobar)
print('calllog:', calllog)
print(
    'cached value (unfiltered):', vars(repo).get('testcachedfoobar', 'NOCACHE')
)

print('')
print('= first access on "visible" view, should do a call')
visibleview = repo.filtered('visible')
print(
    'cached value ("visible" view):',
    vars(visibleview).get('testcachedfoobar', 'NOCACHE'),
)
print('access:', visibleview.testcachedfoobar)
print('calllog:', calllog)
print(
    'cached value (unfiltered):', vars(repo).get('testcachedfoobar', 'NOCACHE')
)
print(
    'cached value ("visible" view):',
    vars(visibleview).get('testcachedfoobar', 'NOCACHE'),
)

print('')
print('= second access on "visible view", should not do call')
print('access:', visibleview.testcachedfoobar)
print('calllog:', calllog)
print(
    'cached value (unfiltered):', vars(repo).get('testcachedfoobar', 'NOCACHE')
)
print(
    'cached value ("visible" view):',
    vars(visibleview).get('testcachedfoobar', 'NOCACHE'),
)

print('')
print('= no effect on other view')
immutableview = repo.filtered('immutable')
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedfoobar', 'NOCACHE'),
)
print('access:', immutableview.testcachedfoobar)
print('calllog:', calllog)
print(
    'cached value (unfiltered):', vars(repo).get('testcachedfoobar', 'NOCACHE')
)
print(
    'cached value ("visible" view):',
    vars(visibleview).get('testcachedfoobar', 'NOCACHE'),
)
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedfoobar', 'NOCACHE'),
)

# unfiltered property cache test
print('')
print('')
print('=== unfiltered property cache ===')
print('')
print('unficalllog:', unficalllog)
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("visible" view):  ',
    vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'),
)

print('')
print('= first access on unfiltered, should do a call')
print('access (unfiltered):', repo.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)

print('')
print('= second access on unfiltered, should not do call')
print('access (unfiltered):', repo.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)

print('')
print('= access on view should use the unfiltered cache')
print('access (unfiltered):      ', repo.testcachedunfifoobar)
print('access ("visible" view):  ', visibleview.testcachedunfifoobar)
print('access ("immutable" view):', immutableview.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("visible" view):  ',
    vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'),
)

print('')
print('= even if we clear the unfiltered cache')
del repo.__dict__['testcachedunfifoobar']
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("visible" view):  ',
    vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'),
)
print('unficalllog:', unficalllog)
print('access ("visible" view):  ', visibleview.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("visible" view):  ',
    vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'),
)
print('access ("immutable" view):', immutableview.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("visible" view):  ',
    vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'),
)
print('access (unfiltered):      ', repo.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print(
    'cached value (unfiltered):      ',
    vars(repo).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("visible" view):  ',
    vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'),
)
print(
    'cached value ("immutable" view):',
    vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'),
)