rbackup/tests/test_hierarchy.py

109 lines
3.1 KiB
Python
Raw Normal View History

2019-04-10 19:23:17 -07:00
"""
2019-04-14 14:56:09 -07:00
.. moduleauthor:: Eric Torres
2019-04-10 19:23:17 -07:00
Tests for the rbackup.struct.hierarchy module.
"""
import shutil
import unittest
from pathlib import Path
from unittest.mock import DEFAULT, patch
from rbackup.struct.hierarchy import Hierarchy
# ========== Constants ==========
2019-04-10 18:00:47 -07:00
TESTING_PACKAGE = "rbackup.struct"
TESTING_MODULE = f"{TESTING_PACKAGE}.hierarchy"
# ========== Tests ==========
class TestHierarchyPaths(unittest.TestCase):
"""Check given path properties of a Hierarchy object."""
def setUp(self):
self.patched_path = patch.multiple(
Path, exists=DEFAULT, mkdir=DEFAULT, symlink_to=DEFAULT, touch=DEFAULT
)
self.mocked_path = self.patched_path.start()
2019-04-14 12:40:10 -07:00
def test_retrieves_correct_metadata_filename(self):
self.assertEqual(Hierarchy("/tmp/backup").metadata_path.name, ".metadata")
2019-04-14 12:40:10 -07:00
def tearDown(self):
patch.stopall()
class TestHierarchyMetadata(unittest.TestCase):
"""Test intrusive metadata methods of a Hierarchy object."""
def setUp(self):
self.patched_path = patch.multiple(
Path, exists=DEFAULT, mkdir=DEFAULT, symlink_to=DEFAULT, touch=DEFAULT
)
self.mocked_path = self.patched_path.start()
def test_gen_metadata_raises_notimplemented_error(self):
2019-04-10 18:17:21 -07:00
with self.assertRaises(NotImplementedError):
Hierarchy("/tmp/backup")._gen_metadata()
2019-04-10 18:17:21 -07:00
def tearDown(self):
2019-04-17 11:53:05 -07:00
patch.stopall()
2019-04-10 18:17:21 -07:00
class TestHierarchyMetadataIO(unittest.TestCase):
"""Only meant to check that data written is the same data that is read."""
2019-04-14 12:40:10 -07:00
def test_write_metadata(self):
data = ["test", "data"]
h = Hierarchy("/tmp/backup")
h.metadata_path.touch()
2019-04-10 18:17:21 -07:00
h.write_metadata(data)
self.assertEqual(data, h.read_metadata())
2019-04-10 18:17:21 -07:00
shutil.rmtree(h)
2019-04-17 10:02:51 -07:00
class TestHierarchyCleanup(unittest.TestCase):
"""Test that hierarchy cleanup works properly.
Test cases
----------
* Function stops if system is not symlink attack-resistant
* If symlink attack-resistant, then only delete metadata when all others false
* Function only deletes snapshots when told to
* Function only deletes repository directory when told to
"""
def setUp(self):
self.patched_path = patch.multiple(
2019-04-17 20:23:53 -07:00
Path,
exists=DEFAULT,
mkdir=DEFAULT,
symlink_to=DEFAULT,
touch=DEFAULT,
unlink=DEFAULT,
2019-04-17 10:02:51 -07:00
)
self.patched_metadata = patch.multiple(
2019-04-17 20:23:53 -07:00
Hierarchy, read_metadata=DEFAULT, write_metadata=DEFAULT
2019-04-17 10:02:51 -07:00
)
self.patched_shutil = patch.multiple(f"{TESTING_MODULE}.shutil", rmtree=DEFAULT)
self.mocked_path = self.patched_path.start()
self.mocked_metadata = self.patched_metadata.start()
self.mocked_shutil = self.patched_shutil.start()
self.mocked_shutil["rmtree"].avoids_symlink_attacks = True
def test_stops_on_non_symlink_resistant(self):
2019-04-18 22:02:01 -07:00
self.mocked_shutil["rmtree"].avoids_symlink_attacks = False
2019-04-17 10:02:51 -07:00
h = Hierarchy("/tmp/backup")
2019-05-01 12:08:13 -07:00
h.cleanup()
2019-04-17 10:02:51 -07:00
self.mocked_shutil["rmtree"].assert_not_called()
def tearDown(self):
2019-04-17 11:53:05 -07:00
patch.stopall()