2012-05-20 30 views
3

(平臺:Linux,特別是Fedora和紅帽企業Linux 6)確保測試用例可以刪除它創建的臨時目錄

我已經寫了一個Python integration test是執行以下操作:

  • 創建一個臨時目錄
  • 講述了一個web服務(apache下運行),運行一個rsync的工作是將文件複製到該目錄
  • 檢查文件是否已正確複製(即配置是正確傳遞FR OM通過對通過Web服務的rsync的調用)客戶端
  • (嘗試)刪除臨時目錄

目前,最後一步失敗,因爲rsync的創造與他們擁有一套文件那是apache用戶,所以測試用例沒有必要的權限來刪除這些文件。

這個Server Fault question提供了一個很好的解釋,爲什麼清理步驟目前失敗,因爲集成測試設置的情況。

我目前的工作:我只是不刪除測試清理中的臨時目錄,因此這些集成測試會將需要從/tmp中手動清除的虛擬文件留下。

我目前正在考慮的主要解決方案是專門添加一個setuid腳本來處理測試套件的清理操作。這應該工作,但我希望別人可以建議一個更優雅的解決方案。具體來說,如果集成測試客戶端沒有必要關心apache進程的uid,我真的很喜歡它。

途徑我考慮,但拒絕以各種理由:

  • 運行測試用例的根。這實際上可行,但需要以root身份運行測試套件相當難看。
  • 在測試套件創建的目錄上設置sticky位。據我所知,rsync忽略了這一點,因爲它設置爲從遠程服務器複製標誌。但是,即使調整設置以僅複製執行位似乎沒有幫助,所以我仍然不確定爲什麼這不起作用。
  • 將測試用戶添加到apache組。由於rsync在創建沒有寫入權限的文件時沒有幫助。
  • 運行一個Apache實例作爲測試用戶並進行測試。這有一些優點(因爲集成測試不會要求apache已經在運行),但是有缺點,我將無法對已經預先配置了生產設置的Apache實例運行集成測試,確保那些是正確的。因此,即使我最終可能將此功能添加到測試套件中,它也不會作爲更直接解決當前問題的替代品。

我真的不想做的另一件事是更改傳遞給rsync的設置,以便測試套件可以正確地清理臨時目錄。這是服務守護進程的集成測試,因此我想盡可能使用盡可能接近生產的配置。

+0

你應該只需要寫權限的目錄包含的母公司,而不是單個文件。 –

+0

爲了單獨測試的目的,您可以像測試一樣運行Web服務嗎?或者,您可以提供另一項服務來清理正在使用的目錄,但這對我來說不那麼幹淨。 –

+0

@詹姆斯:恩,好點。我一直在針對已經運行的Web服務器實例運行這些集成測試,因爲它的啓動時間並不好,但爲了更好地控制文件權限,它可能是值得的。 – ncoghlan

回答

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的目錄,以便測試用戶始終具有讀/寫訪問,也將有與執行位任何執行權限。

+0

爲了獲得一些測試通過,其中apache需要讀取由測試工具創建的文件和目錄,我還爲臨時目錄的ACL條目添加了''「d:o :: rX」'''。 – ncoghlan

1

測試用戶添加到Apache組(或httpd的團體,無論對文件組的所有權)。

+0

不幸的是,rsync正在創建沒有組寫入權限的文件。不過,我會將它添加到我已經嘗試過的事情列表中。 – ncoghlan

相關問題