1 /* 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 20 #define LOG_TAG "utils_test" 21 #include <utils/Log.h> 22 23 #include <gtest/gtest.h> 24 25 extern "C" { 26 #include "installd.h" 27 } 28 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/" 33 34 #define TEST_SYSTEM_DIR1 "/system/app/" 35 #define TEST_SYSTEM_DIR2 "/vendor/app/" 36 37 namespace android { 38 39 class UtilsTest : public testing::Test { 40 protected: 41 virtual void SetUp() { 42 android_app_dir.path = TEST_APP_DIR; 43 android_app_dir.len = strlen(TEST_APP_DIR); 44 45 android_app_private_dir.path = TEST_APP_PRIVATE_DIR; 46 android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR); 47 48 android_data_dir.path = TEST_DATA_DIR; 49 android_data_dir.len = strlen(TEST_DATA_DIR); 50 51 android_asec_dir.path = TEST_ASEC_DIR; 52 android_asec_dir.len = strlen(TEST_ASEC_DIR); 53 54 android_system_dirs.count = 2; 55 56 android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t)); 57 android_system_dirs.dirs[0].path = TEST_SYSTEM_DIR1; 58 android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1); 59 60 android_system_dirs.dirs[1].path = TEST_SYSTEM_DIR2; 61 android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2); 62 } 63 64 virtual void TearDown() { 65 free(android_system_dirs.dirs); 66 } 67 }; 68 69 TEST_F(UtilsTest, IsValidApkPath_BadPrefix) { 70 // Bad prefixes directories 71 const char *badprefix1 = "/etc/passwd"; 72 EXPECT_EQ(-1, validate_apk_path(badprefix1)) 73 << badprefix1 << " should be allowed as a valid path"; 74 75 const char *badprefix2 = "../.." TEST_APP_DIR "../../../blah"; 76 EXPECT_EQ(-1, validate_apk_path(badprefix2)) 77 << badprefix2 << " should be allowed as a valid path"; 78 79 const char *badprefix3 = "init.rc"; 80 EXPECT_EQ(-1, validate_apk_path(badprefix3)) 81 << badprefix3 << " should be allowed as a valid path"; 82 83 const char *badprefix4 = "/init.rc"; 84 EXPECT_EQ(-1, validate_apk_path(badprefix4)) 85 << badprefix4 << " should be allowed as a valid path"; 86 } 87 88 TEST_F(UtilsTest, IsValidApkPath_Internal) { 89 // Internal directories 90 const char *internal1 = TEST_APP_DIR "example.apk"; 91 EXPECT_EQ(0, validate_apk_path(internal1)) 92 << internal1 << " should be allowed as a valid path"; 93 94 const char *badint1 = TEST_APP_DIR "../example.apk"; 95 EXPECT_EQ(-1, validate_apk_path(badint1)) 96 << badint1 << " should be rejected as a invalid path"; 97 98 const char *badint2 = TEST_APP_DIR "/../example.apk"; 99 EXPECT_EQ(-1, validate_apk_path(badint2)) 100 << badint2 << " should be rejected as a invalid path"; 101 102 const char *badint3 = TEST_APP_DIR "example.com/pkg.apk"; 103 EXPECT_EQ(-1, validate_apk_path(badint3)) 104 << badint3 << " should be rejected as a invalid path"; 105 } 106 107 TEST_F(UtilsTest, IsValidApkPath_Private) { 108 // Internal directories 109 const char *private1 = TEST_APP_PRIVATE_DIR "example.apk"; 110 EXPECT_EQ(0, validate_apk_path(private1)) 111 << private1 << " should be allowed as a valid path"; 112 113 const char *badpriv1 = TEST_APP_PRIVATE_DIR "../example.apk"; 114 EXPECT_EQ(-1, validate_apk_path(badpriv1)) 115 << badpriv1 << " should be rejected as a invalid path"; 116 117 const char *badpriv2 = TEST_APP_PRIVATE_DIR "/../example.apk"; 118 EXPECT_EQ(-1, validate_apk_path(badpriv2)) 119 << badpriv2 << " should be rejected as a invalid path"; 120 121 const char *badpriv3 = TEST_APP_PRIVATE_DIR "example.com/pkg.apk"; 122 EXPECT_EQ(-1, validate_apk_path(badpriv3)) 123 << badpriv3 << " should be rejected as a invalid path"; 124 } 125 126 127 TEST_F(UtilsTest, IsValidApkPath_AsecGood1) { 128 const char *asec1 = TEST_ASEC_DIR "example.apk"; 129 EXPECT_EQ(0, validate_apk_path(asec1)) 130 << asec1 << " should be allowed as a valid path"; 131 } 132 133 TEST_F(UtilsTest, IsValidApkPath_AsecGood2) { 134 const char *asec2 = TEST_ASEC_DIR "com.example.asec/pkg.apk"; 135 EXPECT_EQ(0, validate_apk_path(asec2)) 136 << asec2 << " should be allowed as a valid path"; 137 } 138 139 TEST_F(UtilsTest, IsValidApkPath_EscapeFail) { 140 const char *badasec1 = TEST_ASEC_DIR "../example.apk"; 141 EXPECT_EQ(-1, validate_apk_path(badasec1)) 142 << badasec1 << " should be rejected as a invalid path"; 143 } 144 145 TEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) { 146 const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk"; 147 EXPECT_EQ(-1, validate_apk_path(badasec2)) 148 << badasec2 << " should be rejected as a invalid path"; 149 } 150 151 TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) { 152 const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk"; 153 EXPECT_EQ(-1, validate_apk_path(badasec3)) 154 << badasec3 << " should be rejected as a invalid path"; 155 } 156 157 TEST_F(UtilsTest, IsValidApkPath_SlashEscapeFail) { 158 const char *badasec4 = TEST_ASEC_DIR "/../example.apk"; 159 EXPECT_EQ(-1, validate_apk_path(badasec4)) 160 << badasec4 << " should be rejected as a invalid path"; 161 } 162 163 TEST_F(UtilsTest, IsValidApkPath_CrazyDirFail) { 164 const char *badasec5 = TEST_ASEC_DIR ".//../.."; 165 EXPECT_EQ(-1, validate_apk_path(badasec5)) 166 << badasec5 << " should be rejected as a invalid path"; 167 } 168 169 TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeSingleFail) { 170 const char *badasec6 = TEST_ASEC_DIR "com.example.asec/../pkg.apk"; 171 EXPECT_EQ(-1, validate_apk_path(badasec6)) 172 << badasec6 << " should be rejected as a invalid path"; 173 } 174 175 TEST_F(UtilsTest, IsValidApkPath_TwoSubdirFail) { 176 const char *badasec7 = TEST_ASEC_DIR "com.example.asec/subdir1/pkg.apk"; 177 EXPECT_EQ(-1, validate_apk_path(badasec7)) 178 << badasec7 << " should be rejected as a invalid path"; 179 } 180 181 TEST_F(UtilsTest, CheckSystemApp_Dir1) { 182 const char *sysapp1 = TEST_SYSTEM_DIR1 "Voice.apk"; 183 EXPECT_EQ(0, validate_system_app_path(sysapp1)) 184 << sysapp1 << " should be allowed as a system path"; 185 } 186 187 TEST_F(UtilsTest, CheckSystemApp_Dir2) { 188 const char *sysapp2 = TEST_SYSTEM_DIR2 "com.example.myapp.apk"; 189 EXPECT_EQ(0, validate_system_app_path(sysapp2)) 190 << sysapp2 << " should be allowed as a system path"; 191 } 192 193 TEST_F(UtilsTest, CheckSystemApp_EscapeFail) { 194 const char *badapp1 = TEST_SYSTEM_DIR1 "../com.example.apk"; 195 EXPECT_EQ(-1, validate_system_app_path(badapp1)) 196 << badapp1 << " should be rejected not a system path"; 197 } 198 199 TEST_F(UtilsTest, CheckSystemApp_DoubleEscapeFail) { 200 const char *badapp2 = TEST_SYSTEM_DIR2 "/../../com.example.apk"; 201 EXPECT_EQ(-1, validate_system_app_path(badapp2)) 202 << badapp2 << " should be rejected not a system path"; 203 } 204 205 TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) { 206 const char *badapp3 = TEST_APP_DIR "/../../com.example.apk"; 207 EXPECT_EQ(-1, validate_system_app_path(badapp3)) 208 << badapp3 << " should be rejected not a system path"; 209 } 210 211 TEST_F(UtilsTest, GetPathFromString_NullPathFail) { 212 dir_rec_t test1; 213 EXPECT_EQ(-1, get_path_from_string(&test1, NULL)) 214 << "Should not allow NULL as a path."; 215 } 216 217 TEST_F(UtilsTest, GetPathFromString_EmptyPathFail) { 218 dir_rec_t test1; 219 EXPECT_EQ(-1, get_path_from_string(&test1, "")) 220 << "Should not allow empty paths."; 221 } 222 223 TEST_F(UtilsTest, GetPathFromString_RelativePathFail) { 224 dir_rec_t test1; 225 EXPECT_EQ(-1, get_path_from_string(&test1, "mnt/asec")) 226 << "Should not allow relative paths."; 227 } 228 229 TEST_F(UtilsTest, GetPathFromString_NonCanonical) { 230 dir_rec_t test1; 231 232 EXPECT_EQ(0, get_path_from_string(&test1, "/mnt/asec")) 233 << "Should be able to canonicalize directory /mnt/asec"; 234 EXPECT_STREQ("/mnt/asec/", test1.path) 235 << "/mnt/asec should be canonicalized to /mnt/asec/"; 236 EXPECT_EQ(10, (ssize_t) test1.len) 237 << "path len should be equal to the length of /mnt/asec/ (10)"; 238 free(test1.path); 239 } 240 241 TEST_F(UtilsTest, GetPathFromString_CanonicalPath) { 242 dir_rec_t test3; 243 EXPECT_EQ(0, get_path_from_string(&test3, "/data/app/")) 244 << "Should be able to canonicalize directory /data/app/"; 245 EXPECT_STREQ("/data/app/", test3.path) 246 << "/data/app/ should be canonicalized to /data/app/"; 247 EXPECT_EQ(10, (ssize_t) test3.len) 248 << "path len should be equal to the length of /data/app/ (10)"; 249 free(test3.path); 250 } 251 252 TEST_F(UtilsTest, CreatePkgPath_LongPkgNameSuccess) { 253 char path[PKG_PATH_MAX]; 254 255 // Create long packagename of "aaaaa..." 256 size_t pkgnameSize = PKG_NAME_MAX; 257 char pkgname[pkgnameSize + 1]; 258 memset(pkgname, 'a', pkgnameSize); 259 pkgname[pkgnameSize] = '\0'; 260 261 EXPECT_EQ(0, create_pkg_path(path, pkgname, "", 0)) 262 << "Should successfully be able to create package name."; 263 264 const char *prefix = TEST_DATA_DIR PRIMARY_USER_PREFIX; 265 size_t offset = strlen(prefix); 266 EXPECT_STREQ(pkgname, path + offset) 267 << "Package path should be a really long string of a's"; 268 } 269 270 TEST_F(UtilsTest, CreatePkgPath_LongPkgNameFail) { 271 char path[PKG_PATH_MAX]; 272 273 // Create long packagename of "aaaaa..." 274 size_t pkgnameSize = PKG_NAME_MAX + 1; 275 char pkgname[pkgnameSize + 1]; 276 memset(pkgname, 'a', pkgnameSize); 277 pkgname[pkgnameSize] = '\0'; 278 279 EXPECT_EQ(-1, create_pkg_path(path, pkgname, "", 0)) 280 << "Should return error because package name is too long."; 281 } 282 283 TEST_F(UtilsTest, CreatePkgPath_LongPostfixFail) { 284 char path[PKG_PATH_MAX]; 285 286 // Create long packagename of "aaaaa..." 287 size_t postfixSize = PKG_PATH_MAX; 288 char postfix[postfixSize + 1]; 289 memset(postfix, 'a', postfixSize); 290 postfix[postfixSize] = '\0'; 291 292 EXPECT_EQ(-1, create_pkg_path(path, "com.example.package", postfix, 0)) 293 << "Should return error because postfix is too long."; 294 } 295 296 TEST_F(UtilsTest, CreatePkgPath_PrimaryUser) { 297 char path[PKG_PATH_MAX]; 298 299 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 0)) 300 << "Should return error because postfix is too long."; 301 302 EXPECT_STREQ(TEST_DATA_DIR PRIMARY_USER_PREFIX "com.example.package", path) 303 << "Package path should be in /data/data/"; 304 } 305 306 TEST_F(UtilsTest, CreatePkgPath_SecondaryUser) { 307 char path[PKG_PATH_MAX]; 308 309 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 1)) 310 << "Should successfully create package path."; 311 312 EXPECT_STREQ(TEST_DATA_DIR SECONDARY_USER_PREFIX "1/com.example.package", path) 313 << "Package path should be in /data/user/"; 314 } 315 316 TEST_F(UtilsTest, CreatePkgPathInDir_ProtectedDir) { 317 char path[PKG_PATH_MAX]; 318 319 dir_rec_t dir; 320 dir.path = "/data/app-private/"; 321 dir.len = strlen(dir.path); 322 323 EXPECT_EQ(0, create_pkg_path_in_dir(path, &dir, "com.example.package", ".apk")) 324 << "Should successfully create package path."; 325 326 EXPECT_STREQ("/data/app-private/com.example.package.apk", path) 327 << "Package path should be in /data/app-private/"; 328 } 329 330 TEST_F(UtilsTest, CopyAndAppend_Normal) { 331 //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix) 332 dir_rec_t dst; 333 dir_rec_t src; 334 335 src.path = "/data/"; 336 src.len = strlen(src.path); 337 338 EXPECT_EQ(0, copy_and_append(&dst, &src, "app/")) 339 << "Should return error because postfix is too long."; 340 341 EXPECT_STREQ("/data/app/", dst.path) 342 << "Appended path should be correct"; 343 344 EXPECT_EQ(10, (ssize_t) dst.len) 345 << "Appended path should be length of '/data/app/' (10)"; 346 } 347 348 TEST_F(UtilsTest, AppendAndIncrement_Normal) { 349 size_t dst_size = 10; 350 char dst[dst_size]; 351 char *dstp = dst; 352 const char* src = "FOO"; 353 354 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size)) 355 << "String should append successfully"; 356 357 EXPECT_STREQ("FOO", dst) 358 << "String should append correctly"; 359 360 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size)) 361 << "String should append successfully again"; 362 363 EXPECT_STREQ("FOOFOO", dst) 364 << "String should append correctly again"; 365 } 366 367 TEST_F(UtilsTest, AppendAndIncrement_TooBig) { 368 size_t dst_size = 5; 369 char dst[dst_size]; 370 char *dstp = dst; 371 const char* src = "FOO"; 372 373 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size)) 374 << "String should append successfully"; 375 376 EXPECT_STREQ("FOO", dst) 377 << "String should append correctly"; 378 379 EXPECT_EQ(-1, append_and_increment(&dstp, src, &dst_size)) 380 << "String should fail because it's too large to fit"; 381 } 382 383 } 384