borg/src/borg/testsuite/benchmark.py

129 lines
3.8 KiB
Python

"""
Do benchmarks using pytest-benchmark.
Usage:
py.test --benchmark-only
"""
import os
import pytest
from .archiver import changedir, cmd_fixture # NOQA
from .item import Item
from ..constants import zeros
@pytest.fixture
def repo_url(request, tmpdir, monkeypatch):
monkeypatch.setenv("BORG_PASSPHRASE", "123456")
monkeypatch.setenv("BORG_CHECK_I_KNOW_WHAT_I_AM_DOING", "YES")
monkeypatch.setenv("BORG_DELETE_I_KNOW_WHAT_I_AM_DOING", "YES")
monkeypatch.setenv("BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", "yes")
monkeypatch.setenv("BORG_KEYS_DIR", str(tmpdir.join("keys")))
monkeypatch.setenv("BORG_CACHE_DIR", str(tmpdir.join("cache")))
yield str(tmpdir.join("repository"))
tmpdir.remove(rec=1)
@pytest.fixture(params=["none", "repokey-aes-ocb"])
def repo(request, cmd_fixture, repo_url):
cmd_fixture(f"--repo={repo_url}", "rcreate", "--encryption", request.param)
return repo_url
@pytest.fixture(scope="session", params=["zeros", "random"])
def testdata(request, tmpdir_factory):
count, size = 10, 1000 * 1000
assert size <= len(zeros)
p = tmpdir_factory.mktemp("data")
data_type = request.param
if data_type == "zeros":
# do not use a binary zero (\0) to avoid sparse detection
def data(size):
return memoryview(zeros)[:size]
elif data_type == "random":
def data(size):
return os.urandom(size)
else:
raise ValueError("data_type must be 'random' or 'zeros'.")
for i in range(count):
with open(str(p.join(str(i))), "wb") as f:
f.write(data(size))
yield str(p)
p.remove(rec=1)
@pytest.fixture(params=["none", "lz4"])
def repo_archive(request, cmd_fixture, repo, testdata):
archive = "test"
cmd_fixture(f"--repo={repo}", "create", "--compression", request.param, archive, testdata)
return repo, archive
def test_create_none(benchmark, cmd_fixture, repo, testdata):
result, out = benchmark.pedantic(
cmd_fixture, (f"--repo={repo}", "create", "--compression", "none", "test", testdata)
)
assert result == 0
def test_create_lz4(benchmark, cmd_fixture, repo, testdata):
result, out = benchmark.pedantic(
cmd_fixture, (f"--repo={repo}", "create", "--compression", "lz4", "test", testdata)
)
assert result == 0
def test_extract(benchmark, cmd_fixture, repo_archive, tmpdir):
repo, archive = repo_archive
with changedir(str(tmpdir)):
result, out = benchmark.pedantic(cmd_fixture, (f"--repo={repo}", "extract", archive))
assert result == 0
def test_delete(benchmark, cmd_fixture, repo_archive):
repo, archive = repo_archive
result, out = benchmark.pedantic(cmd_fixture, (f"--repo={repo}", "delete", "-a", archive))
assert result == 0
def test_list(benchmark, cmd_fixture, repo_archive):
repo, archive = repo_archive
result, out = benchmark(cmd_fixture, f"--repo={repo}", "list", archive)
assert result == 0
def test_info(benchmark, cmd_fixture, repo_archive):
repo, archive = repo_archive
result, out = benchmark(cmd_fixture, f"--repo={repo}", "info", "-a", archive)
assert result == 0
def test_check(benchmark, cmd_fixture, repo_archive):
repo, archive = repo_archive
result, out = benchmark(cmd_fixture, f"--repo={repo}", "check")
assert result == 0
def test_help(benchmark, cmd_fixture):
result, out = benchmark(cmd_fixture, "help")
assert result == 0
@pytest.mark.parametrize("type, key, value", [(Item, "size", 1000), (Item, "mode", 0x777), (Item, "deleted", False)])
def test_propdict_attributes(benchmark, type, key, value):
propdict = type()
def getattr_setattr(item, key, value):
setattr(item, key, value)
assert item.get(key) == value
assert getattr(item, key) == value
item.as_dict()
benchmark(getattr_setattr, propdict, key, value)