diff options
author | Josh Gao <jmgao@google.com> | 2021-01-25 22:18:48 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-01-25 22:18:48 +0000 |
commit | 6bf6a9fc612c57ae5c9cd25643fde794713058ea (patch) | |
tree | 9999cbdd78e82ebe9deaa0d3ae344380f6eced93 /debuggerd/debuggerd_test.cpp | |
parent | ad7d1d13a4f79ad2a5341023b9fc746b3868d10b (diff) | |
parent | 92317d82c970cea68884c3e9efbb5d6441dd6fa2 (diff) |
Merge changes from topic "tombstone_proto"
* changes:
libdebuggerd: add protobuf implementation.
tombstoned: support for protobuf fds.
tombstoned: make it easier to add more types of outputs.
tombstoned: switch from goto to RAII.
Diffstat (limited to 'debuggerd/debuggerd_test.cpp')
-rw-r--r-- | debuggerd/debuggerd_test.cpp | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/debuggerd/debuggerd_test.cpp b/debuggerd/debuggerd_test.cpp index 45e555f44..b9d66063e 100644 --- a/debuggerd/debuggerd_test.cpp +++ b/debuggerd/debuggerd_test.cpp @@ -1309,11 +1309,11 @@ TEST(tombstoned, java_trace_intercept_smoke) { tombstoned_intercept(self, &intercept_fd, &output_fd, &status, kDebuggerdJavaBacktrace); ASSERT_EQ(InterceptStatus::kRegistered, status); - // First connect to tombstoned requesting a native backtrace. This + // First connect to tombstoned requesting a native tombstone. This // should result in a "regular" FD and not the installed intercept. const char native[] = "native"; unique_fd tombstoned_socket, input_fd; - ASSERT_TRUE(tombstoned_connect(self, &tombstoned_socket, &input_fd, kDebuggerdNativeBacktrace)); + ASSERT_TRUE(tombstoned_connect(self, &tombstoned_socket, &input_fd, kDebuggerdTombstone)); ASSERT_TRUE(android::base::WriteFully(input_fd.get(), native, sizeof(native))); tombstoned_notify_completion(tombstoned_socket.get()); @@ -1425,3 +1425,70 @@ TEST_F(CrasherTest, stack_overflow) { ConsumeFd(std::move(output_fd), &result); ASSERT_MATCH(result, R"(Cause: stack pointer[^\n]*stack overflow.\n)"); } + +TEST(tombstoned, proto) { + const pid_t self = getpid(); + unique_fd tombstoned_socket, text_fd, proto_fd; + ASSERT_TRUE( + tombstoned_connect(self, &tombstoned_socket, &text_fd, &proto_fd, kDebuggerdTombstoneProto)); + + tombstoned_notify_completion(tombstoned_socket.get()); + + ASSERT_NE(-1, text_fd.get()); + ASSERT_NE(-1, proto_fd.get()); + + struct stat text_st; + ASSERT_EQ(0, fstat(text_fd.get(), &text_st)); + + // Give tombstoned some time to link the files into place. + std::this_thread::sleep_for(100ms); + + // Find the tombstone. + std::optional<int> tombstone_index; + for (int i = 0; i < 50; ++i) { + std::string path = android::base::StringPrintf("/data/tombstones/tombstone_%02d", i); + + struct stat st; + if (TEMP_FAILURE_RETRY(stat(path.c_str(), &st)) != 0) { + continue; + } + + if (st.st_dev == text_st.st_dev && st.st_ino == text_st.st_ino) { + tombstone_index = i; + break; + } + } + + ASSERT_TRUE(tombstone_index); + std::string proto_path = + android::base::StringPrintf("/data/tombstones/tombstone_%02d.pb", *tombstone_index); + + struct stat proto_fd_st; + struct stat proto_file_st; + ASSERT_EQ(0, fstat(proto_fd.get(), &proto_fd_st)); + ASSERT_EQ(0, stat(proto_path.c_str(), &proto_file_st)); + + ASSERT_EQ(proto_fd_st.st_dev, proto_file_st.st_dev); + ASSERT_EQ(proto_fd_st.st_ino, proto_file_st.st_ino); +} + +TEST(tombstoned, proto_intercept) { + const pid_t self = getpid(); + unique_fd intercept_fd, output_fd; + InterceptStatus status; + + tombstoned_intercept(self, &intercept_fd, &output_fd, &status, kDebuggerdTombstone); + ASSERT_EQ(InterceptStatus::kRegistered, status); + + unique_fd tombstoned_socket, text_fd, proto_fd; + ASSERT_TRUE( + tombstoned_connect(self, &tombstoned_socket, &text_fd, &proto_fd, kDebuggerdTombstoneProto)); + ASSERT_TRUE(android::base::WriteStringToFd("foo", text_fd.get())); + tombstoned_notify_completion(tombstoned_socket.get()); + + text_fd.reset(); + + std::string output; + ASSERT_TRUE(android::base::ReadFdToString(output_fd, &output)); + ASSERT_EQ("foo", output); +} |