sapling/tests/test-propertycache.py
Jun Wu 9dc21f8d0b codemod: import from the edenscm package
Summary:
D13853115 adds `edenscm/` to `sys.path` and code still uses `import mercurial`.
That has nasty problems if both `import mercurial` and
`import edenscm.mercurial` are used, because Python would think `mercurial.foo`
and `edenscm.mercurial.foo` are different modules so code like
`try: ... except mercurial.error.Foo: ...`, or `isinstance(x, mercurial.foo.Bar)`
would fail to handle the `edenscm.mercurial` version. There are also some
module-level states (ex. `extensions._extensions`) that would cause trouble if
they have multiple versions in a single process.

Change imports to use the `edenscm` so ideally the `mercurial` is no longer
imported at all. Add checks in extensions.py to catch unexpected extensions
importing modules from the old (wrong) locations when running tests.

Reviewed By: phillco

Differential Revision: D13868981

fbshipit-source-id: f4e2513766957fd81d85407994f7521a08e4de48
2019-01-29 17:25:32 -08:00

232 lines
6.5 KiB
Python

"""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 edenscm.mercurial import hg, localrepo, ui as uimod, util
# 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 = os.path.join(os.environ["TESTTMP"], "repo")
assert subprocess.call(["hg", "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"),
)