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, |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
13 // limitations under the License. | 13 // limitations under the License. |
14 | 14 |
15 #include "client/crash_report_database.h" | 15 #include "client/crash_report_database.h" |
16 | 16 |
17 #include <sys/stat.h> | |
18 | |
19 #include "build/build_config.h" | 17 #include "build/build_config.h" |
20 #include "client/settings.h" | 18 #include "client/settings.h" |
21 #include "gtest/gtest.h" | 19 #include "gtest/gtest.h" |
22 #include "test/errors.h" | 20 #include "test/errors.h" |
| 21 #include "test/file.h" |
23 #include "test/scoped_temp_dir.h" | 22 #include "test/scoped_temp_dir.h" |
24 #include "util/file/file_io.h" | 23 #include "util/file/file_io.h" |
25 | 24 |
26 namespace crashpad { | 25 namespace crashpad { |
27 namespace test { | 26 namespace test { |
28 namespace { | 27 namespace { |
29 | 28 |
30 bool FileExistsAtPath(const base::FilePath& path) { | |
31 #if defined(OS_POSIX) | |
32 struct stat st; | |
33 return lstat(path.value().c_str(), &st) == 0; | |
34 #elif defined(OS_WIN) | |
35 struct _stat st; | |
36 return _wstat(path.value().c_str(), &st) == 0; | |
37 #else | |
38 #error "Not implemented" | |
39 #endif | |
40 } | |
41 | |
42 class CrashReportDatabaseTest : public testing::Test { | 29 class CrashReportDatabaseTest : public testing::Test { |
43 public: | 30 public: |
44 CrashReportDatabaseTest() { | 31 CrashReportDatabaseTest() { |
45 } | 32 } |
46 | 33 |
47 protected: | 34 protected: |
48 // testing::Test: | 35 // testing::Test: |
49 void SetUp() override { | 36 void SetUp() override { |
50 db_ = CrashReportDatabase::Initialize(path()); | 37 db_ = CrashReportDatabase::Initialize(path()); |
51 ASSERT_TRUE(db_); | 38 ASSERT_TRUE(db_); |
(...skipping 15 matching lines...) Expand all Loading... |
67 const char kTest[] = "test"; | 54 const char kTest[] = "test"; |
68 ASSERT_TRUE(LoggingWriteFile(new_report->handle, kTest, sizeof(kTest))); | 55 ASSERT_TRUE(LoggingWriteFile(new_report->handle, kTest, sizeof(kTest))); |
69 | 56 |
70 UUID uuid; | 57 UUID uuid; |
71 EXPECT_EQ(CrashReportDatabase::kNoError, | 58 EXPECT_EQ(CrashReportDatabase::kNoError, |
72 db_->FinishedWritingCrashReport(new_report, &uuid)); | 59 db_->FinishedWritingCrashReport(new_report, &uuid)); |
73 | 60 |
74 EXPECT_EQ(CrashReportDatabase::kNoError, | 61 EXPECT_EQ(CrashReportDatabase::kNoError, |
75 db_->LookUpCrashReport(uuid, report)); | 62 db_->LookUpCrashReport(uuid, report)); |
76 ExpectPreparedCrashReport(*report); | 63 ExpectPreparedCrashReport(*report); |
77 ASSERT_TRUE(FileExistsAtPath(report->file_path)); | 64 ASSERT_TRUE(FileExists(report->file_path)); |
78 } | 65 } |
79 | 66 |
80 void UploadReport(const UUID& uuid, bool successful, const std::string& id) { | 67 void UploadReport(const UUID& uuid, bool successful, const std::string& id) { |
81 #if !defined(OS_WIN) | 68 #if !defined(OS_WIN) |
82 // Enable when ported to Windows. | 69 // Enable when ported to Windows. |
83 // https://code.google.com/p/crashpad/issues/detail?id=13 | 70 // https://code.google.com/p/crashpad/issues/detail?id=13 |
84 Settings* const settings = db_->GetSettings(); | 71 Settings* const settings = db_->GetSettings(); |
85 ASSERT_TRUE(settings); | 72 ASSERT_TRUE(settings); |
86 time_t times[2]; | 73 time_t times[2]; |
87 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[0])); | 74 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[0])); |
88 #endif | 75 #endif |
89 | 76 |
90 const CrashReportDatabase::Report* report = nullptr; | 77 const CrashReportDatabase::Report* report = nullptr; |
91 ASSERT_EQ(CrashReportDatabase::kNoError, | 78 ASSERT_EQ(CrashReportDatabase::kNoError, |
92 db_->GetReportForUploading(uuid, &report)); | 79 db_->GetReportForUploading(uuid, &report)); |
93 EXPECT_NE(UUID(), report->uuid); | 80 EXPECT_NE(UUID(), report->uuid); |
94 EXPECT_FALSE(report->file_path.empty()); | 81 EXPECT_FALSE(report->file_path.empty()); |
95 EXPECT_TRUE(FileExistsAtPath(report->file_path)) | 82 EXPECT_TRUE(FileExists(report->file_path)) |
96 << report->file_path.value(); | 83 << report->file_path.value(); |
97 EXPECT_GT(report->creation_time, 0); | 84 EXPECT_GT(report->creation_time, 0); |
98 EXPECT_EQ(CrashReportDatabase::kNoError, | 85 EXPECT_EQ(CrashReportDatabase::kNoError, |
99 db_->RecordUploadAttempt(report, successful, id)); | 86 db_->RecordUploadAttempt(report, successful, id)); |
100 | 87 |
101 #if !defined(OS_WIN) | 88 #if !defined(OS_WIN) |
102 // Enable when ported to Windows. | 89 // Enable when ported to Windows. |
103 // https://code.google.com/p/crashpad/issues/detail?id=13 | 90 // https://code.google.com/p/crashpad/issues/detail?id=13 |
104 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[1])); | 91 ASSERT_TRUE(settings->GetLastUploadAttemptTime(×[1])); |
105 EXPECT_NE(times[1], 0); | 92 EXPECT_NE(times[1], 0); |
106 EXPECT_GE(times[1], times[0]); | 93 EXPECT_GE(times[1], times[0]); |
107 #endif | 94 #endif |
108 } | 95 } |
109 | 96 |
110 void ExpectPreparedCrashReport(const CrashReportDatabase::Report& report) { | 97 void ExpectPreparedCrashReport(const CrashReportDatabase::Report& report) { |
111 EXPECT_NE(UUID(), report.uuid); | 98 EXPECT_NE(UUID(), report.uuid); |
112 EXPECT_FALSE(report.file_path.empty()); | 99 EXPECT_FALSE(report.file_path.empty()); |
113 EXPECT_TRUE(FileExistsAtPath(report.file_path)) << report.file_path.value(); | 100 EXPECT_TRUE(FileExists(report.file_path)) << report.file_path.value(); |
114 EXPECT_TRUE(report.id.empty()); | 101 EXPECT_TRUE(report.id.empty()); |
115 EXPECT_GT(report.creation_time, 0); | 102 EXPECT_GT(report.creation_time, 0); |
116 EXPECT_FALSE(report.uploaded); | 103 EXPECT_FALSE(report.uploaded); |
117 EXPECT_EQ(0, report.last_upload_attempt_time); | 104 EXPECT_EQ(0, report.last_upload_attempt_time); |
118 EXPECT_EQ(0, report.upload_attempts); | 105 EXPECT_EQ(0, report.upload_attempts); |
119 } | 106 } |
120 | 107 |
121 void RelocateDatabase() { | 108 void RelocateDatabase() { |
122 ResetDatabase(); | 109 ResetDatabase(); |
123 temp_dir_.Rename(); | 110 temp_dir_.Rename(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 reports.clear(); | 160 reports.clear(); |
174 EXPECT_EQ(CrashReportDatabase::kNoError, db->GetCompletedReports(&reports)); | 161 EXPECT_EQ(CrashReportDatabase::kNoError, db->GetCompletedReports(&reports)); |
175 EXPECT_TRUE(reports.empty()); | 162 EXPECT_TRUE(reports.empty()); |
176 } | 163 } |
177 | 164 |
178 TEST_F(CrashReportDatabaseTest, NewCrashReport) { | 165 TEST_F(CrashReportDatabaseTest, NewCrashReport) { |
179 CrashReportDatabase::NewReport* new_report; | 166 CrashReportDatabase::NewReport* new_report; |
180 EXPECT_EQ(CrashReportDatabase::kNoError, | 167 EXPECT_EQ(CrashReportDatabase::kNoError, |
181 db()->PrepareNewCrashReport(&new_report)); | 168 db()->PrepareNewCrashReport(&new_report)); |
182 UUID expect_uuid = new_report->uuid; | 169 UUID expect_uuid = new_report->uuid; |
183 EXPECT_TRUE(FileExistsAtPath(new_report->path)) << new_report->path.value(); | 170 EXPECT_TRUE(FileExists(new_report->path)) << new_report->path.value(); |
184 UUID uuid; | 171 UUID uuid; |
185 EXPECT_EQ(CrashReportDatabase::kNoError, | 172 EXPECT_EQ(CrashReportDatabase::kNoError, |
186 db()->FinishedWritingCrashReport(new_report, &uuid)); | 173 db()->FinishedWritingCrashReport(new_report, &uuid)); |
187 EXPECT_EQ(expect_uuid, uuid); | 174 EXPECT_EQ(expect_uuid, uuid); |
188 | 175 |
189 CrashReportDatabase::Report report; | 176 CrashReportDatabase::Report report; |
190 EXPECT_EQ(CrashReportDatabase::kNoError, | 177 EXPECT_EQ(CrashReportDatabase::kNoError, |
191 db()->LookUpCrashReport(uuid, &report)); | 178 db()->LookUpCrashReport(uuid, &report)); |
192 ExpectPreparedCrashReport(report); | 179 ExpectPreparedCrashReport(report); |
193 | 180 |
194 std::vector<CrashReportDatabase::Report> reports; | 181 std::vector<CrashReportDatabase::Report> reports; |
195 EXPECT_EQ(CrashReportDatabase::kNoError, | 182 EXPECT_EQ(CrashReportDatabase::kNoError, |
196 db()->GetPendingReports(&reports)); | 183 db()->GetPendingReports(&reports)); |
197 ASSERT_EQ(1u, reports.size()); | 184 ASSERT_EQ(1u, reports.size()); |
198 EXPECT_EQ(report.uuid, reports[0].uuid); | 185 EXPECT_EQ(report.uuid, reports[0].uuid); |
199 | 186 |
200 reports.clear(); | 187 reports.clear(); |
201 EXPECT_EQ(CrashReportDatabase::kNoError, | 188 EXPECT_EQ(CrashReportDatabase::kNoError, |
202 db()->GetCompletedReports(&reports)); | 189 db()->GetCompletedReports(&reports)); |
203 EXPECT_TRUE(reports.empty()); | 190 EXPECT_TRUE(reports.empty()); |
204 } | 191 } |
205 | 192 |
206 TEST_F(CrashReportDatabaseTest, ErrorWritingCrashReport) { | 193 TEST_F(CrashReportDatabaseTest, ErrorWritingCrashReport) { |
207 CrashReportDatabase::NewReport* new_report = nullptr; | 194 CrashReportDatabase::NewReport* new_report = nullptr; |
208 ASSERT_EQ(CrashReportDatabase::kNoError, | 195 ASSERT_EQ(CrashReportDatabase::kNoError, |
209 db()->PrepareNewCrashReport(&new_report)); | 196 db()->PrepareNewCrashReport(&new_report)); |
210 base::FilePath new_report_path = new_report->path; | 197 base::FilePath new_report_path = new_report->path; |
211 EXPECT_TRUE(FileExistsAtPath(new_report_path)) << new_report_path.value(); | 198 EXPECT_TRUE(FileExists(new_report_path)) << new_report_path.value(); |
212 EXPECT_EQ(CrashReportDatabase::kNoError, | 199 EXPECT_EQ(CrashReportDatabase::kNoError, |
213 db()->ErrorWritingCrashReport(new_report)); | 200 db()->ErrorWritingCrashReport(new_report)); |
214 EXPECT_FALSE(FileExistsAtPath(new_report_path)) << new_report_path.value(); | 201 EXPECT_FALSE(FileExists(new_report_path)) << new_report_path.value(); |
215 } | 202 } |
216 | 203 |
217 TEST_F(CrashReportDatabaseTest, LookUpCrashReport) { | 204 TEST_F(CrashReportDatabaseTest, LookUpCrashReport) { |
218 UUID uuid; | 205 UUID uuid; |
219 | 206 |
220 { | 207 { |
221 CrashReportDatabase::Report report; | 208 CrashReportDatabase::Report report; |
222 CreateCrashReport(&report); | 209 CreateCrashReport(&report); |
223 uuid = report.uuid; | 210 uuid = report.uuid; |
224 } | 211 } |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 EXPECT_FALSE(upload_report_2); | 468 EXPECT_FALSE(upload_report_2); |
482 | 469 |
483 EXPECT_EQ(CrashReportDatabase::kNoError, | 470 EXPECT_EQ(CrashReportDatabase::kNoError, |
484 db()->RecordUploadAttempt(upload_report, true, std::string())); | 471 db()->RecordUploadAttempt(upload_report, true, std::string())); |
485 } | 472 } |
486 | 473 |
487 TEST_F(CrashReportDatabaseTest, MoveDatabase) { | 474 TEST_F(CrashReportDatabaseTest, MoveDatabase) { |
488 CrashReportDatabase::NewReport* new_report; | 475 CrashReportDatabase::NewReport* new_report; |
489 EXPECT_EQ(CrashReportDatabase::kNoError, | 476 EXPECT_EQ(CrashReportDatabase::kNoError, |
490 db()->PrepareNewCrashReport(&new_report)); | 477 db()->PrepareNewCrashReport(&new_report)); |
491 EXPECT_TRUE(FileExistsAtPath(new_report->path)) << new_report->path.value(); | 478 EXPECT_TRUE(FileExists(new_report->path)) << new_report->path.value(); |
492 UUID uuid; | 479 UUID uuid; |
493 EXPECT_EQ(CrashReportDatabase::kNoError, | 480 EXPECT_EQ(CrashReportDatabase::kNoError, |
494 db()->FinishedWritingCrashReport(new_report, &uuid)); | 481 db()->FinishedWritingCrashReport(new_report, &uuid)); |
495 | 482 |
496 RelocateDatabase(); | 483 RelocateDatabase(); |
497 | 484 |
498 CrashReportDatabase::Report report; | 485 CrashReportDatabase::Report report; |
499 EXPECT_EQ(CrashReportDatabase::kNoError, | 486 EXPECT_EQ(CrashReportDatabase::kNoError, |
500 db()->LookUpCrashReport(uuid, &report)); | 487 db()->LookUpCrashReport(uuid, &report)); |
501 ExpectPreparedCrashReport(report); | 488 ExpectPreparedCrashReport(report); |
502 EXPECT_TRUE(FileExistsAtPath(report.file_path)) << report.file_path.value(); | 489 EXPECT_TRUE(FileExists(report.file_path)) << report.file_path.value(); |
503 } | 490 } |
504 | 491 |
505 TEST_F(CrashReportDatabaseTest, ReportRemoved) { | 492 TEST_F(CrashReportDatabaseTest, ReportRemoved) { |
506 CrashReportDatabase::NewReport* new_report; | 493 CrashReportDatabase::NewReport* new_report; |
507 EXPECT_EQ(CrashReportDatabase::kNoError, | 494 EXPECT_EQ(CrashReportDatabase::kNoError, |
508 db()->PrepareNewCrashReport(&new_report)); | 495 db()->PrepareNewCrashReport(&new_report)); |
509 EXPECT_TRUE(FileExistsAtPath(new_report->path)) << new_report->path.value(); | 496 EXPECT_TRUE(FileExists(new_report->path)) << new_report->path.value(); |
510 UUID uuid; | 497 UUID uuid; |
511 EXPECT_EQ(CrashReportDatabase::kNoError, | 498 EXPECT_EQ(CrashReportDatabase::kNoError, |
512 db()->FinishedWritingCrashReport(new_report, &uuid)); | 499 db()->FinishedWritingCrashReport(new_report, &uuid)); |
513 | 500 |
514 CrashReportDatabase::Report report; | 501 CrashReportDatabase::Report report; |
515 EXPECT_EQ(CrashReportDatabase::kNoError, | 502 EXPECT_EQ(CrashReportDatabase::kNoError, |
516 db()->LookUpCrashReport(uuid, &report)); | 503 db()->LookUpCrashReport(uuid, &report)); |
517 | 504 |
518 #if defined(OS_WIN) | 505 #if defined(OS_WIN) |
519 EXPECT_EQ(0, _wunlink(report.file_path.value().c_str())); | 506 EXPECT_EQ(0, _wunlink(report.file_path.value().c_str())); |
520 #else | 507 #else |
521 EXPECT_EQ(0, unlink(report.file_path.value().c_str())) | 508 EXPECT_EQ(0, unlink(report.file_path.value().c_str())) |
522 << ErrnoMessage("unlink"); | 509 << ErrnoMessage("unlink"); |
523 #endif | 510 #endif |
524 | 511 |
525 EXPECT_EQ(CrashReportDatabase::kReportNotFound, | 512 EXPECT_EQ(CrashReportDatabase::kReportNotFound, |
526 db()->LookUpCrashReport(uuid, &report)); | 513 db()->LookUpCrashReport(uuid, &report)); |
527 } | 514 } |
528 | 515 |
529 } // namespace | 516 } // namespace |
530 } // namespace test | 517 } // namespace test |
531 } // namespace crashpad | 518 } // namespace crashpad |
OLD | NEW |