Index: src/client/linux/microdump_writer/microdump_writer_unittest.cc |
diff --git a/src/client/linux/microdump_writer/microdump_writer_unittest.cc b/src/client/linux/microdump_writer/microdump_writer_unittest.cc |
index 52b1d9a9756b3968746e9093fe36ee2fb1c00a03..1fa6f1ff0a27ecb9c2202086173dc74fe7c5b4be 100644 |
--- a/src/client/linux/microdump_writer/microdump_writer_unittest.cc |
+++ b/src/client/linux/microdump_writer/microdump_writer_unittest.cc |
@@ -48,7 +48,11 @@ namespace { |
typedef testing::Test MicrodumpWriterTest; |
-TEST(MicrodumpWriterTest, Setup) { |
+void CrashAndGetMicrodump( |
+ const MappingList& mappings, |
+ const char* build_fingerprint, |
+ const char* product_info, |
+ scoped_array<char>* buf) { |
int fds[2]; |
ASSERT_NE(-1, pipe(fds)); |
@@ -73,6 +77,36 @@ TEST(MicrodumpWriterTest, Setup) { |
// Set a non-zero tid to avoid tripping asserts. |
context.tid = child; |
+ // Redirect temporarily stderr to the stderr.log file. |
+ int save_err = dup(STDERR_FILENO); |
+ ASSERT_NE(-1, save_err); |
+ ASSERT_NE(-1, dup2(err_fd, STDERR_FILENO)); |
+ |
+ ASSERT_TRUE(WriteMicrodump(child, &context, sizeof(context), mappings, |
+ build_fingerprint, product_info)); |
+ |
+ // Revert stderr back to the console. |
+ dup2(save_err, STDERR_FILENO); |
+ close(save_err); |
+ |
+ // Read back the stderr file and check for the microdump marker. |
+ fsync(err_fd); |
+ lseek(err_fd, 0, SEEK_SET); |
+ const size_t kBufSize = 64 * 1024; |
+ buf->reset(new char[kBufSize]); |
+ ASSERT_GT(read(err_fd, buf->get(), kBufSize), 0); |
+ |
+ close(err_fd); |
+ close(fds[1]); |
+ |
+ ASSERT_NE(static_cast<char*>(0), strstr( |
+ buf->get(), "-----BEGIN BREAKPAD MICRODUMP-----")); |
+ ASSERT_NE(static_cast<char*>(0), strstr( |
+ buf->get(), "-----END BREAKPAD MICRODUMP-----")); |
+ |
+} |
+ |
+TEST(MicrodumpWriterTest, BasicWithMappings) { |
// Push some extra mapping to check the MappingList logic. |
const uint32_t memory_size = sysconf(_SC_PAGESIZE); |
const char* kMemoryName = "libfoo.so"; |
@@ -93,28 +127,8 @@ TEST(MicrodumpWriterTest, Setup) { |
memcpy(mapping.second, kModuleGUID, sizeof(MDGUID)); |
mappings.push_back(mapping); |
- // Redirect temporarily stderr to the stderr.log file. |
- int save_err = dup(STDERR_FILENO); |
- ASSERT_NE(-1, save_err); |
- ASSERT_NE(-1, dup2(err_fd, STDERR_FILENO)); |
- |
- ASSERT_TRUE(WriteMicrodump(child, &context, sizeof(context), mappings)); |
- |
- // Revert stderr back to the console. |
- dup2(save_err, STDERR_FILENO); |
- close(save_err); |
- |
- // Read back the stderr file and check for the microdump marker. |
- fsync(err_fd); |
- lseek(err_fd, 0, SEEK_SET); |
- const size_t kBufSize = 64 * 1024; |
- scoped_array<char> buf(new char[kBufSize]); |
- ASSERT_GT(read(err_fd, buf.get(), kBufSize), 0); |
- |
- ASSERT_NE(static_cast<char*>(0), strstr( |
- buf.get(), "-----BEGIN BREAKPAD MICRODUMP-----")); |
- ASSERT_NE(static_cast<char*>(0), strstr( |
- buf.get(), "-----END BREAKPAD MICRODUMP-----")); |
+ scoped_array<char> buf; |
+ CrashAndGetMicrodump(mappings, NULL, NULL, &buf); |
#ifdef __LP64__ |
ASSERT_NE(static_cast<char*>(0), strstr( |
@@ -126,8 +140,25 @@ TEST(MicrodumpWriterTest, Setup) { |
"33221100554477668899AABBCCDDEEFF0 libfoo.so")); |
#endif |
- close(err_fd); |
- close(fds[1]); |
+ // In absence of a product info in the minidump, the writer should just write |
+ // an unknown marker. |
+ ASSERT_NE(static_cast<char*>(0), strstr( |
+ buf.get(), "V UNKNOWN:0.0.0.0")); |
+} |
+ |
+// Ensure that the product info and build fingerprint metadata show up in the |
+// final microdump if present. |
+TEST(MicrodumpWriterTest, BuildFingerprintAndProductInfo) { |
+ const char kProductInfo[] = "MockProduct:42.0.2311.99"; |
+ const char kBuildFingerprint[] = |
+ "aosp/occam/mako:5.1.1/LMY47W/12345678:userdegbug/dev-keys"; |
+ scoped_array<char> buf; |
+ MappingList no_mappings; |
+ |
+ CrashAndGetMicrodump(no_mappings, kBuildFingerprint, kProductInfo, &buf); |
+ |
+ ASSERT_NE(static_cast<char*>(0), strstr(buf.get(), kBuildFingerprint)); |
+ ASSERT_NE(static_cast<char*>(0), strstr(buf.get(), kProductInfo)); |
} |
} // namespace |