blob: 7986329ab6405dce30bb0f8d2faf7943aa5f0c16 [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 Lesinskice5e56e2016-10-21 17:56:45 -070036 Context() = default;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070037
Adam Lesinskice5e56e2016-10-21 17:56:45 -070038 SymbolTable* GetExternalSymbols() override { return &symbols_; }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070039
Adam Lesinskice5e56e2016-10-21 17:56:45 -070040 IDiagnostics* GetDiagnostics() override { return &diagnostics_; }
41
42 const std::string& GetCompilationPackage() override {
43 CHECK(bool(compilation_package_)) << "package name not set";
44 return compilation_package_.value();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070045 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070046
Adam Lesinskice5e56e2016-10-21 17:56:45 -070047 uint8_t GetPackageId() override {
48 CHECK(bool(package_id_)) << "package ID not set";
49 return package_id_.value();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070050 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070051
Adam Lesinskice5e56e2016-10-21 17:56:45 -070052 NameMangler* GetNameMangler() override { return &name_mangler_; }
Adam Lesinski355f2852016-02-13 20:26:45 -080053
Adam Lesinskice5e56e2016-10-21 17:56:45 -070054 bool IsVerbose() override { return false; }
Adam Lesinski64587af2016-02-18 18:33:06 -080055
Adam Lesinskice5e56e2016-10-21 17:56:45 -070056 int GetMinSdkVersion() override { return min_sdk_version_; }
Adam Lesinskifb6312f2016-06-28 14:40:32 -070057
Adam Lesinskicacb28f2016-10-19 12:18:14 -070058 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070059 DISALLOW_COPY_AND_ASSIGN(Context);
60
Adam Lesinskicacb28f2016-10-19 12:18:14 -070061 friend class ContextBuilder;
Adam Lesinski64587af2016-02-18 18:33:06 -080062
Adam Lesinskice5e56e2016-10-21 17:56:45 -070063 Maybe<std::string> compilation_package_;
64 Maybe<uint8_t> package_id_;
65 StdErrDiagnostics diagnostics_;
66 SymbolTable symbols_;
67 NameMangler name_mangler_ = NameMangler({});
68 int min_sdk_version_ = 0;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070069};
70
71class ContextBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070072 public:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070073 ContextBuilder& SetCompilationPackage(const StringPiece& package) {
74 context_->compilation_package_ = package.ToString();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070075 return *this;
76 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070077
Adam Lesinskice5e56e2016-10-21 17:56:45 -070078 ContextBuilder& SetPackageId(uint8_t id) {
79 context_->package_id_ = id;
Adam Lesinskicacb28f2016-10-19 12:18:14 -070080 return *this;
81 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070082
Adam Lesinskice5e56e2016-10-21 17:56:45 -070083 ContextBuilder& SetNameManglerPolicy(const NameManglerPolicy& policy) {
84 context_->name_mangler_ = NameMangler(policy);
Adam Lesinskicacb28f2016-10-19 12:18:14 -070085 return *this;
86 }
Adam Lesinski64587af2016-02-18 18:33:06 -080087
Adam Lesinskice5e56e2016-10-21 17:56:45 -070088 ContextBuilder& AddSymbolSource(std::unique_ptr<ISymbolSource> src) {
89 context_->GetExternalSymbols()->AppendSource(std::move(src));
Adam Lesinskicacb28f2016-10-19 12:18:14 -070090 return *this;
91 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070092
Adam Lesinskice5e56e2016-10-21 17:56:45 -070093 ContextBuilder& SetMinSdkVersion(int min_sdk) {
94 context_->min_sdk_version_ = min_sdk;
Adam Lesinskicacb28f2016-10-19 12:18:14 -070095 return *this;
96 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -070097
Adam Lesinskice5e56e2016-10-21 17:56:45 -070098 std::unique_ptr<Context> Build() { return std::move(context_); }
99
100 private:
101 std::unique_ptr<Context> context_ = std::unique_ptr<Context>(new Context());
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700102};
103
Adam Lesinski64587af2016-02-18 18:33:06 -0800104class StaticSymbolSourceBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700105 public:
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700106 StaticSymbolSourceBuilder& AddPublicSymbol(
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700107 const StringPiece& name, ResourceId id,
108 std::unique_ptr<Attribute> attr = {}) {
109 std::unique_ptr<SymbolTable::Symbol> symbol =
110 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700111 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
112 symbol_source_->id_map_[id] = symbol.get();
113 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700114 return *this;
115 }
116
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700117 StaticSymbolSourceBuilder& AddSymbol(const StringPiece& name, ResourceId id,
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700118 std::unique_ptr<Attribute> attr = {}) {
119 std::unique_ptr<SymbolTable::Symbol> symbol =
120 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700121 symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get();
122 symbol_source_->id_map_[id] = symbol.get();
123 symbol_source_->symbols_.push_back(std::move(symbol));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700124 return *this;
125 }
126
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700127 std::unique_ptr<ISymbolSource> Build() { return std::move(symbol_source_); }
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700128
129 private:
130 class StaticSymbolSource : public ISymbolSource {
131 public:
132 StaticSymbolSource() = default;
133
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700134 std::unique_ptr<SymbolTable::Symbol> FindByName(
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700135 const ResourceName& name) override {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700136 auto iter = name_map_.find(name);
137 if (iter != name_map_.end()) {
138 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700139 }
140 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800141 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700142
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700143 std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override {
144 auto iter = id_map_.find(id);
145 if (iter != id_map_.end()) {
146 return CloneSymbol(iter->second);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700147 }
148 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800149 }
150
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700151 std::list<std::unique_ptr<SymbolTable::Symbol>> symbols_;
152 std::map<ResourceName, SymbolTable::Symbol*> name_map_;
153 std::map<ResourceId, SymbolTable::Symbol*> id_map_;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700154
155 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700156 std::unique_ptr<SymbolTable::Symbol> CloneSymbol(SymbolTable::Symbol* sym) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700157 std::unique_ptr<SymbolTable::Symbol> clone =
158 util::make_unique<SymbolTable::Symbol>();
159 clone->id = sym->id;
160 if (sym->attribute) {
161 clone->attribute =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700162 std::unique_ptr<Attribute>(sym->attribute->Clone(nullptr));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700163 }
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700164 clone->is_public = sym->is_public;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700165 return clone;
Adam Lesinski64587af2016-02-18 18:33:06 -0800166 }
167
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700168 DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
169 };
Adam Lesinski64587af2016-02-18 18:33:06 -0800170
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700171 std::unique_ptr<StaticSymbolSource> symbol_source_ =
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700172 util::make_unique<StaticSymbolSource>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700173};
174
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700175} // namespace test
176} // namespace aapt
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700177
178#endif /* AAPT_TEST_CONTEXT_H */