• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include "base/file_util.h"
6 #include "base/files/file_path.h"
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/path_service.h"
9 #include "base/strings/string_piece.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/base/resource/data_pack.h"
12 
13 namespace ui {
14 
15 class DataPackTest
16     : public testing::TestWithParam<DataPack::TextEncodingType> {
17  public:
DataPackTest()18   DataPackTest() {}
19 };
20 
21 extern const char kSamplePakContents[];
22 extern const size_t kSamplePakSize;
23 
TEST(DataPackTest,LoadFromPath)24 TEST(DataPackTest, LoadFromPath) {
25   base::ScopedTempDir dir;
26   ASSERT_TRUE(dir.CreateUniqueTempDir());
27   base::FilePath data_path = dir.path().Append(FILE_PATH_LITERAL("sample.pak"));
28 
29   // Dump contents into the pak file.
30   ASSERT_EQ(file_util::WriteFile(data_path, kSamplePakContents, kSamplePakSize),
31             static_cast<int>(kSamplePakSize));
32 
33   // Load the file through the data pack API.
34   DataPack pack(SCALE_FACTOR_100P);
35   ASSERT_TRUE(pack.LoadFromPath(data_path));
36 
37   base::StringPiece data;
38   ASSERT_TRUE(pack.HasResource(4));
39   ASSERT_TRUE(pack.GetStringPiece(4, &data));
40   EXPECT_EQ("this is id 4", data);
41   ASSERT_TRUE(pack.HasResource(6));
42   ASSERT_TRUE(pack.GetStringPiece(6, &data));
43   EXPECT_EQ("this is id 6", data);
44 
45   // Try reading zero-length data blobs, just in case.
46   ASSERT_TRUE(pack.GetStringPiece(1, &data));
47   EXPECT_EQ(0U, data.length());
48   ASSERT_TRUE(pack.GetStringPiece(10, &data));
49   EXPECT_EQ(0U, data.length());
50 
51   // Try looking up an invalid key.
52   ASSERT_FALSE(pack.HasResource(140));
53   ASSERT_FALSE(pack.GetStringPiece(140, &data));
54 }
55 
TEST(DataPackTest,LoadFromFile)56 TEST(DataPackTest, LoadFromFile) {
57   base::ScopedTempDir dir;
58   ASSERT_TRUE(dir.CreateUniqueTempDir());
59   base::FilePath data_path = dir.path().Append(FILE_PATH_LITERAL("sample.pak"));
60 
61   // Dump contents into the pak file.
62   ASSERT_EQ(file_util::WriteFile(data_path, kSamplePakContents, kSamplePakSize),
63             static_cast<int>(kSamplePakSize));
64 
65   bool created = false;
66   base::PlatformFileError error_code = base::PLATFORM_FILE_OK;
67   base::PlatformFile file = base::CreatePlatformFile(
68       data_path, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ,
69       &created, &error_code);
70 
71   // Load the file through the data pack API.
72   DataPack pack(SCALE_FACTOR_100P);
73   ASSERT_TRUE(pack.LoadFromFile(file));
74 
75   base::StringPiece data;
76   ASSERT_TRUE(pack.HasResource(4));
77   ASSERT_TRUE(pack.GetStringPiece(4, &data));
78   EXPECT_EQ("this is id 4", data);
79   ASSERT_TRUE(pack.HasResource(6));
80   ASSERT_TRUE(pack.GetStringPiece(6, &data));
81   EXPECT_EQ("this is id 6", data);
82 
83   // Try reading zero-length data blobs, just in case.
84   ASSERT_TRUE(pack.GetStringPiece(1, &data));
85   EXPECT_EQ(0U, data.length());
86   ASSERT_TRUE(pack.GetStringPiece(10, &data));
87   EXPECT_EQ(0U, data.length());
88 
89   // Try looking up an invalid key.
90   ASSERT_FALSE(pack.HasResource(140));
91   ASSERT_FALSE(pack.GetStringPiece(140, &data));
92 
93   base::ClosePlatformFile(file);
94 }
95 
96 INSTANTIATE_TEST_CASE_P(WriteBINARY, DataPackTest, ::testing::Values(
97     DataPack::BINARY));
98 INSTANTIATE_TEST_CASE_P(WriteUTF8, DataPackTest, ::testing::Values(
99     DataPack::UTF8));
100 INSTANTIATE_TEST_CASE_P(WriteUTF16, DataPackTest, ::testing::Values(
101     DataPack::UTF16));
102 
TEST(DataPackTest,LoadFileWithTruncatedHeader)103 TEST(DataPackTest, LoadFileWithTruncatedHeader) {
104   base::FilePath data_path;
105   PathService::Get(base::DIR_SOURCE_ROOT, &data_path);
106   data_path = data_path.Append(FILE_PATH_LITERAL(
107       "ui/base/test/data/data_pack_unittest/truncated-header.pak"));
108 
109   DataPack pack(SCALE_FACTOR_100P);
110   ASSERT_FALSE(pack.LoadFromPath(data_path));
111 }
112 
TEST_P(DataPackTest,Write)113 TEST_P(DataPackTest, Write) {
114   base::ScopedTempDir dir;
115   ASSERT_TRUE(dir.CreateUniqueTempDir());
116   base::FilePath file = dir.path().Append(FILE_PATH_LITERAL("data.pak"));
117 
118   std::string one("one");
119   std::string two("two");
120   std::string three("three");
121   std::string four("four");
122   std::string fifteen("fifteen");
123 
124   std::map<uint16, base::StringPiece> resources;
125   resources.insert(std::make_pair(1, base::StringPiece(one)));
126   resources.insert(std::make_pair(2, base::StringPiece(two)));
127   resources.insert(std::make_pair(15, base::StringPiece(fifteen)));
128   resources.insert(std::make_pair(3, base::StringPiece(three)));
129   resources.insert(std::make_pair(4, base::StringPiece(four)));
130   ASSERT_TRUE(DataPack::WritePack(file, resources, GetParam()));
131 
132   // Now try to read the data back in.
133   DataPack pack(SCALE_FACTOR_100P);
134   ASSERT_TRUE(pack.LoadFromPath(file));
135   EXPECT_EQ(pack.GetTextEncodingType(), GetParam());
136 
137   base::StringPiece data;
138   ASSERT_TRUE(pack.GetStringPiece(1, &data));
139   EXPECT_EQ(one, data);
140   ASSERT_TRUE(pack.GetStringPiece(2, &data));
141   EXPECT_EQ(two, data);
142   ASSERT_TRUE(pack.GetStringPiece(3, &data));
143   EXPECT_EQ(three, data);
144   ASSERT_TRUE(pack.GetStringPiece(4, &data));
145   EXPECT_EQ(four, data);
146   ASSERT_TRUE(pack.GetStringPiece(15, &data));
147   EXPECT_EQ(fifteen, data);
148 }
149 
150 }  // namespace ui
151