blob: 6a8755e9d31b3189fe6644b9a6809e6c8933f551 [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/"
Jeff Sharkey871a8f22017-02-21 18:30:28 -070032#define TEST_APP_EPHEMERAL_DIR "/data/app-ephemeral/"
Mike Lockwood94afecf2012-10-24 10:45:23 -070033#define TEST_ASEC_DIR "/mnt/asec/"
Jeff Sharkey19803802015-04-07 12:44:51 -070034#define TEST_EXPAND_DIR "/mnt/expand/"
Mike Lockwood94afecf2012-10-24 10:45:23 -070035
36#define TEST_SYSTEM_DIR1 "/system/app/"
37#define TEST_SYSTEM_DIR2 "/vendor/app/"
38
39#define REALLY_LONG_APP_NAME "com.example." \
40 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
41 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
42 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
43
44#define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
45 "shared_prefs_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
49namespace android {
Andreas Gampe02d0de52015-11-11 20:43:16 -080050namespace installd {
Mike Lockwood94afecf2012-10-24 10:45:23 -070051
52class UtilsTest : public testing::Test {
53protected:
54 virtual void SetUp() {
Jeff Sharkey19803802015-04-07 12:44:51 -070055 android_app_dir.path = (char*) TEST_APP_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070056 android_app_dir.len = strlen(TEST_APP_DIR);
57
Jeff Sharkey19803802015-04-07 12:44:51 -070058 android_app_private_dir.path = (char*) TEST_APP_PRIVATE_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070059 android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR);
60
Jeff Sharkey871a8f22017-02-21 18:30:28 -070061 android_app_ephemeral_dir.path = (char*) TEST_APP_EPHEMERAL_DIR;
62 android_app_ephemeral_dir.len = strlen(TEST_APP_EPHEMERAL_DIR);
63
Jeff Sharkey19803802015-04-07 12:44:51 -070064 android_data_dir.path = (char*) TEST_DATA_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070065 android_data_dir.len = strlen(TEST_DATA_DIR);
66
Jeff Sharkey19803802015-04-07 12:44:51 -070067 android_asec_dir.path = (char*) TEST_ASEC_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070068 android_asec_dir.len = strlen(TEST_ASEC_DIR);
69
Jeff Sharkey19803802015-04-07 12:44:51 -070070 android_mnt_expand_dir.path = (char*) TEST_EXPAND_DIR;
71 android_mnt_expand_dir.len = strlen(TEST_EXPAND_DIR);
72
Mike Lockwood94afecf2012-10-24 10:45:23 -070073 android_system_dirs.count = 2;
74
75 android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t));
Jeff Sharkey19803802015-04-07 12:44:51 -070076 android_system_dirs.dirs[0].path = (char*) TEST_SYSTEM_DIR1;
Mike Lockwood94afecf2012-10-24 10:45:23 -070077 android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1);
78
Jeff Sharkey19803802015-04-07 12:44:51 -070079 android_system_dirs.dirs[1].path = (char*) TEST_SYSTEM_DIR2;
Mike Lockwood94afecf2012-10-24 10:45:23 -070080 android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2);
81 }
82
83 virtual void TearDown() {
84 free(android_system_dirs.dirs);
85 }
86};
87
88TEST_F(UtilsTest, IsValidApkPath_BadPrefix) {
89 // Bad prefixes directories
90 const char *badprefix1 = "/etc/passwd";
91 EXPECT_EQ(-1, validate_apk_path(badprefix1))
Jeff Sharkey871a8f22017-02-21 18:30:28 -070092 << badprefix1 << " should not be allowed as a valid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -070093
94 const char *badprefix2 = "../.." TEST_APP_DIR "../../../blah";
95 EXPECT_EQ(-1, validate_apk_path(badprefix2))
Jeff Sharkey871a8f22017-02-21 18:30:28 -070096 << badprefix2 << " should not be allowed as a valid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -070097
98 const char *badprefix3 = "init.rc";
99 EXPECT_EQ(-1, validate_apk_path(badprefix3))
Jeff Sharkey871a8f22017-02-21 18:30:28 -0700100 << badprefix3 << " should not be allowed as a valid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700101
102 const char *badprefix4 = "/init.rc";
103 EXPECT_EQ(-1, validate_apk_path(badprefix4))
Jeff Sharkey871a8f22017-02-21 18:30:28 -0700104 << badprefix4 << " should not be allowed as a valid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700105}
106
107TEST_F(UtilsTest, IsValidApkPath_Internal) {
108 // Internal directories
109 const char *internal1 = TEST_APP_DIR "example.apk";
110 EXPECT_EQ(0, validate_apk_path(internal1))
111 << internal1 << " should be allowed as a valid path";
112
Calin Juravlefd88ff22014-08-15 15:45:51 +0100113 // b/16888084
114 const char *path2 = TEST_APP_DIR "example.com/example.apk";
115 EXPECT_EQ(0, validate_apk_path(path2))
116 << path2 << " should be allowed as a valid path";
117
Mike Lockwood94afecf2012-10-24 10:45:23 -0700118 const char *badint1 = TEST_APP_DIR "../example.apk";
119 EXPECT_EQ(-1, validate_apk_path(badint1))
120 << badint1 << " should be rejected as a invalid path";
121
122 const char *badint2 = TEST_APP_DIR "/../example.apk";
123 EXPECT_EQ(-1, validate_apk_path(badint2))
124 << badint2 << " should be rejected as a invalid path";
125
Calin Juravlefd88ff22014-08-15 15:45:51 +0100126 // Only one subdir should be allowed.
127 const char *bad_path3 = TEST_APP_DIR "example.com/subdir/pkg.apk";
128 EXPECT_EQ(-1, validate_apk_path(bad_path3))
129 << bad_path3 << " should be rejected as a invalid path";
Calin Juravlec597b6d2014-08-19 17:43:05 +0100130
131 const char *bad_path4 = TEST_APP_DIR "example.com/subdir/../pkg.apk";
132 EXPECT_EQ(-1, validate_apk_path(bad_path4))
133 << bad_path4 << " should be rejected as a invalid path";
134
135 const char *bad_path5 = TEST_APP_DIR "example.com1/../example.com2/pkg.apk";
136 EXPECT_EQ(-1, validate_apk_path(bad_path5))
137 << bad_path5 << " should be rejected as a invalid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700138}
139
140TEST_F(UtilsTest, IsValidApkPath_Private) {
141 // Internal directories
142 const char *private1 = TEST_APP_PRIVATE_DIR "example.apk";
143 EXPECT_EQ(0, validate_apk_path(private1))
144 << private1 << " should be allowed as a valid path";
145
Calin Juravlefd88ff22014-08-15 15:45:51 +0100146 // b/16888084
147 const char *path2 = TEST_APP_DIR "example.com/example.apk";
148 EXPECT_EQ(0, validate_apk_path(path2))
149 << path2 << " should be allowed as a valid path";
150
Mike Lockwood94afecf2012-10-24 10:45:23 -0700151 const char *badpriv1 = TEST_APP_PRIVATE_DIR "../example.apk";
152 EXPECT_EQ(-1, validate_apk_path(badpriv1))
153 << badpriv1 << " should be rejected as a invalid path";
154
155 const char *badpriv2 = TEST_APP_PRIVATE_DIR "/../example.apk";
156 EXPECT_EQ(-1, validate_apk_path(badpriv2))
157 << badpriv2 << " should be rejected as a invalid path";
158
Calin Juravlefd88ff22014-08-15 15:45:51 +0100159 // Only one subdir should be allowed.
160 const char *bad_path3 = TEST_APP_PRIVATE_DIR "example.com/subdir/pkg.apk";
161 EXPECT_EQ(-1, validate_apk_path(bad_path3))
162 << bad_path3 << " should be rejected as a invalid path";
Calin Juravlec597b6d2014-08-19 17:43:05 +0100163
164 const char *bad_path4 = TEST_APP_PRIVATE_DIR "example.com/subdir/../pkg.apk";
165 EXPECT_EQ(-1, validate_apk_path(bad_path4))
166 << bad_path4 << " should be rejected as a invalid path";
167
168 const char *bad_path5 = TEST_APP_PRIVATE_DIR "example.com1/../example.com2/pkg.apk";
169 EXPECT_EQ(-1, validate_apk_path(bad_path5))
170 << bad_path5 << " should be rejected as a invalid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700171}
172
173
174TEST_F(UtilsTest, IsValidApkPath_AsecGood1) {
175 const char *asec1 = TEST_ASEC_DIR "example.apk";
176 EXPECT_EQ(0, validate_apk_path(asec1))
177 << asec1 << " should be allowed as a valid path";
178}
179
180TEST_F(UtilsTest, IsValidApkPath_AsecGood2) {
181 const char *asec2 = TEST_ASEC_DIR "com.example.asec/pkg.apk";
182 EXPECT_EQ(0, validate_apk_path(asec2))
183 << asec2 << " should be allowed as a valid path";
184}
185
186TEST_F(UtilsTest, IsValidApkPath_EscapeFail) {
187 const char *badasec1 = TEST_ASEC_DIR "../example.apk";
188 EXPECT_EQ(-1, validate_apk_path(badasec1))
189 << badasec1 << " should be rejected as a invalid path";
190}
191
192TEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) {
193 const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk";
194 EXPECT_EQ(-1, validate_apk_path(badasec2))
195 << badasec2 << " should be rejected as a invalid path";
196}
197
198TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) {
199 const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk";
200 EXPECT_EQ(-1, validate_apk_path(badasec3))
201 << badasec3 << " should be rejected as a invalid path";
202}
203
204TEST_F(UtilsTest, IsValidApkPath_SlashEscapeFail) {
205 const char *badasec4 = TEST_ASEC_DIR "/../example.apk";
206 EXPECT_EQ(-1, validate_apk_path(badasec4))
207 << badasec4 << " should be rejected as a invalid path";
208}
209
210TEST_F(UtilsTest, IsValidApkPath_CrazyDirFail) {
211 const char *badasec5 = TEST_ASEC_DIR ".//../..";
212 EXPECT_EQ(-1, validate_apk_path(badasec5))
213 << badasec5 << " should be rejected as a invalid path";
214}
215
216TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeSingleFail) {
217 const char *badasec6 = TEST_ASEC_DIR "com.example.asec/../pkg.apk";
218 EXPECT_EQ(-1, validate_apk_path(badasec6))
219 << badasec6 << " should be rejected as a invalid path";
220}
221
222TEST_F(UtilsTest, IsValidApkPath_TwoSubdirFail) {
223 const char *badasec7 = TEST_ASEC_DIR "com.example.asec/subdir1/pkg.apk";
224 EXPECT_EQ(-1, validate_apk_path(badasec7))
225 << badasec7 << " should be rejected as a invalid path";
226}
227
228TEST_F(UtilsTest, CheckSystemApp_Dir1) {
229 const char *sysapp1 = TEST_SYSTEM_DIR1 "Voice.apk";
230 EXPECT_EQ(0, validate_system_app_path(sysapp1))
231 << sysapp1 << " should be allowed as a system path";
232}
233
234TEST_F(UtilsTest, CheckSystemApp_Dir2) {
235 const char *sysapp2 = TEST_SYSTEM_DIR2 "com.example.myapp.apk";
236 EXPECT_EQ(0, validate_system_app_path(sysapp2))
237 << sysapp2 << " should be allowed as a system path";
238}
239
240TEST_F(UtilsTest, CheckSystemApp_EscapeFail) {
241 const char *badapp1 = TEST_SYSTEM_DIR1 "../com.example.apk";
242 EXPECT_EQ(-1, validate_system_app_path(badapp1))
243 << badapp1 << " should be rejected not a system path";
244}
245
246TEST_F(UtilsTest, CheckSystemApp_DoubleEscapeFail) {
247 const char *badapp2 = TEST_SYSTEM_DIR2 "/../../com.example.apk";
248 EXPECT_EQ(-1, validate_system_app_path(badapp2))
249 << badapp2 << " should be rejected not a system path";
250}
251
252TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) {
253 const char *badapp3 = TEST_APP_DIR "/../../com.example.apk";
254 EXPECT_EQ(-1, validate_system_app_path(badapp3))
255 << badapp3 << " should be rejected not a system path";
256}
257
Calin Juravlec597b6d2014-08-19 17:43:05 +0100258TEST_F(UtilsTest, CheckSystemApp_Subdir) {
259 const char *sysapp = TEST_SYSTEM_DIR1 "com.example/com.example.apk";
260 EXPECT_EQ(0, validate_system_app_path(sysapp))
261 << sysapp << " should be allowed as a system path";
262
263 const char *badapp = TEST_SYSTEM_DIR1 "com.example/subdir/com.example.apk";
264 EXPECT_EQ(-1, validate_system_app_path(badapp))
265 << badapp << " should be rejected not a system path";
266
267 const char *badapp1 = TEST_SYSTEM_DIR1 "com.example/subdir/../com.example.apk";
268 EXPECT_EQ(-1, validate_system_app_path(badapp1))
269 << badapp1 << " should be rejected not a system path";
270
271 const char *badapp2 = TEST_SYSTEM_DIR1 "com.example1/../com.example2/com.example.apk";
272 EXPECT_EQ(-1, validate_system_app_path(badapp2))
273 << badapp2 << " should be rejected not a system path";
274}
275
Mike Lockwood94afecf2012-10-24 10:45:23 -0700276TEST_F(UtilsTest, GetPathFromString_NullPathFail) {
277 dir_rec_t test1;
278 EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL))
279 << "Should not allow NULL as a path.";
280}
281
282TEST_F(UtilsTest, GetPathFromString_EmptyPathFail) {
283 dir_rec_t test1;
284 EXPECT_EQ(-1, get_path_from_string(&test1, ""))
285 << "Should not allow empty paths.";
286}
287
288TEST_F(UtilsTest, GetPathFromString_RelativePathFail) {
289 dir_rec_t test1;
290 EXPECT_EQ(-1, get_path_from_string(&test1, "mnt/asec"))
291 << "Should not allow relative paths.";
292}
293
294TEST_F(UtilsTest, GetPathFromString_NonCanonical) {
295 dir_rec_t test1;
296
297 EXPECT_EQ(0, get_path_from_string(&test1, "/mnt/asec"))
298 << "Should be able to canonicalize directory /mnt/asec";
299 EXPECT_STREQ("/mnt/asec/", test1.path)
300 << "/mnt/asec should be canonicalized to /mnt/asec/";
301 EXPECT_EQ(10, (ssize_t) test1.len)
302 << "path len should be equal to the length of /mnt/asec/ (10)";
303 free(test1.path);
304}
305
306TEST_F(UtilsTest, GetPathFromString_CanonicalPath) {
307 dir_rec_t test3;
308 EXPECT_EQ(0, get_path_from_string(&test3, "/data/app/"))
309 << "Should be able to canonicalize directory /data/app/";
310 EXPECT_STREQ("/data/app/", test3.path)
311 << "/data/app/ should be canonicalized to /data/app/";
312 EXPECT_EQ(10, (ssize_t) test3.len)
313 << "path len should be equal to the length of /data/app/ (10)";
314 free(test3.path);
315}
316
317TEST_F(UtilsTest, CreatePkgPath_LongPkgNameSuccess) {
318 char path[PKG_PATH_MAX];
319
320 // Create long packagename of "aaaaa..."
321 size_t pkgnameSize = PKG_NAME_MAX;
322 char pkgname[pkgnameSize + 1];
323 memset(pkgname, 'a', pkgnameSize);
Jeff Sharkey367ace22017-03-07 22:12:03 -0700324 pkgname[1] = '.';
Mike Lockwood94afecf2012-10-24 10:45:23 -0700325 pkgname[pkgnameSize] = '\0';
326
327 EXPECT_EQ(0, create_pkg_path(path, pkgname, "", 0))
328 << "Should successfully be able to create package name.";
329
Andreas Gampe02d0de52015-11-11 20:43:16 -0800330 std::string prefix = std::string(TEST_DATA_DIR) + PRIMARY_USER_PREFIX;
331 size_t offset = prefix.length();
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700332
Mike Lockwood94afecf2012-10-24 10:45:23 -0700333 EXPECT_STREQ(pkgname, path + offset)
334 << "Package path should be a really long string of a's";
335}
336
337TEST_F(UtilsTest, CreatePkgPath_LongPkgNameFail) {
338 char path[PKG_PATH_MAX];
339
340 // Create long packagename of "aaaaa..."
341 size_t pkgnameSize = PKG_NAME_MAX + 1;
342 char pkgname[pkgnameSize + 1];
343 memset(pkgname, 'a', pkgnameSize);
344 pkgname[pkgnameSize] = '\0';
345
346 EXPECT_EQ(-1, create_pkg_path(path, pkgname, "", 0))
347 << "Should return error because package name is too long.";
348}
349
350TEST_F(UtilsTest, CreatePkgPath_LongPostfixFail) {
351 char path[PKG_PATH_MAX];
352
353 // Create long packagename of "aaaaa..."
354 size_t postfixSize = PKG_PATH_MAX;
355 char postfix[postfixSize + 1];
356 memset(postfix, 'a', postfixSize);
357 postfix[postfixSize] = '\0';
358
359 EXPECT_EQ(-1, create_pkg_path(path, "com.example.package", postfix, 0))
360 << "Should return error because postfix is too long.";
361}
362
363TEST_F(UtilsTest, CreatePkgPath_PrimaryUser) {
364 char path[PKG_PATH_MAX];
365
366 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 0))
367 << "Should return error because postfix is too long.";
368
Andreas Gampe02d0de52015-11-11 20:43:16 -0800369 std::string p = std::string(TEST_DATA_DIR)
370 + PRIMARY_USER_PREFIX
371 + "com.example.package";
372 EXPECT_STREQ(p.c_str(), path)
Mike Lockwood94afecf2012-10-24 10:45:23 -0700373 << "Package path should be in /data/data/";
374}
375
376TEST_F(UtilsTest, CreatePkgPath_SecondaryUser) {
377 char path[PKG_PATH_MAX];
378
379 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 1))
380 << "Should successfully create package path.";
381
Andreas Gampe02d0de52015-11-11 20:43:16 -0800382 std::string p = std::string(TEST_DATA_DIR)
383 + SECONDARY_USER_PREFIX
384 + "1/com.example.package";
385 EXPECT_STREQ(p.c_str(), path)
Mike Lockwood94afecf2012-10-24 10:45:23 -0700386 << "Package path should be in /data/user/";
387}
388
Mike Lockwood94afecf2012-10-24 10:45:23 -0700389TEST_F(UtilsTest, CreateMovePath_Primary) {
390 char path[PKG_PATH_MAX];
391
392 EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0))
393 << "Should be able to create move path for primary user";
394
395 EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path)
396 << "Primary user package directory should be created correctly";
397}
398
399TEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) {
400 char path[PKG_PATH_MAX];
401
402 EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0))
403 << "Should fail to create move path for primary user";
404}
405
406TEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) {
407 char path[PKG_PATH_MAX];
408
409 EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0))
410 << "Should fail to create move path for primary user";
411}
412
413TEST_F(UtilsTest, CopyAndAppend_Normal) {
414 //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix)
415 dir_rec_t dst;
416 dir_rec_t src;
417
Jeff Sharkey19803802015-04-07 12:44:51 -0700418 src.path = (char*) "/data/";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700419 src.len = strlen(src.path);
420
421 EXPECT_EQ(0, copy_and_append(&dst, &src, "app/"))
422 << "Should return error because postfix is too long.";
423
424 EXPECT_STREQ("/data/app/", dst.path)
425 << "Appended path should be correct";
426
427 EXPECT_EQ(10, (ssize_t) dst.len)
428 << "Appended path should be length of '/data/app/' (10)";
429}
430
431TEST_F(UtilsTest, AppendAndIncrement_Normal) {
432 size_t dst_size = 10;
433 char dst[dst_size];
434 char *dstp = dst;
435 const char* src = "FOO";
436
437 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
438 << "String should append successfully";
439
440 EXPECT_STREQ("FOO", dst)
441 << "String should append correctly";
442
443 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
444 << "String should append successfully again";
445
446 EXPECT_STREQ("FOOFOO", dst)
447 << "String should append correctly again";
448}
449
450TEST_F(UtilsTest, AppendAndIncrement_TooBig) {
451 size_t dst_size = 5;
452 char dst[dst_size];
453 char *dstp = dst;
454 const char* src = "FOO";
455
456 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
457 << "String should append successfully";
458
459 EXPECT_STREQ("FOO", dst)
460 << "String should append correctly";
461
462 EXPECT_EQ(-1, append_and_increment(&dstp, src, &dst_size))
463 << "String should fail because it's too large to fit";
464}
465
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700466TEST_F(UtilsTest, CreateDataPath) {
467 EXPECT_EQ("/data", create_data_path(nullptr));
468 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b",
469 create_data_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b"));
470}
471
Jeff Sharkeyd7921182015-04-30 15:58:19 -0700472TEST_F(UtilsTest, CreateDataAppPath) {
473 EXPECT_EQ("/data/app", create_data_app_path(nullptr));
474
475 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app",
476 create_data_app_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b"));
477}
478
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700479TEST_F(UtilsTest, CreateDataUserPath) {
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600480 EXPECT_EQ("/data/data", create_data_user_ce_path(nullptr, 0));
481 EXPECT_EQ("/data/user/10", create_data_user_ce_path(nullptr, 10));
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700482
483 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600484 create_data_user_ce_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0));
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700485 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600486 create_data_user_ce_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10));
Jeff Sharkey41ea4242015-04-09 11:34:03 -0700487}
488
489TEST_F(UtilsTest, CreateDataMediaPath) {
490 EXPECT_EQ("/data/media/0", create_data_media_path(nullptr, 0));
491 EXPECT_EQ("/data/media/10", create_data_media_path(nullptr, 10));
492
493 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/0",
494 create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0));
495 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/10",
496 create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10));
497}
498
Jeff Sharkeyd7921182015-04-30 15:58:19 -0700499TEST_F(UtilsTest, CreateDataAppPackagePath) {
500 EXPECT_EQ("/data/app/com.example", create_data_app_package_path(nullptr, "com.example"));
501
502 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app/com.example",
503 create_data_app_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", "com.example"));
504}
505
506TEST_F(UtilsTest, CreateDataUserPackagePath) {
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600507 EXPECT_EQ("/data/data/com.example", create_data_user_ce_package_path(nullptr, 0, "com.example"));
508 EXPECT_EQ("/data/user/10/com.example", create_data_user_ce_package_path(nullptr, 10, "com.example"));
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700509
510 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0/com.example",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600511 create_data_user_ce_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0, "com.example"));
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700512 EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10/com.example",
Jeff Sharkey2f720f72016-04-10 20:51:40 -0600513 create_data_user_ce_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10, "com.example"));
Jeff Sharkeyc03de092015-04-07 18:14:05 -0700514}
515
Jeff Sharkey367ace22017-03-07 22:12:03 -0700516TEST_F(UtilsTest, IsValidPackageName) {
517 EXPECT_EQ(true, is_valid_package_name("com.example"));
518 EXPECT_EQ(true, is_valid_package_name("com.example-1"));
519 EXPECT_EQ(true, is_valid_package_name("com.example-1024"));
520 EXPECT_EQ(true, is_valid_package_name("com.example.foo---KiJFj4a_tePVw95pSrjg=="));
521 EXPECT_EQ(true, is_valid_package_name("really_LONG.a1234.package_name"));
522
523 EXPECT_EQ(false, is_valid_package_name("1234.package"));
524 EXPECT_EQ(false, is_valid_package_name("com.1234.package"));
525 EXPECT_EQ(false, is_valid_package_name("package"));
526 EXPECT_EQ(false, is_valid_package_name(""));
527 EXPECT_EQ(false, is_valid_package_name("."));
528 EXPECT_EQ(false, is_valid_package_name("com.example/../com.evil/"));
529 EXPECT_EQ(false, is_valid_package_name("com.example-1/../com.evil/"));
530 EXPECT_EQ(false, is_valid_package_name("/com.evil"));
531}
532
Andreas Gampe02d0de52015-11-11 20:43:16 -0800533} // namespace installd
534} // namespace android