blob: b5934e40a2a38680ec5d25ed8194681b34278e04 [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
Jeremy Meyer56f36e82022-05-20 20:35:42 +000019#include "Diagnostics.h"
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070020#include "android-base/logging.h"
21#include "androidfw/StringPiece.h"
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
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070037ResourceTableBuilder& ResourceTableBuilder::AddSimple(StringPiece name, const ResourceId& id) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070038 return AddValue(name, id, util::make_unique<Id>());
39}
40
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070041ResourceTableBuilder& ResourceTableBuilder::AddSimple(StringPiece name,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070042 const ConfigDescription& config,
43 const ResourceId& id) {
44 return AddValue(name, config, id, util::make_unique<Id>());
45}
46
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070047ResourceTableBuilder& ResourceTableBuilder::AddReference(StringPiece name, StringPiece ref) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070048 return AddReference(name, {}, ref);
49}
50
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070051ResourceTableBuilder& ResourceTableBuilder::AddReference(StringPiece name, const ResourceId& id,
52 StringPiece ref) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070053 return AddValue(name, id, util::make_unique<Reference>(ParseNameOrDie(ref)));
54}
55
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070056ResourceTableBuilder& ResourceTableBuilder::AddString(StringPiece name, StringPiece str) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070057 return AddString(name, {}, str);
58}
59
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070060ResourceTableBuilder& ResourceTableBuilder::AddString(StringPiece name, const ResourceId& id,
61 StringPiece str) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070062 return AddValue(name, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
63}
64
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070065ResourceTableBuilder& ResourceTableBuilder::AddString(StringPiece name, const ResourceId& id,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070066 const ConfigDescription& config,
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070067 StringPiece str) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070068 return AddValue(name, config, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
69}
70
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070071ResourceTableBuilder& ResourceTableBuilder::AddFileReference(StringPiece name, StringPiece path,
Adam Lesinski8780eb62017-10-31 17:44:39 -070072 io::IFile* file) {
73 return AddFileReference(name, {}, path, file);
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070074}
75
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070076ResourceTableBuilder& ResourceTableBuilder::AddFileReference(StringPiece name, const ResourceId& id,
77 StringPiece path, io::IFile* file) {
Adam Lesinski8780eb62017-10-31 17:44:39 -070078 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
79 file_ref->file = file;
80 return AddValue(name, id, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070081}
82
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070083ResourceTableBuilder& ResourceTableBuilder::AddFileReference(StringPiece name, StringPiece path,
Adam Lesinski8780eb62017-10-31 17:44:39 -070084 const ConfigDescription& config,
85 io::IFile* file) {
86 auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
87 file_ref->file = file;
88 return AddValue(name, config, {}, std::move(file_ref));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070089}
90
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070091ResourceTableBuilder& ResourceTableBuilder::AddValue(StringPiece name,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070092 std::unique_ptr<Value> value) {
93 return AddValue(name, {}, std::move(value));
94}
95
Yurii Zubrytskyia5775142022-11-02 17:49:49 -070096ResourceTableBuilder& ResourceTableBuilder::AddValue(StringPiece name, const ResourceId& id,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -070097 std::unique_ptr<Value> value) {
98 return AddValue(name, {}, id, std::move(value));
99}
100
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700101ResourceTableBuilder& ResourceTableBuilder::AddValue(StringPiece name,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700102 const ConfigDescription& config,
103 const ResourceId& id,
104 std::unique_ptr<Value> value) {
105 ResourceName res_name = ParseNameOrDie(name);
Ryan Mitchell1d008d12021-03-19 14:54:17 -0700106 NewResourceBuilder builder(res_name);
107 builder.SetValue(std::move(value), config).SetAllowMangled(true);
108 if (id.id != 0U) {
109 builder.SetId(id);
110 }
111
112 CHECK(table_->AddResource(builder.Build(), GetDiagnostics()));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700113 return *this;
114}
115
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700116ResourceTableBuilder& ResourceTableBuilder::SetSymbolState(StringPiece name, const ResourceId& id,
Adam Lesinski71be7052017-12-12 16:48:07 -0800117 Visibility::Level level,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700118 bool allow_new) {
119 ResourceName res_name = ParseNameOrDie(name);
Ryan Mitchell1d008d12021-03-19 14:54:17 -0700120 NewResourceBuilder builder(res_name);
121 builder.SetVisibility({level}).SetAllowNew({}).SetAllowMangled(true);
122 if (id.id != 0U) {
123 builder.SetId(id);
124 }
125
126 CHECK(table_->AddResource(builder.Build(), GetDiagnostics()));
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700127 return *this;
128}
129
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700130ResourceTableBuilder& ResourceTableBuilder::SetOverlayable(StringPiece name,
Ryan Mitchell54237ff2018-12-13 15:44:29 -0800131 const OverlayableItem& overlayable) {
Ryan Mitchelle4e989c2018-10-29 02:21:50 -0700132 ResourceName res_name = ParseNameOrDie(name);
Ryan Mitchell1d008d12021-03-19 14:54:17 -0700133 CHECK(table_->AddResource(
134 NewResourceBuilder(res_name).SetOverlayable(overlayable).SetAllowMangled(true).Build(),
135 GetDiagnostics()));
136 return *this;
137}
138
139ResourceTableBuilder& ResourceTableBuilder::Add(NewResource&& res) {
140 CHECK(table_->AddResource(std::move(res), GetDiagnostics()));
Ryan Mitchelle4e989c2018-10-29 02:21:50 -0700141 return *this;
142}
143
Jeremy Meyer56f36e82022-05-20 20:35:42 +0000144android::StringPool* ResourceTableBuilder::string_pool() {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700145 return &table_->string_pool;
146}
147
148std::unique_ptr<ResourceTable> ResourceTableBuilder::Build() {
149 return std::move(table_);
150}
151
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700152std::unique_ptr<Reference> BuildReference(StringPiece ref, const std::optional<ResourceId>& id) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700153 std::unique_ptr<Reference> reference = util::make_unique<Reference>(ParseNameOrDie(ref));
154 reference->id = id;
155 return reference;
156}
157
158std::unique_ptr<BinaryPrimitive> BuildPrimitive(uint8_t type, uint32_t data) {
159 android::Res_value value = {};
160 value.size = sizeof(value);
161 value.dataType = type;
162 value.data = data;
163 return util::make_unique<BinaryPrimitive>(value);
164}
165
Adam Lesinski73bff1e2017-12-08 16:06:10 -0800166AttributeBuilder::AttributeBuilder()
167 : attr_(util::make_unique<Attribute>(android::ResTable_map::TYPE_ANY)) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700168}
169
170AttributeBuilder& AttributeBuilder::SetTypeMask(uint32_t typeMask) {
171 attr_->type_mask = typeMask;
172 return *this;
173}
174
Adam Lesinski73bff1e2017-12-08 16:06:10 -0800175AttributeBuilder& AttributeBuilder::SetWeak(bool weak) {
176 attr_->SetWeak(weak);
177 return *this;
178}
179
Mark Punzalan5596a612024-01-19 00:06:38 -0800180AttributeBuilder& AttributeBuilder::SetComment(StringPiece comment) {
181 attr_->SetComment(comment);
182 return *this;
183}
184
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700185AttributeBuilder& AttributeBuilder::AddItem(StringPiece name, uint32_t value) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700186 attr_->symbols.push_back(
187 Attribute::Symbol{Reference(ResourceName({}, ResourceType::kId, name)), value});
188 return *this;
189}
190
Mark Punzalan5596a612024-01-19 00:06:38 -0800191AttributeBuilder& AttributeBuilder::AddItemWithComment(StringPiece name, uint32_t value,
192 StringPiece comment) {
193 Reference ref(ResourceName({}, ResourceType::kId, name));
194 ref.SetComment(comment);
195 attr_->symbols.push_back(Attribute::Symbol{ref, value});
196 return *this;
197}
198
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700199std::unique_ptr<Attribute> AttributeBuilder::Build() {
200 return std::move(attr_);
201}
202
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700203StyleBuilder& StyleBuilder::SetParent(StringPiece str) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700204 style_->parent = Reference(ParseNameOrDie(str));
205 return *this;
206}
207
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700208StyleBuilder& StyleBuilder::AddItem(StringPiece str, std::unique_ptr<Item> value) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700209 style_->entries.push_back(Style::Entry{Reference(ParseNameOrDie(str)), std::move(value)});
210 return *this;
211}
212
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700213StyleBuilder& StyleBuilder::AddItem(StringPiece str, const ResourceId& id,
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700214 std::unique_ptr<Item> value) {
215 AddItem(str, std::move(value));
216 style_->entries.back().key.id = id;
217 return *this;
218}
219
220std::unique_ptr<Style> StyleBuilder::Build() {
221 return std::move(style_);
222}
223
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700224StyleableBuilder& StyleableBuilder::AddItem(StringPiece str, const std::optional<ResourceId>& id) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700225 styleable_->entries.push_back(Reference(ParseNameOrDie(str)));
226 styleable_->entries.back().id = id;
227 return *this;
228}
229
230std::unique_ptr<Styleable> StyleableBuilder::Build() {
231 return std::move(styleable_);
232}
233
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700234std::unique_ptr<xml::XmlResource> BuildXmlDom(StringPiece str) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700235 std::string input = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
236 input.append(str.data(), str.size());
237 StringInputStream in(input);
238 StdErrDiagnostics diag;
Jeremy Meyer56f36e82022-05-20 20:35:42 +0000239 std::unique_ptr<xml::XmlResource> doc = xml::Inflate(&in, &diag, android::Source("test.xml"));
Adam Lesinski6b372992017-08-09 10:54:23 -0700240 CHECK(doc != nullptr && doc->root != nullptr) << "failed to parse inline XML string";
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700241 return doc;
242}
243
244std::unique_ptr<xml::XmlResource> BuildXmlDomForPackageName(IAaptContext* context,
Yurii Zubrytskyia5775142022-11-02 17:49:49 -0700245 StringPiece str) {
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700246 std::unique_ptr<xml::XmlResource> doc = BuildXmlDom(str);
247 doc->file.name.package = context->GetCompilationPackage();
248 return doc;
249}
250
Shane Farmer0a5b2012017-06-22 12:24:12 -0700251ArtifactBuilder& ArtifactBuilder::SetName(const std::string& name) {
Shane Farmercb6c3f92017-11-27 13:19:36 -0800252 artifact_.name = name;
Shane Farmer0a5b2012017-06-22 12:24:12 -0700253 return *this;
254}
255
Shane Farmer78c43d72017-12-04 09:08:38 -0800256ArtifactBuilder& ArtifactBuilder::SetVersion(int version) {
257 artifact_.version = version;
258 return *this;
259}
260
Shane Farmercb6c3f92017-11-27 13:19:36 -0800261ArtifactBuilder& ArtifactBuilder::AddAbi(configuration::Abi abi) {
262 artifact_.abis.push_back(abi);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700263 return *this;
264}
265
Shane Farmercb6c3f92017-11-27 13:19:36 -0800266ArtifactBuilder& ArtifactBuilder::AddDensity(const ConfigDescription& density) {
267 artifact_.screen_densities.push_back(density);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700268 return *this;
269}
270
Shane Farmercb6c3f92017-11-27 13:19:36 -0800271ArtifactBuilder& ArtifactBuilder::AddLocale(const ConfigDescription& locale) {
272 artifact_.locales.push_back(locale);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700273 return *this;
274}
275
Shane Farmercb6c3f92017-11-27 13:19:36 -0800276ArtifactBuilder& ArtifactBuilder::SetAndroidSdk(int min_sdk) {
277 artifact_.android_sdk = {AndroidSdk::ForMinSdk(min_sdk)};
Shane Farmerefe45392017-08-21 14:39:28 -0700278 return *this;
279}
280
Shane Farmercb6c3f92017-11-27 13:19:36 -0800281configuration::OutputArtifact ArtifactBuilder::Build() {
Shane Farmer0a5b2012017-06-22 12:24:12 -0700282 return artifact_;
283}
284
Shane Farmer78c43d72017-12-04 09:08:38 -0800285PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAbiGroup(
286 const std::string& label, std::vector<configuration::Abi> abis) {
287 return AddGroup(label, &config_.abi_groups, std::move(abis));
288}
289
290PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDensityGroup(
291 const std::string& label, std::vector<std::string> densities) {
292 std::vector<ConfigDescription> configs;
293 for (const auto& density : densities) {
294 configs.push_back(test::ParseConfigOrDie(density));
295 }
296 return AddGroup(label, &config_.screen_density_groups, configs);
297}
298
299PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddLocaleGroup(
300 const std::string& label, std::vector<std::string> locales) {
301 std::vector<ConfigDescription> configs;
302 for (const auto& locale : locales) {
303 configs.push_back(test::ParseConfigOrDie(locale));
304 }
305 return AddGroup(label, &config_.locale_groups, configs);
306}
307
308PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDeviceFeatureGroup(
309 const std::string& label) {
310 return AddGroup(label, &config_.device_feature_groups);
311}
312
313PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddGlTextureGroup(
314 const std::string& label) {
315 return AddGroup(label, &config_.gl_texture_groups);
316}
317
318PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAndroidSdk(
319 std::string label, int min_sdk) {
320 config_.android_sdks[label] = AndroidSdk::ForMinSdk(min_sdk);
321 return *this;
322}
323
324PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddArtifact(
325 configuration::ConfiguredArtifact artifact) {
326 config_.artifacts.push_back(std::move(artifact));
327 return *this;
328}
329
330configuration::PostProcessingConfiguration PostProcessingConfigurationBuilder::Build() {
331 return config_;
332}
333
Adam Lesinskiefeb7af2017-08-02 14:57:43 -0700334} // namespace test
335} // namespace aapt