Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: client/crash_report_database_test.cc

Issue 1395653002: crashpad_database_util: Don’t create a database unless explicitly asked (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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(&times[0])); 71 ASSERT_TRUE(settings->GetLastUploadAttemptTime(&times[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(&times[1])); 83 ASSERT_TRUE(settings->GetLastUploadAttemptTime(&times[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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698