Index: minidump/minidump_exception_writer_test.cc |
diff --git a/minidump/minidump_exception_writer_test.cc b/minidump/minidump_exception_writer_test.cc |
index ad523f0767c9d77d99d4a5d51955f4d6bf690224..fa2f14d2d498a87c801eac29a9a693e50f3a270d 100644 |
--- a/minidump/minidump_exception_writer_test.cc |
+++ b/minidump/minidump_exception_writer_test.cc |
@@ -26,9 +26,12 @@ |
#include "minidump/minidump_context_writer.h" |
#include "minidump/minidump_extensions.h" |
#include "minidump/minidump_file_writer.h" |
+#include "minidump/minidump_thread_id_map.h" |
#include "minidump/test/minidump_context_test_util.h" |
#include "minidump/test/minidump_file_writer_test_util.h" |
#include "minidump/test/minidump_writable_test_util.h" |
+#include "snapshot/test/test_cpu_context.h" |
+#include "snapshot/test/test_exception_snapshot.h" |
#include "util/file/string_file_writer.h" |
namespace crashpad { |
@@ -194,6 +197,62 @@ TEST(MinidumpExceptionWriter, Standard) { |
ExpectMinidumpContextX86(kSeed, observed_context, false)); |
} |
+TEST(MinidumpExceptionWriter, InitializeFromSnapshot) { |
+ std::vector<uint64_t> exception_codes; |
+ exception_codes.push_back(0x1000000000000000); |
+ exception_codes.push_back(0x5555555555555555); |
+ |
+ MINIDUMP_EXCEPTION_STREAM expect_exception = {}; |
+ |
+ expect_exception.ThreadId = 123; |
+ expect_exception.ExceptionRecord.ExceptionCode = 100; |
+ expect_exception.ExceptionRecord.ExceptionFlags = 1; |
+ expect_exception.ExceptionRecord.ExceptionAddress = 0xfedcba9876543210; |
+ expect_exception.ExceptionRecord.NumberParameters = exception_codes.size(); |
+ for (size_t index = 0; index < exception_codes.size(); ++index) { |
+ expect_exception.ExceptionRecord.ExceptionInformation[index] = |
+ exception_codes[index]; |
+ } |
+ const uint64_t kThreadID = 0xaaaaaaaaaaaaaaaa; |
+ const uint32_t kSeed = 65; |
+ |
+ TestExceptionSnapshot exception_snapshot; |
+ exception_snapshot.SetThreadID(kThreadID); |
+ exception_snapshot.SetException( |
+ expect_exception.ExceptionRecord.ExceptionCode); |
+ exception_snapshot.SetExceptionInfo( |
+ expect_exception.ExceptionRecord.ExceptionFlags); |
+ exception_snapshot.SetExceptionAddress( |
+ expect_exception.ExceptionRecord.ExceptionAddress); |
+ exception_snapshot.SetCodes(exception_codes); |
+ |
+ InitializeCPUContextX86(exception_snapshot.MutableContext(), kSeed); |
+ |
+ MinidumpThreadIDMap thread_id_map; |
+ thread_id_map[kThreadID] = expect_exception.ThreadId; |
+ |
+ auto exception_writer = make_scoped_ptr(new MinidumpExceptionWriter()); |
+ exception_writer->InitializeFromSnapshot(&exception_snapshot, &thread_id_map); |
+ |
+ MinidumpFileWriter minidump_file_writer; |
+ minidump_file_writer.AddStream(exception_writer.Pass()); |
+ |
+ StringFileWriter file_writer; |
+ ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); |
+ |
+ const MINIDUMP_EXCEPTION_STREAM* exception; |
+ ASSERT_NO_FATAL_FAILURE(GetExceptionStream(file_writer.string(), &exception)); |
+ |
+ const MinidumpContextX86* observed_context; |
+ ASSERT_NO_FATAL_FAILURE(ExpectExceptionStream(&expect_exception, |
+ exception, |
+ file_writer.string(), |
+ &observed_context)); |
+ |
+ ASSERT_NO_FATAL_FAILURE( |
+ ExpectMinidumpContextX86(kSeed, observed_context, true)); |
+} |
+ |
TEST(MinidumpExceptionWriterDeathTest, NoContext) { |
MinidumpFileWriter minidump_file_writer; |
auto exception_writer = make_scoped_ptr(new MinidumpExceptionWriter()); |