mirror of
https://github.com/netinvent/npbackup.git
synced 2025-10-21 19:10:39 +08:00
tests: Add basic tests for all functions
This commit is contained in:
parent
25591270fc
commit
96bd944845
1 changed files with 270 additions and 6 deletions
|
@ -6,8 +6,7 @@ __intname__ = "npbackup_cli_tests"
|
|||
__author__ = "Orsiris de Jong"
|
||||
__copyright__ = "Copyright (C) 2022-2024 NetInvent"
|
||||
__license__ = "BSD-3-Clause"
|
||||
__build__ = "2024120301"
|
||||
__compat__ = "python3.6+"
|
||||
__build__ = "2024121001"
|
||||
|
||||
|
||||
"""
|
||||
|
@ -58,8 +57,8 @@ raw_config = ORIGINAL_CONF_FILE_PATH.read_text().replace(
|
|||
)
|
||||
CONF_FILE.write_text(raw_config)
|
||||
|
||||
# full_config = load_config(CONF_FILE)
|
||||
# repo_config, _ = get_repo_config(full_config)
|
||||
full_config = load_config(CONF_FILE)
|
||||
repo_config, _ = get_repo_config(full_config)
|
||||
|
||||
|
||||
class RedirectedStdout:
|
||||
|
@ -99,8 +98,15 @@ def test_download_restic_binaries():
|
|||
|
||||
if os.name == "nt":
|
||||
fname = "_windows_amd64.zip"
|
||||
suffix = ".exe"
|
||||
else:
|
||||
fname = "_linux_amd64.bz2"
|
||||
suffix = ""
|
||||
|
||||
if dest_dir.joinpath(fname).with_suffix(suffix).is_file():
|
||||
print("RESTIC SOURCE ALREADY PRESENT. NOT DOWNLOADING")
|
||||
return
|
||||
|
||||
print("JSON RESPONSE")
|
||||
pprint(json_response, indent=5)
|
||||
|
||||
|
@ -163,7 +169,37 @@ def test_npbackup_cli_show_config():
|
|||
assert "__(o_O)__" in str(logs), "Obfuscation does not work"
|
||||
|
||||
|
||||
def test_npbackup_cli_init():
|
||||
shutil.rmtree(repo_config.g("repo_uri"), ignore_errors=True)
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--init"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(str(logs))
|
||||
assert "created restic repository" in str(logs), "Did not create repo"
|
||||
assert "Repo initialized successfully" in str(logs), "Repo init failed"
|
||||
|
||||
|
||||
def test_npbackup_cli_has_no_recent_snapshots():
|
||||
"""
|
||||
After init, we should not have recent snapshots
|
||||
"""
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--has-recent-snapshot", "--json"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(str(logs))
|
||||
json_logs = json.loads(str(logs))
|
||||
assert json_logs["result"] == False, "Should not have recent snapshots"
|
||||
|
||||
|
||||
def test_npbackup_cli_create_backup():
|
||||
# Let's remove the repo before creating a backup since backup should auto init the repo
|
||||
shutil.rmtree(repo_config.g("repo_uri"), ignore_errors=True)
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "-b"]
|
||||
|
||||
try:
|
||||
|
@ -175,6 +211,21 @@ def test_npbackup_cli_create_backup():
|
|||
assert "Backend finished with success" in str(logs), "Backup failed"
|
||||
|
||||
|
||||
def test_npbackup_cli_has_recent_snapshots():
|
||||
"""
|
||||
After backup, we should have recent snapshots
|
||||
"""
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--has-recent-snapshot", "--json"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(str(logs))
|
||||
json_logs = json.loads(str(logs))
|
||||
assert json_logs["result"], "Should have recent snapshots"
|
||||
|
||||
|
||||
def test_npbackup_cli_unlock():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--unlock"]
|
||||
|
||||
|
@ -218,7 +269,7 @@ def test_npbackup_cli_restore():
|
|||
).is_file(), "Restored snapshot does not contain our data"
|
||||
|
||||
|
||||
def test_npbackup_cli_list():
|
||||
def test_npbackup_cli_ls():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--ls", "latest", "--json"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
|
@ -234,6 +285,101 @@ def test_npbackup_cli_list():
|
|||
), "Missing main gui in list"
|
||||
|
||||
|
||||
def test_npbackup_cli_list_snapshots():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--list", "snapshots", "--json"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
json_logs = json.loads(str(logs))
|
||||
assert json_logs["result"], "Bad list result"
|
||||
assert json_logs["operation"] == "list", "Bogus operation name for list"
|
||||
assert len(json_logs["output"]["data"]) == 64, "No snapshot data found"
|
||||
|
||||
|
||||
|
||||
def test_npbackup_cli_find():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--find", "__version__.py"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Found matching entries in snapshot" in str(logs), "Did not find match for find"
|
||||
assert "__version__.py", "Did not find __version__.py in find"
|
||||
|
||||
|
||||
def test_npbackup_cli_check_quick():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--check", "quick"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Running metadata consistency check of repository" in str(
|
||||
logs
|
||||
), "Failed quick checking repo"
|
||||
print(logs)
|
||||
assert "Repo checked successfully" in str(
|
||||
logs
|
||||
), "Quick check failed"
|
||||
|
||||
|
||||
def test_npbackup_cli_check_full():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--check", "full"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Running full data check of repository" in str(
|
||||
logs
|
||||
), "Failed full checking repo"
|
||||
print(logs)
|
||||
assert "Repo checked successfully" in str(
|
||||
logs
|
||||
), "Full check failed"
|
||||
|
||||
|
||||
def test_npbackup_cli_repair_index():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--repair", "index"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Repairing index in repo" in str(
|
||||
logs
|
||||
), "Index repair failed"
|
||||
print(logs)
|
||||
assert "Repo successfully repaired:" in str(
|
||||
logs
|
||||
), "Missing repair info"
|
||||
|
||||
|
||||
def test_npbackup_cli_repair_snapshots():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--repair", "snapshots"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Repairing snapshots in repo" in str(
|
||||
logs
|
||||
), "Snapshot repair failed"
|
||||
print(logs)
|
||||
assert "Repo successfully repaired:" in str(
|
||||
logs
|
||||
), "Missing repair info"
|
||||
|
||||
|
||||
def test_npbackup_cli_retention():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--policy"]
|
||||
try:
|
||||
|
@ -247,18 +393,136 @@ def test_npbackup_cli_retention():
|
|||
), "Failed applying retention policy"
|
||||
|
||||
|
||||
def test_npbackup_cli_forget():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--forget", "latest"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Forgetting snapshots ['latest']" in str(
|
||||
logs
|
||||
), "Could not forget snapshot"
|
||||
assert "removed snapshot/" in str(logs), "Did not forget snapshot"
|
||||
assert "Successfully forgot snapshot" in str(logs), "Forget failed"
|
||||
|
||||
|
||||
def test_npbackup_cli_recover():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--recover"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Recovering snapshots in repo default" in str(
|
||||
logs
|
||||
), "Could not recover snapshots"
|
||||
assert "found 1 unreferenced roots" in str(logs), "Should have found 1 snapshot"
|
||||
assert "Recovery finished" in str(logs), "Recovery failed"
|
||||
|
||||
|
||||
def test_npbackup_cli_prune():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--prune"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Pruning snapshots for repo" in str(
|
||||
logs
|
||||
), "Could not prune repo"
|
||||
assert "unused size after prune" in str(logs), "Did not prune"
|
||||
assert "Successfully pruned repository" in str(logs), "Prune failed"
|
||||
|
||||
|
||||
def test_npbackup_cli_housekeeping():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--housekeeping", "--json"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
json_logs = json.loads(str(logs))
|
||||
assert json_logs["result"], "Bad housekeeping result"
|
||||
assert json_logs["operation"] == "housekeeping", "Bogus operation name for housekeeping"
|
||||
assert json_logs["detail"]["unlock"]["result"], "Unlock failed in housekeeping"
|
||||
assert json_logs["detail"]["check"]["result"], "check failed in housekeeping"
|
||||
assert json_logs["detail"]["forget"]["result"], "forget failed in housekeeping"
|
||||
assert len(json_logs["detail"]["forget"]["args"]["policy"]) > 4, "policy missing in housekeeping"
|
||||
assert json_logs["detail"]["prune"]["result"], "prune failed in housekeeping"
|
||||
|
||||
|
||||
def test_npbackup_cli_dump():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--dump", "-- ls latest"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Running raw command" in str(
|
||||
logs
|
||||
), "Did not run raw command"
|
||||
assert "Successfully run raw command" in str(logs), "Did not run raw command"
|
||||
|
||||
|
||||
def test_npbackup_cli_raw():
|
||||
sys.argv = ["", "-c", str(CONF_FILE), "--raw", "-- ls latest"]
|
||||
try:
|
||||
with RedirectedStdout() as logs:
|
||||
e = __main__.main()
|
||||
print(e)
|
||||
except SystemExit:
|
||||
print(logs)
|
||||
assert "Running raw command" in str(
|
||||
logs
|
||||
), "Did not run raw command"
|
||||
assert "Successfully run raw command" in str(logs), "Did not run raw command"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_download_restic_binaries()
|
||||
test_npbackup_cli_no_config()
|
||||
test_npbackup_cli_wrong_config_path()
|
||||
test_npbackup_cli_show_config()
|
||||
|
||||
test_npbackup_cli_init()
|
||||
test_npbackup_cli_has_no_recent_snapshots()
|
||||
|
||||
# Backup process
|
||||
test_npbackup_cli_create_backup()
|
||||
test_npbackup_cli_has_recent_snapshots()
|
||||
test_npbackup_cli_unlock()
|
||||
test_npbackup_cli_snapshots()
|
||||
test_npbackup_cli_restore()
|
||||
test_npbackup_cli_list()
|
||||
test_npbackup_cli_list_snapshots()
|
||||
# This one should is pretty hard to test without having repo with multiple different date snapshots
|
||||
# We need to create a "fake" repo starting in let's say 2020 and put our date back to 2023 to test our standard
|
||||
# policy
|
||||
# We can also have a forget test which should fail because of bogus permissions
|
||||
test_npbackup_cli_retention()
|
||||
test_npbackup_cli_forget()
|
||||
test_npbackup_cli_recover()
|
||||
test_npbackup_cli_prune()
|
||||
|
||||
# basic tests for all other commands
|
||||
test_npbackup_cli_ls()
|
||||
test_npbackup_cli_find()
|
||||
test_npbackup_cli_check_quick()
|
||||
test_npbackup_cli_check_full()
|
||||
test_npbackup_cli_repair_index()
|
||||
test_npbackup_cli_repair_snapshots()
|
||||
# Repairing packs needs pack ids
|
||||
#test_npbackup_cli_repair_packs()
|
||||
|
||||
test_npbackup_cli_housekeeping()
|
||||
|
||||
# fails, need to be investigated
|
||||
#test_npbackup_cli_dump()
|
||||
test_npbackup_cli_raw()
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue