summaryrefslogtreecommitdiff
path: root/src/tests/test_utils_file.py
diff options
context:
space:
mode:
authorOleksandr Kuchmystyi <o.kuchmystyi@vyos.io>2025-08-25 17:53:21 +0300
committerOleksandr Kuchmystyi <o.kuchmystyi@vyos.io>2025-09-26 12:48:09 +0300
commit6b6f75e1fc85139e131b86117a53be1766db5fbb (patch)
tree6c3f78eb84f182fcd27e59580d82748ebfb38eec /src/tests/test_utils_file.py
parent06e491caf2fdd8b4e2fe5f3b4396680fca61eeab (diff)
downloadvyos-1x-6b6f75e1fc85139e131b86117a53be1766db5fbb.tar.gz
vyos-1x-6b6f75e1fc85139e131b86117a53be1766db5fbb.zip
image: T5455: Add migration of SSH `known_hosts` files during image upgrade
During upgrade, the script now checks if any `known_hosts` files exist. If so, it prompts the user to save these SSH fingerprints, and upon confirmation, copies the files to the new image persistence directory.
Diffstat (limited to 'src/tests/test_utils_file.py')
-rw-r--r--src/tests/test_utils_file.py86
1 files changed, 86 insertions, 0 deletions
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