blob: f33ae31551928b6d46976b7858c11d92e67f241d [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;
MÃ¥rten Kongstad24c9aa62018-06-20 08:46:41 +020031using ::android::ConfigDescription;
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070032using ::android::StringPiece;
33
34namespace aapt {
35namespace test {
36
37ResourceTableBuilder& ResourceTableBuilder::SetPackageId(const StringPiece& package_name,
38 uint8_t id) {
39 ResourceTablePackage* package = table_->CreatePackage(package_name, id);
40 CHECK(package != nullptr);
41 return *this;
42}
43
44ResourceTableBuilder& ResourceTableBuilder::AddSimple(const StringPiece& name,
45 const ResourceId& id) {
46 return AddValue(name, id, util::make_unique<Id>());
47}
48
49ResourceTableBuilder& ResourceTableBuilder::AddSimple(const StringPiece& name,
50 const ConfigDescription& config,
51 const ResourceId& id) {
52 return AddValue(name, config, id, util::make_unique<Id>());
53}
54
55ResourceTableBuilder& ResourceTableBuilder::AddReference(const StringPiece& name,
56 const StringPiece& ref) {
57 return AddReference(name, {}, ref);
58}
59
60ResourceTableBuilder& ResourceTableBuilder::AddReference(const StringPiece& name,
61 const ResourceId& id,
62 const StringPiece& ref) {
63 return AddValue(name, id, util::make_unique<Reference>(ParseNameOrDie(ref)));
64}
65
66ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name,
67 const StringPiece& str) {
68 return AddString(name, {}, str);
69}
70
71ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name, const ResourceId& id,
72 const StringPiece& str) {
73 return AddValue(name, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
74}
75
76ResourceTableBuilder& ResourceTableBuilder::AddString(const StringPiece& name, const ResourceId& id,
77 const ConfigDescription& config,
78 const StringPiece& str) {
79 return AddValue(name, config, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
80}
81
82ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
Adam Lesinski8780eb62017-10-31 17:44:39 -070083 const StringPiece& path,
84 io::IFile* file) {
85 return AddFileReference(name, {}, path, file);
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070086}
87
88ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
89 const ResourceId& id,
Adam Lesinski8780eb62017-10-31 17:44:39 -070090 const StringPiece& path,
91 io::IFile* file) {
92 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
93 file_ref->file = file;
94 return AddValue(name, id, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070095}
96
97ResourceTableBuilder& ResourceTableBuilder::AddFileReference(const StringPiece& name,
98 const StringPiece& path,
Adam Lesinski8780eb62017-10-31 17:44:39 -070099 const ConfigDescription& config,
100 io::IFile* file) {
101 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
102 file_ref->file = file;
103 return AddValue(name, config, {}, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700104}
105
106ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name,
107 std::unique_ptr<Value> value) {
108 return AddValue(name, {}, std::move(value));
109}
110
111ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name, const ResourceId& id,
112 std::unique_ptr<Value> value) {
113 return AddValue(name, {}, id, std::move(value));
114}
115
116ResourceTableBuilder& ResourceTableBuilder::AddValue(const StringPiece& name,
117 const ConfigDescription& config,
118 const ResourceId& id,
119 std::unique_ptr<Value> value) {
120 ResourceName res_name = ParseNameOrDie(name);
Adam Lesinski71be7052017-12-12 16:48:07 -0800121 CHECK(table_->AddResourceWithIdMangled(res_name, id, config, {}, std::move(value),
122 GetDiagnostics()));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700123 return *this;
124}
125
126ResourceTableBuilder& ResourceTableBuilder::SetSymbolState(const StringPiece& name,
Adam Lesinski71be7052017-12-12 16:48:07 -0800127 const ResourceId& id,
128 Visibility::Level level,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700129 bool allow_new) {
130 ResourceName res_name = ParseNameOrDie(name);
Adam Lesinski71be7052017-12-12 16:48:07 -0800131 Visibility visibility;
132 visibility.level = level;
133 CHECK(table_->SetVisibilityWithIdMangled(res_name, visibility, id, GetDiagnostics()));
134 CHECK(table_->SetAllowNewMangled(res_name, AllowNew{}, GetDiagnostics()));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700135 return *this;
136}
137
138StringPool* ResourceTableBuilder::string_pool() {
139 return &table_->string_pool;
140}
141
142std::unique_ptr<ResourceTable> ResourceTableBuilder::Build() {
143 return std::move(table_);
144}
145
146std::unique_ptr<Reference> BuildReference(const StringPiece& ref, const Maybe<ResourceId>& id) {
147 std::unique_ptr<Reference> reference = util::make_unique<Reference>(ParseNameOrDie(ref));
148 reference->id = id;
149 return reference;
150}
151
152std::unique_ptr<BinaryPrimitive> BuildPrimitive(uint8_t type, uint32_t data) {
153 android::Res_value value = {};
154 value.size = sizeof(value);
155 value.dataType = type;
156 value.data = data;
157 return util::make_unique<BinaryPrimitive>(value);
158}
159
Adam Lesinski73bff1e2017-12-08 16:06:10 -0800160AttributeBuilder::AttributeBuilder()
161 : attr_(util::make_unique<Attribute>(android::ResTable_map::TYPE_ANY)) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700162}
163
164AttributeBuilder& AttributeBuilder::SetTypeMask(uint32_t typeMask) {
165 attr_->type_mask = typeMask;
166 return *this;
167}
168
Adam Lesinski73bff1e2017-12-08 16:06:10 -0800169AttributeBuilder& AttributeBuilder::SetWeak(bool weak) {
170 attr_->SetWeak(weak);
171 return *this;
172}
173
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700174AttributeBuilder& AttributeBuilder::AddItem(const StringPiece& name, uint32_t value) {
175 attr_->symbols.push_back(
176 Attribute::Symbol{Reference(ResourceName({}, ResourceType::kId, name)), value});
177 return *this;
178}
179
180std::unique_ptr<Attribute> AttributeBuilder::Build() {
181 return std::move(attr_);
182}
183
184StyleBuilder& StyleBuilder::SetParent(const StringPiece& str) {
185 style_->parent = Reference(ParseNameOrDie(str));
186 return *this;
187}
188
189StyleBuilder& StyleBuilder::AddItem(const StringPiece& str, std::unique_ptr<Item> value) {
190 style_->entries.push_back(Style::Entry{Reference(ParseNameOrDie(str)), std::move(value)});
191 return *this;
192}
193
194StyleBuilder& StyleBuilder::AddItem(const StringPiece& str, const ResourceId& id,
195 std::unique_ptr<Item> value) {
196 AddItem(str, std::move(value));
197 style_->entries.back().key.id = id;
198 return *this;
199}
200
201std::unique_ptr<Style> StyleBuilder::Build() {
202 return std::move(style_);
203}
204
205StyleableBuilder& StyleableBuilder::AddItem(const StringPiece& str, const Maybe<ResourceId>& id) {
206 styleable_->entries.push_back(Reference(ParseNameOrDie(str)));
207 styleable_->entries.back().id = id;
208 return *this;
209}
210
211std::unique_ptr<Styleable> StyleableBuilder::Build() {
212 return std::move(styleable_);
213}
214
215std::unique_ptr<xml::XmlResource> BuildXmlDom(const StringPiece& str) {
216 std::string input = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
217 input.append(str.data(), str.size());
218 StringInputStream in(input);
219 StdErrDiagnostics diag;
220 std::unique_ptr<xml::XmlResource> doc = xml::Inflate(&in, &diag, Source("test.xml"));
Adam Lesinski6b372992017-08-09 10:54:23 -0700221 CHECK(doc != nullptr && doc->root != nullptr) << "failed to parse inline XML string";
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700222 return doc;
223}
224
225std::unique_ptr<xml::XmlResource> BuildXmlDomForPackageName(IAaptContext* context,
226 const StringPiece& str) {
227 std::unique_ptr<xml::XmlResource> doc = BuildXmlDom(str);
228 doc->file.name.package = context->GetCompilationPackage();
229 return doc;
230}
231
Shane Farmer0a5b2012017-06-22 12:24:12 -0700232ArtifactBuilder& ArtifactBuilder::SetName(const std::string& name) {
Shane Farmercb6c3f92017-11-27 13:19:36 -0800233 artifact_.name = name;
Shane Farmer0a5b2012017-06-22 12:24:12 -0700234 return *this;
235}
236
Shane Farmer78c43d72017-12-04 09:08:38 -0800237ArtifactBuilder& ArtifactBuilder::SetVersion(int version) {
238 artifact_.version = version;
239 return *this;
240}
241
Shane Farmercb6c3f92017-11-27 13:19:36 -0800242ArtifactBuilder& ArtifactBuilder::AddAbi(configuration::Abi abi) {
243 artifact_.abis.push_back(abi);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700244 return *this;
245}
246
Shane Farmercb6c3f92017-11-27 13:19:36 -0800247ArtifactBuilder& ArtifactBuilder::AddDensity(const ConfigDescription& density) {
248 artifact_.screen_densities.push_back(density);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700249 return *this;
250}
251
Shane Farmercb6c3f92017-11-27 13:19:36 -0800252ArtifactBuilder& ArtifactBuilder::AddLocale(const ConfigDescription& locale) {
253 artifact_.locales.push_back(locale);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700254 return *this;
255}
256
Shane Farmercb6c3f92017-11-27 13:19:36 -0800257ArtifactBuilder& ArtifactBuilder::SetAndroidSdk(int min_sdk) {
258 artifact_.android_sdk = {AndroidSdk::ForMinSdk(min_sdk)};
Shane Farmerefe45392017-08-21 14:39:28 -0700259 return *this;
260}
261
Shane Farmercb6c3f92017-11-27 13:19:36 -0800262configuration::OutputArtifact ArtifactBuilder::Build() {
Shane Farmer0a5b2012017-06-22 12:24:12 -0700263 return artifact_;
264}
265
Shane Farmer78c43d72017-12-04 09:08:38 -0800266PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAbiGroup(
267 const std::string& label, std::vector<configuration::Abi> abis) {
268 return AddGroup(label, &config_.abi_groups, std::move(abis));
269}
270
271PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDensityGroup(
272 const std::string& label, std::vector<std::string> densities) {
273 std::vector<ConfigDescription> configs;
274 for (const auto& density : densities) {
275 configs.push_back(test::ParseConfigOrDie(density));
276 }
277 return AddGroup(label, &config_.screen_density_groups, configs);
278}
279
280PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddLocaleGroup(
281 const std::string& label, std::vector<std::string> locales) {
282 std::vector<ConfigDescription> configs;
283 for (const auto& locale : locales) {
284 configs.push_back(test::ParseConfigOrDie(locale));
285 }
286 return AddGroup(label, &config_.locale_groups, configs);
287}
288
289PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDeviceFeatureGroup(
290 const std::string& label) {
291 return AddGroup(label, &config_.device_feature_groups);
292}
293
294PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddGlTextureGroup(
295 const std::string& label) {
296 return AddGroup(label, &config_.gl_texture_groups);
297}
298
299PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAndroidSdk(
300 std::string label, int min_sdk) {
301 config_.android_sdks[label] = AndroidSdk::ForMinSdk(min_sdk);
302 return *this;
303}
304
305PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddArtifact(
306 configuration::ConfiguredArtifact artifact) {
307 config_.artifacts.push_back(std::move(artifact));
308 return *this;
309}
310
311configuration::PostProcessingConfiguration PostProcessingConfigurationBuilder::Build() {
312 return config_;
313}
314
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700315} // namespace test
316} // namespace aapt