## マルチプロセス マルチプロセス — マルチプロセスでテストを走らせるためののユーティリティ。 |

## 概要

                        CutSubProcess;
                        CutSubProcessGroup;
    #define             cut_take_new_sub_process            (test_directory)
    cut_boolean         cut_sub_process_run                 (CutSubProcess *sub_process);
    void                cut_sub_process_run_async           (CutSubProcess *sub_process);
    cut_boolean         cut_sub_process_wait                (CutSubProcess *sub_process);
    cut_boolean         cut_sub_process_is_success          (CutSubProcess *sub_process);
    cut_boolean         cut_sub_process_is_running          (CutSubProcess *sub_process);
    const char*         cut_sub_process_get_test_directory  (CutSubProcess *sub_process);
    void                cut_sub_process_set_test_directory  (CutSubProcess *sub_process,
                                                             const char *test_directory);
    const char*         cut_sub_process_get_source_directory
                                                            (CutSubProcess *sub_process);
    void                cut_sub_process_set_source_directory
                                                            (CutSubProcess *sub_process,
                                                             const char *source_directory);
    cut_boolean         cut_sub_process_get_multi_thread    (CutSubProcess *sub_process);
    void                cut_sub_process_set_multi_thread    (CutSubProcess *sub_process,
                                                             cut_boolean multi_thread);
    const char**        cut_sub_process_get_exclude_files   (CutSubProcess *sub_process);
    void                cut_sub_process_set_exclude_files   (CutSubProcess *sub_process,
                                                             const char **files);
    const char**        cut_sub_process_get_exclude_directories
                                                            (CutSubProcess *sub_process);
    void                cut_sub_process_set_exclude_directories
                                                            (CutSubProcess *sub_process,
                                                             const char **directories);
    const char**        cut_sub_process_get_target_test_case_names
                                                            (CutSubProcess *sub_process);
    void                cut_sub_process_set_target_test_case_names
                                                            (CutSubProcess *sub_process,
                                                             const char **names);
    const char**        cut_sub_process_get_target_test_names
                                                            (CutSubProcess *sub_process);
    void                cut_sub_process_set_target_test_names
                                                            (CutSubProcess *sub_process,
                                                             const char **names);
    double              cut_sub_process_get_elapsed         (CutSubProcess *sub_process);
    double              cut_sub_process_get_total_elapsed   (CutSubProcess *sub_process);
    cut_boolean         cut_sub_process_is_crashed          (CutSubProcess *sub_process);
    cut_boolean         cut_sub_process_get_fatal_failures  (CutSubProcess *sub_process);
    void                cut_sub_process_set_fatal_failures  (CutSubProcess *sub_process,
                                                             cut_boolean fatal_failures);
    #define             cut_take_new_sub_process_group      ()
    void                cut_sub_process_group_add           (CutSubProcessGroup *group,
                                                             CutSubProcess *sub_process);
    cut_boolean         cut_sub_process_group_run           (CutSubProcessGroup *group);
    void                cut_sub_process_group_run_async     (CutSubProcessGroup *group);
    cut_boolean         cut_sub_process_group_wait          (CutSubProcessGroup *group);

## 説明

もしテスト対象のソフトウェアがマルチプロセスやマルチスレッドでの使用をサポートしているなら、それらの機能をテストする必要があります。そのようなテストために、CutSubProcessとCutSubProcessGroupを使うことができます。

CutSubProcessはテストを別のプロセスで走らせ、その結果をメインプロセスに転送します。このため、別のプロセス上でのテスト結果もメインプロセス上でのテスト結果と同じように見えます。

CutSubProcessGroupはいくつかのCutSubProcessをまとめて実行するための便利オブジェクトです。

## 詳細

### CutSubProcess

    typedef struct _CutSubProcess CutSubProcess;

サブcutterプロセスを表現するオブジェクトです。サブcutterプロセスのパラメタとテスト結果を持っています。

例:

    CutSubProcess *sub_process;

    sub_process = cut_take_new_sub_process("test-dir");
    cut_sub_process_set_multi_thread(sub_process, TRUE);
    cut_assert_true(cut_sub_process_run(sub_process));

1.0.4から

### CutSubProcessGroup

    typedef struct _CutSubProcessGroup CutSubProcessGroup;

サブcutterプロセスを実行するオブジェクトです。このオブジェクトは便利にテストを書くために導入されています。

例:

    CutSubProcess *sub_process1, *sub_process2, *sub_process3;
    CutSubProcessGroup *group;

    sub_process1 = cut_take_new_sub_process("test-dir1");
    sub_process2 = cut_take_new_sub_process("test-dir2");
    sub_process3 = cut_take_new_sub_process("test-dir3");

    group = cut_take_new_sub_process_group();
    cut_sub_process_group_add(group, sub_process1);
    cut_sub_process_group_add(group, sub_process2);
    cut_sub_process_group_add(group, sub_process3);
    cut_assert_true(cut_sub_process_group_run(group));

1.0.4から

### cut_take_new_sub_process()

    #define             cut_take_new_sub_process(test_directory)

