OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "minidump/minidump_stream_writer.h" | 25 #include "minidump/minidump_stream_writer.h" |
26 #include "minidump/minidump_writable.h" | 26 #include "minidump/minidump_writable.h" |
27 #include "minidump/test/minidump_file_writer_test_util.h" | 27 #include "minidump/test/minidump_file_writer_test_util.h" |
28 #include "minidump/test/minidump_writable_test_util.h" | 28 #include "minidump/test/minidump_writable_test_util.h" |
29 #include "snapshot/test/test_cpu_context.h" | 29 #include "snapshot/test/test_cpu_context.h" |
30 #include "snapshot/test/test_exception_snapshot.h" | 30 #include "snapshot/test/test_exception_snapshot.h" |
31 #include "snapshot/test/test_module_snapshot.h" | 31 #include "snapshot/test/test_module_snapshot.h" |
32 #include "snapshot/test/test_process_snapshot.h" | 32 #include "snapshot/test/test_process_snapshot.h" |
33 #include "snapshot/test/test_system_snapshot.h" | 33 #include "snapshot/test/test_system_snapshot.h" |
34 #include "snapshot/test/test_thread_snapshot.h" | 34 #include "snapshot/test/test_thread_snapshot.h" |
35 #include "util/file/file_writer.h" | 35 #include "util/file/string_file.h" |
36 #include "util/file/string_file_writer.h" | 36 #include "util/file/string_file.h" |
37 | 37 |
38 namespace crashpad { | 38 namespace crashpad { |
39 namespace test { | 39 namespace test { |
40 namespace { | 40 namespace { |
41 | 41 |
42 TEST(MinidumpFileWriter, Empty) { | 42 TEST(MinidumpFileWriter, Empty) { |
43 MinidumpFileWriter minidump_file; | 43 MinidumpFileWriter minidump_file; |
44 StringFileWriter file_writer; | 44 StringFile string_file; |
45 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); | 45 ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); |
46 ASSERT_EQ(sizeof(MINIDUMP_HEADER), file_writer.string().size()); | 46 ASSERT_EQ(sizeof(MINIDUMP_HEADER), string_file.string().size()); |
47 | 47 |
48 const MINIDUMP_DIRECTORY* directory; | 48 const MINIDUMP_DIRECTORY* directory; |
49 const MINIDUMP_HEADER* header = | 49 const MINIDUMP_HEADER* header = |
50 MinidumpHeaderAtStart(file_writer.string(), &directory); | 50 MinidumpHeaderAtStart(string_file.string(), &directory); |
51 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 0, 0)); | 51 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 0, 0)); |
52 EXPECT_FALSE(directory); | 52 EXPECT_FALSE(directory); |
53 } | 53 } |
54 | 54 |
55 class TestStream final : public internal::MinidumpStreamWriter { | 55 class TestStream final : public internal::MinidumpStreamWriter { |
56 public: | 56 public: |
57 TestStream(MinidumpStreamType stream_type, | 57 TestStream(MinidumpStreamType stream_type, |
58 size_t stream_size, | 58 size_t stream_size, |
59 uint8_t stream_value) | 59 uint8_t stream_value) |
60 : stream_data_(stream_size, stream_value), stream_type_(stream_type) {} | 60 : stream_data_(stream_size, stream_value), stream_type_(stream_type) {} |
(...skipping 29 matching lines...) Expand all Loading... |
90 const time_t kTimestamp = 0x155d2fb8; | 90 const time_t kTimestamp = 0x155d2fb8; |
91 minidump_file.SetTimestamp(kTimestamp); | 91 minidump_file.SetTimestamp(kTimestamp); |
92 | 92 |
93 const size_t kStreamSize = 5; | 93 const size_t kStreamSize = 5; |
94 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); | 94 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); |
95 const uint8_t kStreamValue = 0x5a; | 95 const uint8_t kStreamValue = 0x5a; |
96 auto stream = | 96 auto stream = |
97 make_scoped_ptr(new TestStream(kStreamType, kStreamSize, kStreamValue)); | 97 make_scoped_ptr(new TestStream(kStreamType, kStreamSize, kStreamValue)); |
98 minidump_file.AddStream(stream.Pass()); | 98 minidump_file.AddStream(stream.Pass()); |
99 | 99 |
100 StringFileWriter file_writer; | 100 StringFile string_file; |
101 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); | 101 ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); |
102 | 102 |
103 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 103 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); |
104 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); | 104 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); |
105 const size_t kFileSize = kStreamOffset + kStreamSize; | 105 const size_t kFileSize = kStreamOffset + kStreamSize; |
106 | 106 |
107 ASSERT_EQ(kFileSize, file_writer.string().size()); | 107 ASSERT_EQ(kFileSize, string_file.string().size()); |
108 | 108 |
109 const MINIDUMP_DIRECTORY* directory; | 109 const MINIDUMP_DIRECTORY* directory; |
110 const MINIDUMP_HEADER* header = | 110 const MINIDUMP_HEADER* header = |
111 MinidumpHeaderAtStart(file_writer.string(), &directory); | 111 MinidumpHeaderAtStart(string_file.string(), &directory); |
112 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, kTimestamp)); | 112 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, kTimestamp)); |
113 ASSERT_TRUE(directory); | 113 ASSERT_TRUE(directory); |
114 | 114 |
115 EXPECT_EQ(kStreamType, directory[0].StreamType); | 115 EXPECT_EQ(kStreamType, directory[0].StreamType); |
116 EXPECT_EQ(kStreamSize, directory[0].Location.DataSize); | 116 EXPECT_EQ(kStreamSize, directory[0].Location.DataSize); |
117 EXPECT_EQ(kStreamOffset, directory[0].Location.Rva); | 117 EXPECT_EQ(kStreamOffset, directory[0].Location.Rva); |
118 | 118 |
119 const uint8_t* stream_data = MinidumpWritableAtLocationDescriptor<uint8_t>( | 119 const uint8_t* stream_data = MinidumpWritableAtLocationDescriptor<uint8_t>( |
120 file_writer.string(), directory[0].Location); | 120 string_file.string(), directory[0].Location); |
121 ASSERT_TRUE(stream_data); | 121 ASSERT_TRUE(stream_data); |
122 | 122 |
123 std::string expected_stream(kStreamSize, kStreamValue); | 123 std::string expected_stream(kStreamSize, kStreamValue); |
124 EXPECT_EQ(0, memcmp(stream_data, expected_stream.c_str(), kStreamSize)); | 124 EXPECT_EQ(0, memcmp(stream_data, expected_stream.c_str(), kStreamSize)); |
125 } | 125 } |
126 | 126 |
127 TEST(MinidumpFileWriter, ThreeStreams) { | 127 TEST(MinidumpFileWriter, ThreeStreams) { |
128 MinidumpFileWriter minidump_file; | 128 MinidumpFileWriter minidump_file; |
129 const time_t kTimestamp = 0x155d2fb8; | 129 const time_t kTimestamp = 0x155d2fb8; |
130 minidump_file.SetTimestamp(kTimestamp); | 130 minidump_file.SetTimestamp(kTimestamp); |
(...skipping 15 matching lines...) Expand all Loading... |
146 new TestStream(kStream1Type, kStream1Size, kStream1Value)); | 146 new TestStream(kStream1Type, kStream1Size, kStream1Value)); |
147 minidump_file.AddStream(stream1.Pass()); | 147 minidump_file.AddStream(stream1.Pass()); |
148 | 148 |
149 const size_t kStream2Size = 1; | 149 const size_t kStream2Size = 1; |
150 const MinidumpStreamType kStream2Type = static_cast<MinidumpStreamType>(0x7e); | 150 const MinidumpStreamType kStream2Type = static_cast<MinidumpStreamType>(0x7e); |
151 const uint8_t kStream2Value = 0x36; | 151 const uint8_t kStream2Value = 0x36; |
152 auto stream2 = make_scoped_ptr( | 152 auto stream2 = make_scoped_ptr( |
153 new TestStream(kStream2Type, kStream2Size, kStream2Value)); | 153 new TestStream(kStream2Type, kStream2Size, kStream2Value)); |
154 minidump_file.AddStream(stream2.Pass()); | 154 minidump_file.AddStream(stream2.Pass()); |
155 | 155 |
156 StringFileWriter file_writer; | 156 StringFile string_file; |
157 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); | 157 ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); |
158 | 158 |
159 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 159 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); |
160 const size_t kStream0Offset = | 160 const size_t kStream0Offset = |
161 kDirectoryOffset + 3 * sizeof(MINIDUMP_DIRECTORY); | 161 kDirectoryOffset + 3 * sizeof(MINIDUMP_DIRECTORY); |
162 const size_t kStream1Padding = 3; | 162 const size_t kStream1Padding = 3; |
163 const size_t kStream1Offset = kStream0Offset + kStream0Size + kStream1Padding; | 163 const size_t kStream1Offset = kStream0Offset + kStream0Size + kStream1Padding; |
164 const size_t kStream2Padding = 1; | 164 const size_t kStream2Padding = 1; |
165 const size_t kStream2Offset = kStream1Offset + kStream1Size + kStream2Padding; | 165 const size_t kStream2Offset = kStream1Offset + kStream1Size + kStream2Padding; |
166 const size_t kFileSize = kStream2Offset + kStream2Size; | 166 const size_t kFileSize = kStream2Offset + kStream2Size; |
167 | 167 |
168 ASSERT_EQ(kFileSize, file_writer.string().size()); | 168 ASSERT_EQ(kFileSize, string_file.string().size()); |
169 | 169 |
170 const MINIDUMP_DIRECTORY* directory; | 170 const MINIDUMP_DIRECTORY* directory; |
171 const MINIDUMP_HEADER* header = | 171 const MINIDUMP_HEADER* header = |
172 MinidumpHeaderAtStart(file_writer.string(), &directory); | 172 MinidumpHeaderAtStart(string_file.string(), &directory); |
173 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 3, kTimestamp)); | 173 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 3, kTimestamp)); |
174 ASSERT_TRUE(directory); | 174 ASSERT_TRUE(directory); |
175 | 175 |
176 EXPECT_EQ(kStream0Type, directory[0].StreamType); | 176 EXPECT_EQ(kStream0Type, directory[0].StreamType); |
177 EXPECT_EQ(kStream0Size, directory[0].Location.DataSize); | 177 EXPECT_EQ(kStream0Size, directory[0].Location.DataSize); |
178 EXPECT_EQ(kStream0Offset, directory[0].Location.Rva); | 178 EXPECT_EQ(kStream0Offset, directory[0].Location.Rva); |
179 EXPECT_EQ(kStream1Type, directory[1].StreamType); | 179 EXPECT_EQ(kStream1Type, directory[1].StreamType); |
180 EXPECT_EQ(kStream1Size, directory[1].Location.DataSize); | 180 EXPECT_EQ(kStream1Size, directory[1].Location.DataSize); |
181 EXPECT_EQ(kStream1Offset, directory[1].Location.Rva); | 181 EXPECT_EQ(kStream1Offset, directory[1].Location.Rva); |
182 EXPECT_EQ(kStream2Type, directory[2].StreamType); | 182 EXPECT_EQ(kStream2Type, directory[2].StreamType); |
183 EXPECT_EQ(kStream2Size, directory[2].Location.DataSize); | 183 EXPECT_EQ(kStream2Size, directory[2].Location.DataSize); |
184 EXPECT_EQ(kStream2Offset, directory[2].Location.Rva); | 184 EXPECT_EQ(kStream2Offset, directory[2].Location.Rva); |
185 | 185 |
186 const uint8_t* stream0_data = MinidumpWritableAtLocationDescriptor<uint8_t>( | 186 const uint8_t* stream0_data = MinidumpWritableAtLocationDescriptor<uint8_t>( |
187 file_writer.string(), directory[0].Location); | 187 string_file.string(), directory[0].Location); |
188 ASSERT_TRUE(stream0_data); | 188 ASSERT_TRUE(stream0_data); |
189 | 189 |
190 std::string expected_stream0(kStream0Size, kStream0Value); | 190 std::string expected_stream0(kStream0Size, kStream0Value); |
191 EXPECT_EQ(0, memcmp(stream0_data, expected_stream0.c_str(), kStream0Size)); | 191 EXPECT_EQ(0, memcmp(stream0_data, expected_stream0.c_str(), kStream0Size)); |
192 | 192 |
193 const int kZeroes[16] = {}; | 193 const int kZeroes[16] = {}; |
194 ASSERT_GE(sizeof(kZeroes), kStream1Padding); | 194 ASSERT_GE(sizeof(kZeroes), kStream1Padding); |
195 EXPECT_EQ(0, memcmp(stream0_data + kStream0Size, kZeroes, kStream1Padding)); | 195 EXPECT_EQ(0, memcmp(stream0_data + kStream0Size, kZeroes, kStream1Padding)); |
196 | 196 |
197 const uint8_t* stream1_data = MinidumpWritableAtLocationDescriptor<uint8_t>( | 197 const uint8_t* stream1_data = MinidumpWritableAtLocationDescriptor<uint8_t>( |
198 file_writer.string(), directory[1].Location); | 198 string_file.string(), directory[1].Location); |
199 ASSERT_TRUE(stream1_data); | 199 ASSERT_TRUE(stream1_data); |
200 | 200 |
201 std::string expected_stream1(kStream1Size, kStream1Value); | 201 std::string expected_stream1(kStream1Size, kStream1Value); |
202 EXPECT_EQ(0, memcmp(stream1_data, expected_stream1.c_str(), kStream1Size)); | 202 EXPECT_EQ(0, memcmp(stream1_data, expected_stream1.c_str(), kStream1Size)); |
203 | 203 |
204 ASSERT_GE(sizeof(kZeroes), kStream2Padding); | 204 ASSERT_GE(sizeof(kZeroes), kStream2Padding); |
205 EXPECT_EQ(0, memcmp(stream1_data + kStream1Size, kZeroes, kStream2Padding)); | 205 EXPECT_EQ(0, memcmp(stream1_data + kStream1Size, kZeroes, kStream2Padding)); |
206 | 206 |
207 const uint8_t* stream2_data = MinidumpWritableAtLocationDescriptor<uint8_t>( | 207 const uint8_t* stream2_data = MinidumpWritableAtLocationDescriptor<uint8_t>( |
208 file_writer.string(), directory[2].Location); | 208 string_file.string(), directory[2].Location); |
209 ASSERT_TRUE(stream2_data); | 209 ASSERT_TRUE(stream2_data); |
210 | 210 |
211 std::string expected_stream2(kStream2Size, kStream2Value); | 211 std::string expected_stream2(kStream2Size, kStream2Value); |
212 EXPECT_EQ(0, memcmp(stream2_data, expected_stream2.c_str(), kStream2Size)); | 212 EXPECT_EQ(0, memcmp(stream2_data, expected_stream2.c_str(), kStream2Size)); |
213 } | 213 } |
214 | 214 |
215 TEST(MinidumpFileWriter, ZeroLengthStream) { | 215 TEST(MinidumpFileWriter, ZeroLengthStream) { |
216 MinidumpFileWriter minidump_file; | 216 MinidumpFileWriter minidump_file; |
217 | 217 |
218 const size_t kStreamSize = 0; | 218 const size_t kStreamSize = 0; |
219 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); | 219 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); |
220 auto stream = make_scoped_ptr(new TestStream(kStreamType, kStreamSize, 0)); | 220 auto stream = make_scoped_ptr(new TestStream(kStreamType, kStreamSize, 0)); |
221 minidump_file.AddStream(stream.Pass()); | 221 minidump_file.AddStream(stream.Pass()); |
222 | 222 |
223 StringFileWriter file_writer; | 223 StringFile string_file; |
224 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); | 224 ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); |
225 | 225 |
226 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 226 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); |
227 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); | 227 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); |
228 const size_t kFileSize = kStreamOffset + kStreamSize; | 228 const size_t kFileSize = kStreamOffset + kStreamSize; |
229 | 229 |
230 ASSERT_EQ(kFileSize, file_writer.string().size()); | 230 ASSERT_EQ(kFileSize, string_file.string().size()); |
231 | 231 |
232 const MINIDUMP_DIRECTORY* directory; | 232 const MINIDUMP_DIRECTORY* directory; |
233 const MINIDUMP_HEADER* header = | 233 const MINIDUMP_HEADER* header = |
234 MinidumpHeaderAtStart(file_writer.string(), &directory); | 234 MinidumpHeaderAtStart(string_file.string(), &directory); |
235 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, 0)); | 235 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, 0)); |
236 ASSERT_TRUE(directory); | 236 ASSERT_TRUE(directory); |
237 | 237 |
238 EXPECT_EQ(kStreamType, directory[0].StreamType); | 238 EXPECT_EQ(kStreamType, directory[0].StreamType); |
239 EXPECT_EQ(kStreamSize, directory[0].Location.DataSize); | 239 EXPECT_EQ(kStreamSize, directory[0].Location.DataSize); |
240 EXPECT_EQ(kStreamOffset, directory[0].Location.Rva); | 240 EXPECT_EQ(kStreamOffset, directory[0].Location.Rva); |
241 } | 241 } |
242 | 242 |
243 TEST(MinidumpFileWriter, InitializeFromSnapshot_Basic) { | 243 TEST(MinidumpFileWriter, InitializeFromSnapshot_Basic) { |
244 const uint32_t kSnapshotTime = 0x4976043c; | 244 const uint32_t kSnapshotTime = 0x4976043c; |
245 const timeval kSnapshotTimeval = { static_cast<time_t>(kSnapshotTime), 0 }; | 245 const timeval kSnapshotTimeval = { static_cast<time_t>(kSnapshotTime), 0 }; |
246 | 246 |
247 TestProcessSnapshot process_snapshot; | 247 TestProcessSnapshot process_snapshot; |
248 process_snapshot.SetSnapshotTime(kSnapshotTimeval); | 248 process_snapshot.SetSnapshotTime(kSnapshotTimeval); |
249 | 249 |
250 auto system_snapshot = make_scoped_ptr(new TestSystemSnapshot()); | 250 auto system_snapshot = make_scoped_ptr(new TestSystemSnapshot()); |
251 system_snapshot->SetCPUArchitecture(kCPUArchitectureX86_64); | 251 system_snapshot->SetCPUArchitecture(kCPUArchitectureX86_64); |
252 system_snapshot->SetOperatingSystem(SystemSnapshot::kOperatingSystemMacOSX); | 252 system_snapshot->SetOperatingSystem(SystemSnapshot::kOperatingSystemMacOSX); |
253 process_snapshot.SetSystem(system_snapshot.Pass()); | 253 process_snapshot.SetSystem(system_snapshot.Pass()); |
254 | 254 |
255 MinidumpFileWriter minidump_file_writer; | 255 MinidumpFileWriter minidump_file_writer; |
256 minidump_file_writer.InitializeFromSnapshot(&process_snapshot); | 256 minidump_file_writer.InitializeFromSnapshot(&process_snapshot); |
257 | 257 |
258 StringFileWriter file_writer; | 258 StringFile string_file; |
259 ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); | 259 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
260 | 260 |
261 const MINIDUMP_DIRECTORY* directory; | 261 const MINIDUMP_DIRECTORY* directory; |
262 const MINIDUMP_HEADER* header = | 262 const MINIDUMP_HEADER* header = |
263 MinidumpHeaderAtStart(file_writer.string(), &directory); | 263 MinidumpHeaderAtStart(string_file.string(), &directory); |
264 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 5, kSnapshotTime)); | 264 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 5, kSnapshotTime)); |
265 ASSERT_TRUE(directory); | 265 ASSERT_TRUE(directory); |
266 | 266 |
267 EXPECT_EQ(kMinidumpStreamTypeSystemInfo, directory[0].StreamType); | 267 EXPECT_EQ(kMinidumpStreamTypeSystemInfo, directory[0].StreamType); |
268 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_SYSTEM_INFO>( | 268 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_SYSTEM_INFO>( |
269 file_writer.string(), directory[0].Location)); | 269 string_file.string(), directory[0].Location)); |
270 | 270 |
271 EXPECT_EQ(kMinidumpStreamTypeMiscInfo, directory[1].StreamType); | 271 EXPECT_EQ(kMinidumpStreamTypeMiscInfo, directory[1].StreamType); |
272 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MISC_INFO_4>( | 272 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MISC_INFO_4>( |
273 file_writer.string(), directory[1].Location)); | 273 string_file.string(), directory[1].Location)); |
274 | 274 |
275 EXPECT_EQ(kMinidumpStreamTypeThreadList, directory[2].StreamType); | 275 EXPECT_EQ(kMinidumpStreamTypeThreadList, directory[2].StreamType); |
276 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( | 276 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( |
277 file_writer.string(), directory[2].Location)); | 277 string_file.string(), directory[2].Location)); |
278 | 278 |
279 EXPECT_EQ(kMinidumpStreamTypeModuleList, directory[3].StreamType); | 279 EXPECT_EQ(kMinidumpStreamTypeModuleList, directory[3].StreamType); |
280 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( | 280 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( |
281 file_writer.string(), directory[3].Location)); | 281 string_file.string(), directory[3].Location)); |
282 | 282 |
283 EXPECT_EQ(kMinidumpStreamTypeMemoryList, directory[4].StreamType); | 283 EXPECT_EQ(kMinidumpStreamTypeMemoryList, directory[4].StreamType); |
284 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( | 284 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( |
285 file_writer.string(), directory[4].Location)); | 285 string_file.string(), directory[4].Location)); |
286 } | 286 } |
287 | 287 |
288 TEST(MinidumpFileWriter, InitializeFromSnapshot_Exception) { | 288 TEST(MinidumpFileWriter, InitializeFromSnapshot_Exception) { |
289 // In a 32-bit environment, this will give a “timestamp out of range” warning, | 289 // In a 32-bit environment, this will give a “timestamp out of range” warning, |
290 // but the test should complete without failure. | 290 // but the test should complete without failure. |
291 const uint32_t kSnapshotTime = 0xfd469ab8; | 291 const uint32_t kSnapshotTime = 0xfd469ab8; |
292 MSVC_SUPPRESS_WARNING(4309); // Truncation of constant value. | 292 MSVC_SUPPRESS_WARNING(4309); // Truncation of constant value. |
293 const timeval kSnapshotTimeval = { static_cast<time_t>(kSnapshotTime), 0 }; | 293 const timeval kSnapshotTimeval = { static_cast<time_t>(kSnapshotTime), 0 }; |
294 | 294 |
295 TestProcessSnapshot process_snapshot; | 295 TestProcessSnapshot process_snapshot; |
(...skipping 15 matching lines...) Expand all Loading... |
311 // The module does not have anything that needs to be represented in a | 311 // The module does not have anything that needs to be represented in a |
312 // MinidumpModuleCrashpadInfo structure, so no such structure is expected to | 312 // MinidumpModuleCrashpadInfo structure, so no such structure is expected to |
313 // be present, which will in turn suppress the addition of a | 313 // be present, which will in turn suppress the addition of a |
314 // MinidumpCrashpadInfo stream. | 314 // MinidumpCrashpadInfo stream. |
315 auto module_snapshot = make_scoped_ptr(new TestModuleSnapshot()); | 315 auto module_snapshot = make_scoped_ptr(new TestModuleSnapshot()); |
316 process_snapshot.AddModule(module_snapshot.Pass()); | 316 process_snapshot.AddModule(module_snapshot.Pass()); |
317 | 317 |
318 MinidumpFileWriter minidump_file_writer; | 318 MinidumpFileWriter minidump_file_writer; |
319 minidump_file_writer.InitializeFromSnapshot(&process_snapshot); | 319 minidump_file_writer.InitializeFromSnapshot(&process_snapshot); |
320 | 320 |
321 StringFileWriter file_writer; | 321 StringFile string_file; |
322 ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); | 322 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
323 | 323 |
324 const MINIDUMP_DIRECTORY* directory; | 324 const MINIDUMP_DIRECTORY* directory; |
325 const MINIDUMP_HEADER* header = | 325 const MINIDUMP_HEADER* header = |
326 MinidumpHeaderAtStart(file_writer.string(), &directory); | 326 MinidumpHeaderAtStart(string_file.string(), &directory); |
327 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 6, kSnapshotTime)); | 327 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 6, kSnapshotTime)); |
328 ASSERT_TRUE(directory); | 328 ASSERT_TRUE(directory); |
329 | 329 |
330 EXPECT_EQ(kMinidumpStreamTypeSystemInfo, directory[0].StreamType); | 330 EXPECT_EQ(kMinidumpStreamTypeSystemInfo, directory[0].StreamType); |
331 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_SYSTEM_INFO>( | 331 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_SYSTEM_INFO>( |
332 file_writer.string(), directory[0].Location)); | 332 string_file.string(), directory[0].Location)); |
333 | 333 |
334 EXPECT_EQ(kMinidumpStreamTypeMiscInfo, directory[1].StreamType); | 334 EXPECT_EQ(kMinidumpStreamTypeMiscInfo, directory[1].StreamType); |
335 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MISC_INFO_4>( | 335 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MISC_INFO_4>( |
336 file_writer.string(), directory[1].Location)); | 336 string_file.string(), directory[1].Location)); |
337 | 337 |
338 EXPECT_EQ(kMinidumpStreamTypeThreadList, directory[2].StreamType); | 338 EXPECT_EQ(kMinidumpStreamTypeThreadList, directory[2].StreamType); |
339 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( | 339 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( |
340 file_writer.string(), directory[2].Location)); | 340 string_file.string(), directory[2].Location)); |
341 | 341 |
342 EXPECT_EQ(kMinidumpStreamTypeException, directory[3].StreamType); | 342 EXPECT_EQ(kMinidumpStreamTypeException, directory[3].StreamType); |
343 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_EXCEPTION_STREAM>( | 343 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_EXCEPTION_STREAM>( |
344 file_writer.string(), directory[3].Location)); | 344 string_file.string(), directory[3].Location)); |
345 | 345 |
346 EXPECT_EQ(kMinidumpStreamTypeModuleList, directory[4].StreamType); | 346 EXPECT_EQ(kMinidumpStreamTypeModuleList, directory[4].StreamType); |
347 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( | 347 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( |
348 file_writer.string(), directory[4].Location)); | 348 string_file.string(), directory[4].Location)); |
349 | 349 |
350 EXPECT_EQ(kMinidumpStreamTypeMemoryList, directory[5].StreamType); | 350 EXPECT_EQ(kMinidumpStreamTypeMemoryList, directory[5].StreamType); |
351 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( | 351 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( |
352 file_writer.string(), directory[5].Location)); | 352 string_file.string(), directory[5].Location)); |
353 } | 353 } |
354 | 354 |
355 TEST(MinidumpFileWriter, InitializeFromSnapshot_CrashpadInfo) { | 355 TEST(MinidumpFileWriter, InitializeFromSnapshot_CrashpadInfo) { |
356 const uint32_t kSnapshotTime = 0x15393bd3; | 356 const uint32_t kSnapshotTime = 0x15393bd3; |
357 const timeval kSnapshotTimeval = { static_cast<time_t>(kSnapshotTime), 0 }; | 357 const timeval kSnapshotTimeval = { static_cast<time_t>(kSnapshotTime), 0 }; |
358 | 358 |
359 TestProcessSnapshot process_snapshot; | 359 TestProcessSnapshot process_snapshot; |
360 process_snapshot.SetSnapshotTime(kSnapshotTimeval); | 360 process_snapshot.SetSnapshotTime(kSnapshotTimeval); |
361 | 361 |
362 auto system_snapshot = make_scoped_ptr(new TestSystemSnapshot()); | 362 auto system_snapshot = make_scoped_ptr(new TestSystemSnapshot()); |
(...skipping 12 matching lines...) Expand all Loading... |
375 // The module needs an annotation for the MinidumpCrashpadInfo stream to be | 375 // The module needs an annotation for the MinidumpCrashpadInfo stream to be |
376 // considered useful and be included. | 376 // considered useful and be included. |
377 auto module_snapshot = make_scoped_ptr(new TestModuleSnapshot()); | 377 auto module_snapshot = make_scoped_ptr(new TestModuleSnapshot()); |
378 std::vector<std::string> annotations_list(1, std::string("annotation")); | 378 std::vector<std::string> annotations_list(1, std::string("annotation")); |
379 module_snapshot->SetAnnotationsVector(annotations_list); | 379 module_snapshot->SetAnnotationsVector(annotations_list); |
380 process_snapshot.AddModule(module_snapshot.Pass()); | 380 process_snapshot.AddModule(module_snapshot.Pass()); |
381 | 381 |
382 MinidumpFileWriter minidump_file_writer; | 382 MinidumpFileWriter minidump_file_writer; |
383 minidump_file_writer.InitializeFromSnapshot(&process_snapshot); | 383 minidump_file_writer.InitializeFromSnapshot(&process_snapshot); |
384 | 384 |
385 StringFileWriter file_writer; | 385 StringFile string_file; |
386 ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); | 386 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
387 | 387 |
388 const MINIDUMP_DIRECTORY* directory; | 388 const MINIDUMP_DIRECTORY* directory; |
389 const MINIDUMP_HEADER* header = | 389 const MINIDUMP_HEADER* header = |
390 MinidumpHeaderAtStart(file_writer.string(), &directory); | 390 MinidumpHeaderAtStart(string_file.string(), &directory); |
391 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 7, kSnapshotTime)); | 391 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 7, kSnapshotTime)); |
392 ASSERT_TRUE(directory); | 392 ASSERT_TRUE(directory); |
393 | 393 |
394 EXPECT_EQ(kMinidumpStreamTypeSystemInfo, directory[0].StreamType); | 394 EXPECT_EQ(kMinidumpStreamTypeSystemInfo, directory[0].StreamType); |
395 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_SYSTEM_INFO>( | 395 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_SYSTEM_INFO>( |
396 file_writer.string(), directory[0].Location)); | 396 string_file.string(), directory[0].Location)); |
397 | 397 |
398 EXPECT_EQ(kMinidumpStreamTypeMiscInfo, directory[1].StreamType); | 398 EXPECT_EQ(kMinidumpStreamTypeMiscInfo, directory[1].StreamType); |
399 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MISC_INFO_4>( | 399 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MISC_INFO_4>( |
400 file_writer.string(), directory[1].Location)); | 400 string_file.string(), directory[1].Location)); |
401 | 401 |
402 EXPECT_EQ(kMinidumpStreamTypeThreadList, directory[2].StreamType); | 402 EXPECT_EQ(kMinidumpStreamTypeThreadList, directory[2].StreamType); |
403 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( | 403 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( |
404 file_writer.string(), directory[2].Location)); | 404 string_file.string(), directory[2].Location)); |
405 | 405 |
406 EXPECT_EQ(kMinidumpStreamTypeException, directory[3].StreamType); | 406 EXPECT_EQ(kMinidumpStreamTypeException, directory[3].StreamType); |
407 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_EXCEPTION_STREAM>( | 407 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_EXCEPTION_STREAM>( |
408 file_writer.string(), directory[3].Location)); | 408 string_file.string(), directory[3].Location)); |
409 | 409 |
410 EXPECT_EQ(kMinidumpStreamTypeModuleList, directory[4].StreamType); | 410 EXPECT_EQ(kMinidumpStreamTypeModuleList, directory[4].StreamType); |
411 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( | 411 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( |
412 file_writer.string(), directory[4].Location)); | 412 string_file.string(), directory[4].Location)); |
413 | 413 |
414 EXPECT_EQ(kMinidumpStreamTypeCrashpadInfo, directory[5].StreamType); | 414 EXPECT_EQ(kMinidumpStreamTypeCrashpadInfo, directory[5].StreamType); |
415 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MinidumpCrashpadInfo>( | 415 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MinidumpCrashpadInfo>( |
416 file_writer.string(), directory[5].Location)); | 416 string_file.string(), directory[5].Location)); |
417 | 417 |
418 EXPECT_EQ(kMinidumpStreamTypeMemoryList, directory[6].StreamType); | 418 EXPECT_EQ(kMinidumpStreamTypeMemoryList, directory[6].StreamType); |
419 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( | 419 EXPECT_TRUE(MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( |
420 file_writer.string(), directory[6].Location)); | 420 string_file.string(), directory[6].Location)); |
421 } | 421 } |
422 | 422 |
423 TEST(MinidumpFileWriterDeathTest, SameStreamType) { | 423 TEST(MinidumpFileWriterDeathTest, SameStreamType) { |
424 MinidumpFileWriter minidump_file; | 424 MinidumpFileWriter minidump_file; |
425 | 425 |
426 const size_t kStream0Size = 5; | 426 const size_t kStream0Size = 5; |
427 const MinidumpStreamType kStream0Type = static_cast<MinidumpStreamType>(0x4d); | 427 const MinidumpStreamType kStream0Type = static_cast<MinidumpStreamType>(0x4d); |
428 const uint8_t kStream0Value = 0x5a; | 428 const uint8_t kStream0Value = 0x5a; |
429 auto stream0 = make_scoped_ptr( | 429 auto stream0 = make_scoped_ptr( |
430 new TestStream(kStream0Type, kStream0Size, kStream0Value)); | 430 new TestStream(kStream0Type, kStream0Size, kStream0Value)); |
431 minidump_file.AddStream(stream0.Pass()); | 431 minidump_file.AddStream(stream0.Pass()); |
432 | 432 |
433 // It is an error to add a second stream of the same type. | 433 // It is an error to add a second stream of the same type. |
434 const size_t kStream1Size = 3; | 434 const size_t kStream1Size = 3; |
435 const MinidumpStreamType kStream1Type = static_cast<MinidumpStreamType>(0x4d); | 435 const MinidumpStreamType kStream1Type = static_cast<MinidumpStreamType>(0x4d); |
436 const uint8_t kStream1Value = 0xa5; | 436 const uint8_t kStream1Value = 0xa5; |
437 auto stream1 = make_scoped_ptr( | 437 auto stream1 = make_scoped_ptr( |
438 new TestStream(kStream1Type, kStream1Size, kStream1Value)); | 438 new TestStream(kStream1Type, kStream1Size, kStream1Value)); |
439 ASSERT_DEATH(minidump_file.AddStream(stream1.Pass()), "already present"); | 439 ASSERT_DEATH(minidump_file.AddStream(stream1.Pass()), "already present"); |
440 } | 440 } |
441 | 441 |
442 } // namespace | 442 } // namespace |
443 } // namespace test | 443 } // namespace test |
444 } // namespace crashpad | 444 } // namespace crashpad |
OLD | NEW |