blob: d1e59195755c14fdb79b7f0fe93754856d2bf8ab [file] [log] [blame]
Mike Lockwood94afecf2012-10-24 10:45:23 -07001/*
2 * Copyright (C) 2011 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
Mike Lockwood94afecf2012-10-24 10:45:23 -070020#include <gtest/gtest.h>
21
Jeff Sharkeyf3e30b92016-12-09 17:06:57 -070022#include "InstalldNativeService.h"
23#include "globals.h"
24#include "utils.h"
Jeff Sharkey19803802015-04-07 12:44:51 -070025
26#undef LOG_TAG
27#define LOG_TAG "utils_test"
Mike Lockwood94afecf2012-10-24 10:45:23 -070028
29#define TEST_DATA_DIR "/data/"
30#define TEST_APP_DIR "/data/app/"
31#define TEST_APP_PRIVATE_DIR "/data/app-private/"
32#define TEST_ASEC_DIR "/mnt/asec/"
Jeff Sharkey19803802015-04-07 12:44:51 -070033#define TEST_EXPAND_DIR "/mnt/expand/"
Mike Lockwood94afecf2012-10-24 10:45:23 -070034
35#define TEST_SYSTEM_DIR1 "/system/app/"
36#define TEST_SYSTEM_DIR2 "/vendor/app/"
37
Calin Juravle76268c52017-03-09 13:19:42 -080038#define TEST_PROFILE_DIR "/data/misc/profiles"
39
Mike Lockwood94afecf2012-10-24 10:45:23 -070040#define REALLY_LONG_APP_NAME "com.example." \
41 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
42 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
43 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
44
45#define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
46 "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
47 "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
48 "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_"
49
50namespace android {
Andreas Gampe02d0de52015-11-11 20:43:16 -080051namespace installd {
Mike Lockwood94afecf2012-10-24 10:45:23 -070052
53class UtilsTest : public testing::Test {
54protected:
55 virtual void SetUp() {
Jeff Sharkey19803802015-04-07 12:44:51 -070056 android_app_dir.path = (char*) TEST_APP_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070057 android_app_dir.len = strlen(TEST_APP_DIR);
58
Jeff Sharkey19803802015-04-07 12:44:51 -070059 android_app_private_dir.path = (char*) TEST_APP_PRIVATE_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070060 android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR);
61
Jeff Sharkey19803802015-04-07 12:44:51 -070062 android_data_dir.path = (char*) TEST_DATA_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070063 android_data_dir.len = strlen(TEST_DATA_DIR);
64
Jeff Sharkey19803802015-04-07 12:44:51 -070065 android_asec_dir.path = (char*) TEST_ASEC_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070066 android_asec_dir.len = strlen(TEST_ASEC_DIR);
67
Jeff Sharkey19803802015-04-07 12:44:51 -070068 android_mnt_expand_dir.path = (char*) TEST_EXPAND_DIR;
69 android_mnt_expand_dir.len = strlen(TEST_EXPAND_DIR);
70
Mike Lockwood94afecf2012-10-24 10:45:23 -070071 android_system_dirs.count = 2;
72
73 android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t));
Jeff Sharkey19803802015-04-07 12:44:51 -070074 android_system_dirs.dirs[0].path = (char*) TEST_SYSTEM_DIR1;
Mike Lockwood94afecf2012-10-24 10:45:23 -070075 android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1);
76
Jeff Sharkey19803802015-04-07 12:44:51 -070077 android_system_dirs.dirs[1].path = (char*) TEST_SYSTEM_DIR2;
Mike Lockwood94afecf2012-10-24 10:45:23 -070078 android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2);
Calin Juravle76268c52017-03-09 13:19:42 -080079
80 android_profiles_dir.path = (char*) TEST_PROFILE_DIR;
81 android_profiles_dir.len = strlen(TEST_PROFILE_DIR);
Mike Lockwood94afecf2012-10-24 10:45:23 -070082 }
83
84 virtual void TearDown() {
85 free(android_system_dirs.dirs);
86 }
87};
88
89TEST_F(UtilsTest, IsValidApkPath_BadPrefix) {
90 // Bad prefixes directories
91 const char *badprefix1 = "/etc/passwd";
92 EXPECT_EQ(-1, validate_apk_path(badprefix1))
93 << badprefix1 << " should be allowed as a valid path";
94
95 const char *badprefix2 = "../.." TEST_APP_DIR "../../../blah";
96 EXPECT_EQ(-1, validate_apk_path(badprefix2))
97 << badprefix2 << " should be allowed as a valid path";
98
99 const char *badprefix3 = "init.rc";
100 EXPECT_EQ(-1, validate_apk_path(badprefix3))
101 << badprefix3 << " should be allowed as a valid path";
102
103 const char *badprefix4 = "/init.rc";
104 EXPECT_EQ(-1, validate_apk_path(badprefix4))
105 << badprefix4 << " should be allowed as a valid path";
106}
107
108TEST_F(UtilsTest, IsValidApkPath_Internal) {
109 // Internal directories
110 const char *internal1 = TEST_APP_DIR "example.apk";
111 EXPECT_EQ(0, validate_apk_path(internal1))
112 << internal1 << " should be allowed as a valid path";
113
Calin Juravlefd88ff22014-08-15 15:45:51 +0100114 // b/16888084
115 const char *path2 = TEST_APP_DIR "example.com/example.apk";
116 EXPECT_EQ(0, validate_apk_path(path2))
117 << path2 << " should be allowed as a valid path";
118
Mike Lockwood94afecf2012-10-24 10:45:23 -0700119 const char *badint1 = TEST_APP_DIR "../example.apk";
120 EXPECT_EQ(-1, validate_apk_path(badint1))
121 << badint1 << " should be rejected as a invalid path";
122
123 const char *badint2 = TEST_APP_DIR "/../example.apk";
124 EXPECT_EQ(-1, validate_apk_path(badint2))
125 << badint2 << " should be rejected as a invalid path";
126
Calin Juravlefd88ff22014-08-15 15:45:51 +0100127 // Only one subdir should be allowed.
128 const char *bad_path3 = TEST_APP_DIR "example.com/subdir/pkg.apk";
129 EXPECT_EQ(-1, validate_apk_path(bad_path3))
130 << bad_path3 << " should be rejected as a invalid path";
Calin Juravlec597b6d2014-08-19 17:43:05 +0100131
132 const char *bad_path4 = TEST_APP_DIR "example.com/subdir/../pkg.apk";
133 EXPECT_EQ(-1, validate_apk_path(bad_path4))
134 << bad_path4 << " should be rejected as a invalid path";
135
136 const char *bad_path5 = TEST_APP_DIR "example.com1/../example.com2/pkg.apk";
137 EXPECT_EQ(-1, validate_apk_path(bad_path5))
138 << bad_path5 << " should be rejected as a invalid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700139}
140
141TEST_F(UtilsTest, IsValidApkPath_Private) {
142 // Internal directories
143 const char *private1 = TEST_APP_PRIVATE_DIR "example.apk";
144 EXPECT_EQ(0, validate_apk_path(private1))
145 << private1 << " should be allowed as a valid path";
146
Calin Juravlefd88ff22014-08-15 15:45:51 +0100147 // b/16888084
148 const char *path2 = TEST_APP_DIR "example.com/example.apk";
149 EXPECT_EQ(0, validate_apk_path(path2))
150 << path2 << " should be allowed as a valid path";
151
Mike Lockwood94afecf2012-10-24 10:45:23 -0700152 const char *badpriv1 = TEST_APP_PRIVATE_DIR "../example.apk";
153 EXPECT_EQ(-1, validate_apk_path(badpriv1))
154 << badpriv1 << " should be rejected as a invalid path";
155
156 const char *badpriv2 = TEST_APP_PRIVATE_DIR "/../example.apk";
157 EXPECT_EQ(-1, validate_apk_path(badpriv2))
158 << badpriv2 << " should be rejected as a invalid path";
159
Calin Juravlefd88ff22014-08-15 15:45:51 +0100160 // Only one subdir should be allowed.
161 const char *bad_path3 = TEST_APP_PRIVATE_DIR "example.com/subdir/pkg.apk";
162 EXPECT_EQ(-1, validate_apk_path(bad_path3))
163 << bad_path3 << " should be rejected as a invalid path";
Calin Juravlec597b6d2014-08-19 17:43:05 +0100164
165 const char *bad_path4 = TEST_APP_PRIVATE_DIR "example.com/subdir/../pkg.apk";
166 EXPECT_EQ(-1, validate_apk_path(bad_path4))
167 << bad_path4 << " should be rejected as a invalid path";
168
169 const char *bad_path5 = TEST_APP_PRIVATE_DIR "example.com1/../example.com2/pkg.apk";
170 EXPECT_EQ(-1, validate_apk_path(bad_path5))
171 << bad_path5 << " should be rejected as a invalid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700172}
173
174
175TEST_F(UtilsTest, IsValidApkPath_AsecGood1) {
176 const char *asec1 = TEST_ASEC_DIR "example.apk";
177 EXPECT_EQ(0, validate_apk_path(asec1))
178 << asec1 << " should be allowed as a valid path";
179}
180
181TEST_F(UtilsTest, IsValidApkPath_AsecGood2) {
182 const char *asec2 = TEST_ASEC_DIR "com.example.asec/pkg.apk";
183 EXPECT_EQ(0, validate_apk_path(asec2))
184 << asec2 << " should be allowed as a valid path";
185}
186
187TEST_F(UtilsTest, IsValidApkPath_EscapeFail) {
188 const char *badasec1 = TEST_ASEC_DIR "../example.apk";
189 EXPECT_EQ(-1, validate_apk_path(badasec1))
190 << badasec1 << " should be rejected as a invalid path";
191}
192
193TEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) {
194 const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk";
195 EXPECT_EQ(-1, validate_apk_path(badasec2))
196 << badasec2 << " should be rejected as a invalid path";
197}
198
199TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) {
200 const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk";
201 EXPECT_EQ(-1, validate_apk_path(badasec3))
202 << badasec3 << " should be rejected as a invalid path";
203}
204
205TEST_F(UtilsTest, IsValidApkPath_SlashEscapeFail) {
206 const char *badasec4 = TEST_ASEC_DIR "/../example.apk";
207 EXPECT_EQ(-1, validate_apk_path(badasec4))
208 << badasec4 << " should be rejected as a invalid path";
209}
210
211TEST_F(UtilsTest, IsValidApkPath_CrazyDirFail) {
212 const char *badasec5 = TEST_ASEC_DIR ".//../..";
213 EXPECT_EQ(-1, validate_apk_path(badasec5))
214 << badasec5 << " should be rejected as a invalid path";
215}
216
217TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeSingleFail) {
218 const char *badasec6 = TEST_ASEC_DIR "com.example.asec/../pkg.apk";
219 EXPECT_EQ(-1, validate_apk_path(badasec6))
220 << badasec6 << " should be rejected as a invalid path";
221}
222
223TEST_F(UtilsTest, IsValidApkPath_TwoSubdirFail) {
224 const char *badasec7 = TEST_ASEC_DIR "com.example.asec/subdir1/pkg.apk";
225 EXPECT_EQ(-1, validate_apk_path(badasec7))
226 << badasec7 << " should be rejected as a invalid path";
227}
228
229TEST_F(UtilsTest, CheckSystemApp_Dir1) {
230 const char *sysapp1 = TEST_SYSTEM_DIR1 "Voice.apk";
231 EXPECT_EQ(0, validate_system_app_path(sysapp1))
232 << sysapp1 << " should be allowed as a system path";
233}
234
235TEST_F(UtilsTest, CheckSystemApp_Dir2) {
236 const char *sysapp2 = TEST_SYSTEM_DIR2 "com.example.myapp.apk";
237 EXPECT_EQ(0, validate_system_app_path(sysapp2))
238 << sysapp2 << " should be allowed as a system path";
239}
240
241TEST_F(UtilsTest, CheckSystemApp_EscapeFail) {
242 const char *badapp1 = TEST_SYSTEM_DIR1 "../com.example.apk";
243 EXPECT_EQ(-1, validate_system_app_path(badapp1))
244 << badapp1 << " should be rejected not a system path";
245}
246
247TEST_F(UtilsTest, CheckSystemApp_DoubleEscapeFail) {
248 const char *badapp2 = TEST_SYSTEM_DIR2 "/../../com.example.apk";
249 EXPECT_EQ(-1, validate_system_app_path(badapp2))
250 << badapp2 << " should be rejected not a system path";
251}
252
253TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) {
254 const char *badapp3 = TEST_APP_DIR "/../../com.example.apk";
255 EXPECT_EQ(-1, validate_system_app_path(badapp3))
256 << badapp3 << " should be rejected not a system path";
257}
258
Calin Juravlec597b6d2014-08-19 17:43:05 +0100259TEST_F(UtilsTest, CheckSystemApp_Subdir) {
260 const char *sysapp = TEST_SYSTEM_DIR1 "com.example/com.example.apk";
261 EXPECT_EQ(0, validate_system_app_path(sysapp))
262 << sysapp << " should be allowed as a system path";
263
264 const char *badapp = TEST_SYSTEM_DIR1 "com.example/subdir/com.example.apk";
265 EXPECT_EQ(-1, validate_system_app_path(badapp))
266 << badapp << " should be rejected not a system path";
267
268 const char *badapp1 = TEST_SYSTEM_DIR1 "com.example/subdir/../com.example.apk";
269 EXPECT_EQ(-1, validate_system_app_path(badapp1))
270 << badapp1 << " should be rejected not a system path";
271
272 const char *badapp2 = TEST_SYSTEM_DIR1 "com.example1/../com.example2/com.example.apk";
273 EXPECT_EQ(-1, validate_system_app_path(badapp2))
274 << badapp2 << " should be rejected not a system path";
275}
276
Mike Lockwood94afecf2012-10-24 10:45:23 -0700277TEST_F(UtilsTest, GetPathFromString_NullPathFail) {
278 dir_rec_t test1;
279 EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL))
280 << "Should not allow NULL as a path.";
281}
282
283TEST_F(UtilsTest, GetPathFromString_EmptyPathFail) {
284 dir_rec_t test1;
285 EXPECT_EQ(-1, get_path_from_string(&test1, ""))
286 << "Should not allow empty paths.";
287}
288
289TEST_F(UtilsTest, GetPathFromString_RelativePathFail) {
290 dir_rec_t test1;
291 EXPECT_EQ(-1, get_path_from_string(&test1, "mnt/asec"))
292 << "Should not allow relative paths.";
293}
294
295TEST_F(UtilsTest, GetPathFromString_NonCanonical) {
296 dir_rec_t test1;
297
298 EXPECT_EQ(0, get_path_from_string(&test1, "/mnt/asec"))
299 << "Should be able to canonicalize directory /mnt/asec";
300 EXPECT_STREQ("/mnt/asec/", test1.path)
301 << "/mnt/asec should be canonicalized to /mnt/asec/";
302 EXPECT_EQ(10, (ssize_t) test1.len)
303 << "path len should be equal to the length of /mnt/asec/ (10)";
304 free(test1.path);
305}
306
307TEST_F(UtilsTest, GetPathFromString_CanonicalPath) {
308 dir_rec_t test3;
309 EXPECT_EQ(0, get_path_from_string(&test3, "/data/app/"))
310 << "Should be able to canonicalize directory /data/app/";
311 EXPECT_STREQ("/data/app/", test3.path)
312 << "/data/app/ should be canonicalized to /data/app/";
313 EXPECT_EQ(10, (ssize_t) test3.len)
314 << "path len should be equal to the length of /data/app/ (10)";
315 free(test3.path);
316}
317
318TEST_F(UtilsTest, CreatePkgPath_LongPkgNameSuccess) {
319 char path[PKG_PATH_MAX];
320
321 // Create long packagename of "aaaaa..."
322 size_t pkgnameSize = PKG_NAME_MAX;
323 char pkgname[pkgnameSize + 1];
324 memset(pkgname, 'a', pkgnameSize);
Jeff Sharkey068ef222017-03-07 22:12:03 -0700325 pkgname[1] = '.';
Mike Lockwood94afecf2012-10-24 10:45:23 -0700326 pkgname[pkgnameSize] = '\0';
327
328 EXPECT_EQ(0, create_pkg_path(path, pkgname, "", 0))
329 << "Should successfully be able to create package name.";
330
Andreas Gampe02d0de52015-11-11 20:43:16 -0800331 std::string prefix = std::string(TEST_DATA_DIR) + PRIMARY_USER_PREFIX;
332 size_t offset = prefix.length();
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700333
Mike Lockwood94afecf2012-10-24 10:45:23 -0700334 EXPECT_STREQ(pkgname, path + offset)
335 << "Package path should be a really long string of a's";
336}
337
Mike Lockwood94afecf2012-10-24 10:45:23 -0700338TEST_F(UtilsTest, CreatePkgPath_LongPostfixFail) {
339 char path[PKG_PATH_MAX];
340
341 // Create long packagename of "aaaaa..."
342 size_t postfixSize = PKG_PATH_MAX;
343 char postfix[postfixSize + 1];
344 memset(postfix, 'a', postfixSize);
345 postfix[postfixSize] = '\0';
346
347 EXPECT_EQ(-1, create_pkg_path(path, "com.example.package", postfix, 0))
348 << "Should return error because postfix is too long.";
349}
350
351TEST_F(UtilsTest, CreatePkgPath_PrimaryUser) {
352 char path[PKG_PATH_MAX];
353
354 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 0))
355 << "Should return error because postfix is too long.";
356
Andreas Gampe02d0de52015-11-11 20:43:16 -0800357 std::string p = std::string(TEST_DATA_DIR)
358 + PRIMARY_USER_PREFIX
359 + "com.example.package";
360 EXPECT_STREQ(p.c_str(), path)
Mike Lockwood94afecf2012-10-24 10:45:23 -0700361 << "Package path should be in /data/data/";
362}
363
364TEST_F(UtilsTest, CreatePkgPath_SecondaryUser) {
365 char path[PKG_PATH_MAX];
366
367 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 1))
368 << "Should successfully create package path.";
369
Andreas Gampe02d0de52015-11-11 20:43:16 -0800370 std::string p = std::string(TEST_DATA_DIR)
371 + SECONDARY_USER_PREFIX
372 + "1/com.example.package";
373 EXPECT_STREQ(p.c_str(), path)
Mike Lockwood94afecf2012-10-24 10:45:23 -0700374 << "Package path should be in /data/user/";
375}
376
Mike Lockwood94afecf2012-10-24 10:45:23 -0700377TEST_F(UtilsTest, CreateMovePath_Primary) {
378 char path[PKG_PATH_MAX];
379
380 EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0))
381 << "Should be able to create move path for primary user";
382
383 EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path)
384 << "Primary user package directory should be created correctly";
385}
386
387TEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) {
388 char path[PKG_PATH_MAX];
389
390 EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0))
391 << "Should fail to create move path for primary user";
392}
393
394TEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) {
395 char path[PKG_PATH_MAX];
396
397 EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0))
398 << "Should fail to create move path for primary user";
399}
400
401TEST_F(UtilsTest, CopyAndAppend_Normal) {
402 //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix)
403 dir_rec_t dst;
404 dir_rec_t src;
405
Jeff Sharkey19803802015-04-07 12:44:51 -0700406 src.path = (char*) "/data/";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700407 src.len = strlen(src.path);
408
409 EXPECT_EQ(0, copy_and_append(&dst, &src, "app/"))
410 << "Should return error because postfix is too long.";
411
412 EXPECT_STREQ("/data/app/", dst.path)
413 << "Appended path should be correct";
414
415 EXPECT_EQ(10, (ssize_t) dst.len)
416 << "Appended path should be length of '/data/app/' (10)";
417}
418
419TEST_F(UtilsTest, AppendAndIncrement_Normal) {
420 size_t dst_size = 10;
421 char dst[dst_size];
422 char *dstp = dst;
423 const char* src = "FOO";
424
425 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
426 << "String should append successfully";
427
428 EXPECT_STREQ("FOO", dst)
429 << "String should append correctly";
430
431 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
432 << "String should append successfully again";
433
434 EXPECT_STREQ("FOOFOO", dst)
435 << "String should append correctly again";
436}
437
438TEST_F(UtilsTest, AppendAndIncrement_TooBig) {
439 size_t dst_size = 5;
440 char dst[dst_size];
441 char *dstp = dst;
442 const char* src = "FOO";
443
444 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
445 << "String should append successfully";
446
447 EXPECT_STREQ("FOO", dst)
448 << "String should append correctly";
449
450 EXPECT_EQ(-1, append_and_increment(&dstp, src, &dst_size))
451 << "String should fail because it's too large to fit";
452}
453
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700454TEST_F(UtilsTest, CreateDataPath) {
455 EXPECT_EQ("/data", create_data_path(nullptr));
456 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b",
457 create_data_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b"));
458}
459
Jeff Sharkeyd7921182015-04-30 15:58:19 -0700460TEST_F(UtilsTest, CreateDataAppPath) {
461 EXPECT_EQ("/data/app", create_data_app_path(nullptr));
462
463 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app",
464 create_data_app_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b"));
465}
466
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700467TEST_F(UtilsTest, CreateDataUserPath) {
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600468 EXPECT_EQ("/data/data", create_data_user_ce_path(nullptr, 0));
469 EXPECT_EQ("/data/user/10", create_data_user_ce_path(nullptr, 10));
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700470
471 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600472 create_data_user_ce_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0));
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700473 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600474 create_data_user_ce_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10));
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700475}
476
477TEST_F(UtilsTest, CreateDataMediaPath) {
478 EXPECT_EQ("/data/media/0", create_data_media_path(nullptr, 0));
479 EXPECT_EQ("/data/media/10", create_data_media_path(nullptr, 10));
480
481 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/0",
482 create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0));
483 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/10",
484 create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10));
485}
486
Jeff Sharkeyd7921182015-04-30 15:58:19 -0700487TEST_F(UtilsTest, CreateDataAppPackagePath) {
488 EXPECT_EQ("/data/app/com.example", create_data_app_package_path(nullptr, "com.example"));
489
490 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app/com.example",
491 create_data_app_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", "com.example"));
492}
493
494TEST_F(UtilsTest, CreateDataUserPackagePath) {
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600495 EXPECT_EQ("/data/data/com.example", create_data_user_ce_package_path(nullptr, 0, "com.example"));
496 EXPECT_EQ("/data/user/10/com.example", create_data_user_ce_package_path(nullptr, 10, "com.example"));
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700497
498 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0/com.example",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600499 create_data_user_ce_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0, "com.example"));
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700500 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10/com.example",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600501 create_data_user_ce_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10, "com.example"));
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700502}
503
Jeff Sharkey068ef222017-03-07 22:12:03 -0700504TEST_F(UtilsTest, IsValidPackageName) {
Jeff Sharkey2ee8cc02017-03-08 12:39:46 -0700505 EXPECT_EQ(true, is_valid_package_name("android"));
Jeff Sharkey068ef222017-03-07 22:12:03 -0700506 EXPECT_EQ(true, is_valid_package_name("com.example"));
507 EXPECT_EQ(true, is_valid_package_name("com.example-1"));
508 EXPECT_EQ(true, is_valid_package_name("com.example-1024"));
509 EXPECT_EQ(true, is_valid_package_name("com.example.foo---KiJFj4a_tePVw95pSrjg=="));
510 EXPECT_EQ(true, is_valid_package_name("really_LONG.a1234.package_name"));
511
512 EXPECT_EQ(false, is_valid_package_name("1234.package"));
513 EXPECT_EQ(false, is_valid_package_name("com.1234.package"));
Jeff Sharkey068ef222017-03-07 22:12:03 -0700514 EXPECT_EQ(false, is_valid_package_name(""));
515 EXPECT_EQ(false, is_valid_package_name("."));
Jeff Sharkey2ee8cc02017-03-08 12:39:46 -0700516 EXPECT_EQ(false, is_valid_package_name(".."));
517 EXPECT_EQ(false, is_valid_package_name("../"));
Jeff Sharkey068ef222017-03-07 22:12:03 -0700518 EXPECT_EQ(false, is_valid_package_name("com.example/../com.evil/"));
519 EXPECT_EQ(false, is_valid_package_name("com.example-1/../com.evil/"));
520 EXPECT_EQ(false, is_valid_package_name("/com.evil"));
521}
522
Calin Juravle76268c52017-03-09 13:19:42 -0800523TEST_F(UtilsTest, CreateDataUserProfilePath) {
Calin Juravle114f0812017-03-08 19:05:07 -0800524 EXPECT_EQ("/data/misc/profiles/cur/0", create_primary_cur_profile_dir_path(0));
525 EXPECT_EQ("/data/misc/profiles/cur/1", create_primary_cur_profile_dir_path(1));
Calin Juravle76268c52017-03-09 13:19:42 -0800526}
527
528TEST_F(UtilsTest, CreateDataUserProfilePackagePath) {
529 EXPECT_EQ("/data/misc/profiles/cur/0/com.example",
Calin Juravle114f0812017-03-08 19:05:07 -0800530 create_primary_current_profile_package_dir_path(0, "com.example"));
Calin Juravle76268c52017-03-09 13:19:42 -0800531 EXPECT_EQ("/data/misc/profiles/cur/1/com.example",
Calin Juravle114f0812017-03-08 19:05:07 -0800532 create_primary_current_profile_package_dir_path(1, "com.example"));
Calin Juravle76268c52017-03-09 13:19:42 -0800533}
534
535TEST_F(UtilsTest, CreateDataRefProfilePath) {
Calin Juravle114f0812017-03-08 19:05:07 -0800536 EXPECT_EQ("/data/misc/profiles/ref", create_primary_ref_profile_dir_path());
Calin Juravle76268c52017-03-09 13:19:42 -0800537}
538
539TEST_F(UtilsTest, CreateDataRefProfilePackagePath) {
540 EXPECT_EQ("/data/misc/profiles/ref/com.example",
Calin Juravle114f0812017-03-08 19:05:07 -0800541 create_primary_reference_profile_package_dir_path("com.example"));
Calin Juravle76268c52017-03-09 13:19:42 -0800542}
543
Calin Juravle114f0812017-03-08 19:05:07 -0800544TEST_F(UtilsTest, CreatePrimaryCurrentProfile) {
545 std::string expected =
546 create_primary_current_profile_package_dir_path(1, "com.example") + "/primary.prof";
547 EXPECT_EQ(expected,
548 create_current_profile_path(/*user*/0, "com.example", /*is_secondary*/false));
549}
550
551TEST_F(UtilsTest, CreatePrimaryReferenceProfile) {
552 std::string expected =
553 create_primary_reference_profile_package_dir_path("com.example") + "/primary.prof";
554 EXPECT_EQ(expected,
555 create_reference_profile_path("com.example", /*is_secondary*/false));
556}
557
558TEST_F(UtilsTest, CreateSecondaryCurrentProfile) {
559 EXPECT_EQ("/data/user/0/com.example/secondary.dex.prof",
560 create_current_profile_path(/*user*/0,
561 "/data/user/0/com.example/secondary.dex", /*is_secondary*/true));
562}
563
564TEST_F(UtilsTest, CreateSecondaryReferenceProfile) {
565 EXPECT_EQ("/data/user/0/com.example/oat/secondary.dex.prof",
566 create_reference_profile_path(
567 "/data/user/0/com.example/secondary.dex", /*is_secondary*/true));
Calin Juravle76268c52017-03-09 13:19:42 -0800568}
569
Andreas Gampe02d0de52015-11-11 20:43:16 -0800570} // namespace installd
571} // namespace android