diff options
Diffstat (limited to 'src/client/linux/microdump_writer/microdump_writer_unittest.cc')
-rw-r--r-- | src/client/linux/microdump_writer/microdump_writer_unittest.cc | 81 |
1 files changed, 56 insertions, 25 deletions
diff --git a/src/client/linux/microdump_writer/microdump_writer_unittest.cc b/src/client/linux/microdump_writer/microdump_writer_unittest.cc index 52b1d9a9..1fa6f1ff 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 |