1 /* 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_BUILDERS_H 18 #define AAPT_TEST_BUILDERS_H 19 20 #include <memory> 21 22 #include "android-base/macros.h" 23 24 #include "Resource.h" 25 #include "ResourceTable.h" 26 #include "ResourceValues.h" 27 #include "configuration/ConfigurationParser.h" 28 #include "configuration/ConfigurationParser.internal.h" 29 #include "process/IResourceTableConsumer.h" 30 #include "test/Common.h" 31 #include "util/Maybe.h" 32 #include "xml/XmlDom.h" 33 34 namespace aapt { 35 namespace test { 36 37 class ResourceTableBuilder { 38 public: 39 ResourceTableBuilder() = default; 40 41 ResourceTableBuilder& SetPackageId(const android::StringPiece& package_name, uint8_t id); 42 ResourceTableBuilder& AddSimple(const android::StringPiece& name, const ResourceId& id = {}); 43 ResourceTableBuilder& AddSimple(const android::StringPiece& name, const ConfigDescription& config, 44 const ResourceId& id = {}); 45 ResourceTableBuilder& AddReference(const android::StringPiece& name, 46 const android::StringPiece& ref); 47 ResourceTableBuilder& AddReference(const android::StringPiece& name, const ResourceId& id, 48 const android::StringPiece& ref); 49 ResourceTableBuilder& AddString(const android::StringPiece& name, 50 const android::StringPiece& str); 51 ResourceTableBuilder& AddString(const android::StringPiece& name, const ResourceId& id, 52 const android::StringPiece& str); 53 ResourceTableBuilder& AddString(const android::StringPiece& name, const ResourceId& id, 54 const ConfigDescription& config, const android::StringPiece& str); 55 ResourceTableBuilder& AddFileReference(const android::StringPiece& name, 56 const android::StringPiece& path, 57 io::IFile* file = nullptr); 58 ResourceTableBuilder& AddFileReference(const android::StringPiece& name, const ResourceId& id, 59 const android::StringPiece& path, 60 io::IFile* file = nullptr); 61 ResourceTableBuilder& AddFileReference(const android::StringPiece& name, 62 const android::StringPiece& path, 63 const ConfigDescription& config, 64 io::IFile* file = nullptr); 65 ResourceTableBuilder& AddValue(const android::StringPiece& name, std::unique_ptr<Value> value); 66 ResourceTableBuilder& AddValue(const android::StringPiece& name, const ResourceId& id, 67 std::unique_ptr<Value> value); 68 ResourceTableBuilder& AddValue(const android::StringPiece& name, const ConfigDescription& config, 69 const ResourceId& id, std::unique_ptr<Value> value); 70 ResourceTableBuilder& SetSymbolState(const android::StringPiece& name, const ResourceId& id, 71 Visibility::Level level, bool allow_new = false); 72 73 StringPool* string_pool(); 74 std::unique_ptr<ResourceTable> Build(); 75 76 private: 77 DISALLOW_COPY_AND_ASSIGN(ResourceTableBuilder); 78 79 std::unique_ptr<ResourceTable> table_ = util::make_unique<ResourceTable>(); 80 }; 81 82 std::unique_ptr<Reference> BuildReference(const android::StringPiece& ref, 83 const Maybe<ResourceId>& id = {}); 84 std::unique_ptr<BinaryPrimitive> BuildPrimitive(uint8_t type, uint32_t data); 85 86 template <typename T> 87 class ValueBuilder { 88 public: 89 template <typename... Args> ValueBuilder(Args &&...args)90 explicit ValueBuilder(Args&&... args) : value_(new T{std::forward<Args>(args)...}) { 91 } 92 93 template <typename... Args> SetSource(Args &&...args)94 ValueBuilder& SetSource(Args&&... args) { 95 value_->SetSource(Source{std::forward<Args>(args)...}); 96 return *this; 97 } 98 SetComment(const android::StringPiece & str)99 ValueBuilder& SetComment(const android::StringPiece& str) { 100 value_->SetComment(str); 101 return *this; 102 } 103 Build()104 std::unique_ptr<Value> Build() { 105 return std::move(value_); 106 } 107 108 private: 109 DISALLOW_COPY_AND_ASSIGN(ValueBuilder); 110 111 std::unique_ptr<Value> value_; 112 }; 113 114 class AttributeBuilder { 115 public: 116 AttributeBuilder(); 117 AttributeBuilder& SetTypeMask(uint32_t typeMask); 118 AttributeBuilder& SetWeak(bool weak); 119 AttributeBuilder& AddItem(const android::StringPiece& name, uint32_t value); 120 std::unique_ptr<Attribute> Build(); 121 122 private: 123 DISALLOW_COPY_AND_ASSIGN(AttributeBuilder); 124 125 std::unique_ptr<Attribute> attr_; 126 }; 127 128 class StyleBuilder { 129 public: 130 StyleBuilder() = default; 131 StyleBuilder& SetParent(const android::StringPiece& str); 132 StyleBuilder& AddItem(const android::StringPiece& str, std::unique_ptr<Item> value); 133 StyleBuilder& AddItem(const android::StringPiece& str, const ResourceId& id, 134 std::unique_ptr<Item> value); 135 std::unique_ptr<Style> Build(); 136 137 private: 138 DISALLOW_COPY_AND_ASSIGN(StyleBuilder); 139 140 std::unique_ptr<Style> style_ = util::make_unique<Style>(); 141 }; 142 143 class StyleableBuilder { 144 public: 145 StyleableBuilder() = default; 146 StyleableBuilder& AddItem(const android::StringPiece& str, const Maybe<ResourceId>& id = {}); 147 std::unique_ptr<Styleable> Build(); 148 149 private: 150 DISALLOW_COPY_AND_ASSIGN(StyleableBuilder); 151 152 std::unique_ptr<Styleable> styleable_ = util::make_unique<Styleable>(); 153 }; 154 155 std::unique_ptr<xml::XmlResource> BuildXmlDom(const android::StringPiece& str); 156 std::unique_ptr<xml::XmlResource> BuildXmlDomForPackageName(IAaptContext* context, 157 const android::StringPiece& str); 158 159 class ArtifactBuilder { 160 public: 161 ArtifactBuilder() = default; 162 163 ArtifactBuilder& SetName(const std::string& name); 164 ArtifactBuilder& SetVersion(int version); 165 ArtifactBuilder& AddAbi(configuration::Abi abi); 166 ArtifactBuilder& AddDensity(const ConfigDescription& density); 167 ArtifactBuilder& AddLocale(const ConfigDescription& locale); 168 ArtifactBuilder& SetAndroidSdk(int min_sdk); 169 configuration::OutputArtifact Build(); 170 171 private: 172 DISALLOW_COPY_AND_ASSIGN(ArtifactBuilder); 173 174 configuration::OutputArtifact artifact_; 175 }; 176 177 class PostProcessingConfigurationBuilder { 178 public: 179 PostProcessingConfigurationBuilder() = default; 180 181 PostProcessingConfigurationBuilder& AddAbiGroup(const std::string& label, 182 std::vector<configuration::Abi> abis = {}); 183 PostProcessingConfigurationBuilder& AddDensityGroup(const std::string& label, 184 std::vector<std::string> densities = {}); 185 PostProcessingConfigurationBuilder& AddLocaleGroup(const std::string& label, 186 std::vector<std::string> locales = {}); 187 PostProcessingConfigurationBuilder& AddDeviceFeatureGroup(const std::string& label); 188 PostProcessingConfigurationBuilder& AddGlTextureGroup(const std::string& label); 189 PostProcessingConfigurationBuilder& AddAndroidSdk(std::string label, int min_sdk); 190 PostProcessingConfigurationBuilder& AddArtifact(configuration::ConfiguredArtifact artrifact); 191 192 configuration::PostProcessingConfiguration Build(); 193 194 private: 195 template <typename T> 196 inline PostProcessingConfigurationBuilder& AddGroup(const std::string& label, 197 configuration::Group<T>* group, 198 std::vector<T> to_add = {}) { 199 auto& values = GetOrCreateGroup(label, group); 200 values.insert(std::begin(values), std::begin(to_add), std::end(to_add)); 201 return *this; 202 } 203 204 configuration::PostProcessingConfiguration config_; 205 }; 206 207 } // namespace test 208 } // namespace aapt 209 210 #endif /* AAPT_TEST_BUILDERS_H */ 211