blob: ecec63f3cf31afa2b14bcbeff5d9edb0194b0a1e [file] [log] [blame]
Adam Lesinskiefeb7af2017-08-02 14:57:43 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "test/Builders.h"
18
19#include "android-base/logging.h"
20#include "androidfw/StringPiece.h"
21
Adam Lesinski00451162017-10-03 07:44:08 -070022#include "io/StringStream.h"
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070023#include "test/Common.h"
24#include "util/Util.h"
25
Shane Farmerefe45392017-08-21 14:39:28 -070026using ::aapt::configuration::Abi;
27using ::aapt::configuration::AndroidSdk;
28using ::aapt::configuration::Artifact;
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070029using ::aapt::io::StringInputStream;
30using ::android::StringPiece;
31
32namespace aapt {
33namespace test {
34
35ResourceTableBuilder& ResourceTableBuilder::SetPackageId(const StringPiece& package_name,
36 uint8_t id) {
37 ResourceTablePackage* package = table_->CreatePackage(package_name, id);
38 CHECK(package != nullptr);
39 return *this;
40}
41
42ResourceTableBuilder& ResourceTableBuilder::AddSimple(const StringPiece& name,
43 const ResourceId& id) {
44 return AddValue(name, id, util::make_unique<Id>());
45}
46
47ResourceTableBuilder& ResourceTableBuilder::AddSimple(const StringPiece& name,
48 const ConfigDescription& config,
49 const ResourceId& id) {
50 return AddValue(name, config, id, util::make_unique<Id>());
51}
52
53ResourceTableBuilder& ResourceTableBuilder::AddReference(const StringPiece& name,
54 const StringPiece& ref) {
55 return AddReference(name, {}, ref);
56}
57
58ResourceTableBuilder& ResourceTableBuilder::AddReference(const StringPiece& name,
59 const ResourceId& id,
60 const StringPiece& ref) {
61 return AddValue(name, id, util::make_unique<Reference>(ParseNameOrDie(ref)));
62}
63
64ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name,
65 const StringPiece& str) {
66 return AddString(name, {}, str);
67}
68
69ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name, const ResourceId& id,
70 const StringPiece& str) {
71 return AddValue(name, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
72}
73
74ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name, const ResourceId& id,
75 const ConfigDescription& config,
76 const StringPiece& str) {
77 return AddValue(name, config, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
78}
79
80ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
Adam Lesinski8780eb62017-10-31 17:44:39 -070081 const StringPiece& path,
82 io::IFile* file) {
83 return AddFileReference(name, {}, path, file);
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070084}
85
86ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
87 const ResourceId& id,
Adam Lesinski8780eb62017-10-31 17:44:39 -070088 const StringPiece& path,
89 io::IFile* file) {
90 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
91 file_ref->file = file;
92 return AddValue(name, id, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070093}
94
95ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
96 const StringPiece& path,
Adam Lesinski8780eb62017-10-31 17:44:39 -070097 const ConfigDescription& config,
98 io::IFile* file) {
99 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
100 file_ref->file = file;
101 return AddValue(name, config, {}, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700102}
103
104ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name,
105 std::unique_ptr<Value> value) {
106 return AddValue(name, {}, std::move(value));
107}
108
109ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name, const ResourceId& id,
110 std::unique_ptr<Value> value) {
111 return AddValue(name, {}, id, std::move(value));
112}
113
114ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name,
115 const ConfigDescription& config,
116 const ResourceId& id,
117 std::unique_ptr<Value> value) {
118 ResourceName res_name = ParseNameOrDie(name);
119 CHECK(table_->AddResourceAllowMangled(res_name, id, config, {}, std::move(value),
120 GetDiagnostics()));
121 return *this;
122}
123
124ResourceTableBuilder& ResourceTableBuilder::SetSymbolState(const StringPiece& name,
125 const ResourceId& id, SymbolState state,
126 bool allow_new) {
127 ResourceName res_name = ParseNameOrDie(name);
128 Symbol symbol;
129 symbol.state = state;
130 symbol.allow_new = allow_new;
131 CHECK(table_->SetSymbolStateAllowMangled(res_name, id, symbol, GetDiagnostics()));
132 return *this;
133}
134
135StringPool* ResourceTableBuilder::string_pool() {
136 return &table_->string_pool;
137}
138
139std::unique_ptr<ResourceTable> ResourceTableBuilder::Build() {
140 return std::move(table_);
141}
142
143std::unique_ptr<Reference> BuildReference(const StringPiece& ref, const Maybe<ResourceId>& id) {
144 std::unique_ptr<Reference> reference = util::make_unique<Reference>(ParseNameOrDie(ref));
145 reference->id = id;
146 return reference;
147}
148
149std::unique_ptr<BinaryPrimitive> BuildPrimitive(uint8_t type, uint32_t data) {
150 android::Res_value value = {};
151 value.size = sizeof(value);
152 value.dataType = type;
153 value.data = data;
154 return util::make_unique<BinaryPrimitive>(value);
155}
156
157AttributeBuilder::AttributeBuilder(bool weak) : attr_(util::make_unique<Attribute>(weak)) {
158 attr_->type_mask = android::ResTable_map::TYPE_ANY;
159}
160
161AttributeBuilder& AttributeBuilder::SetTypeMask(uint32_t typeMask) {
162 attr_->type_mask = typeMask;
163 return *this;
164}
165
166AttributeBuilder& AttributeBuilder::AddItem(const StringPiece& name, uint32_t value) {
167 attr_->symbols.push_back(
168 Attribute::Symbol{Reference(ResourceName({}, ResourceType::kId, name)), value});
169 return *this;
170}
171
172std::unique_ptr<Attribute> AttributeBuilder::Build() {
173 return std::move(attr_);
174}
175
176StyleBuilder& StyleBuilder::SetParent(const StringPiece& str) {
177 style_->parent = Reference(ParseNameOrDie(str));
178 return *this;
179}
180
181StyleBuilder& StyleBuilder::AddItem(const StringPiece& str, std::unique_ptr<Item> value) {
182 style_->entries.push_back(Style::Entry{Reference(ParseNameOrDie(str)), std::move(value)});
183 return *this;
184}
185
186StyleBuilder& StyleBuilder::AddItem(const StringPiece& str, const ResourceId& id,
187 std::unique_ptr<Item> value) {
188 AddItem(str, std::move(value));
189 style_->entries.back().key.id = id;
190 return *this;
191}
192
193std::unique_ptr<Style> StyleBuilder::Build() {
194 return std::move(style_);
195}
196
197StyleableBuilder& StyleableBuilder::AddItem(const StringPiece& str, const Maybe<ResourceId>& id) {
198 styleable_->entries.push_back(Reference(ParseNameOrDie(str)));
199 styleable_->entries.back().id = id;
200 return *this;
201}
202
203std::unique_ptr<Styleable> StyleableBuilder::Build() {
204 return std::move(styleable_);
205}
206
207std::unique_ptr<xml::XmlResource> BuildXmlDom(const StringPiece& str) {
208 std::string input = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
209 input.append(str.data(), str.size());
210 StringInputStream in(input);
211 StdErrDiagnostics diag;
212 std::unique_ptr<xml::XmlResource> doc = xml::Inflate(&in, &diag, Source("test.xml"));
Adam Lesinski6b372992017-08-09 10:54:23 -0700213 CHECK(doc != nullptr && doc->root != nullptr) << "failed to parse inline XML string";
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700214 return doc;
215}
216
217std::unique_ptr<xml::XmlResource> BuildXmlDomForPackageName(IAaptContext* context,
218 const StringPiece& str) {
219 std::unique_ptr<xml::XmlResource> doc = BuildXmlDom(str);
220 doc->file.name.package = context->GetCompilationPackage();
221 return doc;
222}
223
Shane Farmer0a5b2012017-06-22 12:24:12 -0700224PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::SetAbiGroup(
Shane Farmerefe45392017-08-21 14:39:28 -0700225 const std::string& name, const std::vector<Abi>& abis) {
Shane Farmer0a5b2012017-06-22 12:24:12 -0700226 config_.abi_groups[name] = abis;
227 return *this;
228}
229
230PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::SetLocaleGroup(
231 const std::string& name, const std::vector<std::string>& locales) {
232 auto& group = config_.locale_groups[name];
233 for (const auto& locale : locales) {
234 group.push_back(ParseConfigOrDie(locale));
235 }
236 return *this;
237}
238
239PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::SetDensityGroup(
240 const std::string& name, const std::vector<std::string>& densities) {
241 auto& group = config_.screen_density_groups[name];
242 for (const auto& density : densities) {
243 group.push_back(ParseConfigOrDie(density));
244 }
245 return *this;
246}
247
Shane Farmerefe45392017-08-21 14:39:28 -0700248PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::SetAndroidSdk(
249 const std::string& name, const AndroidSdk& sdk) {
250 config_.android_sdk_groups[name] = sdk;
251 return *this;
252}
253
Shane Farmer0a5b2012017-06-22 12:24:12 -0700254PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddArtifact(
Shane Farmerefe45392017-08-21 14:39:28 -0700255 const Artifact& artifact) {
Shane Farmer0a5b2012017-06-22 12:24:12 -0700256 config_.artifacts.push_back(artifact);
257 return *this;
258}
259
260configuration::PostProcessingConfiguration PostProcessingConfigurationBuilder::Build() {
261 return config_;
262}
263
264ArtifactBuilder& ArtifactBuilder::SetName(const std::string& name) {
265 artifact_.name = {name};
266 return *this;
267}
268
269ArtifactBuilder& ArtifactBuilder::SetAbiGroup(const std::string& name) {
270 artifact_.abi_group = {name};
271 return *this;
272}
273
274ArtifactBuilder& ArtifactBuilder::SetDensityGroup(const std::string& name) {
275 artifact_.screen_density_group = {name};
276 return *this;
277}
278
279ArtifactBuilder& ArtifactBuilder::SetLocaleGroup(const std::string& name) {
280 artifact_.locale_group = {name};
281 return *this;
282}
283
Shane Farmerefe45392017-08-21 14:39:28 -0700284ArtifactBuilder& ArtifactBuilder::SetAndroidSdk(const std::string& name) {
285 artifact_.android_sdk_group = {name};
286 return *this;
287}
288
Shane Farmer0a5b2012017-06-22 12:24:12 -0700289configuration::Artifact ArtifactBuilder::Build() {
290 return artifact_;
291}
292
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700293} // namespace test
294} // namespace aapt