| 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 #include "ui/base/resource/data_pack.h" | 5 #include "ui/base/resource/data_pack.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/files/file.h" | 12 #include "base/files/file.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 15 #include "base/files/scoped_temp_dir.h" | 15 #include "base/files/scoped_temp_dir.h" |
| 16 #include "base/path_service.h" | 16 #include "base/path_service.h" |
| 17 #include "base/strings/string_piece.h" | 17 #include "base/strings/string_piece.h" |
| 18 #include "build/build_config.h" | 18 #include "build/build_config.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "ui/base/resource/data_pack_literal.h" |
| 20 #include "ui/base/ui_base_paths.h" | 21 #include "ui/base/ui_base_paths.h" |
| 21 | 22 |
| 22 namespace ui { | 23 namespace ui { |
| 23 | 24 |
| 24 class DataPackTest | 25 class DataPackTest |
| 25 : public testing::TestWithParam<DataPack::TextEncodingType> { | 26 : public testing::TestWithParam<DataPack::TextEncodingType> { |
| 26 public: | 27 public: |
| 27 DataPackTest() {} | 28 DataPackTest() {} |
| 28 }; | 29 }; |
| 29 | 30 |
| 30 extern const char kSamplePakContents[]; | |
| 31 extern const char kSampleCorruptPakContents[]; | |
| 32 extern const size_t kSamplePakSize; | |
| 33 extern const size_t kSampleCorruptPakSize; | |
| 34 | |
| 35 TEST(DataPackTest, LoadFromPath) { | 31 TEST(DataPackTest, LoadFromPath) { |
| 36 base::ScopedTempDir dir; | 32 base::ScopedTempDir dir; |
| 37 ASSERT_TRUE(dir.CreateUniqueTempDir()); | 33 ASSERT_TRUE(dir.CreateUniqueTempDir()); |
| 38 base::FilePath data_path = | 34 base::FilePath data_path = |
| 39 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); | 35 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); |
| 40 | 36 |
| 41 // Dump contents into the pak file. | 37 // Dump contents into the pak file. |
| 42 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContents, kSamplePakSize), | 38 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContentsV4, kSamplePakSizeV4), |
| 43 static_cast<int>(kSamplePakSize)); | 39 static_cast<int>(kSamplePakSizeV4)); |
| 44 | 40 |
| 45 // Load the file through the data pack API. | 41 // Load the file through the data pack API. |
| 46 DataPack pack(SCALE_FACTOR_100P); | 42 DataPack pack(SCALE_FACTOR_100P); |
| 47 ASSERT_TRUE(pack.LoadFromPath(data_path)); | 43 ASSERT_TRUE(pack.LoadFromPath(data_path)); |
| 48 | 44 |
| 49 base::StringPiece data; | 45 base::StringPiece data; |
| 50 ASSERT_TRUE(pack.HasResource(4)); | 46 ASSERT_TRUE(pack.HasResource(4)); |
| 51 ASSERT_TRUE(pack.GetStringPiece(4, &data)); | 47 ASSERT_TRUE(pack.GetStringPiece(4, &data)); |
| 52 EXPECT_EQ("this is id 4", data); | 48 EXPECT_EQ("this is id 4", data); |
| 53 ASSERT_TRUE(pack.HasResource(6)); | 49 ASSERT_TRUE(pack.HasResource(6)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 65 ASSERT_FALSE(pack.GetStringPiece(140, &data)); | 61 ASSERT_FALSE(pack.GetStringPiece(140, &data)); |
| 66 } | 62 } |
| 67 | 63 |
| 68 TEST(DataPackTest, LoadFromFile) { | 64 TEST(DataPackTest, LoadFromFile) { |
| 69 base::ScopedTempDir dir; | 65 base::ScopedTempDir dir; |
| 70 ASSERT_TRUE(dir.CreateUniqueTempDir()); | 66 ASSERT_TRUE(dir.CreateUniqueTempDir()); |
| 71 base::FilePath data_path = | 67 base::FilePath data_path = |
| 72 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); | 68 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); |
| 73 | 69 |
| 74 // Dump contents into the pak file. | 70 // Dump contents into the pak file. |
| 75 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContents, kSamplePakSize), | 71 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContentsV4, kSamplePakSizeV4), |
| 76 static_cast<int>(kSamplePakSize)); | 72 static_cast<int>(kSamplePakSizeV4)); |
| 77 | 73 |
| 78 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ); | 74 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ); |
| 79 ASSERT_TRUE(file.IsValid()); | 75 ASSERT_TRUE(file.IsValid()); |
| 80 | 76 |
| 81 // Load the file through the data pack API. | 77 // Load the file through the data pack API. |
| 82 DataPack pack(SCALE_FACTOR_100P); | 78 DataPack pack(SCALE_FACTOR_100P); |
| 83 ASSERT_TRUE(pack.LoadFromFile(std::move(file))); | 79 ASSERT_TRUE(pack.LoadFromFile(std::move(file))); |
| 84 | 80 |
| 85 base::StringPiece data; | 81 base::StringPiece data; |
| 86 ASSERT_TRUE(pack.HasResource(4)); | 82 ASSERT_TRUE(pack.HasResource(4)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 105 base::ScopedTempDir dir; | 101 base::ScopedTempDir dir; |
| 106 ASSERT_TRUE(dir.CreateUniqueTempDir()); | 102 ASSERT_TRUE(dir.CreateUniqueTempDir()); |
| 107 base::FilePath data_path = | 103 base::FilePath data_path = |
| 108 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); | 104 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); |
| 109 | 105 |
| 110 // Construct a file which has a non page-aligned zero-filled header followed | 106 // Construct a file which has a non page-aligned zero-filled header followed |
| 111 // by the actual pak file content. | 107 // by the actual pak file content. |
| 112 const char kPadding[5678] = {0}; | 108 const char kPadding[5678] = {0}; |
| 113 ASSERT_EQ(static_cast<int>(sizeof(kPadding)), | 109 ASSERT_EQ(static_cast<int>(sizeof(kPadding)), |
| 114 base::WriteFile(data_path, kPadding, sizeof(kPadding))); | 110 base::WriteFile(data_path, kPadding, sizeof(kPadding))); |
| 115 ASSERT_TRUE(base::AppendToFile( | 111 ASSERT_TRUE( |
| 116 data_path, kSamplePakContents, kSamplePakSize)); | 112 base::AppendToFile(data_path, kSamplePakContentsV4, kSamplePakSizeV4)); |
| 117 | 113 |
| 118 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ); | 114 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ); |
| 119 ASSERT_TRUE(file.IsValid()); | 115 ASSERT_TRUE(file.IsValid()); |
| 120 | 116 |
| 121 // Load the file through the data pack API. | 117 // Load the file through the data pack API. |
| 122 DataPack pack(SCALE_FACTOR_100P); | 118 DataPack pack(SCALE_FACTOR_100P); |
| 123 base::MemoryMappedFile::Region region = {sizeof(kPadding), kSamplePakSize}; | 119 base::MemoryMappedFile::Region region = {sizeof(kPadding), kSamplePakSizeV4}; |
| 124 ASSERT_TRUE(pack.LoadFromFileRegion(std::move(file), region)); | 120 ASSERT_TRUE(pack.LoadFromFileRegion(std::move(file), region)); |
| 125 | 121 |
| 126 base::StringPiece data; | 122 base::StringPiece data; |
| 127 ASSERT_TRUE(pack.HasResource(4)); | 123 ASSERT_TRUE(pack.HasResource(4)); |
| 128 ASSERT_TRUE(pack.GetStringPiece(4, &data)); | 124 ASSERT_TRUE(pack.GetStringPiece(4, &data)); |
| 129 EXPECT_EQ("this is id 4", data); | 125 EXPECT_EQ("this is id 4", data); |
| 130 ASSERT_TRUE(pack.HasResource(6)); | 126 ASSERT_TRUE(pack.HasResource(6)); |
| 131 ASSERT_TRUE(pack.GetStringPiece(6, &data)); | 127 ASSERT_TRUE(pack.GetStringPiece(6, &data)); |
| 132 EXPECT_EQ("this is id 6", data); | 128 EXPECT_EQ("this is id 6", data); |
| 133 | 129 |
| 134 // Try reading zero-length data blobs, just in case. | 130 // Try reading zero-length data blobs, just in case. |
| 135 ASSERT_TRUE(pack.GetStringPiece(1, &data)); | 131 ASSERT_TRUE(pack.GetStringPiece(1, &data)); |
| 136 EXPECT_EQ(0U, data.length()); | 132 EXPECT_EQ(0U, data.length()); |
| 137 ASSERT_TRUE(pack.GetStringPiece(10, &data)); | 133 ASSERT_TRUE(pack.GetStringPiece(10, &data)); |
| 138 EXPECT_EQ(0U, data.length()); | 134 EXPECT_EQ(0U, data.length()); |
| 139 | 135 |
| 140 // Try looking up an invalid key. | 136 // Try looking up an invalid key. |
| 141 ASSERT_FALSE(pack.HasResource(140)); | 137 ASSERT_FALSE(pack.HasResource(140)); |
| 142 ASSERT_FALSE(pack.GetStringPiece(140, &data)); | 138 ASSERT_FALSE(pack.GetStringPiece(140, &data)); |
| 143 } | 139 } |
| 144 | 140 |
| 145 TEST(DataPackTest, LoadFromBuffer) { | 141 TEST(DataPackTest, LoadFromBufferV4) { |
| 146 DataPack pack(SCALE_FACTOR_100P); | 142 DataPack pack(SCALE_FACTOR_100P); |
| 147 | 143 |
| 148 ASSERT_TRUE(pack.LoadFromBuffer( | 144 ASSERT_TRUE(pack.LoadFromBuffer( |
| 149 base::StringPiece(kSamplePakContents, kSamplePakSize))); | 145 base::StringPiece(kSamplePakContentsV4, kSamplePakSizeV4))); |
| 150 | 146 |
| 151 base::StringPiece data; | 147 base::StringPiece data; |
| 152 ASSERT_TRUE(pack.HasResource(4)); | 148 ASSERT_TRUE(pack.HasResource(4)); |
| 153 ASSERT_TRUE(pack.GetStringPiece(4, &data)); | 149 ASSERT_TRUE(pack.GetStringPiece(4, &data)); |
| 154 EXPECT_EQ("this is id 4", data); | 150 EXPECT_EQ("this is id 4", data); |
| 155 ASSERT_TRUE(pack.HasResource(6)); | 151 ASSERT_TRUE(pack.HasResource(6)); |
| 156 ASSERT_TRUE(pack.GetStringPiece(6, &data)); | 152 ASSERT_TRUE(pack.GetStringPiece(6, &data)); |
| 157 EXPECT_EQ("this is id 6", data); | 153 EXPECT_EQ("this is id 6", data); |
| 158 | 154 |
| 159 // Try reading zero-length data blobs, just in case. | 155 // Try reading zero-length data blobs, just in case. |
| 160 ASSERT_TRUE(pack.GetStringPiece(1, &data)); | 156 ASSERT_TRUE(pack.GetStringPiece(1, &data)); |
| 161 EXPECT_EQ(0U, data.length()); | 157 EXPECT_EQ(0U, data.length()); |
| 162 ASSERT_TRUE(pack.GetStringPiece(10, &data)); | 158 ASSERT_TRUE(pack.GetStringPiece(10, &data)); |
| 163 EXPECT_EQ(0U, data.length()); | 159 EXPECT_EQ(0U, data.length()); |
| 164 | 160 |
| 165 // Try looking up an invalid key. | 161 // Try looking up an invalid key. |
| 166 ASSERT_FALSE(pack.HasResource(140)); | 162 ASSERT_FALSE(pack.HasResource(140)); |
| 163 ASSERT_FALSE(pack.GetStringPiece(140, &data)); |
| 164 } |
| 165 |
| 166 TEST(DataPackTest, LoadFromBufferV5) { |
| 167 DataPack pack(SCALE_FACTOR_100P); |
| 168 |
| 169 ASSERT_TRUE(pack.LoadFromBuffer( |
| 170 base::StringPiece(kSamplePakContentsV5, kSamplePakSizeV5))); |
| 171 |
| 172 base::StringPiece data; |
| 173 ASSERT_TRUE(pack.HasResource(4)); |
| 174 ASSERT_TRUE(pack.GetStringPiece(4, &data)); |
| 175 EXPECT_EQ("this is id 4", data); |
| 176 ASSERT_TRUE(pack.HasResource(6)); |
| 177 ASSERT_TRUE(pack.GetStringPiece(6, &data)); |
| 178 EXPECT_EQ("this is id 6", data); |
| 179 |
| 180 // Try reading zero-length data blobs, just in case. |
| 181 ASSERT_TRUE(pack.GetStringPiece(1, &data)); |
| 182 EXPECT_EQ(0U, data.length()); |
| 183 ASSERT_TRUE(pack.GetStringPiece(10, &data)); |
| 184 EXPECT_EQ("this is id 4", data); |
| 185 |
| 186 // Try looking up an invalid key. |
| 187 ASSERT_FALSE(pack.HasResource(140)); |
| 167 ASSERT_FALSE(pack.GetStringPiece(140, &data)); | 188 ASSERT_FALSE(pack.GetStringPiece(140, &data)); |
| 168 } | 189 } |
| 169 | 190 |
| 170 INSTANTIATE_TEST_CASE_P(WriteBINARY, DataPackTest, ::testing::Values( | 191 INSTANTIATE_TEST_CASE_P(WriteBINARY, DataPackTest, ::testing::Values( |
| 171 DataPack::BINARY)); | 192 DataPack::BINARY)); |
| 172 INSTANTIATE_TEST_CASE_P(WriteUTF8, DataPackTest, ::testing::Values( | 193 INSTANTIATE_TEST_CASE_P(WriteUTF8, DataPackTest, ::testing::Values( |
| 173 DataPack::UTF8)); | 194 DataPack::UTF8)); |
| 174 INSTANTIATE_TEST_CASE_P(WriteUTF16, DataPackTest, ::testing::Values( | 195 INSTANTIATE_TEST_CASE_P(WriteUTF16, DataPackTest, ::testing::Values( |
| 175 DataPack::UTF16)); | 196 DataPack::UTF16)); |
| 176 | 197 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 } | 242 } |
| 222 | 243 |
| 223 #if defined(OS_POSIX) | 244 #if defined(OS_POSIX) |
| 224 TEST(DataPackTest, ModifiedWhileUsed) { | 245 TEST(DataPackTest, ModifiedWhileUsed) { |
| 225 base::ScopedTempDir dir; | 246 base::ScopedTempDir dir; |
| 226 ASSERT_TRUE(dir.CreateUniqueTempDir()); | 247 ASSERT_TRUE(dir.CreateUniqueTempDir()); |
| 227 base::FilePath data_path = | 248 base::FilePath data_path = |
| 228 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); | 249 dir.GetPath().Append(FILE_PATH_LITERAL("sample.pak")); |
| 229 | 250 |
| 230 // Dump contents into the pak file. | 251 // Dump contents into the pak file. |
| 231 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContents, kSamplePakSize), | 252 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContentsV4, kSamplePakSizeV4), |
| 232 static_cast<int>(kSamplePakSize)); | 253 static_cast<int>(kSamplePakSizeV4)); |
| 233 | 254 |
| 234 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ); | 255 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ); |
| 235 ASSERT_TRUE(file.IsValid()); | 256 ASSERT_TRUE(file.IsValid()); |
| 236 | 257 |
| 237 // Load the file through the data pack API. | 258 // Load the file through the data pack API. |
| 238 DataPack pack(SCALE_FACTOR_100P); | 259 DataPack pack(SCALE_FACTOR_100P); |
| 239 ASSERT_TRUE(pack.LoadFromFile(std::move(file))); | 260 ASSERT_TRUE(pack.LoadFromFile(std::move(file))); |
| 240 | 261 |
| 241 base::StringPiece data; | 262 base::StringPiece data; |
| 242 ASSERT_TRUE(pack.HasResource(10)); | 263 ASSERT_TRUE(pack.HasResource(10)); |
| 243 ASSERT_TRUE(pack.GetStringPiece(10, &data)); | 264 ASSERT_TRUE(pack.GetStringPiece(10, &data)); |
| 244 | 265 |
| 245 ASSERT_EQ(base::WriteFile(data_path, kSampleCorruptPakContents, | 266 ASSERT_EQ(base::WriteFile(data_path, kSampleCorruptPakContents, |
| 246 kSampleCorruptPakSize), | 267 kSampleCorruptPakSize), |
| 247 static_cast<int>(kSampleCorruptPakSize)); | 268 static_cast<int>(kSampleCorruptPakSize)); |
| 248 | 269 |
| 249 // Reading asset #10 should now fail as it extends past the end of the file. | 270 // Reading asset #10 should now fail as it extends past the end of the file. |
| 250 ASSERT_TRUE(pack.HasResource(10)); | 271 ASSERT_TRUE(pack.HasResource(10)); |
| 251 ASSERT_FALSE(pack.GetStringPiece(10, &data)); | 272 ASSERT_FALSE(pack.GetStringPiece(10, &data)); |
| 252 } | 273 } |
| 253 #endif | 274 #endif |
| 254 | 275 |
| 255 } // namespace ui | 276 } // namespace ui |
| OLD | NEW |