blob: 29d183876c4c27f065f93a82190c857159d04644 [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 Lesinskice5e56e2016-10-21 17:56:45 -070055 uint8_t GetPackageId() override {
56 CHECK(bool(package_id_)) << "package ID not set";
57 return package_id_.value();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070058 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070059
Adam Lesinskib522f042017-04-21 16:57:59 -070060 NameMangler* GetNameMangler() override {
61 return &name_mangler_;
62 }
Adam Lesinski355f2852016-02-13 20:26:45 -080063
Adam Lesinskib522f042017-04-21 16:57:59 -070064 bool IsVerbose() override {
65 return false;
66 }
Adam Lesinski64587af2016-02-18 18:33:06 -080067
Adam Lesinskib522f042017-04-21 16:57:59 -070068 int GetMinSdkVersion() override {
69 return min_sdk_version_;
70 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -070071
Adam Lesinskicacb28f2016-10-19 12:18:14 -070072 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070073 DISALLOW_COPY_AND_ASSIGN(Context);
74
Adam Lesinskicacb28f2016-10-19 12:18:14 -070075 friend class ContextBuilder;
Adam Lesinski64587af2016-02-18 18:33:06 -080076
Adam Lesinskib522f042017-04-21 16:57:59 -070077 PackageType package_type_ = PackageType::kApp;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070078 Maybe<std::string> compilation_package_;
79 Maybe<uint8_t> package_id_;
80 StdErrDiagnostics diagnostics_;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -080081 NameMangler name_mangler_;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070082 SymbolTable symbols_;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -080083 int min_sdk_version_;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070084};
85
86class ContextBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070087 public:
Adam Lesinskib522f042017-04-21 16:57:59 -070088 ContextBuilder& SetPackageType(PackageType type) {
89 context_->package_type_ = type;
90 return *this;
91 }
92
Adam Lesinskid5083f62017-01-16 15:07:21 -080093 ContextBuilder& SetCompilationPackage(const android::StringPiece& package) {
94 context_->compilation_package_ = package.to_string();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070095 return *this;
96 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070097
Adam Lesinskice5e56e2016-10-21 17:56:45 -070098 ContextBuilder& SetPackageId(uint8_t id) {
99 context_->package_id_ = id;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700100 return *this;
101 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700102
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700103 ContextBuilder& SetNameManglerPolicy(const NameManglerPolicy& policy) {
104 context_->name_mangler_ = NameMangler(policy);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700105 return *this;
106 }
Adam Lesinski64587af2016-02-18 18:33:06 -0800107
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700108 ContextBuilder& AddSymbolSource(std::unique_ptr<ISymbolSource> src) {
109 context_->GetExternalSymbols()->AppendSource(std::move(src));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700110 return *this;
111 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700112
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700113 ContextBuilder& SetMinSdkVersion(int min_sdk) {
114 context_->min_sdk_version_ = min_sdk;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700115 return *this;
116 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -0700117
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700118 std::unique_ptr<Context> Build() { return std::move(context_); }
119
120 private:
121 std::unique_ptr<Context> context_ = std::unique_ptr<Context>(new Context());
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700122};
123
Adam Lesinski64587af2016-02-18 18:33:06 -0800124class StaticSymbolSourceBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700125 public:
Adam Lesinskid5083f62017-01-16 15:07:21 -0800126 StaticSymbolSourceBuilder& AddPublicSymbol(const android::StringPiece& name, ResourceId id,
127 std::unique_ptr<Attribute> attr = {}) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700128 std::unique_ptr<SymbolTable::Symbol> symbol =
129 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700130 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
131 symbol_source_->id_map_[id] = symbol.get();
132 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700133 return *this;
134 }
135
Adam Lesinskid5083f62017-01-16 15:07:21 -0800136 StaticSymbolSourceBuilder& AddSymbol(const android::StringPiece& name, ResourceId id,
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700137 std::unique_ptr<Attribute> attr = {}) {
138 std::unique_ptr<SymbolTable::Symbol> symbol =
139 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700140 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
141 symbol_source_->id_map_[id] = symbol.get();
142 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700143 return *this;
144 }
145
Adam Lesinskib522f042017-04-21 16:57:59 -0700146 std::unique_ptr<ISymbolSource> Build() {
147 return std::move(symbol_source_);
148 }
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700149
150 private:
151 class StaticSymbolSource : public ISymbolSource {
152 public:
153 StaticSymbolSource() = default;
154
Adam Lesinskib522f042017-04-21 16:57:59 -0700155 std::unique_ptr<SymbolTable::Symbol> FindByName(const ResourceName& name) override {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700156 auto iter = name_map_.find(name);
157 if (iter != name_map_.end()) {
158 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700159 }
160 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800161 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700162
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700163 std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override {
164 auto iter = id_map_.find(id);
165 if (iter != id_map_.end()) {
166 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700167 }
168 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800169 }
170
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700171 std::list<std::unique_ptr<SymbolTable::Symbol>> symbols_;
172 std::map<ResourceName, SymbolTable::Symbol*> name_map_;
173 std::map<ResourceId, SymbolTable::Symbol*> id_map_;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700174
175 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700176 std::unique_ptr<SymbolTable::Symbol> CloneSymbol(SymbolTable::Symbol* sym) {
Adam Lesinskib522f042017-04-21 16:57:59 -0700177 std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700178 clone->id = sym->id;
179 if (sym->attribute) {
Adam Lesinskib522f042017-04-21 16:57:59 -0700180 clone->attribute = std::unique_ptr<Attribute>(sym->attribute->Clone(nullptr));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700181 }
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700182 clone->is_public = sym->is_public;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700183 return clone;
Adam Lesinski64587af2016-02-18 18:33:06 -0800184 }
185
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700186 DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
187 };
Adam Lesinski64587af2016-02-18 18:33:06 -0800188
Adam Lesinskib522f042017-04-21 16:57:59 -0700189 std::unique_ptr<StaticSymbolSource> symbol_source_ = util::make_unique<StaticSymbolSource>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700190};
191
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700192} // namespace test
193} // namespace aapt
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700194
195#endif /* AAPT_TEST_CONTEXT_H */