diff options
author | Yabin Cui <yabinc@google.com> | 2015-06-15 16:17:20 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2015-06-17 15:02:59 -0700 |
commit | 621a533ec28dbbf8634211c684456b4bbc1bc0fb (patch) | |
tree | cf6ee5de12b34ab4af179559486ef77c9e1b4588 /simpleperf/workload_test.cpp | |
parent | decc11c6b5f88c72d2ca72be5efe6064f2176d1c (diff) | |
download | extras-621a533ec28dbbf8634211c684456b4bbc1bc0fb.tar.gz |
Simpleperf: add signal handler for SIGCHLD, SIGINT, SIGTERM.
And rely on signal to decide when to stop in record/stat command.
Bug: 19483574
Change-Id: I564cb61e74ea81cffe4de5b050482b3250ed9a06
Diffstat (limited to 'simpleperf/workload_test.cpp')
-rw-r--r-- | simpleperf/workload_test.cpp | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/simpleperf/workload_test.cpp b/simpleperf/workload_test.cpp index 0cc67b80..ada3969f 100644 --- a/simpleperf/workload_test.cpp +++ b/simpleperf/workload_test.cpp @@ -16,24 +16,24 @@ #include <gtest/gtest.h> +#include <signal.h> +#include <utils.h> #include <workload.h> -#include <chrono> - -using namespace std::chrono; +static volatile bool signaled; +static void signal_handler(int) { + signaled = true; +} -TEST(workload, smoke) { +TEST(workload, success) { + signaled = false; + SignalHandlerRegister signal_handler_register({SIGCHLD}, signal_handler); auto workload = Workload::CreateWorkload({"sleep", "1"}); ASSERT_TRUE(workload != nullptr); - ASSERT_FALSE(workload->IsFinished()); ASSERT_TRUE(workload->GetPid() != 0); - auto start_time = steady_clock::now(); ASSERT_TRUE(workload->Start()); - ASSERT_FALSE(workload->IsFinished()); - workload->WaitFinish(); - ASSERT_TRUE(workload->IsFinished()); - auto end_time = steady_clock::now(); - ASSERT_TRUE(end_time >= start_time + seconds(1)); + while (!signaled) { + } } TEST(workload, execvp_failure) { @@ -41,3 +41,42 @@ TEST(workload, execvp_failure) { ASSERT_TRUE(workload != nullptr); ASSERT_FALSE(workload->Start()); } + +static void run_signaled_workload() { + { + signaled = false; + SignalHandlerRegister signal_handler_register({SIGCHLD}, signal_handler); + auto workload = Workload::CreateWorkload({"sleep", "10"}); + ASSERT_TRUE(workload != nullptr); + ASSERT_TRUE(workload->Start()); + ASSERT_EQ(0, kill(workload->GetPid(), SIGSEGV)); + while (!signaled) { + } + } + // Make sure all destructors are called before exit(). + exit(0); +} + +TEST(workload, signaled_warning) { + ASSERT_EXIT(run_signaled_workload(), testing::ExitedWithCode(0), + "child process was terminated by signal"); +} + +static void run_exit_nonzero_workload() { + { + signaled = false; + SignalHandlerRegister signal_handler_register({SIGCHLD}, signal_handler); + auto workload = Workload::CreateWorkload({"ls", "nonexistdir"}); + ASSERT_TRUE(workload != nullptr); + ASSERT_TRUE(workload->Start()); + while (!signaled) { + } + } + // Make sure all destructors are called before exit(). + exit(0); +} + +TEST(workload, exit_nonzero_warning) { + ASSERT_EXIT(run_exit_nonzero_workload(), testing::ExitedWithCode(0), + "child process exited with exit code"); +} |