blob: 54f16db3d2f906fa0b3eb87afa7662c87caa84b6 [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"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070022#include "process/IResourceTableConsumer.h"
23#include "process/SymbolTable.h"
24#include "test/Common.h"
25
26#include <cassert>
27#include <list>
28
29namespace aapt {
30namespace test {
31
32class Context : public IAaptContext {
Adam Lesinski1ab598f2015-08-14 14:26:04 -070033public:
Adam Lesinski64587af2016-02-18 18:33:06 -080034 SymbolTable* getExternalSymbols() override {
35 return &mSymbols;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070036 }
37
38 IDiagnostics* getDiagnostics() override {
Adam Lesinski64587af2016-02-18 18:33:06 -080039 return &mDiagnostics;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070040 }
41
Adam Lesinskid0f116b2016-07-08 15:00:32 -070042 const std::string& getCompilationPackage() override {
Adam Lesinski1ab598f2015-08-14 14:26:04 -070043 assert(mCompilationPackage && "package name not set");
44 return mCompilationPackage.value();
45 }
46
47 uint8_t getPackageId() override {
48 assert(mPackageId && "package ID not set");
49 return mPackageId.value();
50 }
51
52 NameMangler* getNameMangler() override {
Adam Lesinski64587af2016-02-18 18:33:06 -080053 return &mNameMangler;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070054 }
Adam Lesinski355f2852016-02-13 20:26:45 -080055
56 bool verbose() override {
57 return false;
58 }
Adam Lesinski64587af2016-02-18 18:33:06 -080059
Adam Lesinskifb6312f2016-06-28 14:40:32 -070060 int getMinSdkVersion() override {
61 return mMinSdkVersion;
62 }
63
Adam Lesinski64587af2016-02-18 18:33:06 -080064private:
65 friend class ContextBuilder;
66
Adam Lesinskid0f116b2016-07-08 15:00:32 -070067 Maybe<std::string> mCompilationPackage;
Adam Lesinski64587af2016-02-18 18:33:06 -080068 Maybe<uint8_t> mPackageId;
69 StdErrDiagnostics mDiagnostics;
70 SymbolTable mSymbols;
Adam Lesinskifb6312f2016-06-28 14:40:32 -070071 NameMangler mNameMangler = NameMangler({});
72 int mMinSdkVersion = 0;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070073};
74
75class ContextBuilder {
76private:
77 std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
78
79public:
Adam Lesinskid0f116b2016-07-08 15:00:32 -070080 ContextBuilder& setCompilationPackage(const StringPiece& package) {
Adam Lesinski1ab598f2015-08-14 14:26:04 -070081 mContext->mCompilationPackage = package.toString();
82 return *this;
83 }
84
85 ContextBuilder& setPackageId(uint8_t id) {
86 mContext->mPackageId = id;
87 return *this;
88 }
89
Chih-Hung Hsieh470f8fc2016-08-15 12:32:51 -070090 ContextBuilder& setNameManglerPolicy(const NameManglerPolicy& policy) {
Adam Lesinski64587af2016-02-18 18:33:06 -080091 mContext->mNameMangler = NameMangler(policy);
92 return *this;
93 }
94
95 ContextBuilder& addSymbolSource(std::unique_ptr<ISymbolSource> src) {
96 mContext->getExternalSymbols()->appendSource(std::move(src));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070097 return *this;
98 }
99
Adam Lesinskifb6312f2016-06-28 14:40:32 -0700100 ContextBuilder& setMinSdkVersion(int minSdk) {
101 mContext->mMinSdkVersion = minSdk;
102 return *this;
103 }
104
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700105 std::unique_ptr<Context> build() {
106 return std::move(mContext);
107 }
108};
109
Adam Lesinski64587af2016-02-18 18:33:06 -0800110class StaticSymbolSourceBuilder {
111public:
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700112 StaticSymbolSourceBuilder& addPublicSymbol(const StringPiece& name, ResourceId id,
Adam Lesinski64587af2016-02-18 18:33:06 -0800113 std::unique_ptr<Attribute> attr = {}) {
114 std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
115 id, std::move(attr), true);
116 mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
117 mSymbolSource->mIdMap[id] = symbol.get();
118 mSymbolSource->mSymbols.push_back(std::move(symbol));
119 return *this;
120 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700121
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700122 StaticSymbolSourceBuilder& addSymbol(const StringPiece& name, ResourceId id,
Adam Lesinski64587af2016-02-18 18:33:06 -0800123 std::unique_ptr<Attribute> attr = {}) {
124 std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
125 id, std::move(attr), false);
126 mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
127 mSymbolSource->mIdMap[id] = symbol.get();
128 mSymbolSource->mSymbols.push_back(std::move(symbol));
129 return *this;
130 }
131
132 std::unique_ptr<ISymbolSource> build() {
133 return std::move(mSymbolSource);
134 }
135
136private:
137 class StaticSymbolSource : public ISymbolSource {
138 public:
139 StaticSymbolSource() = default;
140
141 std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override {
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700142 auto iter = mNameMap.find(name);
143 if (iter != mNameMap.end()) {
Adam Lesinski64587af2016-02-18 18:33:06 -0800144 return cloneSymbol(iter->second);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700145 }
146 return nullptr;
147 }
148
Adam Lesinski64587af2016-02-18 18:33:06 -0800149 std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700150 auto iter = mIdMap.find(id);
151 if (iter != mIdMap.end()) {
Adam Lesinski64587af2016-02-18 18:33:06 -0800152 return cloneSymbol(iter->second);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700153 }
154 return nullptr;
155 }
Adam Lesinski64587af2016-02-18 18:33:06 -0800156
157 std::list<std::unique_ptr<SymbolTable::Symbol>> mSymbols;
158 std::map<ResourceName, SymbolTable::Symbol*> mNameMap;
159 std::map<ResourceId, SymbolTable::Symbol*> mIdMap;
160
161 private:
162 std::unique_ptr<SymbolTable::Symbol> cloneSymbol(SymbolTable::Symbol* sym) {
163 std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
164 clone->id = sym->id;
165 if (sym->attribute) {
166 clone->attribute = std::unique_ptr<Attribute>(sym->attribute->clone(nullptr));
167 }
168 clone->isPublic = sym->isPublic;
169 return clone;
170 }
171
172 DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700173 };
174
Adam Lesinski64587af2016-02-18 18:33:06 -0800175 std::unique_ptr<StaticSymbolSource> mSymbolSource = util::make_unique<StaticSymbolSource>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700176};
177
178} // namespace test
179} // namespace aapt
180
181#endif /* AAPT_TEST_CONTEXT_H */