xref: /aosp_15_r20/frameworks/base/tools/aapt2/test/Fixture.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2018 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_FIXTURE_H
18*d57664e9SAndroid Build Coastguard Worker #define AAPT_TEST_FIXTURE_H
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include "android-base/file.h"
21*d57664e9SAndroid Build Coastguard Worker #include "android-base/macros.h"
22*d57664e9SAndroid Build Coastguard Worker #include "androidfw/StringPiece.h"
23*d57664e9SAndroid Build Coastguard Worker #include "gmock/gmock.h"
24*d57664e9SAndroid Build Coastguard Worker #include "gtest/gtest.h"
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker #include "io/Util.h"
27*d57664e9SAndroid Build Coastguard Worker #include "util/Files.h"
28*d57664e9SAndroid Build Coastguard Worker #include "LoadedApk.h"
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker namespace aapt {
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker class TestDirectoryFixture : public ::testing::Test {
33*d57664e9SAndroid Build Coastguard Worker  public:
34*d57664e9SAndroid Build Coastguard Worker   TestDirectoryFixture() = default;
35*d57664e9SAndroid Build Coastguard Worker   ~TestDirectoryFixture() override = default;
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker   // Creates the test directory or clears its contents if it contains previously created files.
38*d57664e9SAndroid Build Coastguard Worker   void SetUp() override;
39*d57664e9SAndroid Build Coastguard Worker 
40*d57664e9SAndroid Build Coastguard Worker   // Clears the contents of the test directory.
41*d57664e9SAndroid Build Coastguard Worker   void TearDown() override;
42*d57664e9SAndroid Build Coastguard Worker 
43*d57664e9SAndroid Build Coastguard Worker   // Retrieve the test directory of the fixture.
GetTestDirectory()44*d57664e9SAndroid Build Coastguard Worker   android::StringPiece GetTestDirectory() {
45*d57664e9SAndroid Build Coastguard Worker     return temp_dir_;
46*d57664e9SAndroid Build Coastguard Worker   }
47*d57664e9SAndroid Build Coastguard Worker 
48*d57664e9SAndroid Build Coastguard Worker   // Retrieves the absolute path of the specified relative path in the test directory. Directories
49*d57664e9SAndroid Build Coastguard Worker   // should be separated using forward slashes ('/'), and these slashes will be translated to
50*d57664e9SAndroid Build Coastguard Worker   // backslashes when running Windows tests.
GetTestPath(android::StringPiece path)51*d57664e9SAndroid Build Coastguard Worker   std::string GetTestPath(android::StringPiece path) {
52*d57664e9SAndroid Build Coastguard Worker     std::string base = temp_dir_;
53*d57664e9SAndroid Build Coastguard Worker     for (android::StringPiece part : util::Split(path, '/')) {
54*d57664e9SAndroid Build Coastguard Worker       file::AppendPath(&base, part);
55*d57664e9SAndroid Build Coastguard Worker     }
56*d57664e9SAndroid Build Coastguard Worker     return base;
57*d57664e9SAndroid Build Coastguard Worker   }
58*d57664e9SAndroid Build Coastguard Worker 
59*d57664e9SAndroid Build Coastguard Worker   // Creates a file with the specified contents, creates any intermediate directories in the
60*d57664e9SAndroid Build Coastguard Worker   // process. The file path must be an absolute path within the test directory.
61*d57664e9SAndroid Build Coastguard Worker   void WriteFile(const std::string& path, const std::string& contents);
62*d57664e9SAndroid Build Coastguard Worker 
63*d57664e9SAndroid Build Coastguard Worker  private:
64*d57664e9SAndroid Build Coastguard Worker   std::string temp_dir_;
65*d57664e9SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(TestDirectoryFixture);
66*d57664e9SAndroid Build Coastguard Worker };
67*d57664e9SAndroid Build Coastguard Worker 
68*d57664e9SAndroid Build Coastguard Worker class CommandTestFixture : public TestDirectoryFixture {
69*d57664e9SAndroid Build Coastguard Worker  public:
70*d57664e9SAndroid Build Coastguard Worker   CommandTestFixture() = default;
71*d57664e9SAndroid Build Coastguard Worker   ~CommandTestFixture() override = default;
72*d57664e9SAndroid Build Coastguard Worker 
73*d57664e9SAndroid Build Coastguard Worker   // Wries the contents of the file to the specified path. The file is compiled and the flattened
74*d57664e9SAndroid Build Coastguard Worker   // file is written to the out directory.
75*d57664e9SAndroid Build Coastguard Worker   bool CompileFile(const std::string& path, const std::string& contents,
76*d57664e9SAndroid Build Coastguard Worker                    android::StringPiece flat_out_dir, android::IDiagnostics* diag,
77*d57664e9SAndroid Build Coastguard Worker                    const std::vector<android::StringPiece>& additional_args = {});
78*d57664e9SAndroid Build Coastguard Worker 
79*d57664e9SAndroid Build Coastguard Worker   // Executes the link command with the specified arguments.
80*d57664e9SAndroid Build Coastguard Worker   bool Link(const std::vector<std::string>& args, android::IDiagnostics* diag);
81*d57664e9SAndroid Build Coastguard Worker 
82*d57664e9SAndroid Build Coastguard Worker   // Executes the link command with the specified arguments. The flattened files residing in the
83*d57664e9SAndroid Build Coastguard Worker   // flat directory will be added to the link command as file arguments.
84*d57664e9SAndroid Build Coastguard Worker   bool Link(const std::vector<std::string>& args, android::StringPiece flat_dir,
85*d57664e9SAndroid Build Coastguard Worker             android::IDiagnostics* diag);
86*d57664e9SAndroid Build Coastguard Worker 
87*d57664e9SAndroid Build Coastguard Worker   // Creates a minimal android manifest within the test directory and returns the file path.
88*d57664e9SAndroid Build Coastguard Worker   std::string GetDefaultManifest(const char* package_name = kDefaultPackageName);
89*d57664e9SAndroid Build Coastguard Worker 
90*d57664e9SAndroid Build Coastguard Worker   // Returns pointer to data inside APK files
91*d57664e9SAndroid Build Coastguard Worker   std::unique_ptr<io::IData> OpenFileAsData(LoadedApk* apk, android::StringPiece path);
92*d57664e9SAndroid Build Coastguard Worker 
93*d57664e9SAndroid Build Coastguard Worker   // Asserts that loading the tree from the specified file in the apk succeeds.
94*d57664e9SAndroid Build Coastguard Worker   void AssertLoadXml(LoadedApk* apk, const io::IData* data,
95*d57664e9SAndroid Build Coastguard Worker                      android::ResXMLTree* out_tree);
96*d57664e9SAndroid Build Coastguard Worker 
97*d57664e9SAndroid Build Coastguard Worker   static const char* kDefaultPackageName;
98*d57664e9SAndroid Build Coastguard Worker  private:
99*d57664e9SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(CommandTestFixture);
100*d57664e9SAndroid Build Coastguard Worker };
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker struct ManifestBuilder {
103*d57664e9SAndroid Build Coastguard Worker   explicit ManifestBuilder(CommandTestFixture* fixture);
104*d57664e9SAndroid Build Coastguard Worker   ManifestBuilder& AddContents(const std::string& contents);
105*d57664e9SAndroid Build Coastguard Worker   ManifestBuilder& SetPackageName(const std::string& package_name);
106*d57664e9SAndroid Build Coastguard Worker   std::string Build(const std::string& file_path);
107*d57664e9SAndroid Build Coastguard Worker   std::string Build();
108*d57664e9SAndroid Build Coastguard Worker 
109*d57664e9SAndroid Build Coastguard Worker  private:
110*d57664e9SAndroid Build Coastguard Worker   CommandTestFixture* fixture_;
111*d57664e9SAndroid Build Coastguard Worker   std::string package_name_ = CommandTestFixture::kDefaultPackageName;
112*d57664e9SAndroid Build Coastguard Worker   std::string contents_;
113*d57664e9SAndroid Build Coastguard Worker };
114*d57664e9SAndroid Build Coastguard Worker 
115*d57664e9SAndroid Build Coastguard Worker struct LinkCommandBuilder {
116*d57664e9SAndroid Build Coastguard Worker   explicit LinkCommandBuilder(CommandTestFixture* fixture);
117*d57664e9SAndroid Build Coastguard Worker   LinkCommandBuilder& AddCompiledResDir(const std::string& dir, android::IDiagnostics* diag);
118*d57664e9SAndroid Build Coastguard Worker   LinkCommandBuilder& AddFlag(const std::string& flag);
119*d57664e9SAndroid Build Coastguard Worker   LinkCommandBuilder& AddParameter(const std::string& param, const std::string& value);
120*d57664e9SAndroid Build Coastguard Worker   LinkCommandBuilder& SetManifestFile(const std::string& manifest_path);
121*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> Build(const std::string& out_apk_path);
122*d57664e9SAndroid Build Coastguard Worker 
123*d57664e9SAndroid Build Coastguard Worker  private:
124*d57664e9SAndroid Build Coastguard Worker   CommandTestFixture* fixture_;
125*d57664e9SAndroid Build Coastguard Worker   std::vector<std::string> args_;
126*d57664e9SAndroid Build Coastguard Worker   bool manifest_supplied_ = false;
127*d57664e9SAndroid Build Coastguard Worker };
128*d57664e9SAndroid Build Coastguard Worker 
129*d57664e9SAndroid Build Coastguard Worker } // namespace aapt
130*d57664e9SAndroid Build Coastguard Worker 
131*d57664e9SAndroid Build Coastguard Worker #endif  // AAPT_TEST_FIXTURE_H
132