2017-05-27 4 views
0

私はafl-fuzz(Cアプリケーション)をPythonに書き直しています。私はその内部の仕組みを十分に理解していないので、できるだけ近いところでその機能を再現したいと思います。UnitTestのSystemExitハンドラを回避できますか?

私は、Pythonインタープリタをforkするルーチンの機能テストを実行しようとしていますが、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変更することなく、この機能にunittestの仕事をする方法はありますか? sys.exit()の代わりにos._exitを試しましたが、両方のプロセスでプログラムが終了しました。

答えて

1

sys.exit()は、キャッチされないとプログラムを終了するSystemExitクラスの例外を発生させます。

def text_exercise_fork(self): 
    try: 
     run_test() 
    except SystemExit as e: 
     print(e.args[0]) 
+0

ありがとうございました。事は私がそれをキャッチしたくないということです、私は出口コード= 42で実際にフォークされたプロセスが死ぬことを望みます。 – d33tah

0

それはos._exitが実際に働いていたことが判明したが、私のユニットテストで私はos.forkを嘲笑ことを考えると、それをモックするために必要な:あなたは、例外をキャッチしようとすることができます。愚かな間違い。

関連する問題