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