| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Unit tests for the SafeBrowsing storage system. | 5 // Unit tests for the SafeBrowsing storage system. |
| 6 | 6 |
| 7 #include "chrome/browser/safe_browsing/safe_browsing_database.h" | 7 #include "chrome/browser/safe_browsing/safe_browsing_database.h" |
| 8 | 8 |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 | 10 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 const std::string& ip_str, | 203 const std::string& ip_str, |
| 204 size_t prefix_size) { | 204 size_t prefix_size) { |
| 205 const std::string full_hash_str = HashedIpPrefix(ip_str, prefix_size); | 205 const std::string full_hash_str = HashedIpPrefix(ip_str, prefix_size); |
| 206 EXPECT_EQ(sizeof(SBFullHash), full_hash_str.size()); | 206 EXPECT_EQ(sizeof(SBFullHash), full_hash_str.size()); |
| 207 SBFullHash full_hash; | 207 SBFullHash full_hash; |
| 208 std::memcpy(&(full_hash.full_hash), full_hash_str.data(), sizeof(SBFullHash)); | 208 std::memcpy(&(full_hash.full_hash), full_hash_str.data(), sizeof(SBFullHash)); |
| 209 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, | 209 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, |
| 210 &full_hash, sizeof(full_hash), std::vector<int>()); | 210 &full_hash, sizeof(full_hash), std::vector<int>()); |
| 211 } | 211 } |
| 212 | 212 |
| 213 // Prevent DCHECK from killing tests. | |
| 214 // TODO(shess): Pawel disputes the use of this, so the test which uses | |
| 215 // it is DISABLED. http://crbug.com/56448 | |
| 216 class ScopedLogMessageIgnorer { | |
| 217 public: | |
| 218 ScopedLogMessageIgnorer() { | |
| 219 logging::SetLogMessageHandler(&LogMessageIgnorer); | |
| 220 } | |
| 221 ~ScopedLogMessageIgnorer() { | |
| 222 // TODO(shess): Would be better to verify whether anyone else | |
| 223 // changed it, and then restore it to the previous value. | |
| 224 logging::SetLogMessageHandler(NULL); | |
| 225 } | |
| 226 | |
| 227 private: | |
| 228 static bool LogMessageIgnorer(int severity, const char* file, int line, | |
| 229 size_t message_start, const std::string& str) { | |
| 230 // Intercept FATAL, strip the stack backtrace, and log it without | |
| 231 // the crash part. | |
| 232 if (severity == logging::LOG_FATAL) { | |
| 233 size_t newline = str.find('\n'); | |
| 234 if (newline != std::string::npos) { | |
| 235 const std::string msg = str.substr(0, newline + 1); | |
| 236 fprintf(stderr, "%s", msg.c_str()); | |
| 237 fflush(stderr); | |
| 238 } | |
| 239 return true; | |
| 240 } | |
| 241 | |
| 242 return false; | |
| 243 } | |
| 244 }; | |
| 245 | |
| 246 } // namespace | 213 } // namespace |
| 247 | 214 |
| 248 class SafeBrowsingDatabaseTest : public PlatformTest { | 215 class SafeBrowsingDatabaseTest : public PlatformTest { |
| 249 public: | 216 public: |
| 250 SafeBrowsingDatabaseTest() : task_runner_(new base::TestSimpleTaskRunner) {} | 217 SafeBrowsingDatabaseTest() : task_runner_(new base::TestSimpleTaskRunner) {} |
| 251 | 218 |
| 252 void SetUp() override { | 219 void SetUp() override { |
| 253 PlatformTest::SetUp(); | 220 PlatformTest::SetUp(); |
| 254 | 221 |
| 255 // Setup a database in a temporary directory. | 222 // Setup a database in a temporary directory. |
| (...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1165 kCacheLifetime); | 1132 kCacheLifetime); |
| 1166 } | 1133 } |
| 1167 | 1134 |
| 1168 // The cached response means the collision no longer causes a hit. | 1135 // The cached response means the collision no longer causes a hit. |
| 1169 EXPECT_FALSE(database_->ContainsBrowseUrl( | 1136 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 1170 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); | 1137 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); |
| 1171 } | 1138 } |
| 1172 | 1139 |
| 1173 // Test that corrupt databases are appropriately handled, even if the | 1140 // Test that corrupt databases are appropriately handled, even if the |
| 1174 // corruption is detected in the midst of the update. | 1141 // corruption is detected in the midst of the update. |
| 1175 // TODO(shess): Disabled until ScopedLogMessageIgnorer resolved. | 1142 // TODO(shess): Disabled until DCHECK killing is resolved. |
| 1176 // http://crbug.com/56448 | 1143 // http://crbug.com/56448 |
| 1177 TEST_F(SafeBrowsingDatabaseTest, DISABLED_FileCorruptionHandling) { | 1144 TEST_F(SafeBrowsingDatabaseTest, DISABLED_FileCorruptionHandling) { |
| 1178 // Re-create the database in a captive message loop so that we can | 1145 // Re-create the database in a captive message loop so that we can |
| 1179 // influence task-posting. Database specifically needs to the | 1146 // influence task-posting. Database specifically needs to the |
| 1180 // file-backed. | 1147 // file-backed. |
| 1181 database_.reset(); | 1148 database_.reset(); |
| 1182 base::MessageLoop loop; | 1149 base::MessageLoop loop; |
| 1183 SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile(task_runner_); | 1150 SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile(task_runner_); |
| 1184 database_.reset(new SafeBrowsingDatabaseNew( | 1151 database_.reset(new SafeBrowsingDatabaseNew( |
| 1185 task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)); | 1152 task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1200 // until the entire table is read in |UpdateFinished()|. | 1167 // until the entire table is read in |UpdateFinished()|. |
| 1201 FILE* fp = base::OpenFile(database_filename_, "r+"); | 1168 FILE* fp = base::OpenFile(database_filename_, "r+"); |
| 1202 ASSERT_TRUE(fp); | 1169 ASSERT_TRUE(fp); |
| 1203 ASSERT_NE(-1, fseek(fp, -8, SEEK_END)); | 1170 ASSERT_NE(-1, fseek(fp, -8, SEEK_END)); |
| 1204 for (size_t i = 0; i < 8; ++i) { | 1171 for (size_t i = 0; i < 8; ++i) { |
| 1205 fputc('!', fp); | 1172 fputc('!', fp); |
| 1206 } | 1173 } |
| 1207 fclose(fp); | 1174 fclose(fp); |
| 1208 | 1175 |
| 1209 { | 1176 { |
| 1210 // The following code will cause DCHECKs, so suppress the crashes. | 1177 // The following code will cause DCHECKs. |
| 1211 ScopedLogMessageIgnorer ignorer; | 1178 // There's no way to prevent DCHECK from killing tests. |
| 1179 // TODO(shess): Pawel disputes the use of using (removed) LogMessageHandler |
| 1180 // to hijack the message, so this test is DISABLED. http://crbug.com/56448 |
| 1212 | 1181 |
| 1213 // Start an update. The insert will fail due to corruption. | 1182 // Start an update. The insert will fail due to corruption. |
| 1214 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1183 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1215 database_->InsertChunks(kMalwareList, chunks); | 1184 database_->InsertChunks(kMalwareList, chunks); |
| 1216 database_->UpdateFinished(true); | 1185 database_->UpdateFinished(true); |
| 1217 | 1186 |
| 1218 // Database file still exists until the corruption handler has run. | 1187 // Database file still exists until the corruption handler has run. |
| 1219 EXPECT_TRUE(base::PathExists(database_filename_)); | 1188 EXPECT_TRUE(base::PathExists(database_filename_)); |
| 1220 | 1189 |
| 1221 // Flush through the corruption-handler task. | 1190 // Flush through the corruption-handler task. |
| (...skipping 1146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2368 ASSERT_EQ(1U, prefix_hits.size()); | 2337 ASSERT_EQ(1U, prefix_hits.size()); |
| 2369 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); | 2338 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); |
| 2370 EXPECT_TRUE(cache_hits.empty()); | 2339 EXPECT_TRUE(cache_hits.empty()); |
| 2371 | 2340 |
| 2372 // This prefix collides, but no full hash match. | 2341 // This prefix collides, but no full hash match. |
| 2373 EXPECT_FALSE(database_->ContainsBrowseUrl( | 2342 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 2374 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); | 2343 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); |
| 2375 } | 2344 } |
| 2376 | 2345 |
| 2377 } // namespace safe_browsing | 2346 } // namespace safe_browsing |
| OLD | NEW |