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
3 // found in the LICENSE file.
5 #include "base/file_util.h"
6 #include "base/files/file.h"
7 #include "base/files/file_path.h"
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/path_service.h"
10 #include "base/strings/string_piece.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/base/resource/data_pack.h"
17 : public testing::TestWithParam
<DataPack::TextEncodingType
> {
22 extern const char kSamplePakContents
[];
23 extern const size_t kSamplePakSize
;
25 TEST(DataPackTest
, LoadFromPath
) {
26 base::ScopedTempDir dir
;
27 ASSERT_TRUE(dir
.CreateUniqueTempDir());
28 base::FilePath data_path
= dir
.path().Append(FILE_PATH_LITERAL("sample.pak"));
30 // Dump contents into the pak file.
31 ASSERT_EQ(file_util::WriteFile(data_path
, kSamplePakContents
, kSamplePakSize
),
32 static_cast<int>(kSamplePakSize
));
34 // Load the file through the data pack API.
35 DataPack
pack(SCALE_FACTOR_100P
);
36 ASSERT_TRUE(pack
.LoadFromPath(data_path
));
38 base::StringPiece data
;
39 ASSERT_TRUE(pack
.HasResource(4));
40 ASSERT_TRUE(pack
.GetStringPiece(4, &data
));
41 EXPECT_EQ("this is id 4", data
);
42 ASSERT_TRUE(pack
.HasResource(6));
43 ASSERT_TRUE(pack
.GetStringPiece(6, &data
));
44 EXPECT_EQ("this is id 6", data
);
46 // Try reading zero-length data blobs, just in case.
47 ASSERT_TRUE(pack
.GetStringPiece(1, &data
));
48 EXPECT_EQ(0U, data
.length());
49 ASSERT_TRUE(pack
.GetStringPiece(10, &data
));
50 EXPECT_EQ(0U, data
.length());
52 // Try looking up an invalid key.
53 ASSERT_FALSE(pack
.HasResource(140));
54 ASSERT_FALSE(pack
.GetStringPiece(140, &data
));
57 TEST(DataPackTest
, LoadFromFile
) {
58 base::ScopedTempDir dir
;
59 ASSERT_TRUE(dir
.CreateUniqueTempDir());
60 base::FilePath data_path
= dir
.path().Append(FILE_PATH_LITERAL("sample.pak"));
62 // Dump contents into the pak file.
63 ASSERT_EQ(file_util::WriteFile(data_path
, kSamplePakContents
, kSamplePakSize
),
64 static_cast<int>(kSamplePakSize
));
66 base::File
file(data_path
, base::File::FLAG_OPEN
| base::File::FLAG_READ
);
67 ASSERT_TRUE(file
.IsValid());
69 // Load the file through the data pack API.
70 DataPack
pack(SCALE_FACTOR_100P
);
71 ASSERT_TRUE(pack
.LoadFromFile(file
.Pass()));
73 base::StringPiece data
;
74 ASSERT_TRUE(pack
.HasResource(4));
75 ASSERT_TRUE(pack
.GetStringPiece(4, &data
));
76 EXPECT_EQ("this is id 4", data
);
77 ASSERT_TRUE(pack
.HasResource(6));
78 ASSERT_TRUE(pack
.GetStringPiece(6, &data
));
79 EXPECT_EQ("this is id 6", data
);
81 // Try reading zero-length data blobs, just in case.
82 ASSERT_TRUE(pack
.GetStringPiece(1, &data
));
83 EXPECT_EQ(0U, data
.length());
84 ASSERT_TRUE(pack
.GetStringPiece(10, &data
));
85 EXPECT_EQ(0U, data
.length());
87 // Try looking up an invalid key.
88 ASSERT_FALSE(pack
.HasResource(140));
89 ASSERT_FALSE(pack
.GetStringPiece(140, &data
));
92 INSTANTIATE_TEST_CASE_P(WriteBINARY
, DataPackTest
, ::testing::Values(
94 INSTANTIATE_TEST_CASE_P(WriteUTF8
, DataPackTest
, ::testing::Values(
96 INSTANTIATE_TEST_CASE_P(WriteUTF16
, DataPackTest
, ::testing::Values(
99 TEST(DataPackTest
, LoadFileWithTruncatedHeader
) {
100 base::FilePath data_path
;
101 PathService::Get(base::DIR_SOURCE_ROOT
, &data_path
);
102 data_path
= data_path
.Append(FILE_PATH_LITERAL(
103 "ui/base/test/data/data_pack_unittest/truncated-header.pak"));
105 DataPack
pack(SCALE_FACTOR_100P
);
106 ASSERT_FALSE(pack
.LoadFromPath(data_path
));
109 TEST_P(DataPackTest
, Write
) {
110 base::ScopedTempDir dir
;
111 ASSERT_TRUE(dir
.CreateUniqueTempDir());
112 base::FilePath file
= dir
.path().Append(FILE_PATH_LITERAL("data.pak"));
114 std::string
one("one");
115 std::string
two("two");
116 std::string
three("three");
117 std::string
four("four");
118 std::string
fifteen("fifteen");
120 std::map
<uint16
, base::StringPiece
> resources
;
121 resources
.insert(std::make_pair(1, base::StringPiece(one
)));
122 resources
.insert(std::make_pair(2, base::StringPiece(two
)));
123 resources
.insert(std::make_pair(15, base::StringPiece(fifteen
)));
124 resources
.insert(std::make_pair(3, base::StringPiece(three
)));
125 resources
.insert(std::make_pair(4, base::StringPiece(four
)));
126 ASSERT_TRUE(DataPack::WritePack(file
, resources
, GetParam()));
128 // Now try to read the data back in.
129 DataPack
pack(SCALE_FACTOR_100P
);
130 ASSERT_TRUE(pack
.LoadFromPath(file
));
131 EXPECT_EQ(pack
.GetTextEncodingType(), GetParam());
133 base::StringPiece data
;
134 ASSERT_TRUE(pack
.GetStringPiece(1, &data
));
135 EXPECT_EQ(one
, data
);
136 ASSERT_TRUE(pack
.GetStringPiece(2, &data
));
137 EXPECT_EQ(two
, data
);
138 ASSERT_TRUE(pack
.GetStringPiece(3, &data
));
139 EXPECT_EQ(three
, data
);
140 ASSERT_TRUE(pack
.GetStringPiece(4, &data
));
141 EXPECT_EQ(four
, data
);
142 ASSERT_TRUE(pack
.GetStringPiece(15, &data
));
143 EXPECT_EQ(fifteen
, data
);