| 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 EXPECT_FALSE(directory); | 44 EXPECT_FALSE(directory); |
| 45 } | 45 } |
| 46 | 46 |
| 47 class TestStream final : public internal::MinidumpStreamWriter { | 47 class TestStream final : public internal::MinidumpStreamWriter { |
| 48 public: | 48 public: |
| 49 TestStream(MinidumpStreamType stream_type, | 49 TestStream(MinidumpStreamType stream_type, |
| 50 size_t stream_size, | 50 size_t stream_size, |
| 51 uint8_t stream_value) | 51 uint8_t stream_value) |
| 52 : stream_data_(stream_size, stream_value), stream_type_(stream_type) {} | 52 : stream_data_(stream_size, stream_value), stream_type_(stream_type) {} |
| 53 | 53 |
| 54 ~TestStream() {} | 54 ~TestStream() override {} |
| 55 | 55 |
| 56 // MinidumpStreamWriter: | 56 // MinidumpStreamWriter: |
| 57 MinidumpStreamType StreamType() const override { | 57 MinidumpStreamType StreamType() const override { |
| 58 return stream_type_; | 58 return stream_type_; |
| 59 } | 59 } |
| 60 | 60 |
| 61 protected: | 61 protected: |
| 62 // MinidumpWritable: | 62 // MinidumpWritable: |
| 63 size_t SizeOfObject() override { | 63 size_t SizeOfObject() override { |
| 64 EXPECT_GE(state(), kStateFrozen); | 64 EXPECT_GE(state(), kStateFrozen); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 78 }; | 78 }; |
| 79 | 79 |
| 80 TEST(MinidumpFileWriter, OneStream) { | 80 TEST(MinidumpFileWriter, OneStream) { |
| 81 MinidumpFileWriter minidump_file; | 81 MinidumpFileWriter minidump_file; |
| 82 const time_t kTimestamp = 0x155d2fb8; | 82 const time_t kTimestamp = 0x155d2fb8; |
| 83 minidump_file.SetTimestamp(kTimestamp); | 83 minidump_file.SetTimestamp(kTimestamp); |
| 84 | 84 |
| 85 const size_t kStreamSize = 5; | 85 const size_t kStreamSize = 5; |
| 86 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); | 86 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); |
| 87 const uint8_t kStreamValue = 0x5a; | 87 const uint8_t kStreamValue = 0x5a; |
| 88 TestStream stream(kStreamType, kStreamSize, kStreamValue); | 88 auto stream = |
| 89 minidump_file.AddStream(&stream); | 89 make_scoped_ptr(new TestStream(kStreamType, kStreamSize, kStreamValue)); |
| 90 minidump_file.AddStream(stream.Pass()); |
| 90 | 91 |
| 91 StringFileWriter file_writer; | 92 StringFileWriter file_writer; |
| 92 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); | 93 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); |
| 93 | 94 |
| 94 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 95 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); |
| 95 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); | 96 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); |
| 96 const size_t kFileSize = kStreamOffset + kStreamSize; | 97 const size_t kFileSize = kStreamOffset + kStreamSize; |
| 97 | 98 |
| 98 ASSERT_EQ(kFileSize, file_writer.string().size()); | 99 ASSERT_EQ(kFileSize, file_writer.string().size()); |
| 99 | 100 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 116 } | 117 } |
| 117 | 118 |
| 118 TEST(MinidumpFileWriter, ThreeStreams) { | 119 TEST(MinidumpFileWriter, ThreeStreams) { |
| 119 MinidumpFileWriter minidump_file; | 120 MinidumpFileWriter minidump_file; |
| 120 const time_t kTimestamp = 0x155d2fb8; | 121 const time_t kTimestamp = 0x155d2fb8; |
| 121 minidump_file.SetTimestamp(kTimestamp); | 122 minidump_file.SetTimestamp(kTimestamp); |
| 122 | 123 |
| 123 const size_t kStream0Size = 5; | 124 const size_t kStream0Size = 5; |
| 124 const MinidumpStreamType kStream0Type = static_cast<MinidumpStreamType>(0x6d); | 125 const MinidumpStreamType kStream0Type = static_cast<MinidumpStreamType>(0x6d); |
| 125 const uint8_t kStream0Value = 0x5a; | 126 const uint8_t kStream0Value = 0x5a; |
| 126 TestStream stream0(kStream0Type, kStream0Size, kStream0Value); | 127 auto stream0 = make_scoped_ptr( |
| 127 minidump_file.AddStream(&stream0); | 128 new TestStream(kStream0Type, kStream0Size, kStream0Value)); |
| 129 minidump_file.AddStream(stream0.Pass()); |
| 128 | 130 |
| 129 // Make the second stream’s type be a smaller quantity than the first stream’s | 131 // Make the second stream’s type be a smaller quantity than the first stream’s |
| 130 // to test that the streams show up in the order that they were added, not in | 132 // to test that the streams show up in the order that they were added, not in |
| 131 // numeric order. | 133 // numeric order. |
| 132 const size_t kStream1Size = 3; | 134 const size_t kStream1Size = 3; |
| 133 const MinidumpStreamType kStream1Type = static_cast<MinidumpStreamType>(0x4d); | 135 const MinidumpStreamType kStream1Type = static_cast<MinidumpStreamType>(0x4d); |
| 134 const uint8_t kStream1Value = 0xa5; | 136 const uint8_t kStream1Value = 0xa5; |
| 135 TestStream stream1(kStream1Type, kStream1Size, kStream1Value); | 137 auto stream1 = make_scoped_ptr( |
| 136 minidump_file.AddStream(&stream1); | 138 new TestStream(kStream1Type, kStream1Size, kStream1Value)); |
| 139 minidump_file.AddStream(stream1.Pass()); |
| 137 | 140 |
| 138 const size_t kStream2Size = 1; | 141 const size_t kStream2Size = 1; |
| 139 const MinidumpStreamType kStream2Type = static_cast<MinidumpStreamType>(0x7e); | 142 const MinidumpStreamType kStream2Type = static_cast<MinidumpStreamType>(0x7e); |
| 140 const uint8_t kStream2Value = 0x36; | 143 const uint8_t kStream2Value = 0x36; |
| 141 TestStream stream2(kStream2Type, kStream2Size, kStream2Value); | 144 auto stream2 = make_scoped_ptr( |
| 142 minidump_file.AddStream(&stream2); | 145 new TestStream(kStream2Type, kStream2Size, kStream2Value)); |
| 146 minidump_file.AddStream(stream2.Pass()); |
| 143 | 147 |
| 144 StringFileWriter file_writer; | 148 StringFileWriter file_writer; |
| 145 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); | 149 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); |
| 146 | 150 |
| 147 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 151 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); |
| 148 const size_t kStream0Offset = | 152 const size_t kStream0Offset = |
| 149 kDirectoryOffset + 3 * sizeof(MINIDUMP_DIRECTORY); | 153 kDirectoryOffset + 3 * sizeof(MINIDUMP_DIRECTORY); |
| 150 const size_t kStream1Padding = 3; | 154 const size_t kStream1Padding = 3; |
| 151 const size_t kStream1Offset = kStream0Offset + kStream0Size + kStream1Padding; | 155 const size_t kStream1Offset = kStream0Offset + kStream0Size + kStream1Padding; |
| 152 const size_t kStream2Padding = 1; | 156 const size_t kStream2Padding = 1; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 | 202 |
| 199 std::string expected_stream2(kStream2Size, kStream2Value); | 203 std::string expected_stream2(kStream2Size, kStream2Value); |
| 200 EXPECT_EQ(0, memcmp(stream2_data, expected_stream2.c_str(), kStream2Size)); | 204 EXPECT_EQ(0, memcmp(stream2_data, expected_stream2.c_str(), kStream2Size)); |
| 201 } | 205 } |
| 202 | 206 |
| 203 TEST(MinidumpFileWriter, ZeroLengthStream) { | 207 TEST(MinidumpFileWriter, ZeroLengthStream) { |
| 204 MinidumpFileWriter minidump_file; | 208 MinidumpFileWriter minidump_file; |
| 205 | 209 |
| 206 const size_t kStreamSize = 0; | 210 const size_t kStreamSize = 0; |
| 207 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); | 211 const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); |
| 208 TestStream stream(kStreamType, kStreamSize, 0); | 212 auto stream = make_scoped_ptr(new TestStream(kStreamType, kStreamSize, 0)); |
| 209 minidump_file.AddStream(&stream); | 213 minidump_file.AddStream(stream.Pass()); |
| 210 | 214 |
| 211 StringFileWriter file_writer; | 215 StringFileWriter file_writer; |
| 212 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); | 216 ASSERT_TRUE(minidump_file.WriteEverything(&file_writer)); |
| 213 | 217 |
| 214 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 218 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); |
| 215 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); | 219 const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); |
| 216 const size_t kFileSize = kStreamOffset + kStreamSize; | 220 const size_t kFileSize = kStreamOffset + kStreamSize; |
| 217 | 221 |
| 218 ASSERT_EQ(kFileSize, file_writer.string().size()); | 222 ASSERT_EQ(kFileSize, file_writer.string().size()); |
| 219 | 223 |
| 220 const MINIDUMP_DIRECTORY* directory; | 224 const MINIDUMP_DIRECTORY* directory; |
| 221 const MINIDUMP_HEADER* header = | 225 const MINIDUMP_HEADER* header = |
| 222 MinidumpHeaderAtStart(file_writer.string(), &directory); | 226 MinidumpHeaderAtStart(file_writer.string(), &directory); |
| 223 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, 0)); | 227 ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, 0)); |
| 224 ASSERT_TRUE(directory); | 228 ASSERT_TRUE(directory); |
| 225 | 229 |
| 226 EXPECT_EQ(kStreamType, directory[0].StreamType); | 230 EXPECT_EQ(kStreamType, directory[0].StreamType); |
| 227 EXPECT_EQ(kStreamSize, directory[0].Location.DataSize); | 231 EXPECT_EQ(kStreamSize, directory[0].Location.DataSize); |
| 228 EXPECT_EQ(kStreamOffset, directory[0].Location.Rva); | 232 EXPECT_EQ(kStreamOffset, directory[0].Location.Rva); |
| 229 } | 233 } |
| 230 | 234 |
| 231 TEST(MinidumpFileWriterDeathTest, SameStreamType) { | 235 TEST(MinidumpFileWriterDeathTest, SameStreamType) { |
| 232 MinidumpFileWriter minidump_file; | 236 MinidumpFileWriter minidump_file; |
| 233 | 237 |
| 234 const size_t kStream0Size = 5; | 238 const size_t kStream0Size = 5; |
| 235 const MinidumpStreamType kStream0Type = static_cast<MinidumpStreamType>(0x4d); | 239 const MinidumpStreamType kStream0Type = static_cast<MinidumpStreamType>(0x4d); |
| 236 const uint8_t kStream0Value = 0x5a; | 240 const uint8_t kStream0Value = 0x5a; |
| 237 TestStream stream0(kStream0Type, kStream0Size, kStream0Value); | 241 auto stream0 = make_scoped_ptr( |
| 238 minidump_file.AddStream(&stream0); | 242 new TestStream(kStream0Type, kStream0Size, kStream0Value)); |
| 243 minidump_file.AddStream(stream0.Pass()); |
| 239 | 244 |
| 240 // It is an error to add a second stream of the same type. | 245 // It is an error to add a second stream of the same type. |
| 241 const size_t kStream1Size = 3; | 246 const size_t kStream1Size = 3; |
| 242 const MinidumpStreamType kStream1Type = static_cast<MinidumpStreamType>(0x4d); | 247 const MinidumpStreamType kStream1Type = static_cast<MinidumpStreamType>(0x4d); |
| 243 const uint8_t kStream1Value = 0xa5; | 248 const uint8_t kStream1Value = 0xa5; |
| 244 TestStream stream1(kStream1Type, kStream1Size, kStream1Value); | 249 auto stream1 = make_scoped_ptr( |
| 245 ASSERT_DEATH(minidump_file.AddStream(&stream1), "already present"); | 250 new TestStream(kStream1Type, kStream1Size, kStream1Value)); |
| 251 ASSERT_DEATH(minidump_file.AddStream(stream1.Pass()), "already present"); |
| 246 } | 252 } |
| 247 | 253 |
| 248 } // namespace | 254 } // namespace |
| 249 } // namespace test | 255 } // namespace test |
| 250 } // namespace crashpad | 256 } // namespace crashpad |
| OLD | NEW |