summaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/test_utils.py46
-rw-r--r--src/tests/test_utils_file.py86
2 files changed, 132 insertions, 0 deletions
diff --git a/src/tests/test_utils.py b/src/tests/test_utils.py
index 5c06a4394..12fda84d0 100644
--- a/src/tests/test_utils.py
+++ b/src/tests/test_utils.py
@@ -12,7 +12,12 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import pwd
from unittest import TestCase
+
+from vyos.utils import auth
+
+
class TestVyOSUtils(TestCase):
def test_key_mangling(self):
from vyos.utils.dict import mangle_dict_keys
@@ -36,3 +41,44 @@ class TestVyOSUtils(TestCase):
self.assertEqual(list_strip(lst, rsb, right=True), ['a', 'b', 'c'])
self.assertEqual(list_strip(lst, non), [])
self.assertEqual(list_strip(sub, lst), [])
+
+class TestVyOSUtilsAuth(TestCase):
+
+ def test_get_local_users_returns_existing_usernames(self):
+ # Returned users exist, skip list is excluded, and UIDs are in range
+
+ all_users = set(s_user.pw_name for s_user in pwd.getpwall())
+ local_users = auth.get_local_users()
+
+ # All returned users must really exist
+ for user in local_users:
+ self.assertIn(user, all_users)
+
+ # Nobody in the skip list
+ for skipped in auth.SYSTEM_USER_SKIP_LIST:
+ self.assertNotIn(skipped, local_users)
+
+ # All are within UID range
+ for s_user in pwd.getpwall():
+ if s_user.pw_name in local_users:
+ self.assertGreaterEqual(s_user.pw_uid, auth.MIN_USER_UID)
+ self.assertLessEqual(s_user.pw_uid, auth.MAX_USER_UID)
+
+ def test_get_user_home_dir_for_real_user(self):
+ # User's homedir is a non-empty string for a valid user
+
+ local_users = auth.get_local_users()
+ if local_users:
+ for user in local_users:
+ home_dir = auth.get_user_home_dir(user)
+ self.assertIsInstance(home_dir, str)
+ self.assertTrue(bool(home_dir)) # Should not be empty
+ else:
+ self.skipTest("No suitable non-system users found on this system")
+
+ def test_get_user_home_dir_invalid_user(self):
+ # Raises KeyError for nonexistent username
+
+ user = "__this_user_does_not_exist__" # Test using unlikely username
+ with self.assertRaises(KeyError):
+ auth.get_user_home_dir(user)
diff --git a/src/tests/test_utils_file.py b/src/tests/test_utils_file.py
new file mode 100644
index 000000000..4519cf03c
--- /dev/null
+++ b/src/tests/test_utils_file.py
@@ -0,0 +1,86 @@
+# Copyright VyOS maintainers and contributors <maintainers@vyos.io>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or later as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import tempfile
+import unittest
+
+from pathlib import Path
+
+from vyos.utils.file import copy_recursive
+from vyos.utils.file import move_recursive
+
+
+class TestVyOSUtilsFile(unittest.TestCase):
+ def setUp(self):
+ """Create temporary directories for source and destination."""
+ self.tmpdir = tempfile.TemporaryDirectory()
+ self.src = Path(self.tmpdir.name) / 'src'
+ self.dst = Path(self.tmpdir.name) / 'dst'
+
+ # Create test directory structure in `src`
+ (self.src / 'subdir').mkdir(parents=True)
+ (self.dst).mkdir(parents=True)
+
+ # Create files
+ (self.src / 'file1.txt').write_text('hello world')
+ (self.src / 'subdir' / 'file2.txt').write_text('subdir file')
+
+ def tearDown(self):
+ """Cleanup temp directory."""
+ self.tmpdir.cleanup()
+
+ def test_copy_recursive_no_overwrite(self):
+ copy_recursive(str(self.src), str(self.dst), overwrite=False)
+
+ self.assertTrue((self.dst / 'file1.txt').exists())
+ self.assertTrue((self.dst / 'subdir' / 'file2.txt').exists())
+
+ def test_copy_recursive_skip_existing(self):
+ # Create conflicting file in destination
+ (self.dst / 'file1.txt').write_text('different content')
+
+ copy_recursive(str(self.src), str(self.dst), overwrite=False)
+
+ # Destination should remain the same (not overwritten)
+ content = (self.dst / 'file1.txt').read_text()
+ self.assertEqual(content, 'different content')
+
+ def test_copy_recursive_overwrite(self):
+ (self.dst / 'file1.txt').write_text('different content')
+
+ copy_recursive(str(self.src), str(self.dst), overwrite=True)
+
+ # Destination should be overwritten with source content
+ content = (self.dst / 'file1.txt').read_text()
+ self.assertEqual(content, 'hello world')
+
+ def test_move_recursive(self):
+ move_recursive(str(self.src), str(self.dst), overwrite=False)
+
+ # Files should appear in destination
+ self.assertTrue((self.dst / 'file1.txt').exists())
+ self.assertTrue((self.dst / 'subdir' / 'file2.txt').exists())
+
+ # Source should be removed
+ self.assertFalse(self.src.exists())
+
+ def test_move_recursive_overwrite(self):
+ # Prepare conflicting file in destination
+ (self.dst / 'file1.txt').write_text('conflicting')
+
+ move_recursive(str(self.src), str(self.dst), overwrite=True)
+
+ content = (self.dst / 'file1.txt').read_text()
+ self.assertEqual(content, 'hello world') # overwritten
+ self.assertFalse(self.src.exists()) # source cleaned up