OSDN Git Service

ANRdaemon: move trace result from /sdcard to /data am: d93aa41807
[android-x86/system-extras.git] / simpleperf / workload_test.cpp
index 0cc67b8..eb1e345 100644 (file)
 
 #include <gtest/gtest.h>
 
-#include <workload.h>
+#include <signal.h>
 
-#include <chrono>
+#include "scoped_signal_handler.h"
+#include "utils.h"
+#include "workload.h"
 
-using namespace std::chrono;
+static volatile bool signaled;
+static void signal_handler(int) {
+  signaled = true;
+}
 
-TEST(workload, smoke) {
+TEST(workload, success) {
+  signaled = false;
+  ScopedSignalHandler scoped_signal_handler({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 +43,42 @@ TEST(workload, execvp_failure) {
   ASSERT_TRUE(workload != nullptr);
   ASSERT_FALSE(workload->Start());
 }
+
+static void run_signaled_workload() {
+  {
+    signaled = false;
+    ScopedSignalHandler scoped_signal_handler({SIGCHLD}, signal_handler);
+    auto workload = Workload::CreateWorkload({"sleep", "10"});
+    ASSERT_TRUE(workload != nullptr);
+    ASSERT_TRUE(workload->Start());
+    ASSERT_EQ(0, kill(workload->GetPid(), SIGKILL));
+    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;
+    ScopedSignalHandler scoped_signal_handler({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");
+}