194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood/* 294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * Copyright (C) 2011 The Android Open Source Project 394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * 494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * you may not use this file except in compliance with the License. 694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * You may obtain a copy of the License at 794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * 894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * 1094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * Unless required by applicable law or agreed to in writing, software 1194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * See the License for the specific language governing permissions and 1494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * limitations under the License. 1594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood */ 1694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 1794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdlib.h> 1894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <string.h> 1994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 2094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <gtest/gtest.h> 2194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 2294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include "installd.h" 2319803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey 2419803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey#undef LOG_TAG 2519803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey#define LOG_TAG "utils_test" 2694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 2794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_DATA_DIR "/data/" 2894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_APP_DIR "/data/app/" 2994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_APP_PRIVATE_DIR "/data/app-private/" 3094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_ASEC_DIR "/mnt/asec/" 3119803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey#define TEST_EXPAND_DIR "/mnt/expand/" 3294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 3394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_SYSTEM_DIR1 "/system/app/" 3494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_SYSTEM_DIR2 "/vendor/app/" 3594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 3694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define REALLY_LONG_APP_NAME "com.example." \ 3794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \ 3894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \ 3994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 4094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 4194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ 4294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ 4394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ 4494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" 4594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 4694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodnamespace android { 4794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 4894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodclass UtilsTest : public testing::Test { 4994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodprotected: 5094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood virtual void SetUp() { 5119803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_app_dir.path = (char*) TEST_APP_DIR; 5294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_app_dir.len = strlen(TEST_APP_DIR); 5394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 5419803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_app_private_dir.path = (char*) TEST_APP_PRIVATE_DIR; 5594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR); 5694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 5719803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_data_dir.path = (char*) TEST_DATA_DIR; 5894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_data_dir.len = strlen(TEST_DATA_DIR); 5994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 6019803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_asec_dir.path = (char*) TEST_ASEC_DIR; 6194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_asec_dir.len = strlen(TEST_ASEC_DIR); 6294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 6319803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_mnt_expand_dir.path = (char*) TEST_EXPAND_DIR; 6419803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_mnt_expand_dir.len = strlen(TEST_EXPAND_DIR); 6519803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey 6694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_system_dirs.count = 2; 6794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 6894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t)); 6919803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_system_dirs.dirs[0].path = (char*) TEST_SYSTEM_DIR1; 7094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1); 7194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 7219803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey android_system_dirs.dirs[1].path = (char*) TEST_SYSTEM_DIR2; 7394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2); 7494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 7594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 7694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood virtual void TearDown() { 7794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood free(android_system_dirs.dirs); 7894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 7994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}; 8094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 8194afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_BadPrefix) { 8294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // Bad prefixes directories 8394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badprefix1 = "/etc/passwd"; 8494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badprefix1)) 8594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badprefix1 << " should be allowed as a valid path"; 8694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 8794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badprefix2 = "../.." TEST_APP_DIR "../../../blah"; 8894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badprefix2)) 8994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badprefix2 << " should be allowed as a valid path"; 9094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 9194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badprefix3 = "init.rc"; 9294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badprefix3)) 9394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badprefix3 << " should be allowed as a valid path"; 9494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 9594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badprefix4 = "/init.rc"; 9694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badprefix4)) 9794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badprefix4 << " should be allowed as a valid path"; 9894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 9994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 10094afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_Internal) { 10194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // Internal directories 10294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *internal1 = TEST_APP_DIR "example.apk"; 10394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, validate_apk_path(internal1)) 10494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << internal1 << " should be allowed as a valid path"; 10594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 106fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle // b/16888084 107fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle const char *path2 = TEST_APP_DIR "example.com/example.apk"; 108fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle EXPECT_EQ(0, validate_apk_path(path2)) 109fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle << path2 << " should be allowed as a valid path"; 110fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle 11194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badint1 = TEST_APP_DIR "../example.apk"; 11294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badint1)) 11394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badint1 << " should be rejected as a invalid path"; 11494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 11594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badint2 = TEST_APP_DIR "/../example.apk"; 11694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badint2)) 11794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badint2 << " should be rejected as a invalid path"; 11894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 119fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle // Only one subdir should be allowed. 120fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle const char *bad_path3 = TEST_APP_DIR "example.com/subdir/pkg.apk"; 121fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle EXPECT_EQ(-1, validate_apk_path(bad_path3)) 122fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle << bad_path3 << " should be rejected as a invalid path"; 123c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 124c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *bad_path4 = TEST_APP_DIR "example.com/subdir/../pkg.apk"; 125c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(-1, validate_apk_path(bad_path4)) 126c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << bad_path4 << " should be rejected as a invalid path"; 127c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 128c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *bad_path5 = TEST_APP_DIR "example.com1/../example.com2/pkg.apk"; 129c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(-1, validate_apk_path(bad_path5)) 130c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << bad_path5 << " should be rejected as a invalid path"; 13194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 13294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 13394afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_Private) { 13494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // Internal directories 13594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *private1 = TEST_APP_PRIVATE_DIR "example.apk"; 13694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, validate_apk_path(private1)) 13794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << private1 << " should be allowed as a valid path"; 13894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 139fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle // b/16888084 140fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle const char *path2 = TEST_APP_DIR "example.com/example.apk"; 141fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle EXPECT_EQ(0, validate_apk_path(path2)) 142fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle << path2 << " should be allowed as a valid path"; 143fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle 14494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badpriv1 = TEST_APP_PRIVATE_DIR "../example.apk"; 14594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badpriv1)) 14694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badpriv1 << " should be rejected as a invalid path"; 14794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 14894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badpriv2 = TEST_APP_PRIVATE_DIR "/../example.apk"; 14994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badpriv2)) 15094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badpriv2 << " should be rejected as a invalid path"; 15194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 152fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle // Only one subdir should be allowed. 153fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle const char *bad_path3 = TEST_APP_PRIVATE_DIR "example.com/subdir/pkg.apk"; 154fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle EXPECT_EQ(-1, validate_apk_path(bad_path3)) 155fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle << bad_path3 << " should be rejected as a invalid path"; 156c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 157c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *bad_path4 = TEST_APP_PRIVATE_DIR "example.com/subdir/../pkg.apk"; 158c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(-1, validate_apk_path(bad_path4)) 159c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << bad_path4 << " should be rejected as a invalid path"; 160c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 161c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *bad_path5 = TEST_APP_PRIVATE_DIR "example.com1/../example.com2/pkg.apk"; 162c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(-1, validate_apk_path(bad_path5)) 163c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << bad_path5 << " should be rejected as a invalid path"; 16494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 16594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 16694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 16794afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_AsecGood1) { 16894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *asec1 = TEST_ASEC_DIR "example.apk"; 16994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, validate_apk_path(asec1)) 17094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << asec1 << " should be allowed as a valid path"; 17194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 17294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 17394afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_AsecGood2) { 17494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *asec2 = TEST_ASEC_DIR "com.example.asec/pkg.apk"; 17594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, validate_apk_path(asec2)) 17694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << asec2 << " should be allowed as a valid path"; 17794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 17894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 17994afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_EscapeFail) { 18094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badasec1 = TEST_ASEC_DIR "../example.apk"; 18194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badasec1)) 18294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badasec1 << " should be rejected as a invalid path"; 18394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 18494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 18594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) { 18694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk"; 18794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badasec2)) 18894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badasec2 << " should be rejected as a invalid path"; 18994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 19094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 19194afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) { 19294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk"; 19394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badasec3)) 19494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badasec3 << " should be rejected as a invalid path"; 19594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 19694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 19794afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_SlashEscapeFail) { 19894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badasec4 = TEST_ASEC_DIR "/../example.apk"; 19994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badasec4)) 20094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badasec4 << " should be rejected as a invalid path"; 20194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 20294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 20394afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_CrazyDirFail) { 20494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badasec5 = TEST_ASEC_DIR ".//../.."; 20594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badasec5)) 20694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badasec5 << " should be rejected as a invalid path"; 20794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 20894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 20994afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_SubdirEscapeSingleFail) { 21094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badasec6 = TEST_ASEC_DIR "com.example.asec/../pkg.apk"; 21194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badasec6)) 21294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badasec6 << " should be rejected as a invalid path"; 21394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 21494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 21594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_TwoSubdirFail) { 21694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badasec7 = TEST_ASEC_DIR "com.example.asec/subdir1/pkg.apk"; 21794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_apk_path(badasec7)) 21894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badasec7 << " should be rejected as a invalid path"; 21994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 22094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 22194afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_Dir1) { 22294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *sysapp1 = TEST_SYSTEM_DIR1 "Voice.apk"; 22394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, validate_system_app_path(sysapp1)) 22494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << sysapp1 << " should be allowed as a system path"; 22594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 22694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 22794afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_Dir2) { 22894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *sysapp2 = TEST_SYSTEM_DIR2 "com.example.myapp.apk"; 22994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, validate_system_app_path(sysapp2)) 23094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << sysapp2 << " should be allowed as a system path"; 23194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 23294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 23394afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_EscapeFail) { 23494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badapp1 = TEST_SYSTEM_DIR1 "../com.example.apk"; 23594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_system_app_path(badapp1)) 23694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badapp1 << " should be rejected not a system path"; 23794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 23894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 23994afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_DoubleEscapeFail) { 24094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badapp2 = TEST_SYSTEM_DIR2 "/../../com.example.apk"; 24194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_system_app_path(badapp2)) 24294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badapp2 << " should be rejected not a system path"; 24394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 24494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 24594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) { 24694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *badapp3 = TEST_APP_DIR "/../../com.example.apk"; 24794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, validate_system_app_path(badapp3)) 24894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << badapp3 << " should be rejected not a system path"; 24994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 25094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 251c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin JuravleTEST_F(UtilsTest, CheckSystemApp_Subdir) { 252c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *sysapp = TEST_SYSTEM_DIR1 "com.example/com.example.apk"; 253c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(0, validate_system_app_path(sysapp)) 254c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << sysapp << " should be allowed as a system path"; 255c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 256c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *badapp = TEST_SYSTEM_DIR1 "com.example/subdir/com.example.apk"; 257c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(-1, validate_system_app_path(badapp)) 258c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << badapp << " should be rejected not a system path"; 259c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 260c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *badapp1 = TEST_SYSTEM_DIR1 "com.example/subdir/../com.example.apk"; 261c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(-1, validate_system_app_path(badapp1)) 262c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << badapp1 << " should be rejected not a system path"; 263c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 264c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle const char *badapp2 = TEST_SYSTEM_DIR1 "com.example1/../com.example2/com.example.apk"; 265c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle EXPECT_EQ(-1, validate_system_app_path(badapp2)) 266c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle << badapp2 << " should be rejected not a system path"; 267c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle} 268c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle 26994afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_NullPathFail) { 27094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dir_rec_t test1; 27194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL)) 27294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should not allow NULL as a path."; 27394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 27494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 27594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_EmptyPathFail) { 27694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dir_rec_t test1; 27794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, get_path_from_string(&test1, "")) 27894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should not allow empty paths."; 27994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 28094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 28194afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_RelativePathFail) { 28294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dir_rec_t test1; 28394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, get_path_from_string(&test1, "mnt/asec")) 28494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should not allow relative paths."; 28594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 28694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 28794afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_NonCanonical) { 28894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dir_rec_t test1; 28994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 29094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, get_path_from_string(&test1, "/mnt/asec")) 29194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should be able to canonicalize directory /mnt/asec"; 29294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ("/mnt/asec/", test1.path) 29394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "/mnt/asec should be canonicalized to /mnt/asec/"; 29494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(10, (ssize_t) test1.len) 29594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "path len should be equal to the length of /mnt/asec/ (10)"; 29694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood free(test1.path); 29794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 29894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 29994afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_CanonicalPath) { 30094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dir_rec_t test3; 30194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, get_path_from_string(&test3, "/data/app/")) 30294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should be able to canonicalize directory /data/app/"; 30394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ("/data/app/", test3.path) 30494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "/data/app/ should be canonicalized to /data/app/"; 30594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(10, (ssize_t) test3.len) 30694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "path len should be equal to the length of /data/app/ (10)"; 30794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood free(test3.path); 30894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 30994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 31094afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_LongPkgNameSuccess) { 31194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 31294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 31394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // Create long packagename of "aaaaa..." 31494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood size_t pkgnameSize = PKG_NAME_MAX; 31594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char pkgname[pkgnameSize + 1]; 31694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood memset(pkgname, 'a', pkgnameSize); 31794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood pkgname[pkgnameSize] = '\0'; 31894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 31994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, create_pkg_path(path, pkgname, "", 0)) 32094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should successfully be able to create package name."; 32194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 32294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char *prefix = TEST_DATA_DIR PRIMARY_USER_PREFIX; 32394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood size_t offset = strlen(prefix); 324c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey 32594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ(pkgname, path + offset) 32694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Package path should be a really long string of a's"; 32794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 32894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 32994afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_LongPkgNameFail) { 33094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 33194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 33294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // Create long packagename of "aaaaa..." 33394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood size_t pkgnameSize = PKG_NAME_MAX + 1; 33494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char pkgname[pkgnameSize + 1]; 33594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood memset(pkgname, 'a', pkgnameSize); 33694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood pkgname[pkgnameSize] = '\0'; 33794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 33894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, create_pkg_path(path, pkgname, "", 0)) 33994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should return error because package name is too long."; 34094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 34194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 34294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_LongPostfixFail) { 34394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 34494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 34594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // Create long packagename of "aaaaa..." 34694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood size_t postfixSize = PKG_PATH_MAX; 34794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char postfix[postfixSize + 1]; 34894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood memset(postfix, 'a', postfixSize); 34994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood postfix[postfixSize] = '\0'; 35094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 35194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, create_pkg_path(path, "com.example.package", postfix, 0)) 35294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should return error because postfix is too long."; 35394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 35494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 35594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_PrimaryUser) { 35694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 35794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 35894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 0)) 35994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should return error because postfix is too long."; 36094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 36194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ(TEST_DATA_DIR PRIMARY_USER_PREFIX "com.example.package", path) 36294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Package path should be in /data/data/"; 36394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 36494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 36594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_SecondaryUser) { 36694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 36794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 36894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 1)) 36994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should successfully create package path."; 37094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 37194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ(TEST_DATA_DIR SECONDARY_USER_PREFIX "1/com.example.package", path) 37294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Package path should be in /data/user/"; 37394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 37494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 37594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreateMovePath_Primary) { 37694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 37794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 37894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0)) 37994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should be able to create move path for primary user"; 38094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 38194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path) 38294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Primary user package directory should be created correctly"; 38394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 38494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 38594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) { 38694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 38794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 38894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0)) 38994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should fail to create move path for primary user"; 39094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 39194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 39294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) { 39394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char path[PKG_PATH_MAX]; 39494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 39594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0)) 39694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should fail to create move path for primary user"; 39794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 39894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 39994afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CopyAndAppend_Normal) { 40094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix) 40194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dir_rec_t dst; 40294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dir_rec_t src; 40394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 40419803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey src.path = (char*) "/data/"; 40594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood src.len = strlen(src.path); 40694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 40794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, copy_and_append(&dst, &src, "app/")) 40894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Should return error because postfix is too long."; 40994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 41094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ("/data/app/", dst.path) 41194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Appended path should be correct"; 41294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 41394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(10, (ssize_t) dst.len) 41494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "Appended path should be length of '/data/app/' (10)"; 41594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 41694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 41794afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, AppendAndIncrement_Normal) { 41894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood size_t dst_size = 10; 41994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char dst[dst_size]; 42094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char *dstp = dst; 42194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char* src = "FOO"; 42294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 42394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size)) 42494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "String should append successfully"; 42594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 42694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ("FOO", dst) 42794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "String should append correctly"; 42894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 42994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size)) 43094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "String should append successfully again"; 43194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 43294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ("FOOFOO", dst) 43394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "String should append correctly again"; 43494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 43594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 43694afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, AppendAndIncrement_TooBig) { 43794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood size_t dst_size = 5; 43894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char dst[dst_size]; 43994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char *dstp = dst; 44094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood const char* src = "FOO"; 44194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 44294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size)) 44394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "String should append successfully"; 44494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 44594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_STREQ("FOO", dst) 44694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "String should append correctly"; 44794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 44894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood EXPECT_EQ(-1, append_and_increment(&dstp, src, &dst_size)) 44994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "String should fail because it's too large to fit"; 45094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 45194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 45241ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff SharkeyTEST_F(UtilsTest, CreateDataPath) { 45341ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/data", create_data_path(nullptr)); 45441ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 45541ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey create_data_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b")); 45641ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey} 45741ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey 458d792118c493806eeb24a8203f508e6e18fe93bd7Jeff SharkeyTEST_F(UtilsTest, CreateDataAppPath) { 459d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey EXPECT_EQ("/data/app", create_data_app_path(nullptr)); 460d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey 461d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app", 462d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey create_data_app_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b")); 463d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey} 464d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey 46541ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff SharkeyTEST_F(UtilsTest, CreateDataUserPath) { 46641ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/data/data", create_data_user_path(nullptr, 0)); 46741ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/data/user/10", create_data_user_path(nullptr, 10)); 46841ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey 46941ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0", 47041ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey create_data_user_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0)); 47141ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10", 47241ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey create_data_user_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10)); 47341ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey} 47441ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey 47541ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff SharkeyTEST_F(UtilsTest, CreateDataMediaPath) { 47641ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/data/media/0", create_data_media_path(nullptr, 0)); 47741ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/data/media/10", create_data_media_path(nullptr, 10)); 47841ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey 47941ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/0", 48041ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0)); 48141ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/10", 48241ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10)); 48341ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey} 48441ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey 485d792118c493806eeb24a8203f508e6e18fe93bd7Jeff SharkeyTEST_F(UtilsTest, CreateDataAppPackagePath) { 486d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey EXPECT_EQ("/data/app/com.example", create_data_app_package_path(nullptr, "com.example")); 487d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey 488d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app/com.example", 489d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey create_data_app_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", "com.example")); 490d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey} 491d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey 492d792118c493806eeb24a8203f508e6e18fe93bd7Jeff SharkeyTEST_F(UtilsTest, CreateDataUserPackagePath) { 493d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey EXPECT_EQ("/data/data/com.example", create_data_user_package_path(nullptr, 0, "com.example")); 494d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey EXPECT_EQ("/data/user/10/com.example", create_data_user_package_path(nullptr, 10, "com.example")); 495c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey 496c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0/com.example", 497d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey create_data_user_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0, "com.example")); 498c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10/com.example", 499d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey create_data_user_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10, "com.example")); 500c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey} 501c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey 50294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 503