blob: 553c43e6c4694632f9ab4409c97fc9497a36532c [file] [log] [blame]
Adam Lesinski1ab598f2015-08-14 14:26:04 -07001/*
2 * Copyright (C) 2015 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#ifndef AAPT_TEST_CONTEXT_H
18#define AAPT_TEST_CONTEXT_H
19
Adam Lesinskice5e56e2016-10-21 17:56:45 -070020#include <list>
21
22#include "android-base/logging.h"
23#include "android-base/macros.h"
24
Adam Lesinski1ab598f2015-08-14 14:26:04 -070025#include "NameMangler.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070026#include "process/IResourceTableConsumer.h"
27#include "process/SymbolTable.h"
28#include "test/Common.h"
Adam Lesinskicacb28f2016-10-19 12:18:14 -070029#include "util/Util.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070030
Adam Lesinski1ab598f2015-08-14 14:26:04 -070031namespace aapt {
32namespace test {
33
34class Context : public IAaptContext {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070035 public:
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -080036 Context() : name_mangler_({}), symbols_(&name_mangler_), min_sdk_version_(0) {}
Adam Lesinski1ab598f2015-08-14 14:26:04 -070037
Adam Lesinskib522f042017-04-21 16:57:59 -070038 PackageType GetPackageType() override {
39 return package_type_;
40 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070041
Adam Lesinskib522f042017-04-21 16:57:59 -070042 SymbolTable* GetExternalSymbols() override {
43 return &symbols_;
44 }
45
46 IDiagnostics* GetDiagnostics() override {
47 return &diagnostics_;
48 }
Adam Lesinskice5e56e2016-10-21 17:56:45 -070049
50 const std::string& GetCompilationPackage() override {
51 CHECK(bool(compilation_package_)) << "package name not set";
52 return compilation_package_.value();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070053 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070054
Adam Lesinski4ca56972017-04-26 21:49:53 -070055 void SetCompilationPackage(const android::StringPiece& package) {
56 compilation_package_ = package.to_string();
57 }
58
Adam Lesinskice5e56e2016-10-21 17:56:45 -070059 uint8_t GetPackageId() override {
60 CHECK(bool(package_id_)) << "package ID not set";
61 return package_id_.value();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070062 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070063
Adam Lesinski4ca56972017-04-26 21:49:53 -070064 void SetPackageId(uint8_t package_id) {
65 package_id_ = package_id;
66 }
67
Adam Lesinskib522f042017-04-21 16:57:59 -070068 NameMangler* GetNameMangler() override {
69 return &name_mangler_;
70 }
Adam Lesinski355f2852016-02-13 20:26:45 -080071
Adam Lesinski4ca56972017-04-26 21:49:53 -070072 void SetNameManglerPolicy(const NameManglerPolicy& policy) {
73 name_mangler_ = NameMangler(policy);
74 }
75
Adam Lesinskib522f042017-04-21 16:57:59 -070076 bool IsVerbose() override {
77 return false;
78 }
Adam Lesinski64587af2016-02-18 18:33:06 -080079
Adam Lesinskib522f042017-04-21 16:57:59 -070080 int GetMinSdkVersion() override {
81 return min_sdk_version_;
82 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -070083
Ryan Mitchell4d5833e2019-09-04 02:46:03 -070084 void SetMinSdkVersion(int min_sdk_version) {
85 min_sdk_version_ = min_sdk_version;
86 }
87
Udam Sainib228df32019-06-18 16:50:34 -070088 const std::set<std::string>& GetSplitNameDependencies() override {
89 return split_name_dependencies_;
90 }
91
Adam Lesinskicacb28f2016-10-19 12:18:14 -070092 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070093 DISALLOW_COPY_AND_ASSIGN(Context);
94
Adam Lesinskicacb28f2016-10-19 12:18:14 -070095 friend class ContextBuilder;
Adam Lesinski64587af2016-02-18 18:33:06 -080096
Adam Lesinskib522f042017-04-21 16:57:59 -070097 PackageType package_type_ = PackageType::kApp;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070098 Maybe<std::string> compilation_package_;
99 Maybe<uint8_t> package_id_;
100 StdErrDiagnostics diagnostics_;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800101 NameMangler name_mangler_;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700102 SymbolTable symbols_;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800103 int min_sdk_version_;
Udam Sainib228df32019-06-18 16:50:34 -0700104 std::set<std::string> split_name_dependencies_;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700105};
106
107class ContextBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700108 public:
Adam Lesinskib522f042017-04-21 16:57:59 -0700109 ContextBuilder& SetPackageType(PackageType type) {
110 context_->package_type_ = type;
111 return *this;
112 }
113
Adam Lesinskid5083f62017-01-16 15:07:21 -0800114 ContextBuilder& SetCompilationPackage(const android::StringPiece& package) {
115 context_->compilation_package_ = package.to_string();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700116 return *this;
117 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700118
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700119 ContextBuilder& SetPackageId(uint8_t id) {
120 context_->package_id_ = id;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700121 return *this;
122 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700123
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700124 ContextBuilder& SetNameManglerPolicy(const NameManglerPolicy& policy) {
125 context_->name_mangler_ = NameMangler(policy);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700126 return *this;
127 }
Adam Lesinski64587af2016-02-18 18:33:06 -0800128
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700129 ContextBuilder& AddSymbolSource(std::unique_ptr<ISymbolSource> src) {
130 context_->GetExternalSymbols()->AppendSource(std::move(src));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700131 return *this;
132 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700133
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700134 ContextBuilder& SetMinSdkVersion(int min_sdk) {
135 context_->min_sdk_version_ = min_sdk;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700136 return *this;
137 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -0700138
Udam Sainib228df32019-06-18 16:50:34 -0700139 ContextBuilder& SetSplitNameDependencies(const std::set<std::string>& split_name_dependencies) {
140 context_->split_name_dependencies_ = split_name_dependencies;
141 return *this;
142 }
143
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700144 std::unique_ptr<Context> Build() { return std::move(context_); }
145
146 private:
147 std::unique_ptr<Context> context_ = std::unique_ptr<Context>(new Context());
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700148};
149
Adam Lesinski64587af2016-02-18 18:33:06 -0800150class StaticSymbolSourceBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700151 public:
Adam Lesinskid5083f62017-01-16 15:07:21 -0800152 StaticSymbolSourceBuilder& AddPublicSymbol(const android::StringPiece& name, ResourceId id,
153 std::unique_ptr<Attribute> attr = {}) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700154 std::unique_ptr<SymbolTable::Symbol> symbol =
155 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700156 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
157 symbol_source_->id_map_[id] = symbol.get();
158 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700159 return *this;
160 }
161
Adam Lesinskid5083f62017-01-16 15:07:21 -0800162 StaticSymbolSourceBuilder& AddSymbol(const android::StringPiece& name, ResourceId id,
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700163 std::unique_ptr<Attribute> attr = {}) {
164 std::unique_ptr<SymbolTable::Symbol> symbol =
165 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700166 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
167 symbol_source_->id_map_[id] = symbol.get();
168 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700169 return *this;
170 }
171
Adam Lesinskib522f042017-04-21 16:57:59 -0700172 std::unique_ptr<ISymbolSource> Build() {
173 return std::move(symbol_source_);
174 }
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700175
176 private:
177 class StaticSymbolSource : public ISymbolSource {
178 public:
179 StaticSymbolSource() = default;
180
Adam Lesinskib522f042017-04-21 16:57:59 -0700181 std::unique_ptr<SymbolTable::Symbol> FindByName(const ResourceName& name) override {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700182 auto iter = name_map_.find(name);
183 if (iter != name_map_.end()) {
184 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700185 }
186 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800187 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700188
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700189 std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override {
190 auto iter = id_map_.find(id);
191 if (iter != id_map_.end()) {
192 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700193 }
194 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800195 }
196
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700197 std::list<std::unique_ptr<SymbolTable::Symbol>> symbols_;
198 std::map<ResourceName, SymbolTable::Symbol*> name_map_;
199 std::map<ResourceId, SymbolTable::Symbol*> id_map_;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700200
201 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700202 std::unique_ptr<SymbolTable::Symbol> CloneSymbol(SymbolTable::Symbol* sym) {
Adam Lesinskib522f042017-04-21 16:57:59 -0700203 std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700204 clone->id = sym->id;
205 if (sym->attribute) {
Adam Lesinskib522f042017-04-21 16:57:59 -0700206 clone->attribute = std::unique_ptr<Attribute>(sym->attribute->Clone(nullptr));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700207 }
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700208 clone->is_public = sym->is_public;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700209 return clone;
Adam Lesinski64587af2016-02-18 18:33:06 -0800210 }
211
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700212 DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
213 };
Adam Lesinski64587af2016-02-18 18:33:06 -0800214
Adam Lesinskib522f042017-04-21 16:57:59 -0700215 std::unique_ptr<StaticSymbolSource> symbol_source_ = util::make_unique<StaticSymbolSource>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700216};
217
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700218} // namespace test
219} // namespace aapt
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700220
221#endif /* AAPT_TEST_CONTEXT_H */