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