summaryrefslogtreecommitdiff
path: root/simpleperf/workload_test.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2015-06-15 16:17:20 -0700
committerYabin Cui <yabinc@google.com>2015-06-17 15:02:59 -0700
commit621a533ec28dbbf8634211c684456b4bbc1bc0fb (patch)
treecf6ee5de12b34ab4af179559486ef77c9e1b4588 /simpleperf/workload_test.cpp
parentdecc11c6b5f88c72d2ca72be5efe6064f2176d1c (diff)
downloadextras-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.cpp61
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");
+}