blob: 66dd51ecb4fbd3eb2ef56c866f64e4e1c9a622fe [file] [log] [blame]
Calin Juravledff47292018-02-01 14:44:56 +00001/**
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#include <stdlib.h>
18#include <string.h>
19
20#include <android-base/logging.h>
21#include <gtest/gtest.h>
22
Mathieu Chartierdbc4ce62018-03-07 09:38:16 -080023#include "installd_constants.h"
Calin Juravledff47292018-02-01 14:44:56 +000024#include "otapreopt_parameters.h"
25
26namespace android {
27namespace installd {
28
29static bool ParseBool(const char* in) {
30 if (strcmp(in, "true") == 0) {
31 return true;
32 }
33 return false;
34}
35
36static const char* ParseNull(const char* arg) {
37 return (strcmp(arg, "!") == 0) ? nullptr : arg;
38}
39
40class OTAPreoptTest : public testing::Test {
41protected:
42 virtual void SetUp() {
Calin Juravle0c609c22018-02-12 17:39:37 -080043 setenv("ANDROID_LOG_TAGS", "*:f", 1);
44 android::base::InitLogging(nullptr, android::base::StderrLogger);
Calin Juravledff47292018-02-01 14:44:56 +000045 }
46
47 void verifyPackageParameters(const OTAPreoptParameters& params,
48 uint32_t version,
49 bool versioned,
50 const char** args) {
51 // otapreopt target-slot [version] dexopt {DEXOPT_PARAMETERS}
52 int i = 0;
53 if (version > 2 || (version == 2 && versioned)) {
54 i += 4;
55 } else {
56 i += 3;
57 }
58 ASSERT_STREQ(params.target_slot.c_str(), args[1]);
59 ASSERT_STREQ(params.apk_path, args[i++]);
60 ASSERT_EQ(params.uid, static_cast<uid_t>(atoi(args[i++])));
61 ASSERT_STREQ(params.pkgName, args[i++]);
62 ASSERT_STREQ(params.instruction_set, args[i++]);
63 ASSERT_EQ(params.dexopt_needed, atoi(args[i++]));
64 ASSERT_STREQ(params.oat_dir, args[i++]);
Mathieu Chartierdbc4ce62018-03-07 09:38:16 -080065 const int dexopt_flags = atoi(args[i++]);
Calin Juravledff47292018-02-01 14:44:56 +000066 ASSERT_STREQ(params.compiler_filter, args[i++]);
67 ASSERT_STREQ(params.volume_uuid, ParseNull(args[i++]));
68 ASSERT_STREQ(params.shared_libraries, ParseNull(args[i++]));
69 if (version > 1) {
70 ASSERT_STREQ(params.se_info, ParseNull(args[i++]));
71 } else {
Calin Juravle0c609c22018-02-12 17:39:37 -080072 ASSERT_EQ(params.se_info, nullptr);
Calin Juravledff47292018-02-01 14:44:56 +000073 }
74 if (version > 2) {
75 ASSERT_EQ(params.downgrade, ParseBool(args[i++]));
76 } else {
77 ASSERT_FALSE(params.downgrade);
78 }
79 if (version > 3) {
80 ASSERT_EQ(params.target_sdk_version, atoi(args[i++]));
81 } else {
Mathieu Chartierdbc4ce62018-03-07 09:38:16 -080082 ASSERT_EQ(params.target_sdk_version, 0);
Calin Juravledff47292018-02-01 14:44:56 +000083 }
84 if (version > 4) {
85 ASSERT_STREQ(params.profile_name, ParseNull(args[i++]));
86 } else {
87 ASSERT_STREQ(params.profile_name, "primary.prof");
88 }
Calin Juravle62c5a372018-02-01 17:03:23 +000089 if (version > 5) {
90 ASSERT_STREQ(params.dex_metadata_path, ParseNull(args[i++]));
91 } else {
Calin Juravle0c609c22018-02-12 17:39:37 -080092 ASSERT_EQ(params.dex_metadata_path, nullptr);
Calin Juravle62c5a372018-02-01 17:03:23 +000093 }
Calin Juravle2efc4022018-02-13 18:31:32 -080094 if (version > 6) {
95 ASSERT_STREQ(params.compilation_reason, ParseNull(args[i++]));
96 } else {
97 ASSERT_STREQ(params.compilation_reason, "ab-ota");
98 }
Mathieu Chartierdbc4ce62018-03-07 09:38:16 -080099 if (version > 7) {
100 ASSERT_EQ(params.dexopt_flags, dexopt_flags);
101 } else {
102 ASSERT_EQ(params.dexopt_flags, dexopt_flags | DEXOPT_GENERATE_COMPACT_DEX);
103 }
Calin Juravledff47292018-02-01 14:44:56 +0000104 }
105
106 const char* getVersionCStr(uint32_t version) {
107 switch (version) {
108 case 1: return "1";
109 case 2: return "2";
110 case 3: return "3";
111 case 4: return "4";
112 case 5: return "5";
Calin Juravle62c5a372018-02-01 17:03:23 +0000113 case 6: return "6";
Calin Juravle2efc4022018-02-13 18:31:32 -0800114 case 7: return "7";
Mathieu Chartierdbc4ce62018-03-07 09:38:16 -0800115 case 8: return "8";
Mathieu Chartier1dc3dfa2018-03-12 17:55:06 -0700116 case 9: return "9";
Andreas Gampe2478cf22018-09-18 09:37:21 -0700117 case 10: return "10";
Calin Juravledff47292018-02-01 14:44:56 +0000118 }
119 return nullptr;
120 }
121
Andreas Gampe2478cf22018-09-18 09:37:21 -0700122 std::vector<const char*> getArgs(uint32_t version,
123 bool versioned,
124 const char* shared_libs = "shared.lib") {
Calin Juravledff47292018-02-01 14:44:56 +0000125 std::vector<const char*> args;
126 args.push_back("otapreopt"); // "otapreopt"
127 args.push_back("a"); // slot
128 if (versioned) {
129 args.push_back(getVersionCStr(version));
130 }
131 args.push_back("dexopt"); // "dexopt"
132 args.push_back("foo.apk"); // apk_path
133 args.push_back("123"); // uid
134 args.push_back("pkgname"); // pkg
135 args.push_back("arm"); // isa
136 args.push_back("1"); // dexopt_needed (DEX2OAT_FROM_SCRATCH)
137 args.push_back("oat_dir"); // oat_dir
138 args.push_back("0"); // dexopt_flags
139 args.push_back("speed"); // filter
140 args.push_back("!"); // volume
Andreas Gampe2478cf22018-09-18 09:37:21 -0700141 args.push_back(shared_libs); // libs
Calin Juravledff47292018-02-01 14:44:56 +0000142
143 if (version > 1) {
144 args.push_back("!"); // seinfo
145 }
146 if (version > 2) {
147 args.push_back("true"); // downgrade
148 }
149 if (version > 3) {
150 args.push_back("28"); // sdk_version
151 }
152 if (version > 4) {
153 args.push_back("split_a.prof"); // profile_name
154 }
Calin Juravle62c5a372018-02-01 17:03:23 +0000155 if (version > 5) {
156 args.push_back("dex_metadata.dm"); // dex_metadata_path
157 }
Calin Juravle2efc4022018-02-13 18:31:32 -0800158 if (version > 6) {
159 args.push_back("ab-ota-test"); // compilation_reason
160 }
Calin Juravledff47292018-02-01 14:44:56 +0000161 args.push_back(nullptr); // we have to end with null.
162 return args;
163 }
164
Andreas Gampe2478cf22018-09-18 09:37:21 -0700165 void VerifyReadArguments(uint32_t version,
166 bool versioned,
167 const char* shared_libs = "shared.lib") {
Calin Juravledff47292018-02-01 14:44:56 +0000168 OTAPreoptParameters params;
Andreas Gampe2478cf22018-09-18 09:37:21 -0700169 std::vector<const char*> args = getArgs(version, versioned, shared_libs);
Calin Juravledff47292018-02-01 14:44:56 +0000170 ASSERT_TRUE(params.ReadArguments(args.size() - 1, args.data()));
171 verifyPackageParameters(params, version, versioned, args.data());
172 }
173};
174
175TEST_F(OTAPreoptTest, ReadArgumentsV1) {
176 VerifyReadArguments(1, false);
177}
178
179TEST_F(OTAPreoptTest, ReadArgumentsV2Unversioned) {
180 VerifyReadArguments(2, false);
181}
182
183TEST_F(OTAPreoptTest, ReadArgumentsV2) {
184 VerifyReadArguments(2, true);
185}
186
187TEST_F(OTAPreoptTest, ReadArgumentsV3) {
188 VerifyReadArguments(3, true);
189}
190
191TEST_F(OTAPreoptTest, ReadArgumentsV4) {
192 VerifyReadArguments(4, true);
193}
194
195TEST_F(OTAPreoptTest, ReadArgumentsV5) {
196 VerifyReadArguments(5, true);
197}
198
Calin Juravle62c5a372018-02-01 17:03:23 +0000199TEST_F(OTAPreoptTest, ReadArgumentsV6) {
200 VerifyReadArguments(6, true);
201}
202
Calin Juravle2efc4022018-02-13 18:31:32 -0800203TEST_F(OTAPreoptTest, ReadArgumentsV7) {
204 VerifyReadArguments(7, true);
205}
206
Andreas Gampe2478cf22018-09-18 09:37:21 -0700207TEST_F(OTAPreoptTest, ReadArgumentsV9SharedLibsAmpersand) {
208 OTAPreoptParameters params;
209 std::vector<const char*> args = getArgs(9, true, "&");
210 ASSERT_FALSE(params.ReadArguments(args.size() - 1, args.data()));
211}
212
213TEST_F(OTAPreoptTest, ReadArgumentsV10SharedLibsAmpersand) {
214 OTAPreoptParameters params;
215 std::vector<const char*> args = getArgs(10, true, "&");
216 ASSERT_TRUE(params.ReadArguments(args.size() - 1, args.data()));
217}
218
Calin Juravledff47292018-02-01 14:44:56 +0000219TEST_F(OTAPreoptTest, ReadArgumentsFailToManyArgs) {
220 OTAPreoptParameters params;
221 std::vector<const char*> args = getArgs(5, true);
222 args[2] = "3"; // pretend it's version 3. It should fail since there are too many args.
223 ASSERT_FALSE(params.ReadArguments(args.size() - 1, args.data()));
224}
225
226TEST_F(OTAPreoptTest, ReadArgumentsFailInsufficientArgs) {
227 OTAPreoptParameters params;
228 std::vector<const char*> args = getArgs(4, true);
229 args[2] = "5"; // pretend it's version 5. It should fail since there are insufficient args.
230 ASSERT_FALSE(params.ReadArguments(args.size() - 1, args.data()));
231}
232
233TEST_F(OTAPreoptTest, ReadArgumentsFailInvalidDexopt) {
234 OTAPreoptParameters params;
235 std::vector<const char*> args = getArgs(4, true);
236 args[3] = "dexopt-invalid";
237 ASSERT_FALSE(params.ReadArguments(args.size() - 1, args.data()));
238}
239
240TEST_F(OTAPreoptTest, ReadArgumentsFailInvalidSlot) {
241 OTAPreoptParameters params;
242 std::vector<const char*> args = getArgs(3, true);
243 args[1] = "invalid-slot???";
244 ASSERT_FALSE(params.ReadArguments(args.size() - 1, args.data()));
245}
246
247} // namespace installd
248} // namespace android