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 IDMAP2_TESTS_TESTHELPERS_H_
18 #define IDMAP2_TESTS_TESTHELPERS_H_
19 
20 #include <string>
21 
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
24 
25 namespace android::idmap2 {
26 
27 const unsigned char idmap_raw_data[] = {
28     // IDMAP HEADER
29     // 0x0: magic
30     0x49, 0x44, 0x4d, 0x50,
31 
32     // 0x4: version
33     0x01, 0x00, 0x00, 0x00,
34 
35     // 0x8: target crc
36     0x34, 0x12, 0x00, 0x00,
37 
38     // 0xc: overlay crc
39     0x78, 0x56, 0x00, 0x00,
40 
41     // 0x10: target path "target.apk"
42     0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x61, 0x70, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58 
59     // 0x110: overlay path "overlay.apk"
60     0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00,
61     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
69     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 
77     // DATA HEADER
78     // 0x210: target package id
79     0x7f, 0x00,
80 
81     // 0x212: types count
82     0x02, 0x00,
83 
84     // DATA BLOCK
85     // 0x214: target type
86     0x02, 0x00,
87 
88     // 0x216: overlay type
89     0x02, 0x00,
90 
91     // 0x218: entry count
92     0x01, 0x00,
93 
94     // 0x21a: entry offset
95     0x00, 0x00,
96 
97     // 0x21c: entries
98     0x00, 0x00, 0x00, 0x00,
99 
100     // DATA BLOCK
101     // 0x220: target type
102     0x03, 0x00,
103 
104     // 0x222: overlay type
105     0x03, 0x00,
106 
107     // 0x224: entry count
108     0x03, 0x00,
109 
110     // 0x226: entry offset
111     0x03, 0x00,
112 
113     // 0x228, 0x22c, 0x230: entries
114     0x00, 0x00, 0x00, 0x00,
115 
116     0xff, 0xff, 0xff, 0xff,
117 
118     0x01, 0x00, 0x00, 0x00};
119 
120 const unsigned int idmap_raw_data_len = 565;
121 
122 std::string GetTestDataPath();
123 
124 class Idmap2Tests : public testing::Test {
125  protected:
SetUp()126   virtual void SetUp() {
127 #ifdef __ANDROID__
128     tmp_dir_path_ = "/data/local/tmp/idmap2-tests-XXXXXX";
129 #else
130     tmp_dir_path_ = "/tmp/idmap2-tests-XXXXXX";
131 #endif
132     EXPECT_NE(mkdtemp(const_cast<char*>(tmp_dir_path_.c_str())), nullptr)
133         << "Failed to create temporary directory: " << strerror(errno);
134     target_apk_path_ = GetTestDataPath() + "/target/target.apk";
135     overlay_apk_path_ = GetTestDataPath() + "/overlay/overlay.apk";
136     idmap_path_ = tmp_dir_path_ + "/a.idmap";
137   }
138 
TearDown()139   virtual void TearDown() {
140     EXPECT_EQ(rmdir(tmp_dir_path_.c_str()), 0)
141         << "Failed to remove temporary directory " << tmp_dir_path_ << ": " << strerror(errno);
142   }
143 
GetTempDirPath()144   const std::string& GetTempDirPath() {
145     return tmp_dir_path_;
146   }
147 
GetTargetApkPath()148   const std::string& GetTargetApkPath() {
149     return target_apk_path_;
150   }
151 
GetOverlayApkPath()152   const std::string& GetOverlayApkPath() {
153     return overlay_apk_path_;
154   }
155 
GetIdmapPath()156   const std::string& GetIdmapPath() {
157     return idmap_path_;
158   }
159 
160  private:
161   std::string tmp_dir_path_;
162   std::string target_apk_path_;
163   std::string overlay_apk_path_;
164   std::string idmap_path_;
165 };
166 
167 }  // namespace android::idmap2
168 
169 #endif  // IDMAP2_TESTS_TESTHELPERS_H_
170