`test_directory`以下のテストを実行するサブcutterプロセスを作り、それを返します。返されたサブcutterプロセスの所有者はCutterです。

`test_directory` : | サブcutterプロセスのテストがあるディレクトリ。

1.0.4から

### cut_sub_process_run ()

    cut_boolean         cut_sub_process_run                 (CutSubProcess *sub_process);

サブcutterプロセスを実行します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | もし、`sub_process`が正常に終了した場合は`CUT_TRUE`、そうでない場合は`CUT_FALSE`。

1.0.4から

### cut_sub_process_run_async ()

    void                cut_sub_process_run_async           (CutSubProcess *sub_process);

非同期でサブcutterコマンドを実行します。`sub_process`の結果は`cut_sub_process_wait()`で取得できます。

`sub_process` : | CutSubProcessオブジェクト。

1.0.4から

### cut_sub_process_wait ()

    cut_boolean         cut_sub_process_wait                (CutSubProcess *sub_process);

非同期で実行されたサブcutterプロセスの終了を待ち、結果を返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | もし、`sub_process`が正常に終了した場合は`CUT_TRUE`、そうでない場合は`CUT_FALSE`。

1.0.4から

### cut_sub_process_is_success ()

    cut_boolean         cut_sub_process_is_success          (CutSubProcess *sub_process);

`sub_process`が正常に終了したかどうかを返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | もし、`sub_process`が正常に終了した場合は`CUT_TRUE`、そうでない場合は`CUT_FALSE`。

1.0.4から

### cut_sub_process_is_running ()

    cut_boolean         cut_sub_process_is_running          (CutSubProcess *sub_process);

`sub_process`が実行中かどうかを返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | `sub_process`が実行中の場合は`CUT_TRUE`、そうでない場合は`CUT_FALSE`。

1.0.4から

### cut_sub_process_get_test_directory ()

    const char*         cut_sub_process_get_test_directory  (CutSubProcess *sub_process);

実行対象のテストがあるディレクトリを返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | テストディレクトリ

1.0.4から

### cut_sub_process_set_test_directory ()

    void                cut_sub_process_set_test_directory  (CutSubProcess *sub_process,
                                                             const char *test_directory);

実行対象のテストがあるディレクトリとして`test_directory`を指定します。これは必須のコマンドライン引数であるTEST_DIRECTORYと同じ意味を持ちます。

`sub_process` : | CutSubProcessオブジェクト。
`test_directory` : | テストディレクトリ

1.0.4から

### cut_sub_process_get_source_directory ()

    const char*         cut_sub_process_get_source_directory
                                                            (CutSubProcess *sub_process);

ソースファイルがあるディレクトリを返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | ソースディレクトリ。

1.0.4から

### cut_sub_process_set_source_directory ()

    void                cut_sub_process_set_source_directory
                                                            (CutSubProcess *sub_process,
                                                             const char *source_directory);

ソースファイルがあるディレクトリとして`source_directory`を指定します。これは--source-directoryコマンドラインオプションと同じ意味を持ちます。

`sub_process` : | CutSubProcessオブジェクト。
`source_directory` : | ソースディレクトリ。

1.0.4から

### cut_sub_process_get_multi_thread ()

    cut_boolean         cut_sub_process_get_multi_thread    (CutSubProcess *sub_process);

`sub_process`をマルチスレッドモードで実行するかどうかを返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | `sub_process`がマルチスレッドモードで実行されるなら`CUT_TRUE`、そうでなければ`CUT_FALSE`。

1.0.4から

### cut_sub_process_set_multi_thread ()

    void                cut_sub_process_set_multi_thread    (CutSubProcess *sub_process,
                                                             cut_boolean multi_thread);

`sub_process`がマルチスレッドモードで実行されるかどうかを指定します。これは--multi-threadコマンドラインオプションと同じ意味を持ちます。

`sub_process` : | CutSubProcessオブジェクト。
`multi_thread` : | マルチスレッドモードで実行されるなら`CUT_TRUE`。

1.0.4から

### cut_sub_process_get_exclude_files ()

    const char**        cut_sub_process_get_exclude_files   (CutSubProcess *sub_process);

テスト対象ファイルから除外されるファイル名を返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | テスト対象ファイルから除外されるファイル名。

1.0.4から

### cut_sub_process_set_exclude_files ()

    void                cut_sub_process_set_exclude_files   (CutSubProcess *sub_process,
                                                             const char **files);

テスト対象から除外されるファイル名を指定します。これは--exclude-fileコマンドラインオプションと同じ意味を持ちます。

`sub_process` : | CutSubProcessオブジェクト。
`files` : | テスト対象ファイルから除外されるファイル名。

1.0.4から

### cut_sub_process_get_exclude_directories ()

    const char**        cut_sub_process_get_exclude_directories
                                                            (CutSubProcess *sub_process);

テスト対象ディレクトリから除外されるディレクトリ名を返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | テスト対象ディレクトリから除外されるディレクトリ名。

1.0.4から

### cut_sub_process_set_exclude_directories ()

    void                cut_sub_process_set_exclude_directories
                                                            (CutSubProcess *sub_process,
                                                             const char **directories);

