blob: 4ab4faa1bb00da32fc7e1156b64d433b1ba14e63 [file] [log] [blame]
[email protected]63942f22012-05-01 06:11:521// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]9a9df872009-01-08 19:51:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]58ba3ea2014-01-03 22:14:155#include "base/files/file.h"
[email protected]57999812013-02-24 05:40:526#include "base/files/file_path.h"
thestig22dfc4012014-09-05 08:29:447#include "base/files/file_util.h"
[email protected]ea1a3f62012-11-16 20:34:238#include "base/files/scoped_temp_dir.h"
[email protected]9a9df872009-01-08 19:51:099#include "base/path_service.h"
[email protected]daf079a2013-04-17 21:42:4010#include "base/strings/string_piece.h"
[email protected]9a9df872009-01-08 19:51:0911#include "testing/gtest/include/gtest/gtest.h"
[email protected]42ce29d2011-01-20 23:19:4612#include "ui/base/resource/data_pack.h"
[email protected]447eca12014-05-16 05:25:0613#include "ui/base/ui_base_paths.h"
[email protected]9a9df872009-01-08 19:51:0914
[email protected]42ce29d2011-01-20 23:19:4615namespace ui {
[email protected]426d0392010-12-23 05:56:0516
[email protected]775870c2011-09-19 22:26:5117class DataPackTest
18 : public testing::TestWithParam<DataPack::TextEncodingType> {
19 public:
20 DataPackTest() {}
21};
22
[email protected]aae69652011-09-06 22:31:2823extern const char kSamplePakContents[];
[email protected]ff19b7b62014-05-28 19:20:4924extern const char kSampleCorruptPakContents[];
[email protected]aae69652011-09-06 22:31:2825extern const size_t kSamplePakSize;
[email protected]ff19b7b62014-05-28 19:20:4926extern const size_t kSampleCorruptPakSize;
[email protected]9a9df872009-01-08 19:51:0927
[email protected]6c26d9c2012-07-10 19:18:0428TEST(DataPackTest, LoadFromPath) {
[email protected]ea1a3f62012-11-16 20:34:2329 base::ScopedTempDir dir;
[email protected]aae69652011-09-06 22:31:2830 ASSERT_TRUE(dir.CreateUniqueTempDir());
[email protected]79f63882013-02-10 05:15:4531 base::FilePath data_path = dir.path().Append(FILE_PATH_LITERAL("sample.pak"));
[email protected]aae69652011-09-06 22:31:2832
33 // Dump contents into the pak file.
[email protected]e5c2a22e2014-03-06 20:42:3034 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContents, kSamplePakSize),
[email protected]aae69652011-09-06 22:31:2835 static_cast<int>(kSamplePakSize));
36
37 // Load the file through the data pack API.
[email protected]c49201a2012-05-24 11:04:5738 DataPack pack(SCALE_FACTOR_100P);
[email protected]6c26d9c2012-07-10 19:18:0439 ASSERT_TRUE(pack.LoadFromPath(data_path));
[email protected]9a9df872009-01-08 19:51:0940
[email protected]8a16266e2009-09-10 21:08:3941 base::StringPiece data;
[email protected]c49201a2012-05-24 11:04:5742 ASSERT_TRUE(pack.HasResource(4));
[email protected]d8fef522009-10-27 20:45:0843 ASSERT_TRUE(pack.GetStringPiece(4, &data));
[email protected]9a9df872009-01-08 19:51:0944 EXPECT_EQ("this is id 4", data);
[email protected]c49201a2012-05-24 11:04:5745 ASSERT_TRUE(pack.HasResource(6));
[email protected]d8fef522009-10-27 20:45:0846 ASSERT_TRUE(pack.GetStringPiece(6, &data));
[email protected]9a9df872009-01-08 19:51:0947 EXPECT_EQ("this is id 6", data);
48
49 // Try reading zero-length data blobs, just in case.
[email protected]d8fef522009-10-27 20:45:0850 ASSERT_TRUE(pack.GetStringPiece(1, &data));
[email protected]9a9df872009-01-08 19:51:0951 EXPECT_EQ(0U, data.length());
[email protected]d8fef522009-10-27 20:45:0852 ASSERT_TRUE(pack.GetStringPiece(10, &data));
[email protected]9a9df872009-01-08 19:51:0953 EXPECT_EQ(0U, data.length());
54
55 // Try looking up an invalid key.
[email protected]c49201a2012-05-24 11:04:5756 ASSERT_FALSE(pack.HasResource(140));
[email protected]d8fef522009-10-27 20:45:0857 ASSERT_FALSE(pack.GetStringPiece(140, &data));
[email protected]9a9df872009-01-08 19:51:0958}
[email protected]f017cc92009-12-14 20:48:0759
[email protected]6c26d9c2012-07-10 19:18:0460TEST(DataPackTest, LoadFromFile) {
[email protected]ea1a3f62012-11-16 20:34:2361 base::ScopedTempDir dir;
[email protected]6c26d9c2012-07-10 19:18:0462 ASSERT_TRUE(dir.CreateUniqueTempDir());
[email protected]79f63882013-02-10 05:15:4563 base::FilePath data_path = dir.path().Append(FILE_PATH_LITERAL("sample.pak"));
[email protected]6c26d9c2012-07-10 19:18:0464
65 // Dump contents into the pak file.
[email protected]e5c2a22e2014-03-06 20:42:3066 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContents, kSamplePakSize),
[email protected]6c26d9c2012-07-10 19:18:0467 static_cast<int>(kSamplePakSize));
68
[email protected]58ba3ea2014-01-03 22:14:1569 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
70 ASSERT_TRUE(file.IsValid());
[email protected]6c26d9c2012-07-10 19:18:0471
72 // Load the file through the data pack API.
73 DataPack pack(SCALE_FACTOR_100P);
[email protected]58ba3ea2014-01-03 22:14:1574 ASSERT_TRUE(pack.LoadFromFile(file.Pass()));
[email protected]6c26d9c2012-07-10 19:18:0475
76 base::StringPiece data;
77 ASSERT_TRUE(pack.HasResource(4));
78 ASSERT_TRUE(pack.GetStringPiece(4, &data));
79 EXPECT_EQ("this is id 4", data);
80 ASSERT_TRUE(pack.HasResource(6));
81 ASSERT_TRUE(pack.GetStringPiece(6, &data));
82 EXPECT_EQ("this is id 6", data);
83
84 // Try reading zero-length data blobs, just in case.
85 ASSERT_TRUE(pack.GetStringPiece(1, &data));
86 EXPECT_EQ(0U, data.length());
87 ASSERT_TRUE(pack.GetStringPiece(10, &data));
88 EXPECT_EQ(0U, data.length());
89
90 // Try looking up an invalid key.
91 ASSERT_FALSE(pack.HasResource(140));
92 ASSERT_FALSE(pack.GetStringPiece(140, &data));
[email protected]6c26d9c2012-07-10 19:18:0493}
94
[email protected]3fa9ff82014-07-28 17:57:4095TEST(DataPackTest, LoadFromFileRegion) {
96 base::ScopedTempDir dir;
97 ASSERT_TRUE(dir.CreateUniqueTempDir());
98 base::FilePath data_path = dir.path().Append(FILE_PATH_LITERAL("sample.pak"));
99
100 // Construct a file which has a non page-aligned zero-filled header followed
101 // by the actual pak file content.
102 const char kPadding[5678] = {0};
103 ASSERT_EQ(static_cast<int>(sizeof(kPadding)),
104 base::WriteFile(data_path, kPadding, sizeof(kPadding)));
chirantan75ea2fd2014-10-07 23:15:30105 ASSERT_TRUE(base::AppendToFile(
106 data_path, kSamplePakContents, kSamplePakSize));
[email protected]3fa9ff82014-07-28 17:57:40107
108 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
109 ASSERT_TRUE(file.IsValid());
110
111 // Load the file through the data pack API.
112 DataPack pack(SCALE_FACTOR_100P);
113 base::MemoryMappedFile::Region region(sizeof(kPadding), kSamplePakSize);
114 ASSERT_TRUE(pack.LoadFromFileRegion(file.Pass(), region));
115
116 base::StringPiece data;
117 ASSERT_TRUE(pack.HasResource(4));
118 ASSERT_TRUE(pack.GetStringPiece(4, &data));
119 EXPECT_EQ("this is id 4", data);
120 ASSERT_TRUE(pack.HasResource(6));
121 ASSERT_TRUE(pack.GetStringPiece(6, &data));
122 EXPECT_EQ("this is id 6", data);
123
124 // Try reading zero-length data blobs, just in case.
125 ASSERT_TRUE(pack.GetStringPiece(1, &data));
126 EXPECT_EQ(0U, data.length());
127 ASSERT_TRUE(pack.GetStringPiece(10, &data));
128 EXPECT_EQ(0U, data.length());
129
130 // Try looking up an invalid key.
131 ASSERT_FALSE(pack.HasResource(140));
132 ASSERT_FALSE(pack.GetStringPiece(140, &data));
133}
134
[email protected]775870c2011-09-19 22:26:51135INSTANTIATE_TEST_CASE_P(WriteBINARY, DataPackTest, ::testing::Values(
136 DataPack::BINARY));
137INSTANTIATE_TEST_CASE_P(WriteUTF8, DataPackTest, ::testing::Values(
138 DataPack::UTF8));
139INSTANTIATE_TEST_CASE_P(WriteUTF16, DataPackTest, ::testing::Values(
140 DataPack::UTF16));
141
[email protected]86d67adb2011-09-02 18:19:43142TEST(DataPackTest, LoadFileWithTruncatedHeader) {
[email protected]79f63882013-02-10 05:15:45143 base::FilePath data_path;
[email protected]6a27dd02014-05-28 23:38:52144 ASSERT_TRUE(PathService::Get(UI_DIR_TEST_DATA, &data_path));
[email protected]447eca12014-05-16 05:25:06145 data_path = data_path.AppendASCII("data_pack_unittest/truncated-header.pak");
[email protected]86d67adb2011-09-02 18:19:43146
[email protected]c49201a2012-05-24 11:04:57147 DataPack pack(SCALE_FACTOR_100P);
[email protected]6c26d9c2012-07-10 19:18:04148 ASSERT_FALSE(pack.LoadFromPath(data_path));
[email protected]86d67adb2011-09-02 18:19:43149}
150
[email protected]775870c2011-09-19 22:26:51151TEST_P(DataPackTest, Write) {
[email protected]ea1a3f62012-11-16 20:34:23152 base::ScopedTempDir dir;
[email protected]f017cc92009-12-14 20:48:07153 ASSERT_TRUE(dir.CreateUniqueTempDir());
[email protected]79f63882013-02-10 05:15:45154 base::FilePath file = dir.path().Append(FILE_PATH_LITERAL("data.pak"));
[email protected]f017cc92009-12-14 20:48:07155
156 std::string one("one");
157 std::string two("two");
158 std::string three("three");
159 std::string four("four");
160 std::string fifteen("fifteen");
161
[email protected]14bb3362011-08-04 20:57:44162 std::map<uint16, base::StringPiece> resources;
[email protected]f017cc92009-12-14 20:48:07163 resources.insert(std::make_pair(1, base::StringPiece(one)));
164 resources.insert(std::make_pair(2, base::StringPiece(two)));
165 resources.insert(std::make_pair(15, base::StringPiece(fifteen)));
166 resources.insert(std::make_pair(3, base::StringPiece(three)));
167 resources.insert(std::make_pair(4, base::StringPiece(four)));
[email protected]775870c2011-09-19 22:26:51168 ASSERT_TRUE(DataPack::WritePack(file, resources, GetParam()));
[email protected]f017cc92009-12-14 20:48:07169
170 // Now try to read the data back in.
[email protected]c49201a2012-05-24 11:04:57171 DataPack pack(SCALE_FACTOR_100P);
[email protected]6c26d9c2012-07-10 19:18:04172 ASSERT_TRUE(pack.LoadFromPath(file));
[email protected]775870c2011-09-19 22:26:51173 EXPECT_EQ(pack.GetTextEncodingType(), GetParam());
[email protected]f017cc92009-12-14 20:48:07174
175 base::StringPiece data;
176 ASSERT_TRUE(pack.GetStringPiece(1, &data));
177 EXPECT_EQ(one, data);
178 ASSERT_TRUE(pack.GetStringPiece(2, &data));
179 EXPECT_EQ(two, data);
180 ASSERT_TRUE(pack.GetStringPiece(3, &data));
181 EXPECT_EQ(three, data);
182 ASSERT_TRUE(pack.GetStringPiece(4, &data));
183 EXPECT_EQ(four, data);
184 ASSERT_TRUE(pack.GetStringPiece(15, &data));
185 EXPECT_EQ(fifteen, data);
186}
[email protected]426d0392010-12-23 05:56:05187
[email protected]ff19b7b62014-05-28 19:20:49188#if defined(OS_POSIX)
189TEST(DataPackTest, ModifiedWhileUsed) {
190 base::ScopedTempDir dir;
191 ASSERT_TRUE(dir.CreateUniqueTempDir());
192 base::FilePath data_path = dir.path().Append(FILE_PATH_LITERAL("sample.pak"));
193
194 // Dump contents into the pak file.
195 ASSERT_EQ(base::WriteFile(data_path, kSamplePakContents, kSamplePakSize),
196 static_cast<int>(kSamplePakSize));
197
198 base::File file(data_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
199 ASSERT_TRUE(file.IsValid());
200
201 // Load the file through the data pack API.
202 DataPack pack(SCALE_FACTOR_100P);
203 ASSERT_TRUE(pack.LoadFromFile(file.Pass()));
204
205 base::StringPiece data;
206 ASSERT_TRUE(pack.HasResource(10));
207 ASSERT_TRUE(pack.GetStringPiece(10, &data));
208
209 ASSERT_EQ(base::WriteFile(data_path, kSampleCorruptPakContents,
210 kSampleCorruptPakSize),
211 static_cast<int>(kSampleCorruptPakSize));
212
213 // Reading asset #10 should now fail as it extends past the end of the file.
214 ASSERT_TRUE(pack.HasResource(10));
215 ASSERT_FALSE(pack.GetStringPiece(10, &data));
216}
217#endif
218
[email protected]42ce29d2011-01-20 23:19:46219} // namespace ui