summaryrefslogtreecommitdiffstats
path: root/atf-c++/utils_test.cpp
diff options
context:
space:
mode:
authorjmmv <jmmv@FreeBSD.org>2014-10-30 17:14:07 +0000
committerjmmv <jmmv@FreeBSD.org>2014-10-30 17:14:07 +0000
commit3b6cf63a5c1f2de80b3b7fdd30eab1717f5c9407 (patch)
treead1d74d2ba71e1c54c3276bb7c67e257831ec21f /atf-c++/utils_test.cpp
parent14f39fed9fe557bdd640e02d9abbe2e695400d9e (diff)
downloadFreeBSD-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.cpp66
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);
}
OpenPOWER on IntegriCloud