aboutsummaryrefslogtreecommitdiff
path: root/run_unittests.py
diff options
context:
space:
mode:
authorFilipe Brandenburger <filbranden@google.com>2018-03-12 00:23:21 -0700
committerFilipe Brandenburger <filbranden@google.com>2018-04-18 11:44:54 -0700
commit59b0fa9722c92f2df76dc87f7a4f0afbce4bd6fa (patch)
tree5298931668940d7b8ffe963b5afb2e11f822f8ae /run_unittests.py
parentb0382733d80e4963036a6abd4f475ebbea67d72c (diff)
downloadmeson-59b0fa9722c92f2df76dc87f7a4f0afbce4bd6fa.zip
meson-59b0fa9722c92f2df76dc87f7a4f0afbce4bd6fa.tar.gz
meson-59b0fa9722c92f2df76dc87f7a4f0afbce4bd6fa.tar.bz2
Add a unit test for install_umask.
This test copies a src tree using umask of 002, then runs the build and install under umask 027. It ensures that the default install_umask of 022 is still applied to all files and directories in the install tree.
Diffstat (limited to 'run_unittests.py')
-rwxr-xr-xrun_unittests.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/run_unittests.py b/run_unittests.py
index e0cd1ec..bb18f11 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -2669,6 +2669,74 @@ class LinuxlikeTests(BasePlatformTests):
# The chown failed nonfatally if we're not root
self.assertEqual(0, statf.st_uid)
+ def test_install_umask(self):
+ '''
+ Test that files are installed with correct permissions using default
+ install umask of 022, regardless of the umask at time the worktree
+ was checked out or the build was executed.
+ '''
+ # Copy source tree to a temporary directory and change permissions
+ # there to simulate a checkout with umask 002.
+ orig_testdir = os.path.join(self.unit_test_dir, '24 install umask')
+ # Create a new testdir under tmpdir.
+ tmpdir = os.path.realpath(tempfile.mkdtemp())
+ self.addCleanup(windows_proof_rmtree, tmpdir)
+ testdir = os.path.join(tmpdir, '24 install umask')
+ # Copy the tree using shutil.copyfile, which will use the current umask
+ # instead of preserving permissions of the old tree.
+ save_umask = os.umask(0o002)
+ self.addCleanup(os.umask, save_umask)
+ shutil.copytree(orig_testdir, testdir, copy_function=shutil.copyfile)
+ # Preserve the executable status of subdir/sayhello though.
+ os.chmod(os.path.join(testdir, 'subdir', 'sayhello'), 0o775)
+ self.init(testdir)
+ # Run the build under a 027 umask now.
+ os.umask(0o027)
+ self.build()
+ # And keep umask 027 for the install step too.
+ self.install()
+
+ for executable in [
+ 'bin/prog',
+ 'share/subdir/sayhello',
+ ]:
+ f = os.path.join(self.installdir, 'usr', *executable.split('/'))
+ found_mode = stat.filemode(os.stat(f).st_mode)
+ want_mode = '-rwxr-xr-x'
+ self.assertEqual(want_mode, found_mode,
+ msg=('Expected file %s to have mode %s but found %s instead.' %
+ (executable, want_mode, found_mode)))
+
+ for directory in [
+ 'usr',
+ 'usr/bin',
+ 'usr/include',
+ 'usr/share',
+ 'usr/share/man',
+ 'usr/share/man/man1',
+ 'usr/share/subdir',
+ ]:
+ f = os.path.join(self.installdir, *directory.split('/'))
+ found_mode = stat.filemode(os.stat(f).st_mode)
+ want_mode = 'drwxr-xr-x'
+ self.assertEqual(want_mode, found_mode,
+ msg=('Expected directory %s to have mode %s but found %s instead.' %
+ (directory, want_mode, found_mode)))
+
+ for datafile in [
+ 'include/sample.h',
+ 'share/datafile.cat',
+ 'share/file.dat',
+ 'share/man/man1/prog.1.gz',
+ 'share/subdir/datafile.dog',
+ ]:
+ f = os.path.join(self.installdir, 'usr', *datafile.split('/'))
+ found_mode = stat.filemode(os.stat(f).st_mode)
+ want_mode = '-rw-r--r--'
+ self.assertEqual(want_mode, found_mode,
+ msg=('Expected file %s to have mode %s but found %s instead.' %
+ (datafile, want_mode, found_mode)))
+
def test_cpp_std_override(self):
testdir = os.path.join(self.unit_test_dir, '6 std override')
self.init(testdir)