Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: components/browser_watcher/postmortem_minidump_writer_win_unittest.cc

Issue 2128683002: Collect unclean shutdown debug information (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@tracker
Patch Set: Minimal collection to proto Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/browser_watcher/postmortem_minidump_writer.h"
6
7 #include <windows.h> // NOLINT
8 #include <dbghelp.h>
9
10 #include "base/files/file_path.h"
11 #include "base/files/file_util.h"
12 #include "base/files/scoped_temp_dir.h"
13 #include "components/browser_watcher/stability_report.pb.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace browser_watcher {
17
18 TEST(PostmortemMinidumpWriterWinTest, WriteDumpBasicTest) {
19 // Create a stability report.
20 // TODO(manzagop): flesh out the report once proto is more detailed.
21 StabilityReport expected_report;
22 ProcessState* process_state = expected_report.add_process_states();
23 CodeModule* module = process_state->add_modules();
24 module->set_base_address(1024);
25 module->set_code_file("some_code_file.dll");
26
27 // Write to minidump.
28 base::ScopedTempDir temp_dir;
29 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
30 base::FilePath minidump_path = temp_dir.path().AppendASCII("minidump.dmp");
31 {
32 // Note: the inner scope to ensure the writer goes out of scope, which will
33 // close the minidump file.
34 PostmortemMinidumpWriter writer;
35 ASSERT_TRUE(writer.WriteDump(minidump_path, expected_report));
36 }
37
38 // Read back the minidump.
39 base::ScopedFILE minidump_file;
40 minidump_file.reset(base::OpenFile(minidump_path, "rb"));
41 ASSERT_TRUE(minidump_file.get());
42
43 MINIDUMP_HEADER header = {};
44 ASSERT_EQ(1, fread(&header, sizeof(header), 1, minidump_file.get()));
45 ASSERT_EQ(MINIDUMP_SIGNATURE, header.Signature);
46 ASSERT_EQ(1, header.NumberOfStreams);
47 RVA directory_rva = header.StreamDirectoryRva;
48
49 MINIDUMP_DIRECTORY directory = {};
50 ASSERT_EQ(0, fseek(minidump_file.get(), directory_rva, SEEK_SET));
51 ASSERT_EQ(1, fread(&directory, sizeof(directory), 1, minidump_file.get()));
52 ASSERT_EQ(0x4B6B0002, directory.StreamType);
53 RVA report_rva = directory.Location.Rva;
54 ULONG32 report_size_bytes = directory.Location.DataSize;
55
56 std::string recovered_serialized_report;
57 recovered_serialized_report.resize(report_size_bytes);
58 ASSERT_EQ(0, fseek(minidump_file.get(), report_rva, SEEK_SET));
59 ASSERT_EQ(report_size_bytes, fread(&recovered_serialized_report.at(0), 1,
60 report_size_bytes, minidump_file.get()));
61
62 // Validate the recovered report.
63 std::string expected_serialized_report;
64 expected_report.SerializeToString(&expected_serialized_report);
65 ASSERT_EQ(expected_serialized_report, recovered_serialized_report);
66
67 StabilityReport recovered_report;
68 ASSERT_TRUE(recovered_report.ParseFromString(recovered_serialized_report));
69 }
70
71 } // namespace browser_watcher
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698