テスト対象ディレクトリから除外されるディレクトリ名を指定します。これは--exclude-directoryコマンドラインオプションと同じ意味を持ちます。

`sub_process` : | CutSubProcessオブジェクト。
`directories` : | テスト対象ディレクトリから除外されるディレクトリ名。

1.0.4から

### cut_sub_process_get_target_test_case_names ()

    const char**        cut_sub_process_get_target_test_case_names
                                                            (CutSubProcess *sub_process);

実行されるテストケース名を返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | 実行されるテストケース名。

1.0.4から

### cut_sub_process_set_target_test_case_names ()

    void                cut_sub_process_set_target_test_case_names
                                                            (CutSubProcess *sub_process,
                                                             const char **names);

実行されるテストケース名を指定します。これは--test-caseコマンドラインオプションと同じ意味を持ちます。

`sub_process` : | CutSubProcessオブジェクト。
`names` : | 実行されるテストケース名。

1.0.4から

### cut_sub_process_get_target_test_names ()

    const char**        cut_sub_process_get_target_test_names
                                                            (CutSubProcess *sub_process);

実行されるテスト名を返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | 実行されるテスト名。

1.0.4から

### cut_sub_process_set_target_test_names ()

    void                cut_sub_process_set_target_test_names
                                                            (CutSubProcess *sub_process,
                                                             const char **names);

実行されるテスト名を指定します。これは--testコマンドラインオプションと同じ意味を持ちます。

`sub_process` : | CutSubProcessオブジェクト。
`names` : | 実行されるテスト名。

1.0.4から

### cut_sub_process_get_elapsed ()

    double              cut_sub_process_get_elapsed         (CutSubProcess *sub_process);

`sub_process`を実行していた間の時間を取得します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | `sub_process`を実行していた間の時間。

1.0.4から

### cut_sub_process_get_total_elapsed ()

    double              cut_sub_process_get_total_elapsed   (CutSubProcess *sub_process);

各テストで使われた時間の合計を返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | 各テストで使われた時間の合計。

1.0.4から

### cut_sub_process_is_crashed ()

    cut_boolean         cut_sub_process_is_crashed          (CutSubProcess *sub_process);

`sub_process`が異常終了したかどうかを返します。

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | `sub_process`が異常終了したときは`CUT_TRUE`、そうでない場合は`CUT_FALSE`。

1.0.4から

### cut_sub_process_get_fatal_failures ()

    cut_boolean         cut_sub_process_get_fatal_failures  (CutSubProcess *sub_process);

Returns whether `sub_process` is ran in fatal-failures mode. See `cut_sub_process_set_fatal_failures()` more details of fatal-failures mode.

`sub_process` : | CutSubProcessオブジェクト。
戻り値 : | `CUT_TRUE` if `sub_process` is ran in fatal-failures mode, `CUT_FALSE` otherwise.

1.0.4から

### cut_sub_process_set_fatal_failures ()

    void                cut_sub_process_set_fatal_failures  (CutSubProcess *sub_process,
                                                             cut_boolean fatal_failures);

Sets whether `sub_process` is ran in fatal-failures mode or not. In this mode, all failures are treated as fatal problems. It means that test is aborted on failure. On some environments, breakpoint is set.

This is same as --fatal-failures command line option.

`sub_process` : | CutSubProcessオブジェクト。
`fatal_failures` : | `CUT_TRUE` to be ran in fatal-failures mode.

1.0.4から

### cut_take_new_sub_process_group()

    #define             cut_take_new_sub_process_group()

サブc

戻り値 : | CutSubProcessGroupオブジェクト。

1.0.4から

### cut_sub_process_group_add ()

    void                cut_sub_process_group_add           (CutSubProcessGroup *group,
                                                             CutSubProcess *sub_process);

`sub_process`を`group`に追加します。

`group` : | CutSubProcessGroupオブジェクト。
`sub_process` : | CutSubProcessオブジェクト。

1.0.4から

### cut_sub_process_group_run ()

    cut_boolean         cut_sub_process_group_run           (CutSubProcessGroup *group);

`group`内のすべてのサブcutterプロセスを実行し、その結果を返します。

`group` : | CutSubProcessGroupオブジェクト。
戻り値 : | `group`内のすべてのサブcutterプロセスが正常終了したら`CUT_TRUE`、そうでない場合は`CUT_FALSE`。

1.0.4から

### cut_sub_process_group_run_async ()

    void                cut_sub_process_group_run_async     (CutSubProcessGroup *group);

`group`内のすべてのサブcutterプロセスを非同期で実行します。実行結果は`cut_sub_process_group_wait()`で取得できます。

`group` : | CutSubProcessGroupオブジェクト。

1.0.4から

### cut_sub_process_group_wait ()

    cut_boolean         cut_sub_process_group_wait          (CutSubProcessGroup *group);

`group`内の非同期で実行されたすべてのサブcutterプロセスの終了を待ち、終了結果を返します。

`group` : | CutSubProcessGroupオブジェクト。
戻り値 : | `group`内のすべてのサブcutterプロセスが正常終了したら`CUT_TRUE`、そうでない場合は`CUT_FALSE`。

1.0.4から