OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/files/file_util.h" |
| 6 #include "base/files/scoped_temp_dir.h" |
| 7 #include "base/run_loop.h" |
| 8 #include "base/test/test_simple_task_runner.h" |
| 9 #include "base/time/time.h" |
| 10 #include "components/safe_browsing_db/v4_store.h" |
| 11 #include "components/safe_browsing_db/v4_store.pb.h" |
| 12 #include "content/public/test/test_browser_thread_bundle.h" |
| 13 #include "testing/platform_test.h" |
| 14 |
| 15 namespace safe_browsing { |
| 16 |
| 17 class V4StoreTest : public PlatformTest { |
| 18 public: |
| 19 V4StoreTest() : task_runner_(new base::TestSimpleTaskRunner) {} |
| 20 |
| 21 void SetUp() override { |
| 22 PlatformTest::SetUp(); |
| 23 |
| 24 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 25 store_path_ = temp_dir_.path().AppendASCII("V4StoreTest.store"); |
| 26 DVLOG(1) << "store_path_: " << store_path_.value(); |
| 27 } |
| 28 |
| 29 void TearDown() override { |
| 30 base::DeleteFile(store_path_, false); |
| 31 PlatformTest::TearDown(); |
| 32 } |
| 33 |
| 34 void WriteFileFormatProtoToFile(uint32_t magic, |
| 35 uint32_t version = 0, |
| 36 ListUpdateResponse* response = nullptr) { |
| 37 V4StoreFileFormat file_format; |
| 38 file_format.set_magic_number(magic); |
| 39 file_format.set_version_number(version); |
| 40 if (response != nullptr) { |
| 41 ListUpdateResponse* list_update_response = |
| 42 file_format.mutable_list_update_response(); |
| 43 *list_update_response = *response; |
| 44 } |
| 45 |
| 46 std::string file_format_string; |
| 47 file_format.SerializeToString(&file_format_string); |
| 48 base::WriteFile(store_path_, file_format_string.data(), |
| 49 file_format_string.size()); |
| 50 } |
| 51 |
| 52 base::ScopedTempDir temp_dir_; |
| 53 base::FilePath store_path_; |
| 54 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 55 content::TestBrowserThreadBundle thread_bundle_; |
| 56 }; |
| 57 |
| 58 TEST_F(V4StoreTest, TestReadFromEmptyFile) { |
| 59 base::CloseFile(base::OpenFile(store_path_, "wb+")); |
| 60 |
| 61 EXPECT_EQ(FILE_EMPTY_FAILURE, |
| 62 V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 63 } |
| 64 |
| 65 TEST_F(V4StoreTest, TestReadFromAbsentFile) { |
| 66 EXPECT_EQ(FILE_UNREADABLE_FAILURE, |
| 67 V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 68 } |
| 69 |
| 70 TEST_F(V4StoreTest, TestReadFromInvalidContentsFile) { |
| 71 const char kInvalidContents[] = "Chromium"; |
| 72 base::WriteFile(store_path_, kInvalidContents, strlen(kInvalidContents)); |
| 73 EXPECT_EQ(PROTO_PARSING_FAILURE, |
| 74 V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 75 } |
| 76 |
| 77 TEST_F(V4StoreTest, TestReadFromFileWithUnknownProto) { |
| 78 Checksum checksum; |
| 79 checksum.set_sha256("checksum"); |
| 80 std::string checksum_string; |
| 81 checksum.SerializeToString(&checksum_string); |
| 82 base::WriteFile(store_path_, checksum_string.data(), checksum_string.size()); |
| 83 |
| 84 // Even though we wrote a completely different proto to file, the proto |
| 85 // parsing method does not fail. This shows the importance of a magic number. |
| 86 EXPECT_EQ(UNEXPECTED_MAGIC_NUMBER_FAILURE, |
| 87 V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 88 } |
| 89 |
| 90 TEST_F(V4StoreTest, TestReadFromUnexpectedMagicFile) { |
| 91 WriteFileFormatProtoToFile(111); |
| 92 EXPECT_EQ(UNEXPECTED_MAGIC_NUMBER_FAILURE, |
| 93 V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 94 } |
| 95 |
| 96 TEST_F(V4StoreTest, TestReadFromLowVersionFile) { |
| 97 WriteFileFormatProtoToFile(0x600D71FE, 2); |
| 98 EXPECT_EQ(FILE_VERSION_INCOMPATIBLE_FAILURE, |
| 99 V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 100 } |
| 101 |
| 102 TEST_F(V4StoreTest, TestReadFromNoHashPrefixInfoFile) { |
| 103 WriteFileFormatProtoToFile(0x600D71FE, 9); |
| 104 EXPECT_EQ(HASH_PREFIX_INFO_MISSING_FAILURE, |
| 105 V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 106 } |
| 107 |
| 108 TEST_F(V4StoreTest, TestReadFromNoHashPrefixesFile) { |
| 109 ListUpdateResponse list_update_response; |
| 110 list_update_response.set_platform_type(LINUX_PLATFORM); |
| 111 WriteFileFormatProtoToFile(0x600D71FE, 9, &list_update_response); |
| 112 EXPECT_EQ(READ_SUCCESS, V4Store(task_runner_, store_path_).ReadFromDisk()); |
| 113 } |
| 114 |
| 115 TEST_F(V4StoreTest, TestWriteNoResponseType) { |
| 116 ListUpdateResponse list_update_response; |
| 117 EXPECT_EQ( |
| 118 INVALID_RESPONSE_TYPE_FAILURE, |
| 119 V4Store(task_runner_, store_path_).WriteToDisk(list_update_response)); |
| 120 } |
| 121 |
| 122 TEST_F(V4StoreTest, TestWritePartialResponseType) { |
| 123 ListUpdateResponse list_update_response; |
| 124 list_update_response.set_response_type(ListUpdateResponse::PARTIAL_UPDATE); |
| 125 EXPECT_EQ( |
| 126 INVALID_RESPONSE_TYPE_FAILURE, |
| 127 V4Store(task_runner_, store_path_).WriteToDisk(list_update_response)); |
| 128 } |
| 129 |
| 130 TEST_F(V4StoreTest, TestWriteFullResponseType) { |
| 131 ListUpdateResponse list_update_response; |
| 132 list_update_response.set_response_type(ListUpdateResponse::FULL_UPDATE); |
| 133 list_update_response.set_new_client_state("test_client_state"); |
| 134 V4Store* write_store = new V4Store(task_runner_, store_path_); |
| 135 EXPECT_EQ(WRITE_SUCCESS, write_store->WriteToDisk(list_update_response)); |
| 136 |
| 137 V4Store* read_store = new V4Store(task_runner_, store_path_); |
| 138 EXPECT_EQ(READ_SUCCESS, read_store->ReadFromDisk()); |
| 139 EXPECT_EQ("test_client_state", read_store->state_); |
| 140 } |
| 141 |
| 142 } // namespace safe_browsing |
OLD | NEW |