diff --git a/tests/cheap-copy.py b/tests/cheap-copy.py index e14082ebd679b7b13f0c7b6e56ce77cb8fbe86c3..f98d7d94eafa8c53c747149fed99e5d6fbcc6ddb 100755 --- a/tests/cheap-copy.py +++ b/tests/cheap-copy.py @@ -7,6 +7,7 @@ import os import subprocess import sys import tempfile +from pathlib import Path try: @@ -24,6 +25,7 @@ from testutils import ( class TestCheapCopy(BaseTest): def setUp(self) -> None: super().setUp() + os.environ['G_MESSAGES_DEBUG'] = 'all' self.cheap_copy = os.path.join(self.G_TEST_BUILDDIR, 'test-cheap-copy') def assert_tree_is_superset( @@ -156,6 +158,79 @@ class TestCheapCopy(BaseTest): """ self.test_populated('/tmp', '/var/tmp', require_hard_links=False) + def test_usrmerge(self): + with tempfile.TemporaryDirectory( + ) as source, tempfile.TemporaryDirectory( + ) as parent, tempfile.TemporaryDirectory( + ) as expected: + (Path(source) / 'bin').mkdir(parents=True) + (Path(source) / 'lib').mkdir(parents=True) + (Path(source) / 'lib/x86_64-linux-gnu').mkdir(parents=True) + (Path(source) / 'lib32').mkdir(parents=True) + (Path(source) / 'usr/bin').mkdir(parents=True) + (Path(source) / 'usr/bin/which').touch() + (Path(source) / 'bin/which').symlink_to('/usr/bin/which') + (Path(source) / 'bin/less').touch() + (Path(source) / 'usr/bin/less').symlink_to('/bin/less') + (Path(source) / 'bin/more').touch() + (Path(source) / 'usr/bin/more').symlink_to('../../bin/more') + (Path(source) / 'usr/bin/env').touch() + (Path(source) / 'bin/env').symlink_to('../usr/bin/env') + (Path(source) / 'usr/bin/gcc').symlink_to('gcc-9') + (Path(source) / 'usr/bin/foo').symlink_to('/bin/foo-1') + (Path(source) / 'usr/bin/bar').symlink_to('../../bin/bar-2') + (Path(source) / 'usr/lib/x86_64-linux-gnu').mkdir(parents=True) + (Path(source) / 'bin/x').symlink_to('/usr/bin/x-1') + (Path(source) / 'bin/y').symlink_to('../usr/bin/x-2') + (Path(source) / 'lib/x86_64-linux-gnu/libpng12.so.0').symlink_to( + 'libpng12.so.0.46.0') + (Path(source) / 'lib/x86_64-linux-gnu/libpng12.so.0.46.0').touch() + ( + Path(source) / 'usr/lib/x86_64-linux-gnu/libpng12.so.0' + ).symlink_to('/lib/x86_64-linux-gnu/libpng12.so.0') + ( + Path(source) / 'usr/lib/x86_64-linux-gnu/libpng12.so' + ).symlink_to('libpng12.so.0') + + (Path(expected) / 'bin').symlink_to('usr/bin') + (Path(expected) / 'lib').symlink_to('usr/lib') + (Path(expected) / 'lib32').symlink_to('usr/lib32') + (Path(expected) / 'usr/lib').mkdir(parents=True) + (Path(expected) / 'usr/lib/x86_64-linux-gnu').mkdir(parents=True) + (Path(expected) / 'usr/lib32').mkdir(parents=True) + (Path(expected) / 'usr/bin').mkdir(parents=True) + (Path(expected) / 'usr/bin/which').touch() + (Path(expected) / 'usr/bin/less').touch() + (Path(expected) / 'usr/bin/more').touch() + (Path(expected) / 'usr/bin/env').touch() + (Path(expected) / 'usr/bin/gcc').symlink_to('gcc-9') + (Path(expected) / 'usr/bin/foo').symlink_to('/bin/foo-1') + (Path(expected) / 'usr/bin/bar').symlink_to('../../bin/bar-2') + (Path(expected) / 'bin/x').symlink_to('/usr/bin/x-1') + (Path(expected) / 'bin/y').symlink_to('../usr/bin/x-2') + ( + Path(expected) / 'usr/lib/x86_64-linux-gnu/libpng12.so.0' + ).symlink_to('libpng12.so.0.46.0') + ( + Path(expected) / 'usr/lib/x86_64-linux-gnu/libpng12.so.0.46.0' + ).touch() + ( + Path(expected) / 'usr/lib/x86_64-linux-gnu/libpng12.so' + ).symlink_to('libpng12.so.0') + + dest = os.path.join(parent, 'dest') + subprocess.run( + [ + self.cheap_copy, + '--usrmerge', + source, + dest, + ], + check=True, + stdout=2, + ) + self.assert_tree_is_same(expected, dest, require_hard_links=False) + def tearDown(self) -> None: super().tearDown()