1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef AAPT_TEST_CONTEXT_H 18*d57664e9SAndroid Build Coastguard Worker #define AAPT_TEST_CONTEXT_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <list> 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker #include "Diagnostics.h" 23*d57664e9SAndroid Build Coastguard Worker #include "NameMangler.h" 24*d57664e9SAndroid Build Coastguard Worker #include "android-base/logging.h" 25*d57664e9SAndroid Build Coastguard Worker #include "android-base/macros.h" 26*d57664e9SAndroid Build Coastguard Worker #include "process/IResourceTableConsumer.h" 27*d57664e9SAndroid Build Coastguard Worker #include "process/SymbolTable.h" 28*d57664e9SAndroid Build Coastguard Worker #include "test/Common.h" 29*d57664e9SAndroid Build Coastguard Worker #include "util/Util.h" 30*d57664e9SAndroid Build Coastguard Worker 31*d57664e9SAndroid Build Coastguard Worker namespace aapt { 32*d57664e9SAndroid Build Coastguard Worker namespace test { 33*d57664e9SAndroid Build Coastguard Worker 34*d57664e9SAndroid Build Coastguard Worker class Context : public IAaptContext { 35*d57664e9SAndroid Build Coastguard Worker public: Context()36*d57664e9SAndroid Build Coastguard Worker Context() : name_mangler_({}), symbols_(&name_mangler_), min_sdk_version_(0) {} 37*d57664e9SAndroid Build Coastguard Worker GetPackageType()38*d57664e9SAndroid Build Coastguard Worker PackageType GetPackageType() override { 39*d57664e9SAndroid Build Coastguard Worker return package_type_; 40*d57664e9SAndroid Build Coastguard Worker } 41*d57664e9SAndroid Build Coastguard Worker GetExternalSymbols()42*d57664e9SAndroid Build Coastguard Worker SymbolTable* GetExternalSymbols() override { 43*d57664e9SAndroid Build Coastguard Worker return &symbols_; 44*d57664e9SAndroid Build Coastguard Worker } 45*d57664e9SAndroid Build Coastguard Worker GetDiagnostics()46*d57664e9SAndroid Build Coastguard Worker android::IDiagnostics* GetDiagnostics() override { 47*d57664e9SAndroid Build Coastguard Worker return &diagnostics_; 48*d57664e9SAndroid Build Coastguard Worker } 49*d57664e9SAndroid Build Coastguard Worker GetCompilationPackage()50*d57664e9SAndroid Build Coastguard Worker const std::string& GetCompilationPackage() override { 51*d57664e9SAndroid Build Coastguard Worker CHECK(bool(compilation_package_)) << "package name not set"; 52*d57664e9SAndroid Build Coastguard Worker return compilation_package_.value(); 53*d57664e9SAndroid Build Coastguard Worker } 54*d57664e9SAndroid Build Coastguard Worker SetCompilationPackage(android::StringPiece package)55*d57664e9SAndroid Build Coastguard Worker void SetCompilationPackage(android::StringPiece package) { 56*d57664e9SAndroid Build Coastguard Worker compilation_package_ = std::string(package); 57*d57664e9SAndroid Build Coastguard Worker } 58*d57664e9SAndroid Build Coastguard Worker GetPackageId()59*d57664e9SAndroid Build Coastguard Worker uint8_t GetPackageId() override { 60*d57664e9SAndroid Build Coastguard Worker CHECK(bool(package_id_)) << "package ID not set"; 61*d57664e9SAndroid Build Coastguard Worker return package_id_.value(); 62*d57664e9SAndroid Build Coastguard Worker } 63*d57664e9SAndroid Build Coastguard Worker SetPackageId(uint8_t package_id)64*d57664e9SAndroid Build Coastguard Worker void SetPackageId(uint8_t package_id) { 65*d57664e9SAndroid Build Coastguard Worker package_id_ = package_id; 66*d57664e9SAndroid Build Coastguard Worker } 67*d57664e9SAndroid Build Coastguard Worker GetNameMangler()68*d57664e9SAndroid Build Coastguard Worker NameMangler* GetNameMangler() override { 69*d57664e9SAndroid Build Coastguard Worker return &name_mangler_; 70*d57664e9SAndroid Build Coastguard Worker } 71*d57664e9SAndroid Build Coastguard Worker SetNameManglerPolicy(const NameManglerPolicy & policy)72*d57664e9SAndroid Build Coastguard Worker void SetNameManglerPolicy(const NameManglerPolicy& policy) { 73*d57664e9SAndroid Build Coastguard Worker name_mangler_ = NameMangler(policy); 74*d57664e9SAndroid Build Coastguard Worker } 75*d57664e9SAndroid Build Coastguard Worker IsVerbose()76*d57664e9SAndroid Build Coastguard Worker bool IsVerbose() override { 77*d57664e9SAndroid Build Coastguard Worker return false; 78*d57664e9SAndroid Build Coastguard Worker } 79*d57664e9SAndroid Build Coastguard Worker GetMinSdkVersion()80*d57664e9SAndroid Build Coastguard Worker int GetMinSdkVersion() override { 81*d57664e9SAndroid Build Coastguard Worker return min_sdk_version_; 82*d57664e9SAndroid Build Coastguard Worker } 83*d57664e9SAndroid Build Coastguard Worker SetMinSdkVersion(int min_sdk_version)84*d57664e9SAndroid Build Coastguard Worker void SetMinSdkVersion(int min_sdk_version) { 85*d57664e9SAndroid Build Coastguard Worker min_sdk_version_ = min_sdk_version; 86*d57664e9SAndroid Build Coastguard Worker } 87*d57664e9SAndroid Build Coastguard Worker GetSplitNameDependencies()88*d57664e9SAndroid Build Coastguard Worker const std::set<std::string>& GetSplitNameDependencies() override { 89*d57664e9SAndroid Build Coastguard Worker return split_name_dependencies_; 90*d57664e9SAndroid Build Coastguard Worker } 91*d57664e9SAndroid Build Coastguard Worker 92*d57664e9SAndroid Build Coastguard Worker private: 93*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(Context); 94*d57664e9SAndroid Build Coastguard Worker 95*d57664e9SAndroid Build Coastguard Worker friend class ContextBuilder; 96*d57664e9SAndroid Build Coastguard Worker 97*d57664e9SAndroid Build Coastguard Worker PackageType package_type_ = PackageType::kApp; 98*d57664e9SAndroid Build Coastguard Worker std::optional<std::string> compilation_package_; 99*d57664e9SAndroid Build Coastguard Worker std::optional<uint8_t> package_id_; 100*d57664e9SAndroid Build Coastguard Worker StdErrDiagnostics diagnostics_; 101*d57664e9SAndroid Build Coastguard Worker NameMangler name_mangler_; 102*d57664e9SAndroid Build Coastguard Worker SymbolTable symbols_; 103*d57664e9SAndroid Build Coastguard Worker int min_sdk_version_; 104*d57664e9SAndroid Build Coastguard Worker std::set<std::string> split_name_dependencies_; 105*d57664e9SAndroid Build Coastguard Worker }; 106*d57664e9SAndroid Build Coastguard Worker 107*d57664e9SAndroid Build Coastguard Worker class ContextBuilder { 108*d57664e9SAndroid Build Coastguard Worker public: SetPackageType(PackageType type)109*d57664e9SAndroid Build Coastguard Worker ContextBuilder& SetPackageType(PackageType type) { 110*d57664e9SAndroid Build Coastguard Worker context_->package_type_ = type; 111*d57664e9SAndroid Build Coastguard Worker return *this; 112*d57664e9SAndroid Build Coastguard Worker } 113*d57664e9SAndroid Build Coastguard Worker SetCompilationPackage(android::StringPiece package)114*d57664e9SAndroid Build Coastguard Worker ContextBuilder& SetCompilationPackage(android::StringPiece package) { 115*d57664e9SAndroid Build Coastguard Worker context_->compilation_package_ = std::string(package); 116*d57664e9SAndroid Build Coastguard Worker return *this; 117*d57664e9SAndroid Build Coastguard Worker } 118*d57664e9SAndroid Build Coastguard Worker SetPackageId(uint8_t id)119*d57664e9SAndroid Build Coastguard Worker ContextBuilder& SetPackageId(uint8_t id) { 120*d57664e9SAndroid Build Coastguard Worker context_->package_id_ = id; 121*d57664e9SAndroid Build Coastguard Worker return *this; 122*d57664e9SAndroid Build Coastguard Worker } 123*d57664e9SAndroid Build Coastguard Worker SetNameManglerPolicy(const NameManglerPolicy & policy)124*d57664e9SAndroid Build Coastguard Worker ContextBuilder& SetNameManglerPolicy(const NameManglerPolicy& policy) { 125*d57664e9SAndroid Build Coastguard Worker context_->name_mangler_ = NameMangler(policy); 126*d57664e9SAndroid Build Coastguard Worker return *this; 127*d57664e9SAndroid Build Coastguard Worker } 128*d57664e9SAndroid Build Coastguard Worker AddSymbolSource(std::unique_ptr<ISymbolSource> src)129*d57664e9SAndroid Build Coastguard Worker ContextBuilder& AddSymbolSource(std::unique_ptr<ISymbolSource> src) { 130*d57664e9SAndroid Build Coastguard Worker context_->GetExternalSymbols()->AppendSource(std::move(src)); 131*d57664e9SAndroid Build Coastguard Worker return *this; 132*d57664e9SAndroid Build Coastguard Worker } 133*d57664e9SAndroid Build Coastguard Worker SetMinSdkVersion(int min_sdk)134*d57664e9SAndroid Build Coastguard Worker ContextBuilder& SetMinSdkVersion(int min_sdk) { 135*d57664e9SAndroid Build Coastguard Worker context_->min_sdk_version_ = min_sdk; 136*d57664e9SAndroid Build Coastguard Worker return *this; 137*d57664e9SAndroid Build Coastguard Worker } 138*d57664e9SAndroid Build Coastguard Worker SetSplitNameDependencies(const std::set<std::string> & split_name_dependencies)139*d57664e9SAndroid Build Coastguard Worker ContextBuilder& SetSplitNameDependencies(const std::set<std::string>& split_name_dependencies) { 140*d57664e9SAndroid Build Coastguard Worker context_->split_name_dependencies_ = split_name_dependencies; 141*d57664e9SAndroid Build Coastguard Worker return *this; 142*d57664e9SAndroid Build Coastguard Worker } 143*d57664e9SAndroid Build Coastguard Worker Build()144*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Context> Build() { return std::move(context_); } 145*d57664e9SAndroid Build Coastguard Worker 146*d57664e9SAndroid Build Coastguard Worker private: 147*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Context> context_ = std::unique_ptr<Context>(new Context()); 148*d57664e9SAndroid Build Coastguard Worker }; 149*d57664e9SAndroid Build Coastguard Worker 150*d57664e9SAndroid Build Coastguard Worker class StaticSymbolSourceBuilder { 151*d57664e9SAndroid Build Coastguard Worker public: 152*d57664e9SAndroid Build Coastguard Worker StaticSymbolSourceBuilder& AddPublicSymbol(android::StringPiece name, ResourceId id, 153*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Attribute> attr = {}) { 154*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<SymbolTable::Symbol> symbol = 155*d57664e9SAndroid Build Coastguard Worker util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true); 156*d57664e9SAndroid Build Coastguard Worker symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get(); 157*d57664e9SAndroid Build Coastguard Worker symbol_source_->id_map_[id] = symbol.get(); 158*d57664e9SAndroid Build Coastguard Worker symbol_source_->symbols_.push_back(std::move(symbol)); 159*d57664e9SAndroid Build Coastguard Worker return *this; 160*d57664e9SAndroid Build Coastguard Worker } 161*d57664e9SAndroid Build Coastguard Worker 162*d57664e9SAndroid Build Coastguard Worker StaticSymbolSourceBuilder& AddSymbol(android::StringPiece name, ResourceId id, 163*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Attribute> attr = {}) { 164*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<SymbolTable::Symbol> symbol = 165*d57664e9SAndroid Build Coastguard Worker util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false); 166*d57664e9SAndroid Build Coastguard Worker symbol_source_->name_map_[ParseNameOrDie(name)] = symbol.get(); 167*d57664e9SAndroid Build Coastguard Worker symbol_source_->id_map_[id] = symbol.get(); 168*d57664e9SAndroid Build Coastguard Worker symbol_source_->symbols_.push_back(std::move(symbol)); 169*d57664e9SAndroid Build Coastguard Worker return *this; 170*d57664e9SAndroid Build Coastguard Worker } 171*d57664e9SAndroid Build Coastguard Worker Build()172*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<ISymbolSource> Build() { 173*d57664e9SAndroid Build Coastguard Worker return std::move(symbol_source_); 174*d57664e9SAndroid Build Coastguard Worker } 175*d57664e9SAndroid Build Coastguard Worker 176*d57664e9SAndroid Build Coastguard Worker private: 177*d57664e9SAndroid Build Coastguard Worker class StaticSymbolSource : public ISymbolSource { 178*d57664e9SAndroid Build Coastguard Worker public: 179*d57664e9SAndroid Build Coastguard Worker StaticSymbolSource() = default; 180*d57664e9SAndroid Build Coastguard Worker FindByName(const ResourceName & name)181*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<SymbolTable::Symbol> FindByName(const ResourceName& name) override { 182*d57664e9SAndroid Build Coastguard Worker auto iter = name_map_.find(name); 183*d57664e9SAndroid Build Coastguard Worker if (iter != name_map_.end()) { 184*d57664e9SAndroid Build Coastguard Worker return CloneSymbol(iter->second); 185*d57664e9SAndroid Build Coastguard Worker } 186*d57664e9SAndroid Build Coastguard Worker return nullptr; 187*d57664e9SAndroid Build Coastguard Worker } 188*d57664e9SAndroid Build Coastguard Worker FindById(ResourceId id)189*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override { 190*d57664e9SAndroid Build Coastguard Worker auto iter = id_map_.find(id); 191*d57664e9SAndroid Build Coastguard Worker if (iter != id_map_.end()) { 192*d57664e9SAndroid Build Coastguard Worker return CloneSymbol(iter->second); 193*d57664e9SAndroid Build Coastguard Worker } 194*d57664e9SAndroid Build Coastguard Worker return nullptr; 195*d57664e9SAndroid Build Coastguard Worker } 196*d57664e9SAndroid Build Coastguard Worker 197*d57664e9SAndroid Build Coastguard Worker std::list<std::unique_ptr<SymbolTable::Symbol>> symbols_; 198*d57664e9SAndroid Build Coastguard Worker std::map<ResourceName, SymbolTable::Symbol*> name_map_; 199*d57664e9SAndroid Build Coastguard Worker std::map<ResourceId, SymbolTable::Symbol*> id_map_; 200*d57664e9SAndroid Build Coastguard Worker 201*d57664e9SAndroid Build Coastguard Worker private: CloneSymbol(SymbolTable::Symbol * sym)202*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<SymbolTable::Symbol> CloneSymbol(SymbolTable::Symbol* sym) { 203*d57664e9SAndroid Build Coastguard Worker CloningValueTransformer cloner(nullptr); 204*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>(); 205*d57664e9SAndroid Build Coastguard Worker clone->id = sym->id; 206*d57664e9SAndroid Build Coastguard Worker if (sym->attribute) { 207*d57664e9SAndroid Build Coastguard Worker clone->attribute = std::unique_ptr<Attribute>(sym->attribute->Transform(cloner)); 208*d57664e9SAndroid Build Coastguard Worker } 209*d57664e9SAndroid Build Coastguard Worker clone->is_public = sym->is_public; 210*d57664e9SAndroid Build Coastguard Worker return clone; 211*d57664e9SAndroid Build Coastguard Worker } 212*d57664e9SAndroid Build Coastguard Worker 213*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource); 214*d57664e9SAndroid Build Coastguard Worker }; 215*d57664e9SAndroid Build Coastguard Worker 216*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<StaticSymbolSource> symbol_source_ = util::make_unique<StaticSymbolSource>(); 217*d57664e9SAndroid Build Coastguard Worker }; 218*d57664e9SAndroid Build Coastguard Worker 219*d57664e9SAndroid Build Coastguard Worker } // namespace test 220*d57664e9SAndroid Build Coastguard Worker } // namespace aapt 221*d57664e9SAndroid Build Coastguard Worker 222*d57664e9SAndroid Build Coastguard Worker #endif /* AAPT_TEST_CONTEXT_H */ 223