blob: 84d03cfb0283cfd3532375e7914e8d90f0c2621a [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;
Shane Farmercb6c3f92017-11-27 13:19:36 -080028using ::aapt::configuration::ConfiguredArtifact;
Shane Farmer78c43d72017-12-04 09:08:38 -080029using ::aapt::configuration::GetOrCreateGroup;
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070030using ::aapt::io::StringInputStream;
31using ::android::StringPiece;
32
33namespace aapt {
34namespace test {
35
36ResourceTableBuilder& ResourceTableBuilder::SetPackageId(const StringPiece& package_name,
37 uint8_t id) {
38 ResourceTablePackage* package = table_->CreatePackage(package_name, id);
39 CHECK(package != nullptr);
40 return *this;
41}
42
43ResourceTableBuilder& ResourceTableBuilder::AddSimple(const StringPiece& name,
44 const ResourceId& id) {
45 return AddValue(name, id, util::make_unique<Id>());
46}
47
48ResourceTableBuilder& ResourceTableBuilder::AddSimple(const StringPiece& name,
49 const ConfigDescription& config,
50 const ResourceId& id) {
51 return AddValue(name, config, id, util::make_unique<Id>());
52}
53
54ResourceTableBuilder& ResourceTableBuilder::AddReference(const StringPiece& name,
55 const StringPiece& ref) {
56 return AddReference(name, {}, ref);
57}
58
59ResourceTableBuilder& ResourceTableBuilder::AddReference(const StringPiece& name,
60 const ResourceId& id,
61 const StringPiece& ref) {
62 return AddValue(name, id, util::make_unique<Reference>(ParseNameOrDie(ref)));
63}
64
65ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name,
66 const StringPiece& str) {
67 return AddString(name, {}, str);
68}
69
70ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name, const ResourceId& id,
71 const StringPiece& str) {
72 return AddValue(name, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
73}
74
75ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name, const ResourceId& id,
76 const ConfigDescription& config,
77 const StringPiece& str) {
78 return AddValue(name, config, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
79}
80
81ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
Adam Lesinski8780eb62017-10-31 17:44:39 -070082 const StringPiece& path,
83 io::IFile* file) {
84 return AddFileReference(name, {}, path, file);
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070085}
86
87ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
88 const ResourceId& id,
Adam Lesinski8780eb62017-10-31 17:44:39 -070089 const StringPiece& path,
90 io::IFile* file) {
91 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
92 file_ref->file = file;
93 return AddValue(name, id, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070094}
95
96ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
97 const StringPiece& path,
Adam Lesinski8780eb62017-10-31 17:44:39 -070098 const ConfigDescription& config,
99 io::IFile* file) {
100 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
101 file_ref->file = file;
102 return AddValue(name, config, {}, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700103}
104
105ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name,
106 std::unique_ptr<Value> value) {
107 return AddValue(name, {}, std::move(value));
108}
109
110ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name, const ResourceId& id,
111 std::unique_ptr<Value> value) {
112 return AddValue(name, {}, id, std::move(value));
113}
114
115ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name,
116 const ConfigDescription& config,
117 const ResourceId& id,
118 std::unique_ptr<Value> value) {
119 ResourceName res_name = ParseNameOrDie(name);
120 CHECK(table_->AddResourceAllowMangled(res_name, id, config, {}, std::move(value),
121 GetDiagnostics()));
122 return *this;
123}
124
125ResourceTableBuilder& ResourceTableBuilder::SetSymbolState(const StringPiece& name,
126 const ResourceId& id, SymbolState state,
127 bool allow_new) {
128 ResourceName res_name = ParseNameOrDie(name);
129 Symbol symbol;
130 symbol.state = state;
131 symbol.allow_new = allow_new;
132 CHECK(table_->SetSymbolStateAllowMangled(res_name, id, symbol, GetDiagnostics()));
133 return *this;
134}
135
136StringPool* ResourceTableBuilder::string_pool() {
137 return &table_->string_pool;
138}
139
140std::unique_ptr<ResourceTable> ResourceTableBuilder::Build() {
141 return std::move(table_);
142}
143
144std::unique_ptr<Reference> BuildReference(const StringPiece& ref, const Maybe<ResourceId>& id) {
145 std::unique_ptr<Reference> reference = util::make_unique<Reference>(ParseNameOrDie(ref));
146 reference->id = id;
147 return reference;
148}
149
150std::unique_ptr<BinaryPrimitive> BuildPrimitive(uint8_t type, uint32_t data) {
151 android::Res_value value = {};
152 value.size = sizeof(value);
153 value.dataType = type;
154 value.data = data;
155 return util::make_unique<BinaryPrimitive>(value);
156}
157
158AttributeBuilder::AttributeBuilder(bool weak) : attr_(util::make_unique<Attribute>(weak)) {
159 attr_->type_mask = android::ResTable_map::TYPE_ANY;
160}
161
162AttributeBuilder& AttributeBuilder::SetTypeMask(uint32_t typeMask) {
163 attr_->type_mask = typeMask;
164 return *this;
165}
166
167AttributeBuilder& AttributeBuilder::AddItem(const StringPiece& name, uint32_t value) {
168 attr_->symbols.push_back(
169 Attribute::Symbol{Reference(ResourceName({}, ResourceType::kId, name)), value});
170 return *this;
171}
172
173std::unique_ptr<Attribute> AttributeBuilder::Build() {
174 return std::move(attr_);
175}
176
177StyleBuilder& StyleBuilder::SetParent(const StringPiece& str) {
178 style_->parent = Reference(ParseNameOrDie(str));
179 return *this;
180}
181
182StyleBuilder& StyleBuilder::AddItem(const StringPiece& str, std::unique_ptr<Item> value) {
183 style_->entries.push_back(Style::Entry{Reference(ParseNameOrDie(str)), std::move(value)});
184 return *this;
185}
186
187StyleBuilder& StyleBuilder::AddItem(const StringPiece& str, const ResourceId& id,
188 std::unique_ptr<Item> value) {
189 AddItem(str, std::move(value));
190 style_->entries.back().key.id = id;
191 return *this;
192}
193
194std::unique_ptr<Style> StyleBuilder::Build() {
195 return std::move(style_);
196}
197
198StyleableBuilder& StyleableBuilder::AddItem(const StringPiece& str, const Maybe<ResourceId>& id) {
199 styleable_->entries.push_back(Reference(ParseNameOrDie(str)));
200 styleable_->entries.back().id = id;
201 return *this;
202}
203
204std::unique_ptr<Styleable> StyleableBuilder::Build() {
205 return std::move(styleable_);
206}
207
208std::unique_ptr<xml::XmlResource> BuildXmlDom(const StringPiece& str) {
209 std::string input = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
210 input.append(str.data(), str.size());
211 StringInputStream in(input);
212 StdErrDiagnostics diag;
213 std::unique_ptr<xml::XmlResource> doc = xml::Inflate(&in, &diag, Source("test.xml"));
Adam Lesinski6b372992017-08-09 10:54:23 -0700214 CHECK(doc != nullptr && doc->root != nullptr) << "failed to parse inline XML string";
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700215 return doc;
216}
217
218std::unique_ptr<xml::XmlResource> BuildXmlDomForPackageName(IAaptContext* context,
219 const StringPiece& str) {
220 std::unique_ptr<xml::XmlResource> doc = BuildXmlDom(str);
221 doc->file.name.package = context->GetCompilationPackage();
222 return doc;
223}
224
Shane Farmer0a5b2012017-06-22 12:24:12 -0700225ArtifactBuilder& ArtifactBuilder::SetName(const std::string& name) {
Shane Farmercb6c3f92017-11-27 13:19:36 -0800226 artifact_.name = name;
Shane Farmer0a5b2012017-06-22 12:24:12 -0700227 return *this;
228}
229
Shane Farmer78c43d72017-12-04 09:08:38 -0800230ArtifactBuilder& ArtifactBuilder::SetVersion(int version) {
231 artifact_.version = version;
232 return *this;
233}
234
Shane Farmercb6c3f92017-11-27 13:19:36 -0800235ArtifactBuilder& ArtifactBuilder::AddAbi(configuration::Abi abi) {
236 artifact_.abis.push_back(abi);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700237 return *this;
238}
239
Shane Farmercb6c3f92017-11-27 13:19:36 -0800240ArtifactBuilder& ArtifactBuilder::AddDensity(const ConfigDescription& density) {
241 artifact_.screen_densities.push_back(density);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700242 return *this;
243}
244
Shane Farmercb6c3f92017-11-27 13:19:36 -0800245ArtifactBuilder& ArtifactBuilder::AddLocale(const ConfigDescription& locale) {
246 artifact_.locales.push_back(locale);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700247 return *this;
248}
249
Shane Farmercb6c3f92017-11-27 13:19:36 -0800250ArtifactBuilder& ArtifactBuilder::SetAndroidSdk(int min_sdk) {
251 artifact_.android_sdk = {AndroidSdk::ForMinSdk(min_sdk)};
Shane Farmerefe45392017-08-21 14:39:28 -0700252 return *this;
253}
254
Shane Farmercb6c3f92017-11-27 13:19:36 -0800255configuration::OutputArtifact ArtifactBuilder::Build() {
Shane Farmer0a5b2012017-06-22 12:24:12 -0700256 return artifact_;
257}
258
Shane Farmer78c43d72017-12-04 09:08:38 -0800259PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAbiGroup(
260 const std::string& label, std::vector<configuration::Abi> abis) {
261 return AddGroup(label, &config_.abi_groups, std::move(abis));
262}
263
264PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDensityGroup(
265 const std::string& label, std::vector<std::string> densities) {
266 std::vector<ConfigDescription> configs;
267 for (const auto& density : densities) {
268 configs.push_back(test::ParseConfigOrDie(density));
269 }
270 return AddGroup(label, &config_.screen_density_groups, configs);
271}
272
273PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddLocaleGroup(
274 const std::string& label, std::vector<std::string> locales) {
275 std::vector<ConfigDescription> configs;
276 for (const auto& locale : locales) {
277 configs.push_back(test::ParseConfigOrDie(locale));
278 }
279 return AddGroup(label, &config_.locale_groups, configs);
280}
281
282PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDeviceFeatureGroup(
283 const std::string& label) {
284 return AddGroup(label, &config_.device_feature_groups);
285}
286
287PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddGlTextureGroup(
288 const std::string& label) {
289 return AddGroup(label, &config_.gl_texture_groups);
290}
291
292PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAndroidSdk(
293 std::string label, int min_sdk) {
294 config_.android_sdks[label] = AndroidSdk::ForMinSdk(min_sdk);
295 return *this;
296}
297
298PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddArtifact(
299 configuration::ConfiguredArtifact artifact) {
300 config_.artifacts.push_back(std::move(artifact));
301 return *this;
302}
303
304configuration::PostProcessingConfiguration PostProcessingConfigurationBuilder::Build() {
305 return config_;
306}
307
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700308} // namespace test
309} // namespace aapt