Index: minidump/minidump_crashpad_info_writer_test.cc |
diff --git a/minidump/minidump_crashpad_info_writer_test.cc b/minidump/minidump_crashpad_info_writer_test.cc |
index 2840d348240194097bbef65285862c25f53397b6..279079654462e5dd0e314a16fc26895e9d62b775 100644 |
--- a/minidump/minidump_crashpad_info_writer_test.cc |
+++ b/minidump/minidump_crashpad_info_writer_test.cc |
@@ -21,7 +21,10 @@ |
#include "minidump/minidump_file_writer.h" |
#include "minidump/minidump_module_crashpad_info_writer.h" |
#include "minidump/test/minidump_file_writer_test_util.h" |
+#include "minidump/test/minidump_string_writer_test_util.h" |
#include "minidump/test/minidump_writable_test_util.h" |
+#include "snapshot/test/test_module_snapshot.h" |
+#include "snapshot/test/test_process_snapshot.h" |
#include "util/file/string_file_writer.h" |
namespace crashpad { |
@@ -51,6 +54,7 @@ void GetCrashpadInfoStream(const std::string& file_contents, |
TEST(MinidumpCrashpadInfoWriter, Empty) { |
MinidumpFileWriter minidump_file_writer; |
auto crashpad_info_writer = make_scoped_ptr(new MinidumpCrashpadInfoWriter()); |
+ EXPECT_FALSE(crashpad_info_writer->IsUseful()); |
minidump_file_writer.AddStream(crashpad_info_writer.Pass()); |
@@ -80,6 +84,8 @@ TEST(MinidumpCrashpadInfoWriter, CrashpadModuleList) { |
module_list_writer->AddModule(module_writer.Pass()); |
crashpad_info_writer->SetModuleList(module_list_writer.Pass()); |
+ EXPECT_TRUE(crashpad_info_writer->IsUseful()); |
+ |
minidump_file_writer.AddStream(crashpad_info_writer.Pass()); |
StringFileWriter file_writer; |
@@ -102,10 +108,77 @@ TEST(MinidumpCrashpadInfoWriter, CrashpadModuleList) { |
EXPECT_EQ(MinidumpModuleCrashpadInfo::kVersion, module->version); |
EXPECT_EQ(kMinidumpModuleListIndex, module->minidump_module_list_index); |
+ EXPECT_EQ(0u, module->list_annotations.DataSize); |
+ EXPECT_EQ(0u, module->list_annotations.Rva); |
EXPECT_EQ(0u, module->simple_annotations.DataSize); |
EXPECT_EQ(0u, module->simple_annotations.Rva); |
} |
+TEST(MinidumpCrashpadInfoWriter, InitializeFromSnapshot) { |
+ const char kEntry[] = "This is a simple annotation in a list."; |
+ |
+ // Test with a useless module, one that doesn’t carry anything that would |
+ // require MinidumpCrashpadInfo or any child object. |
+ auto process_snapshot = make_scoped_ptr(new TestProcessSnapshot()); |
+ |
+ auto module_snapshot = make_scoped_ptr(new TestModuleSnapshot()); |
+ process_snapshot->AddModule(module_snapshot.Pass()); |
+ |
+ auto info_writer = make_scoped_ptr(new MinidumpCrashpadInfoWriter()); |
+ info_writer->InitializeFromSnapshot(process_snapshot.get()); |
+ EXPECT_FALSE(info_writer->IsUseful()); |
+ |
+ // Try again with a useful module. |
+ process_snapshot.reset(new TestProcessSnapshot()); |
+ |
+ module_snapshot.reset(new TestModuleSnapshot()); |
+ std::vector<std::string> annotations_list(1, std::string(kEntry)); |
+ module_snapshot->SetAnnotationsVector(annotations_list); |
+ process_snapshot->AddModule(module_snapshot.Pass()); |
+ |
+ info_writer.reset(new MinidumpCrashpadInfoWriter()); |
+ info_writer->InitializeFromSnapshot(process_snapshot.get()); |
+ EXPECT_TRUE(info_writer->IsUseful()); |
+ |
+ MinidumpFileWriter minidump_file_writer; |
+ minidump_file_writer.AddStream(info_writer.Pass()); |
+ |
+ StringFileWriter file_writer; |
+ ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); |
+ |
+ const MinidumpCrashpadInfo* info; |
+ const MinidumpModuleCrashpadInfoList* module_list; |
+ ASSERT_NO_FATAL_FAILURE(GetCrashpadInfoStream( |
+ file_writer.string(), &info, &module_list)); |
+ |
+ EXPECT_EQ(MinidumpCrashpadInfo::kVersion, info->version); |
+ ASSERT_TRUE(module_list); |
+ ASSERT_EQ(1u, module_list->count); |
+ |
+ const MinidumpModuleCrashpadInfo* module = |
+ MinidumpWritableAtLocationDescriptor<MinidumpModuleCrashpadInfo>( |
+ file_writer.string(), module_list->children[0]); |
+ ASSERT_TRUE(module); |
+ |
+ EXPECT_EQ(MinidumpModuleCrashpadInfo::kVersion, module->version); |
+ EXPECT_EQ(0u, module->minidump_module_list_index); |
+ |
+ const MinidumpRVAList* list_annotations = |
+ MinidumpWritableAtLocationDescriptor<MinidumpRVAList>( |
+ file_writer.string(), module->list_annotations); |
+ ASSERT_TRUE(list_annotations); |
+ |
+ ASSERT_EQ(1u, list_annotations->count); |
+ EXPECT_EQ(kEntry, |
+ MinidumpUTF8StringAtRVAAsString( |
+ file_writer.string(), list_annotations->children[0])); |
+ |
+ const MinidumpSimpleStringDictionary* simple_annotations = |
+ MinidumpWritableAtLocationDescriptor<MinidumpSimpleStringDictionary>( |
+ file_writer.string(), module->simple_annotations); |
+ EXPECT_FALSE(simple_annotations); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace crashpad |