diff options
author | jmmv <jmmv@FreeBSD.org> | 2014-10-30 17:14:07 +0000 |
---|---|---|
committer | jmmv <jmmv@FreeBSD.org> | 2014-10-30 17:14:07 +0000 |
commit | 3b6cf63a5c1f2de80b3b7fdd30eab1717f5c9407 (patch) | |
tree | ad1d74d2ba71e1c54c3276bb7c67e257831ec21f /atf-c++/utils_test.cpp | |
parent | 14f39fed9fe557bdd640e02d9abbe2e695400d9e (diff) | |
download | FreeBSD-src-3b6cf63a5c1f2de80b3b7fdd30eab1717f5c9407.zip FreeBSD-src-3b6cf63a5c1f2de80b3b7fdd30eab1717f5c9407.tar.gz |
Import atf-0.21:
Released on October 23rd, 2014.
* Restored the atf(7) manual page to serve as a reference to all the other
manual pages shipped by ATF.
* Added the -s flag to atf-sh to support specifying the shell interpreter
to be used.
* Removed ATF_WORKDIR. The only remaining consumers have been converted to
use the standard TMPDIR environment variable. As a benefit, and because
Kyua forces the TMPDIR to live within the test case's work directory,
any stale files left behind by ATF will be automatically cleaned up.
* Documented the environment variables recognized by each component in the
relevant manual pages. This information was lost with the atf-config(1)
removal.
* Added a new "require.diskspace" metadata property to test cases so that
they can specify the minimum amount of disk space required for the test
to run.
* Renamed the atf-{c,c++,sh}-api(3) manual pages to atf-{c,c++,sh}(3) for
discoverability purposes. Symbolic links are provided for the time
being to still make the old names visible.
* Issue #5: Recommend the (expected, actual) idiom for calls to the test
macros in the manual pages.
* Issue #7: Stopped catching unhandled exceptions in atf-c++ tests. This
propagates the crash to the caller, which in turn allows it to obtain
proper debugging information. In particular, Kyua should now be able to
extract a stacktrace pinpointing the problem.
* Issue #8: Fixed atf-c/macros_test:use test failures spotted by the clang
that ships with FreeBSD 11.0-CURRENT.
* Issue #12: Improved documentation of atf-sh(3) and atf-check(1) by better
explaining how they relate to each other.
* Issue #14: Stopped setting 'set -e' in atf-sh. This setting was
initially added as a way to enable a "strict" mode in the library and to
make test cases fail fast when they run unprotected commands. However,
doing so in the library is surprising as the responsibility of enabling
'set -e' should be on the user's code. Also, 'set -e' introduces
inconsistent behavior on subshells and users do not expect that.
* Issue #15: Fixed atf_utils_{fork,wait} to support nested calls.
* Issue #16: Fixed test failures (by removing a long-standing hack) on
systems that lack \e support in printf(1).
* Issue #19: Removed stale references to atf-config and atf-run.
Diffstat (limited to 'atf-c++/utils_test.cpp')
-rw-r--r-- | atf-c++/utils_test.cpp | 66 |
1 files changed, 44 insertions, 22 deletions
diff --git a/atf-c++/utils_test.cpp b/atf-c++/utils_test.cpp index 37457ff..34e0709 100644 --- a/atf-c++/utils_test.cpp +++ b/atf-c++/utils_test.cpp @@ -1,6 +1,3 @@ -// -// Automated Testing Framework (atf) -// // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // @@ -25,7 +22,8 @@ // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// + +#include "atf-c++/utils.hpp" extern "C" { #include <sys/stat.h> @@ -38,22 +36,20 @@ extern "C" { #include <cstdlib> #include <iostream> #include <set> +#include <sstream> #include <string> #include <vector> -#include "macros.hpp" -#include "utils.hpp" - -#include "detail/test_helpers.hpp" +#include <atf-c++.hpp> static std::string -read_file(const char *path) +read_file(const std::string& path) { char buffer[1024]; - const int fd = open(path, O_RDONLY); + const int fd = open(path.c_str(), O_RDONLY); if (fd == -1) - ATF_FAIL("Cannot open " + std::string(path)); + ATF_FAIL("Cannot open " + path); const ssize_t length = read(fd, buffer, sizeof(buffer) - 1); close(fd); ATF_REQUIRE(length != -1); @@ -238,8 +234,13 @@ ATF_TEST_CASE_BODY(fork) ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); - ATF_REQUIRE_EQ("Child stdout\n", read_file("atf_utils_fork_out.txt")); - ATF_REQUIRE_EQ("Child stderr\n", read_file("atf_utils_fork_err.txt")); + std::ostringstream out_name; + out_name << "atf_utils_fork_" << pid << "_out.txt"; + std::ostringstream err_name; + err_name << "atf_utils_fork_" << pid << "_err.txt"; + + ATF_REQUIRE_EQ("Child stdout\n", read_file(out_name.str())); + ATF_REQUIRE_EQ("Child stderr\n", read_file(err_name.str())); } ATF_TEST_CASE_WITHOUT_HEAD(grep_collection__set); @@ -353,6 +354,35 @@ ATF_TEST_CASE_BODY(wait__ok) } } +ATF_TEST_CASE_WITHOUT_HEAD(wait__ok_nested); +ATF_TEST_CASE_BODY(wait__ok_nested) +{ + const pid_t parent = atf::utils::fork(); + ATF_REQUIRE(parent != -1); + if (parent == 0) { + const pid_t child = atf::utils::fork(); + ATF_REQUIRE(child != -1); + if (child == 0) { + std::cerr.flush(); + std::cout << "Child output\n"; + std::cout.flush(); + std::cerr << "Child error\n"; + std::exit(50); + } else { + std::cout << "Parent output\n"; + std::cerr << "Parent error\n"; + atf::utils::wait(child, 50, "Child output\n", "Child error\n"); + std::exit(40); + } + } else { + atf::utils::wait(parent, 40, + "Parent output\n" + "subprocess stdout: Child output\n" + "subprocess stderr: Child error\n", + "Parent error\n"); + } +} + ATF_TEST_CASE_WITHOUT_HEAD(wait__invalid_exitstatus); ATF_TEST_CASE_BODY(wait__invalid_exitstatus) { @@ -433,12 +463,6 @@ ATF_TEST_CASE_BODY(wait__save_stderr) } // ------------------------------------------------------------------------ -// Tests cases for the header file. -// ------------------------------------------------------------------------ - -HEADER_TC(include, "atf-c++/utils.hpp"); - -// ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ @@ -476,12 +500,10 @@ ATF_INIT_TEST_CASES(tcs) ATF_ADD_TEST_CASE(tcs, redirect__other); ATF_ADD_TEST_CASE(tcs, wait__ok); + ATF_ADD_TEST_CASE(tcs, wait__ok_nested); ATF_ADD_TEST_CASE(tcs, wait__invalid_exitstatus); ATF_ADD_TEST_CASE(tcs, wait__invalid_stdout); ATF_ADD_TEST_CASE(tcs, wait__invalid_stderr); ATF_ADD_TEST_CASE(tcs, wait__save_stdout); ATF_ADD_TEST_CASE(tcs, wait__save_stderr); - - // Add the test cases for the header file. - ATF_ADD_TEST_CASE(tcs, include); } |