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 |