| 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 |