Если я могу немного расширить вопрос и понять его как «Есть ли более читаемый способ проверки режимов файлов?», то я предлагаю добавить пользовательское утверждение. Цель:
self.assertFileMode(my_directory, user="rwx", group="rx", others="rx")
Как это сделать.
Давайте поместим это утверждение в миксин:
import os
import stat
class FileAssertions(object):
FILE_PERMS = {
'user': {'r': stat.S_IRUSR, 'w': stat.S_IWUSR, 'x': stat.S_IXUSR, 's': stat.S_ISUID},
'group': {'r': stat.S_IRGRP, 'w': stat.S_IWGRP, 'x': stat.S_IXGRP, 's': stat.S_ISGID},
'others': {'r': stat.S_IROTH, 'w': stat.S_IWOTH, 'x': stat.S_IXOTH},
}
def assertFileMode(self, path, **kwargs):
mode = os.stat(path).st_mode
for key, perm_defs in self.FILE_PERMS.items():
expected = kwargs.pop(key, None)
if expected is not None:
actual_perms = mode & sum(perm_defs.values())
expected_perms = sum(perm_defs[flag] for flag in expected)
if actual_perms != expected_perms:
msg = '{key} permissions: {expected} != {actual} for {path}'.format(
key=key, path=path,
expected=''.join(sorted(expected)),
actual=''.join(sorted(flag for flag, value in perm_defs.items()
if value & mode != 0))
)
raise self.failureException(msg)
if kwargs:
raise TypeError('assertFileMode: unknown arguments %s' % ', '.join(kwargs))
Использование
Теперь, как насчет того, чтобы протестировать некоторые файловые режимы?
# We use our mixin
class MyTestCase(FileAssertions, TestCase):
def test_some_paths(self):
# Test all permissions
self.assertFileMode('/foo/bar', user='rwx', group='rx', others='')
# Only test user permissions
self.assertFileMode('/foo/bar', user='rwx')
# We support the suid/sgid bits as well
self.assertFileMode('/foo/bar', user='rwxs', group='rxs', others='rx')
Пример вывода:
AssertionError: user permissions: rw != rwx for /foo/bar
Примечания:
- Проверяются только разрешения, предоставленные методу. Чтобы проверить отсутствие разрешений, передайте пустую строку.
- Большая часть сложности связана с созданием удобного для пользователя сообщения.
- Разрешения отсортированы в алфавитном порядке в сообщениях об ошибках, поэтому их легче сравнивать на глаз.
- Для простоты я не занимался тестированием закрепляющего бита.
person
spectras
schedule
26.09.2015
os.stat(my_directory)
возвращает объектos.stat_return()
, который имеет несколько свойств, включаяst_mode
. Что касается демистификации16877
, вы можете присвоить значение переменной с соответствующим именем, но это все, что вы можете сделать, поскольку свойствоst_mode
объектаos.stat_return()
всегда будет числовым значением. - person Alea Kootz   schedule 21.09.20150o40755
или16877
, но если дать ему повсеместное название, это поможет всем. - person Peter Wood   schedule 23.09.2015