我正在爲Python重寫一個afl-fuzz(一個C應用程序)。由於我對其內部工作沒有足夠的瞭解,因此我想盡可能地複製其功能。我可以使用UnitTest的SystemExit處理程序嗎?
我試圖運行一個例程的功能測試,它運行Python解釋器,運行execve
,如果失敗,則返回42來向調用者報告失敗。測試在unittest外運行良好,但在放入它:
#!/usr/bin/env python
import os
import sys
import unittest
def run_test():
x = os.fork()
if not x:
sys.exit(42)
waitpid_result, status = os.waitpid(x, os.WUNTRACED)
print(os.WEXITSTATUS(status))
class ForkFunctionalTest(unittest.TestCase):
def test_exercise_fork(self):
run_test()
if __name__ == '__main__':
print('Expecting "42" as output:')
run_test()
print('\nAnd here goes unexpected SystemExit error:')
unittest.main()
下面是它的失敗:
Expecting "42" as output:
42
And here goes unexpected SystemExit error:
E
======================================================================
ERROR: test_exercise_fork (__main__.ForkFunctionalTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "afl-fuzz2.py", line 23, in test_exercise_fork
run_test()
File "afl-fuzz2.py", line 15, in run_test
sys.exit(42)
SystemExit: 42
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
1
.
----------------------------------------------------------------------
Ran 1 test in 0.014s
OK
有沒有辦法讓這個功能單元測試工作,而無需改變RUN_TEST?我嘗試了os._exit而不是sys.exit(),但它使程序在兩個進程中都死亡。
謝謝。問題是我不想捕獲它,我想實際上分叉的進程死於退出代碼= 42。 – d33tah