blob: 0564db063b9a4c7fa40127ff59fb8aac7849a757 [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
Adam Lesinskicacb28f2016-10-19 12:18:14 -070084 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070085 DISALLOW_COPY_AND_ASSIGN(Context);
86
Adam Lesinskicacb28f2016-10-19 12:18:14 -070087 friend class ContextBuilder;
Adam Lesinski64587af2016-02-18 18:33:06 -080088
Adam Lesinskib522f042017-04-21 16:57:59 -070089 PackageType package_type_ = PackageType::kApp;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070090 Maybe<std::string> compilation_package_;
91 Maybe<uint8_t> package_id_;
92 StdErrDiagnostics diagnostics_;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -080093 NameMangler name_mangler_;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070094 SymbolTable symbols_;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -080095 int min_sdk_version_;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070096};
97
98class ContextBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070099 public:
Adam Lesinskib522f042017-04-21 16:57:59 -0700100 ContextBuilder& SetPackageType(PackageType type) {
101 context_->package_type_ = type;
102 return *this;
103 }
104
Adam Lesinskid5083f62017-01-16 15:07:21 -0800105 ContextBuilder& SetCompilationPackage(const android::StringPiece& package) {
106 context_->compilation_package_ = package.to_string();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700107 return *this;
108 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700109
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700110 ContextBuilder& SetPackageId(uint8_t id) {
111 context_->package_id_ = id;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700112 return *this;
113 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700114
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700115 ContextBuilder& SetNameManglerPolicy(const NameManglerPolicy& policy) {
116 context_->name_mangler_ = NameMangler(policy);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700117 return *this;
118 }
Adam Lesinski64587af2016-02-18 18:33:06 -0800119
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700120 ContextBuilder& AddSymbolSource(std::unique_ptr<ISymbolSource> src) {
121 context_->GetExternalSymbols()->AppendSource(std::move(src));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700122 return *this;
123 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700124
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700125 ContextBuilder& SetMinSdkVersion(int min_sdk) {
126 context_->min_sdk_version_ = min_sdk;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700127 return *this;
128 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -0700129
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700130 std::unique_ptr<Context> Build() { return std::move(context_); }
131
132 private:
133 std::unique_ptr<Context> context_ = std::unique_ptr<Context>(new Context());
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700134};
135
Adam Lesinski64587af2016-02-18 18:33:06 -0800136class StaticSymbolSourceBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700137 public:
Adam Lesinskid5083f62017-01-16 15:07:21 -0800138 StaticSymbolSourceBuilder& AddPublicSymbol(const android::StringPiece& name, ResourceId id,
139 std::unique_ptr<Attribute> attr = {}) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700140 std::unique_ptr<SymbolTable::Symbol> symbol =
141 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700142 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
143 symbol_source_->id_map_[id] = symbol.get();
144 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700145 return *this;
146 }
147
Adam Lesinskid5083f62017-01-16 15:07:21 -0800148 StaticSymbolSourceBuilder& AddSymbol(const android::StringPiece& name, ResourceId id,
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700149 std::unique_ptr<Attribute> attr = {}) {
150 std::unique_ptr<SymbolTable::Symbol> symbol =
151 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700152 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
153 symbol_source_->id_map_[id] = symbol.get();
154 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700155 return *this;
156 }
157
Adam Lesinskib522f042017-04-21 16:57:59 -0700158 std::unique_ptr<ISymbolSource> Build() {
159 return std::move(symbol_source_);
160 }
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700161
162 private:
163 class StaticSymbolSource : public ISymbolSource {
164 public:
165 StaticSymbolSource() = default;
166
Adam Lesinskib522f042017-04-21 16:57:59 -0700167 std::unique_ptr<SymbolTable::Symbol> FindByName(const ResourceName& name) override {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700168 auto iter = name_map_.find(name);
169 if (iter != name_map_.end()) {
170 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700171 }
172 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800173 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700174
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700175 std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override {
176 auto iter = id_map_.find(id);
177 if (iter != id_map_.end()) {
178 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700179 }
180 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800181 }
182
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700183 std::list<std::unique_ptr<SymbolTable::Symbol>> symbols_;
184 std::map<ResourceName, SymbolTable::Symbol*> name_map_;
185 std::map<ResourceId, SymbolTable::Symbol*> id_map_;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700186
187 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700188 std::unique_ptr<SymbolTable::Symbol> CloneSymbol(SymbolTable::Symbol* sym) {
Adam Lesinskib522f042017-04-21 16:57:59 -0700189 std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700190 clone->id = sym->id;
191 if (sym->attribute) {
Adam Lesinskib522f042017-04-21 16:57:59 -0700192 clone->attribute = std::unique_ptr<Attribute>(sym->attribute->Clone(nullptr));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700193 }
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700194 clone->is_public = sym->is_public;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700195 return clone;
Adam Lesinski64587af2016-02-18 18:33:06 -0800196 }
197
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700198 DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
199 };
Adam Lesinski64587af2016-02-18 18:33:06 -0800200
Adam Lesinskib522f042017-04-21 16:57:59 -0700201 std::unique_ptr<StaticSymbolSource> symbol_source_ = util::make_unique<StaticSymbolSource>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700202};
203
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700204} // namespace test
205} // namespace aapt
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700206
207#endif /* AAPT_TEST_CONTEXT_H */