OLD | NEW |
1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 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 16 matching lines...) Expand all Loading... |
27 namespace { | 27 namespace { |
28 | 28 |
29 class CrashReportDatabaseTest : public testing::Test { | 29 class CrashReportDatabaseTest : public testing::Test { |
30 public: | 30 public: |
31 CrashReportDatabaseTest() { | 31 CrashReportDatabaseTest() { |
32 } | 32 } |
33 | 33 |
34 protected: | 34 protected: |
35 // testing::Test: | 35 // testing::Test: |
36 void SetUp() override { | 36 void SetUp() override { |
37 db_ = CrashReportDatabase::Initialize(path()); | 37 db_ = CrashReportDatabase::Initialize(path(), true); |
38 ASSERT_TRUE(db_); | 38 ASSERT_TRUE(db_); |
39 } | 39 } |
40 | 40 |
41 void ResetDatabase() { | 41 void ResetDatabase() { |
42 db_.reset(); | 42 db_.reset(); |
43 } | 43 } |
44 | 44 |
45 CrashReportDatabase* db() { return db_.get(); } | 45 CrashReportDatabase* db() { return db_.get(); } |
46 base::FilePath path() const { | 46 base::FilePath path() const { |
47 return temp_dir_.path().Append(FILE_PATH_LITERAL("crashpad_test_database")); | 47 return temp_dir_.path().Append(FILE_PATH_LITERAL("crashpad_test_database")); |
(...skipping 20 matching lines...) Expand all Loading... |
68 Settings* const settings = db_->GetSettings(); | 68 Settings* const settings = db_->GetSettings(); |
69 ASSERT_TRUE(settings); | 69 ASSERT_TRUE(settings); |
70 time_t times[2]; | 70 time_t times[2]; |
71 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[0])); | 71 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[0])); |
72 | 72 |
73 const CrashReportDatabase::Report* report = nullptr; | 73 const CrashReportDatabase::Report* report = nullptr; |
74 ASSERT_EQ(CrashReportDatabase::kNoError, | 74 ASSERT_EQ(CrashReportDatabase::kNoError, |
75 db_->GetReportForUploading(uuid, &report)); | 75 db_->GetReportForUploading(uuid, &report)); |
76 EXPECT_NE(UUID(), report->uuid); | 76 EXPECT_NE(UUID(), report->uuid); |
77 EXPECT_FALSE(report->file_path.empty()); | 77 EXPECT_FALSE(report->file_path.empty()); |
78 EXPECT_TRUE(FileExists(report->file_path)) | 78 EXPECT_TRUE(FileExists(report->file_path)) << report->file_path.value(); |
79 << report->file_path.value(); | |
80 EXPECT_GT(report->creation_time, 0); | 79 EXPECT_GT(report->creation_time, 0); |
81 EXPECT_EQ(CrashReportDatabase::kNoError, | 80 EXPECT_EQ(CrashReportDatabase::kNoError, |
82 db_->RecordUploadAttempt(report, successful, id)); | 81 db_->RecordUploadAttempt(report, successful, id)); |
83 | 82 |
84 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[1])); | 83 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[1])); |
85 EXPECT_NE(times[1], 0); | 84 EXPECT_NE(times[1], 0); |
86 EXPECT_GE(times[1], times[0]); | 85 EXPECT_GE(times[1], times[0]); |
87 } | 86 } |
88 | 87 |
89 void ExpectPreparedCrashReport(const CrashReportDatabase::Report& report) { | 88 void ExpectPreparedCrashReport(const CrashReportDatabase::Report& report) { |
(...skipping 19 matching lines...) Expand all Loading... |
109 | 108 |
110 DISALLOW_COPY_AND_ASSIGN(CrashReportDatabaseTest); | 109 DISALLOW_COPY_AND_ASSIGN(CrashReportDatabaseTest); |
111 }; | 110 }; |
112 | 111 |
113 TEST_F(CrashReportDatabaseTest, Initialize) { | 112 TEST_F(CrashReportDatabaseTest, Initialize) { |
114 // Initialize the database for the first time, creating it. | 113 // Initialize the database for the first time, creating it. |
115 ASSERT_TRUE(db()); | 114 ASSERT_TRUE(db()); |
116 | 115 |
117 Settings* settings = db()->GetSettings(); | 116 Settings* settings = db()->GetSettings(); |
118 | 117 |
119 UUID client_ids[2]; | 118 UUID client_ids[3]; |
120 ASSERT_TRUE(settings->GetClientID(&client_ids[0])); | 119 ASSERT_TRUE(settings->GetClientID(&client_ids[0])); |
121 EXPECT_NE(client_ids[0], UUID()); | 120 EXPECT_NE(client_ids[0], UUID()); |
122 | 121 |
123 time_t last_upload_attempt_time; | 122 time_t last_upload_attempt_time; |
124 ASSERT_TRUE(settings->GetLastUploadAttemptTime(&last_upload_attempt_time)); | 123 ASSERT_TRUE(settings->GetLastUploadAttemptTime(&last_upload_attempt_time)); |
125 EXPECT_EQ(0, last_upload_attempt_time); | 124 EXPECT_EQ(0, last_upload_attempt_time); |
126 | 125 |
127 // Close and reopen the database at the same path. | 126 // Close and reopen the database at the same path. |
128 ResetDatabase(); | 127 ResetDatabase(); |
129 EXPECT_FALSE(db()); | 128 EXPECT_FALSE(db()); |
130 auto db = CrashReportDatabase::Initialize(path()); | 129 auto db = CrashReportDatabase::Initialize(path(), false); |
131 ASSERT_TRUE(db); | 130 ASSERT_TRUE(db); |
132 | 131 |
133 settings = db->GetSettings(); | 132 settings = db->GetSettings(); |
134 | 133 |
135 ASSERT_TRUE(settings->GetClientID(&client_ids[1])); | 134 ASSERT_TRUE(settings->GetClientID(&client_ids[1])); |
136 EXPECT_EQ(client_ids[0], client_ids[1]); | 135 EXPECT_EQ(client_ids[0], client_ids[1]); |
137 | 136 |
138 ASSERT_TRUE(settings->GetLastUploadAttemptTime(&last_upload_attempt_time)); | 137 ASSERT_TRUE(settings->GetLastUploadAttemptTime(&last_upload_attempt_time)); |
139 EXPECT_EQ(0, last_upload_attempt_time); | 138 EXPECT_EQ(0, last_upload_attempt_time); |
140 | 139 |
| 140 // Check that the database can also be opened when “create” is set to true. |
| 141 db = CrashReportDatabase::Initialize(path(), true); |
| 142 ASSERT_TRUE(db); |
| 143 |
| 144 settings = db->GetSettings(); |
| 145 |
| 146 ASSERT_TRUE(settings->GetClientID(&client_ids[2])); |
| 147 EXPECT_EQ(client_ids[0], client_ids[2]); |
| 148 |
| 149 ASSERT_TRUE(settings->GetLastUploadAttemptTime(&last_upload_attempt_time)); |
| 150 EXPECT_EQ(0, last_upload_attempt_time); |
| 151 |
141 std::vector<CrashReportDatabase::Report> reports; | 152 std::vector<CrashReportDatabase::Report> reports; |
142 EXPECT_EQ(CrashReportDatabase::kNoError, db->GetPendingReports(&reports)); | 153 EXPECT_EQ(CrashReportDatabase::kNoError, db->GetPendingReports(&reports)); |
143 EXPECT_TRUE(reports.empty()); | 154 EXPECT_TRUE(reports.empty()); |
144 reports.clear(); | 155 reports.clear(); |
145 EXPECT_EQ(CrashReportDatabase::kNoError, db->GetCompletedReports(&reports)); | 156 EXPECT_EQ(CrashReportDatabase::kNoError, db->GetCompletedReports(&reports)); |
146 EXPECT_TRUE(reports.empty()); | 157 EXPECT_TRUE(reports.empty()); |
| 158 |
| 159 // With “create” set to false, a nonexistent database shouldn’t be created. |
| 160 base::FilePath non_database_path = |
| 161 path().DirName().Append(FILE_PATH_LITERAL("not_a_database")); |
| 162 db = CrashReportDatabase::Initialize(non_database_path, false); |
| 163 EXPECT_FALSE(db); |
147 } | 164 } |
148 | 165 |
149 TEST_F(CrashReportDatabaseTest, NewCrashReport) { | 166 TEST_F(CrashReportDatabaseTest, NewCrashReport) { |
150 CrashReportDatabase::NewReport* new_report; | 167 CrashReportDatabase::NewReport* new_report; |
151 EXPECT_EQ(CrashReportDatabase::kNoError, | 168 EXPECT_EQ(CrashReportDatabase::kNoError, |
152 db()->PrepareNewCrashReport(&new_report)); | 169 db()->PrepareNewCrashReport(&new_report)); |
153 UUID expect_uuid = new_report->uuid; | 170 UUID expect_uuid = new_report->uuid; |
154 EXPECT_TRUE(FileExists(new_report->path)) << new_report->path.value(); | 171 EXPECT_TRUE(FileExists(new_report->path)) << new_report->path.value(); |
155 UUID uuid; | 172 UUID uuid; |
156 EXPECT_EQ(CrashReportDatabase::kNoError, | 173 EXPECT_EQ(CrashReportDatabase::kNoError, |
157 db()->FinishedWritingCrashReport(new_report, &uuid)); | 174 db()->FinishedWritingCrashReport(new_report, &uuid)); |
158 EXPECT_EQ(expect_uuid, uuid); | 175 EXPECT_EQ(expect_uuid, uuid); |
159 | 176 |
160 CrashReportDatabase::Report report; | 177 CrashReportDatabase::Report report; |
161 EXPECT_EQ(CrashReportDatabase::kNoError, | 178 EXPECT_EQ(CrashReportDatabase::kNoError, |
162 db()->LookUpCrashReport(uuid, &report)); | 179 db()->LookUpCrashReport(uuid, &report)); |
163 ExpectPreparedCrashReport(report); | 180 ExpectPreparedCrashReport(report); |
164 | 181 |
165 std::vector<CrashReportDatabase::Report> reports; | 182 std::vector<CrashReportDatabase::Report> reports; |
166 EXPECT_EQ(CrashReportDatabase::kNoError, | 183 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetPendingReports(&reports)); |
167 db()->GetPendingReports(&reports)); | |
168 ASSERT_EQ(1u, reports.size()); | 184 ASSERT_EQ(1u, reports.size()); |
169 EXPECT_EQ(report.uuid, reports[0].uuid); | 185 EXPECT_EQ(report.uuid, reports[0].uuid); |
170 | 186 |
171 reports.clear(); | 187 reports.clear(); |
172 EXPECT_EQ(CrashReportDatabase::kNoError, | 188 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetCompletedReports(&reports)); |
173 db()->GetCompletedReports(&reports)); | |
174 EXPECT_TRUE(reports.empty()); | 189 EXPECT_TRUE(reports.empty()); |
175 } | 190 } |
176 | 191 |
177 TEST_F(CrashReportDatabaseTest, ErrorWritingCrashReport) { | 192 TEST_F(CrashReportDatabaseTest, ErrorWritingCrashReport) { |
178 CrashReportDatabase::NewReport* new_report = nullptr; | 193 CrashReportDatabase::NewReport* new_report = nullptr; |
179 ASSERT_EQ(CrashReportDatabase::kNoError, | 194 ASSERT_EQ(CrashReportDatabase::kNoError, |
180 db()->PrepareNewCrashReport(&new_report)); | 195 db()->PrepareNewCrashReport(&new_report)); |
181 base::FilePath new_report_path = new_report->path; | 196 base::FilePath new_report_path = new_report->path; |
182 EXPECT_TRUE(FileExists(new_report_path)) << new_report_path.value(); | 197 EXPECT_TRUE(FileExists(new_report_path)) << new_report_path.value(); |
183 EXPECT_EQ(CrashReportDatabase::kNoError, | 198 EXPECT_EQ(CrashReportDatabase::kNoError, |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 CreateCrashReport(&reports[3]); | 328 CreateCrashReport(&reports[3]); |
314 CreateCrashReport(&reports[4]); | 329 CreateCrashReport(&reports[4]); |
315 | 330 |
316 const UUID& report_0_uuid = reports[0].uuid; | 331 const UUID& report_0_uuid = reports[0].uuid; |
317 const UUID& report_1_uuid = reports[1].uuid; | 332 const UUID& report_1_uuid = reports[1].uuid; |
318 const UUID& report_2_uuid = reports[2].uuid; | 333 const UUID& report_2_uuid = reports[2].uuid; |
319 const UUID& report_3_uuid = reports[3].uuid; | 334 const UUID& report_3_uuid = reports[3].uuid; |
320 const UUID& report_4_uuid = reports[4].uuid; | 335 const UUID& report_4_uuid = reports[4].uuid; |
321 | 336 |
322 std::vector<CrashReportDatabase::Report> pending; | 337 std::vector<CrashReportDatabase::Report> pending; |
323 EXPECT_EQ(CrashReportDatabase::kNoError, | 338 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetPendingReports(&pending)); |
324 db()->GetPendingReports(&pending)); | |
325 | 339 |
326 std::vector<CrashReportDatabase::Report> completed; | 340 std::vector<CrashReportDatabase::Report> completed; |
327 EXPECT_EQ(CrashReportDatabase::kNoError, | 341 EXPECT_EQ(CrashReportDatabase::kNoError, |
328 db()->GetCompletedReports(&completed)); | 342 db()->GetCompletedReports(&completed)); |
329 | 343 |
330 EXPECT_EQ(reports.size(), pending.size()); | 344 EXPECT_EQ(reports.size(), pending.size()); |
331 EXPECT_EQ(0u, completed.size()); | 345 EXPECT_EQ(0u, completed.size()); |
332 | 346 |
333 // Upload one report successfully. | 347 // Upload one report successfully. |
334 UploadReport(report_1_uuid, true, "report1"); | 348 UploadReport(report_1_uuid, true, "report1"); |
335 | 349 |
336 pending.clear(); | 350 pending.clear(); |
337 EXPECT_EQ(CrashReportDatabase::kNoError, | 351 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetPendingReports(&pending)); |
338 db()->GetPendingReports(&pending)); | |
339 completed.clear(); | 352 completed.clear(); |
340 EXPECT_EQ(CrashReportDatabase::kNoError, | 353 EXPECT_EQ(CrashReportDatabase::kNoError, |
341 db()->GetCompletedReports(&completed)); | 354 db()->GetCompletedReports(&completed)); |
342 | 355 |
343 EXPECT_EQ(4u, pending.size()); | 356 EXPECT_EQ(4u, pending.size()); |
344 ASSERT_EQ(1u, completed.size()); | 357 ASSERT_EQ(1u, completed.size()); |
345 | 358 |
346 for (const auto& report : pending) { | 359 for (const auto& report : pending) { |
347 EXPECT_NE(report_1_uuid, report.uuid); | 360 EXPECT_NE(report_1_uuid, report.uuid); |
348 EXPECT_FALSE(report.file_path.empty()); | 361 EXPECT_FALSE(report.file_path.empty()); |
349 } | 362 } |
350 EXPECT_EQ(report_1_uuid, completed[0].uuid); | 363 EXPECT_EQ(report_1_uuid, completed[0].uuid); |
351 EXPECT_EQ("report1", completed[0].id); | 364 EXPECT_EQ("report1", completed[0].id); |
352 EXPECT_EQ(true, completed[0].uploaded); | 365 EXPECT_EQ(true, completed[0].uploaded); |
353 EXPECT_GT(completed[0].last_upload_attempt_time, 0); | 366 EXPECT_GT(completed[0].last_upload_attempt_time, 0); |
354 EXPECT_EQ(1, completed[0].upload_attempts); | 367 EXPECT_EQ(1, completed[0].upload_attempts); |
355 | 368 |
356 // Fail to upload one report. | 369 // Fail to upload one report. |
357 UploadReport(report_2_uuid, false, std::string()); | 370 UploadReport(report_2_uuid, false, std::string()); |
358 | 371 |
359 pending.clear(); | 372 pending.clear(); |
360 EXPECT_EQ(CrashReportDatabase::kNoError, | 373 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetPendingReports(&pending)); |
361 db()->GetPendingReports(&pending)); | |
362 completed.clear(); | 374 completed.clear(); |
363 EXPECT_EQ(CrashReportDatabase::kNoError, | 375 EXPECT_EQ(CrashReportDatabase::kNoError, |
364 db()->GetCompletedReports(&completed)); | 376 db()->GetCompletedReports(&completed)); |
365 | 377 |
366 EXPECT_EQ(4u, pending.size()); | 378 EXPECT_EQ(4u, pending.size()); |
367 ASSERT_EQ(1u, completed.size()); | 379 ASSERT_EQ(1u, completed.size()); |
368 | 380 |
369 for (const auto& report : pending) { | 381 for (const auto& report : pending) { |
370 if (report.upload_attempts != 0) { | 382 if (report.upload_attempts != 0) { |
371 EXPECT_EQ(report_2_uuid, report.uuid); | 383 EXPECT_EQ(report_2_uuid, report.uuid); |
372 EXPECT_GT(report.last_upload_attempt_time, 0); | 384 EXPECT_GT(report.last_upload_attempt_time, 0); |
373 EXPECT_FALSE(report.uploaded); | 385 EXPECT_FALSE(report.uploaded); |
374 EXPECT_TRUE(report.id.empty()); | 386 EXPECT_TRUE(report.id.empty()); |
375 } | 387 } |
376 EXPECT_FALSE(report.file_path.empty()); | 388 EXPECT_FALSE(report.file_path.empty()); |
377 } | 389 } |
378 | 390 |
379 // Upload a second report. | 391 // Upload a second report. |
380 UploadReport(report_4_uuid, true, "report_4"); | 392 UploadReport(report_4_uuid, true, "report_4"); |
381 | 393 |
382 pending.clear(); | 394 pending.clear(); |
383 EXPECT_EQ(CrashReportDatabase::kNoError, | 395 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetPendingReports(&pending)); |
384 db()->GetPendingReports(&pending)); | |
385 completed.clear(); | 396 completed.clear(); |
386 EXPECT_EQ(CrashReportDatabase::kNoError, | 397 EXPECT_EQ(CrashReportDatabase::kNoError, |
387 db()->GetCompletedReports(&completed)); | 398 db()->GetCompletedReports(&completed)); |
388 | 399 |
389 EXPECT_EQ(3u, pending.size()); | 400 EXPECT_EQ(3u, pending.size()); |
390 ASSERT_EQ(2u, completed.size()); | 401 ASSERT_EQ(2u, completed.size()); |
391 | 402 |
392 // Succeed the failed report. | 403 // Succeed the failed report. |
393 UploadReport(report_2_uuid, true, "report 2"); | 404 UploadReport(report_2_uuid, true, "report 2"); |
394 | 405 |
395 pending.clear(); | 406 pending.clear(); |
396 EXPECT_EQ(CrashReportDatabase::kNoError, | 407 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetPendingReports(&pending)); |
397 db()->GetPendingReports(&pending)); | |
398 completed.clear(); | 408 completed.clear(); |
399 EXPECT_EQ(CrashReportDatabase::kNoError, | 409 EXPECT_EQ(CrashReportDatabase::kNoError, |
400 db()->GetCompletedReports(&completed)); | 410 db()->GetCompletedReports(&completed)); |
401 | 411 |
402 EXPECT_EQ(2u, pending.size()); | 412 EXPECT_EQ(2u, pending.size()); |
403 ASSERT_EQ(3u, completed.size()); | 413 ASSERT_EQ(3u, completed.size()); |
404 | 414 |
405 for (const auto& report : pending) { | 415 for (const auto& report : pending) { |
406 EXPECT_TRUE(report.uuid == report_0_uuid || | 416 EXPECT_TRUE(report.uuid == report_0_uuid || report.uuid == report_3_uuid); |
407 report.uuid == report_3_uuid); | |
408 EXPECT_FALSE(report.file_path.empty()); | 417 EXPECT_FALSE(report.file_path.empty()); |
409 } | 418 } |
410 | 419 |
411 // Skip upload for one report. | 420 // Skip upload for one report. |
412 EXPECT_EQ(CrashReportDatabase::kNoError, | 421 EXPECT_EQ(CrashReportDatabase::kNoError, |
413 db()->SkipReportUpload(report_3_uuid)); | 422 db()->SkipReportUpload(report_3_uuid)); |
414 | 423 |
415 pending.clear(); | 424 pending.clear(); |
416 EXPECT_EQ(CrashReportDatabase::kNoError, | 425 EXPECT_EQ(CrashReportDatabase::kNoError, db()->GetPendingReports(&pending)); |
417 db()->GetPendingReports(&pending)); | |
418 completed.clear(); | 426 completed.clear(); |
419 EXPECT_EQ(CrashReportDatabase::kNoError, | 427 EXPECT_EQ(CrashReportDatabase::kNoError, |
420 db()->GetCompletedReports(&completed)); | 428 db()->GetCompletedReports(&completed)); |
421 | 429 |
422 ASSERT_EQ(1u, pending.size()); | 430 ASSERT_EQ(1u, pending.size()); |
423 ASSERT_EQ(4u, completed.size()); | 431 ASSERT_EQ(4u, completed.size()); |
424 | 432 |
425 EXPECT_EQ(report_0_uuid, pending[0].uuid); | 433 EXPECT_EQ(report_0_uuid, pending[0].uuid); |
426 | 434 |
427 for (const auto& report : completed) { | 435 for (const auto& report : completed) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 << ErrnoMessage("unlink"); | 501 << ErrnoMessage("unlink"); |
494 #endif | 502 #endif |
495 | 503 |
496 EXPECT_EQ(CrashReportDatabase::kReportNotFound, | 504 EXPECT_EQ(CrashReportDatabase::kReportNotFound, |
497 db()->LookUpCrashReport(uuid, &report)); | 505 db()->LookUpCrashReport(uuid, &report)); |
498 } | 506 } |
499 | 507 |
500 } // namespace | 508 } // namespace |
501 } // namespace test | 509 } // namespace test |
502 } // namespace crashpad | 510 } // namespace crashpad |
OLD | NEW |