ATF_TC_BODY(rewrite__missing_file, tc) { bool success; RE(kyua_atf_result_rewrite("in.txt", "out.txt", generate_wait_exitstatus(EXIT_SUCCESS), false, &success)); atf_utils_cat_file("out.txt", "OUTPUT: "); ATF_REQUIRE(atf_utils_compare_file("out.txt", "broken: Premature exit; test case exited with code 0\n")); ATF_REQUIRE(!success); }
ATF_TC_BODY(rewrite__too_long_with_newlines, tc) { char input[1000]; fill_buffer("failed: ", "line\n", input, sizeof(input)); // This is quite awful but is the price we have to pay for using fixed-size // buffers in the code for simplicity and speed... char exp_output[1024 + 8 /* strlen("failed: ") */ + 1]; fill_buffer("failed: ", "line<<NEWLINE>>", exp_output, sizeof(exp_output)); exp_output[sizeof(exp_output) - 2] = '\n'; bool success; atf_utils_create_file("in.txt", "%s", input); RE(kyua_atf_result_rewrite("in.txt", "out.txt", generate_wait_exitstatus(EXIT_FAILURE), false, &success)); atf_utils_cat_file("out.txt", "OUTPUT: "); printf("EXPECTED: %s", exp_output); ATF_REQUIRE(atf_utils_compare_file("out.txt", exp_output)); ATF_REQUIRE_EQ(false, success); }
/// Forks and executes the body of a test case in a controlled manner. /// /// \param test_program Path to the test program to execute. /// \param test_case Name of the test case to run. /// \param result_file Path to the ATF result file to be created. /// \param user_variables Set of configuration variables to pass to the test. /// \param run_params Settings to control the subprocess. /// \param [out] success Set to true if the test case runs properly and returns /// a result that is to be considered as successful. /// /// \return OK if all goes well, an error otherwise. Note that a failed test /// case is denoted by setting success to false on exit, not by returning an /// error. static kyua_error_t run_body(const char* test_program, const char* test_case, const char* result_file, const char* const user_variables[], const kyua_run_params_t* run_params, bool* success) { kyua_error_t error; char* tmp_result_file; error = kyua_fs_concat(&tmp_result_file, run_params->work_directory, "result.txt", NULL); if (kyua_error_is_set(error)) goto out; pid_t pid; error = kyua_run_fork(run_params, &pid); if (!kyua_error_is_set(error) && pid == 0) { exec_body(test_program, test_case, tmp_result_file, user_variables); } assert(pid != -1 && pid != 0); if (kyua_error_is_set(error)) goto out_tmp_result_file; int status; bool timed_out; error = kyua_run_wait(pid, &status, &timed_out); if (kyua_error_is_set(error)) goto out_tmp_result_file; if (WIFSIGNALED(status) && WCOREDUMP(status)) { kyua_stacktrace_dump(test_program, pid, run_params, stderr); } error = kyua_atf_result_rewrite(tmp_result_file, result_file, status, timed_out, success); out_tmp_result_file: free(tmp_result_file); out: return error; }