确保测试用例可以删除它创建的临时目录

时间:2012-05-20 13:33:36

标签: python apache file-permissions rsync

(平台:Linux,特别是Fedora和Red Hat Enterprise Linux 6)

我有一个用Python编写的integration test来执行以下操作:

  • 创建一个临时目录
  • 告诉Web服务(在apache下运行)运行将文件复制到该目录的rsync作业
  • 检查文件是否已正确复制(即配置已从客户端正确传递到通过Web服务进行rsync调用)
  • (尝试)删除临时目录

目前,最后一步失败是因为rsync正在创建文件,其所有权设置为apache用户的所有权,因此测试用例没有必要的权限来删除文件。

考虑到集成测试设置的情况,这个Server Fault question提供了一个很好的解释,说明清理步骤当前失败的原因。

我目前的做法:我只是不删除测试清理中的临时目录,因此这些集成测试会留下虚拟文件,需要手动清除/tmp

我目前正在考虑的主要解决方案是专门添加一个setuid脚本来处理测试套件的清理操作。这应该有效,但我希望其他人能提出更优雅的解决方案。具体来说,如果集成测试客户端不需要关心apache进程的uid,我真的很喜欢它。

我已经考虑但由于各种原因拒绝的方法:

  • 以root身份运行测试用例。这实际上有效,但是需要以root身份运行测试套件是相当丑陋的。
  • 设置测试套件创建的目录上的粘滞位。就像我所知,rsync忽略了这一点,因为它设置为从远程服务器复制标志。然而,即使调整设置只复制执行位似乎没有帮助,所以我仍然不确定为什么这不起作用。
  • 将测试用户添加到apache组。由于rsync正在创建没有组写权限的文件,因此没有帮助。
  • 以测试用户身份运行Apache实例并对其进行测试。这有一些优点(因为集成测试不会要求apache已经运行),但有一个缺点,我赢得了能够针对已预先配置的Apache实例运行集成测试生产设置,以确保那些是正确的。因此,尽管我最终可能会将此功能添加到测试套件中,但它不会成为替换以更直接地解决当前问题。

我真正不想做的另一件事是更改传递给rsync的设置,以便测试套件可以正确清理临时目录。这是服务守护程序的集成测试,因此我希望尽可能使用配置尽可能接近生产。

2 个答案:

答案 0 :(得分:1)

将测试用户添加到apache组(或httpd组,无论哪个文件具有组所有权)。

答案 1 :(得分:1)

在服务器故障问题的答案的帮助下,我能够使用setfacl找出解决方案。

为集成测试创建临时目录的代码现在执行以下操作(它是unittest.TestCase实例的一部分,因此引用addCleanup):

local_path = tempfile.mkdtemp().decode("utf-8")
self.addCleanup(shutil.rmtree, local_path)
acl = "d:u:{0}:rwX".format(os.geteuid())
subprocess.check_call(["setfacl", "-m", acl, local_path])

前两行只是创建临时目录,并确保在测试结束时删除它。

最后两行是新部分,并设置目录的默认ACL,以便测试用户始终具有读/写访问权限,并且对具有执行位设置的任何内容也具有执行权限。