• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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