003 File Manager
Current Path:
/usr/src/contrib/kyua/utils/process
usr
/
src
/
contrib
/
kyua
/
utils
/
process
/
📁
..
📄
.gitignore
(8 B)
📄
Kyuafile
(390 B)
📄
Makefile.am.inc
(5.61 KB)
📄
child.cpp
(12.31 KB)
📄
child.hpp
(4 KB)
📄
child.ipp
(3.97 KB)
📄
child_fwd.hpp
(1.83 KB)
📄
child_test.cpp
(27.16 KB)
📄
deadline_killer.cpp
(2.12 KB)
📄
deadline_killer.hpp
(2.2 KB)
📄
deadline_killer_fwd.hpp
(1.89 KB)
📄
deadline_killer_test.cpp
(3.44 KB)
📄
exceptions.cpp
(2.77 KB)
📄
exceptions.hpp
(2.68 KB)
📄
exceptions_test.cpp
(2.26 KB)
📄
executor.cpp
(27.59 KB)
📄
executor.hpp
(8.38 KB)
📄
executor.ipp
(6.97 KB)
📄
executor_fwd.hpp
(1.94 KB)
📄
executor_test.cpp
(30.57 KB)
📄
fdstream.cpp
(2.53 KB)
📄
fdstream.hpp
(2.34 KB)
📄
fdstream_fwd.hpp
(1.85 KB)
📄
fdstream_test.cpp
(2.36 KB)
📄
helpers.cpp
(2.41 KB)
📄
isolation.cpp
(7.12 KB)
📄
isolation.hpp
(2.28 KB)
📄
isolation_test.cpp
(19.49 KB)
📄
operations.cpp
(9.2 KB)
📄
operations.hpp
(2.25 KB)
📄
operations_fwd.hpp
(1.98 KB)
📄
operations_test.cpp
(13.42 KB)
📄
status.cpp
(5.84 KB)
📄
status.hpp
(2.86 KB)
📄
status_fwd.hpp
(1.84 KB)
📄
status_test.cpp
(6.03 KB)
📄
system.cpp
(2.25 KB)
📄
system.hpp
(2.66 KB)
📄
systembuf.cpp
(4.58 KB)
📄
systembuf.hpp
(2.49 KB)
📄
systembuf_fwd.hpp
(1.86 KB)
📄
systembuf_test.cpp
(4.27 KB)
Editing: status_test.cpp
// Copyright 2010 The Kyua Authors. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of Google Inc. nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER 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 "utils/process/status.hpp" extern "C" { #include <sys/wait.h> #include <signal.h> #include <unistd.h> } #include <cstdlib> #include <atf-c++.hpp> #include "utils/test_utils.ipp" using utils::process::status; namespace { /// Body of a subprocess that exits with a particular exit status. /// /// \tparam ExitStatus The status to exit with. template< int ExitStatus > void child_exit(void) { std::exit(ExitStatus); } /// Body of a subprocess that sends a particular signal to itself. /// /// \tparam Signo The signal to send to self. template< int Signo > void child_signal(void) { ::kill(::getpid(), Signo); } /// Spawns a process and waits for completion. /// /// \param hook The function to run within the child. Should not return. /// /// \return The termination status of the spawned subprocess. status fork_and_wait(void (*hook)(void)) { pid_t pid = ::fork(); ATF_REQUIRE(pid != -1); if (pid == 0) { hook(); std::abort(); } else { int stat_loc; ATF_REQUIRE(::waitpid(pid, &stat_loc, 0) != -1); const status s = status(pid, stat_loc); ATF_REQUIRE_EQ(pid, s.dead_pid()); return s; } } } // anonymous namespace ATF_TEST_CASE_WITHOUT_HEAD(fake_exited) ATF_TEST_CASE_BODY(fake_exited) { const status fake = status::fake_exited(123); ATF_REQUIRE_EQ(-1, fake.dead_pid()); ATF_REQUIRE(fake.exited()); ATF_REQUIRE_EQ(123, fake.exitstatus()); ATF_REQUIRE(!fake.signaled()); } ATF_TEST_CASE_WITHOUT_HEAD(fake_signaled) ATF_TEST_CASE_BODY(fake_signaled) { const status fake = status::fake_signaled(567, true); ATF_REQUIRE_EQ(-1, fake.dead_pid()); ATF_REQUIRE(!fake.exited()); ATF_REQUIRE(fake.signaled()); ATF_REQUIRE_EQ(567, fake.termsig()); ATF_REQUIRE(fake.coredump()); } ATF_TEST_CASE_WITHOUT_HEAD(output__exitstatus); ATF_TEST_CASE_BODY(output__exitstatus) { const status fake = status::fake_exited(123); std::ostringstream str; str << fake; ATF_REQUIRE_EQ("status{exitstatus=123}", str.str()); } ATF_TEST_CASE_WITHOUT_HEAD(output__signaled_without_core); ATF_TEST_CASE_BODY(output__signaled_without_core) { const status fake = status::fake_signaled(8, false); std::ostringstream str; str << fake; ATF_REQUIRE_EQ("status{termsig=8, coredump=false}", str.str()); } ATF_TEST_CASE_WITHOUT_HEAD(output__signaled_with_core); ATF_TEST_CASE_BODY(output__signaled_with_core) { const status fake = status::fake_signaled(9, true); std::ostringstream str; str << fake; ATF_REQUIRE_EQ("status{termsig=9, coredump=true}", str.str()); } ATF_TEST_CASE_WITHOUT_HEAD(integration__exited); ATF_TEST_CASE_BODY(integration__exited) { const status exit_success = fork_and_wait(child_exit< EXIT_SUCCESS >); ATF_REQUIRE(exit_success.exited()); ATF_REQUIRE_EQ(EXIT_SUCCESS, exit_success.exitstatus()); ATF_REQUIRE(!exit_success.signaled()); const status exit_failure = fork_and_wait(child_exit< EXIT_FAILURE >); ATF_REQUIRE(exit_failure.exited()); ATF_REQUIRE_EQ(EXIT_FAILURE, exit_failure.exitstatus()); ATF_REQUIRE(!exit_failure.signaled()); } ATF_TEST_CASE_WITHOUT_HEAD(integration__signaled); ATF_TEST_CASE_BODY(integration__signaled) { const status sigterm = fork_and_wait(child_signal< SIGTERM >); ATF_REQUIRE(!sigterm.exited()); ATF_REQUIRE(sigterm.signaled()); ATF_REQUIRE_EQ(SIGTERM, sigterm.termsig()); ATF_REQUIRE(!sigterm.coredump()); const status sigkill = fork_and_wait(child_signal< SIGKILL >); ATF_REQUIRE(!sigkill.exited()); ATF_REQUIRE(sigkill.signaled()); ATF_REQUIRE_EQ(SIGKILL, sigkill.termsig()); ATF_REQUIRE(!sigkill.coredump()); } ATF_TEST_CASE_WITHOUT_HEAD(integration__coredump); ATF_TEST_CASE_BODY(integration__coredump) { utils::prepare_coredump_test(this); const status coredump = fork_and_wait(child_signal< SIGQUIT >); ATF_REQUIRE(!coredump.exited()); ATF_REQUIRE(coredump.signaled()); ATF_REQUIRE_EQ(SIGQUIT, coredump.termsig()); #if !defined(WCOREDUMP) expect_fail("Platform does not support checking for coredump"); #endif ATF_REQUIRE(coredump.coredump()); } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, fake_exited); ATF_ADD_TEST_CASE(tcs, fake_signaled); ATF_ADD_TEST_CASE(tcs, output__exitstatus); ATF_ADD_TEST_CASE(tcs, output__signaled_without_core); ATF_ADD_TEST_CASE(tcs, output__signaled_with_core); ATF_ADD_TEST_CASE(tcs, integration__exited); ATF_ADD_TEST_CASE(tcs, integration__signaled); ATF_ADD_TEST_CASE(tcs, integration__coredump); }
Upload File
Create Folder