blob: 36f568be4069225f7207ef1fb9533207e5d005f8 [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
20#include "NameMangler.h"
21#include "util/Util.h"
22
23#include "process/IResourceTableConsumer.h"
24#include "process/SymbolTable.h"
25#include "test/Common.h"
26
27#include <cassert>
28#include <list>
29
30namespace aapt {
31namespace test {
32
33class Context : public IAaptContext {
Adam Lesinski1ab598f2015-08-14 14:26:04 -070034public:
Adam Lesinski64587af2016-02-18 18:33:06 -080035 SymbolTable* getExternalSymbols() override {
36 return &mSymbols;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070037 }
38
39 IDiagnostics* getDiagnostics() override {
Adam Lesinski64587af2016-02-18 18:33:06 -080040 return &mDiagnostics;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070041 }
42
Adam Lesinski64587af2016-02-18 18:33:06 -080043 const std::u16string& getCompilationPackage() override {
Adam Lesinski1ab598f2015-08-14 14:26:04 -070044 assert(mCompilationPackage && "package name not set");
45 return mCompilationPackage.value();
46 }
47
48 uint8_t getPackageId() override {
49 assert(mPackageId && "package ID not set");
50 return mPackageId.value();
51 }
52
53 NameMangler* getNameMangler() override {
Adam Lesinski64587af2016-02-18 18:33:06 -080054 return &mNameMangler;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070055 }
Adam Lesinski355f2852016-02-13 20:26:45 -080056
57 bool verbose() override {
58 return false;
59 }
Adam Lesinski64587af2016-02-18 18:33:06 -080060
Adam Lesinskifb6312f2016-06-28 14:40:32 -070061 int getMinSdkVersion() override {
62 return mMinSdkVersion;
63 }
64
Adam Lesinski64587af2016-02-18 18:33:06 -080065private:
66 friend class ContextBuilder;
67
Adam Lesinski64587af2016-02-18 18:33:06 -080068 Maybe<std::u16string> mCompilationPackage;
69 Maybe<uint8_t> mPackageId;
70 StdErrDiagnostics mDiagnostics;
71 SymbolTable mSymbols;
Adam Lesinskifb6312f2016-06-28 14:40:32 -070072 NameMangler mNameMangler = NameMangler({});
73 int mMinSdkVersion = 0;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070074};
75
76class ContextBuilder {
77private:
78 std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
79
80public:
81 ContextBuilder& setCompilationPackage(const StringPiece16& package) {
82 mContext->mCompilationPackage = package.toString();
83 return *this;
84 }
85
86 ContextBuilder& setPackageId(uint8_t id) {
87 mContext->mPackageId = id;
88 return *this;
89 }
90
Adam Lesinski1ab598f2015-08-14 14:26:04 -070091 ContextBuilder& setNameManglerPolicy(NameManglerPolicy policy) {
Adam Lesinski64587af2016-02-18 18:33:06 -080092 mContext->mNameMangler = NameMangler(policy);
93 return *this;
94 }
95
96 ContextBuilder& addSymbolSource(std::unique_ptr<ISymbolSource> src) {
97 mContext->getExternalSymbols()->appendSource(std::move(src));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070098 return *this;
99 }
100
Adam Lesinskifb6312f2016-06-28 14:40:32 -0700101 ContextBuilder& setMinSdkVersion(int minSdk) {
102 mContext->mMinSdkVersion = minSdk;
103 return *this;
104 }
105
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700106 std::unique_ptr<Context> build() {
107 return std::move(mContext);
108 }
109};
110
Adam Lesinski64587af2016-02-18 18:33:06 -0800111class StaticSymbolSourceBuilder {
112public:
113 StaticSymbolSourceBuilder& addPublicSymbol(const StringPiece16& name, ResourceId id,
114 std::unique_ptr<Attribute> attr = {}) {
115 std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
116 id, std::move(attr), true);
117 mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
118 mSymbolSource->mIdMap[id] = symbol.get();
119 mSymbolSource->mSymbols.push_back(std::move(symbol));
120 return *this;
121 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700122
Adam Lesinski64587af2016-02-18 18:33:06 -0800123 StaticSymbolSourceBuilder& addSymbol(const StringPiece16& name, ResourceId id,
124 std::unique_ptr<Attribute> attr = {}) {
125 std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
126 id, std::move(attr), false);
127 mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
128 mSymbolSource->mIdMap[id] = symbol.get();
129 mSymbolSource->mSymbols.push_back(std::move(symbol));
130 return *this;
131 }
132
133 std::unique_ptr<ISymbolSource> build() {
134 return std::move(mSymbolSource);
135 }
136
137private:
138 class StaticSymbolSource : public ISymbolSource {
139 public:
140 StaticSymbolSource() = default;
141
142 std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override {
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700143 auto iter = mNameMap.find(name);
144 if (iter != mNameMap.end()) {
Adam Lesinski64587af2016-02-18 18:33:06 -0800145 return cloneSymbol(iter->second);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700146 }
147 return nullptr;
148 }
149
Adam Lesinski64587af2016-02-18 18:33:06 -0800150 std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700151 auto iter = mIdMap.find(id);
152 if (iter != mIdMap.end()) {
Adam Lesinski64587af2016-02-18 18:33:06 -0800153 return cloneSymbol(iter->second);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700154 }
155 return nullptr;
156 }
Adam Lesinski64587af2016-02-18 18:33:06 -0800157
158 std::list<std::unique_ptr<SymbolTable::Symbol>> mSymbols;
159 std::map<ResourceName, SymbolTable::Symbol*> mNameMap;
160 std::map<ResourceId, SymbolTable::Symbol*> mIdMap;
161
162 private:
163 std::unique_ptr<SymbolTable::Symbol> cloneSymbol(SymbolTable::Symbol* sym) {
164 std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
165 clone->id = sym->id;
166 if (sym->attribute) {
167 clone->attribute = std::unique_ptr<Attribute>(sym->attribute->clone(nullptr));
168 }
169 clone->isPublic = sym->isPublic;
170 return clone;
171 }
172
173 DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700174 };
175
Adam Lesinski64587af2016-02-18 18:33:06 -0800176 std::unique_ptr<StaticSymbolSource> mSymbolSource = util::make_unique<StaticSymbolSource>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700177};
178
179} // namespace test
180} // namespace aapt
181
182#endif /* AAPT_TEST_CONTEXT_H */