aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/microdump_writer/microdump_writer_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/linux/microdump_writer/microdump_writer_unittest.cc')
-rw-r--r--src/client/linux/microdump_writer/microdump_writer_unittest.cc81
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