blob: 6c7f6f78a71d0bacf04d3f6f3188d5e6501a59b0 [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"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070021#include "process/IResourceTableConsumer.h"
22#include "process/SymbolTable.h"
23#include "test/Common.h"
Adam Lesinskicacb28f2016-10-19 12:18:14 -070024#include "util/Util.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070025
26#include <cassert>
27#include <list>
28
29namespace aapt {
30namespace test {
31
32class Context : public IAaptContext {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070033 public:
34 SymbolTable* getExternalSymbols() override { return &mSymbols; }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070035
Adam Lesinskicacb28f2016-10-19 12:18:14 -070036 IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070037
Adam Lesinskicacb28f2016-10-19 12:18:14 -070038 const std::string& getCompilationPackage() override {
39 assert(mCompilationPackage && "package name not set");
40 return mCompilationPackage.value();
41 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070042
Adam Lesinskicacb28f2016-10-19 12:18:14 -070043 uint8_t getPackageId() override {
44 assert(mPackageId && "package ID not set");
45 return mPackageId.value();
46 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070047
Adam Lesinskicacb28f2016-10-19 12:18:14 -070048 NameMangler* getNameMangler() override { return &mNameMangler; }
Adam Lesinski355f2852016-02-13 20:26:45 -080049
Adam Lesinskicacb28f2016-10-19 12:18:14 -070050 bool verbose() override { return false; }
Adam Lesinski64587af2016-02-18 18:33:06 -080051
Adam Lesinskicacb28f2016-10-19 12:18:14 -070052 int getMinSdkVersion() override { return mMinSdkVersion; }
Adam Lesinskifb6312f2016-06-28 14:40:32 -070053
Adam Lesinskicacb28f2016-10-19 12:18:14 -070054 private:
55 friend class ContextBuilder;
Adam Lesinski64587af2016-02-18 18:33:06 -080056
Adam Lesinskicacb28f2016-10-19 12:18:14 -070057 Maybe<std::string> mCompilationPackage;
58 Maybe<uint8_t> mPackageId;
59 StdErrDiagnostics mDiagnostics;
60 SymbolTable mSymbols;
61 NameMangler mNameMangler = NameMangler({});
62 int mMinSdkVersion = 0;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070063};
64
65class ContextBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070066 private:
67 std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070068
Adam Lesinskicacb28f2016-10-19 12:18:14 -070069 public:
70 ContextBuilder& setCompilationPackage(const StringPiece& package) {
71 mContext->mCompilationPackage = package.toString();
72 return *this;
73 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070074
Adam Lesinskicacb28f2016-10-19 12:18:14 -070075 ContextBuilder& setPackageId(uint8_t id) {
76 mContext->mPackageId = id;
77 return *this;
78 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070079
Adam Lesinskicacb28f2016-10-19 12:18:14 -070080 ContextBuilder& setNameManglerPolicy(const NameManglerPolicy& policy) {
81 mContext->mNameMangler = NameMangler(policy);
82 return *this;
83 }
Adam Lesinski64587af2016-02-18 18:33:06 -080084
Adam Lesinskicacb28f2016-10-19 12:18:14 -070085 ContextBuilder& addSymbolSource(std::unique_ptr<ISymbolSource> src) {
86 mContext->getExternalSymbols()->appendSource(std::move(src));
87 return *this;
88 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070089
Adam Lesinskicacb28f2016-10-19 12:18:14 -070090 ContextBuilder& setMinSdkVersion(int minSdk) {
91 mContext->mMinSdkVersion = minSdk;
92 return *this;
93 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -070094
Adam Lesinskicacb28f2016-10-19 12:18:14 -070095 std::unique_ptr<Context> build() { return std::move(mContext); }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070096};
97
Adam Lesinski64587af2016-02-18 18:33:06 -080098class StaticSymbolSourceBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070099 public:
100 StaticSymbolSourceBuilder& addPublicSymbol(
101 const StringPiece& name, ResourceId id,
102 std::unique_ptr<Attribute> attr = {}) {
103 std::unique_ptr<SymbolTable::Symbol> symbol =
104 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true);
105 mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
106 mSymbolSource->mIdMap[id] = symbol.get();
107 mSymbolSource->mSymbols.push_back(std::move(symbol));
108 return *this;
109 }
110
111 StaticSymbolSourceBuilder& addSymbol(const StringPiece& name, ResourceId id,
112 std::unique_ptr<Attribute> attr = {}) {
113 std::unique_ptr<SymbolTable::Symbol> symbol =
114 util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false);
115 mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
116 mSymbolSource->mIdMap[id] = symbol.get();
117 mSymbolSource->mSymbols.push_back(std::move(symbol));
118 return *this;
119 }
120
121 std::unique_ptr<ISymbolSource> build() { return std::move(mSymbolSource); }
122
123 private:
124 class StaticSymbolSource : public ISymbolSource {
125 public:
126 StaticSymbolSource() = default;
127
128 std::unique_ptr<SymbolTable::Symbol> findByName(
129 const ResourceName& name) override {
130 auto iter = mNameMap.find(name);
131 if (iter != mNameMap.end()) {
132 return cloneSymbol(iter->second);
133 }
134 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800135 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700136
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700137 std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
138 auto iter = mIdMap.find(id);
139 if (iter != mIdMap.end()) {
140 return cloneSymbol(iter->second);
141 }
142 return nullptr;
Adam Lesinski64587af2016-02-18 18:33:06 -0800143 }
144
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700145 std::list<std::unique_ptr<SymbolTable::Symbol>> mSymbols;
146 std::map<ResourceName, SymbolTable::Symbol*> mNameMap;
147 std::map<ResourceId, SymbolTable::Symbol*> mIdMap;
148
149 private:
150 std::unique_ptr<SymbolTable::Symbol> cloneSymbol(SymbolTable::Symbol* sym) {
151 std::unique_ptr<SymbolTable::Symbol> clone =
152 util::make_unique<SymbolTable::Symbol>();
153 clone->id = sym->id;
154 if (sym->attribute) {
155 clone->attribute =
156 std::unique_ptr<Attribute>(sym->attribute->clone(nullptr));
157 }
158 clone->isPublic = sym->isPublic;
159 return clone;
Adam Lesinski64587af2016-02-18 18:33:06 -0800160 }
161
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700162 DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
163 };
Adam Lesinski64587af2016-02-18 18:33:06 -0800164
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700165 std::unique_ptr<StaticSymbolSource> mSymbolSource =
166 util::make_unique<StaticSymbolSource>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700167};
168
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700169} // namespace test
170} // namespace aapt
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700171
172#endif /* AAPT_TEST_CONTEXT_H */