bool atf_check::run_output_check(const atf::check::check_result &r, const std::string &stdxxx) const { atf::fs::path path("/"); std::string arg; output_check_t check = m_stdout_check; if (stdxxx == "stdout") { path = r.stdout_path(); arg = m_stdout_arg.c_str(); check = m_stdout_check; } else if (stdxxx == "stderr") { path = r.stderr_path(); arg = m_stderr_arg.c_str(); check = m_stderr_check; } else UNREACHABLE; if (check == oc_empty) { if (!file_empty(path)) { std::cerr << "Fail: incorrect " << stdxxx << std::endl; print_diff(atf::fs::path("/dev/null"), path); return false; } } else if (check == oc_file) { if (atf::io::cmp(path, atf::fs::path(arg)) != 0) { std::cerr << "Fail: incorrect " << stdxxx << std::endl; print_diff(atf::fs::path(arg), path); return false; } } else if (check == oc_inline) { std::string decoded = decode(arg); atf::fs::path path2 = atf::fs::path(atf::config::get("atf_workdir")) \ / "inline.XXXXXX"; atf::fs::temp_file temp(path2); temp.write(decoded); if (atf::io::cmp(path, temp.get_path()) != 0) { std::cerr << "Fail: incorrect " << stdxxx << std::endl; print_diff(temp.get_path(), path); return false; } } else if (check == oc_save) { std::ifstream ifs(path.c_str(), std::fstream::binary); ifs >> std::noskipws; std::istream_iterator< char > begin(ifs), end; std::ofstream ofs(arg.c_str(), std::fstream::binary | std::fstream::trunc); std::ostream_iterator <char> obegin(ofs); std::copy(begin, end, obegin); }
static bool run_output_check(const output_check oc, const atf::fs::path& path, const std::string& stdxxx) { bool result; if (oc.type == oc_empty) { const bool is_empty = file_empty(path); if (!oc.negated && !is_empty) { std::cerr << "Fail: " << stdxxx << " not empty\n"; print_diff(atf::fs::path("/dev/null"), path); result = false; } else if (oc.negated && is_empty) { std::cerr << "Fail: " << stdxxx << " is empty\n"; result = false; } else result = true; } else if (oc.type == oc_file) { const bool equals = compare_files(path, atf::fs::path(oc.value)); if (!oc.negated && !equals) { std::cerr << "Fail: " << stdxxx << " does not match golden " "output\n"; print_diff(atf::fs::path(oc.value), path); result = false; } else if (oc.negated && equals) { std::cerr << "Fail: " << stdxxx << " matches golden output\n"; cat_file(atf::fs::path(oc.value)); result = false; } else result = true; } else if (oc.type == oc_ignore) { result = true; } else if (oc.type == oc_inline) { atf::fs::path path2 = atf::fs::path(atf::config::get("atf_workdir")) / "inline.XXXXXX"; temp_file temp(path2); temp.write(decode(oc.value)); temp.close(); const bool equals = compare_files(path, temp.get_path()); if (!oc.negated && !equals) { std::cerr << "Fail: " << stdxxx << " does not match expected " "value\n"; print_diff(temp.get_path(), path); result = false; } else if (oc.negated && equals) { std::cerr << "Fail: " << stdxxx << " matches expected value\n"; cat_file(temp.get_path()); result = false; } else result = true; } else if (oc.type == oc_match) { const bool matches = grep_file(path, oc.value); if (!oc.negated && !matches) { std::cerr << "Fail: regexp " + oc.value + " not in " << stdxxx << "\n"; cat_file(path); result = false; } else if (oc.negated && matches) { std::cerr << "Fail: regexp " + oc.value + " is in " << stdxxx << "\n"; cat_file(path); result = false; } else result = true; } else if (oc.type == oc_save) { INV(!oc.negated); std::ifstream ifs(path.c_str(), std::fstream::binary); ifs >> std::noskipws; std::istream_iterator< char > begin(ifs), end; std::ofstream ofs(oc.value.c_str(), std::fstream::binary | std::fstream::trunc); std::ostream_iterator <char> obegin(ofs); std::copy(begin, end, obegin); result = true; } else {