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
2202d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe#include <commands.h>
2302d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe#include <globals.h>
2402d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe#include <utils.h>
2519803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey
2619803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey#undef LOG_TAG
2719803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey#define LOG_TAG "utils_test"
2894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_DATA_DIR "/data/"
3094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_APP_DIR "/data/app/"
3194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_APP_PRIVATE_DIR "/data/app-private/"
3294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_ASEC_DIR "/mnt/asec/"
3319803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey#define TEST_EXPAND_DIR "/mnt/expand/"
3494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
3594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_SYSTEM_DIR1 "/system/app/"
3694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define TEST_SYSTEM_DIR2 "/vendor/app/"
3794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
3894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define REALLY_LONG_APP_NAME "com.example." \
3994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
4094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
4194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
4294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#define REALLY_LONG_LEAF_NAME "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        "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
4694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_"
4794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodnamespace android {
4902d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampenamespace installd {
5094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodclass UtilsTest : public testing::Test {
5294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodprotected:
5394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual void SetUp() {
5419803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_app_dir.path = (char*) TEST_APP_DIR;
5594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_app_dir.len = strlen(TEST_APP_DIR);
5694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5719803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_app_private_dir.path = (char*) TEST_APP_PRIVATE_DIR;
5894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR);
5994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
6019803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_data_dir.path = (char*) TEST_DATA_DIR;
6194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_data_dir.len = strlen(TEST_DATA_DIR);
6294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
6319803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_asec_dir.path = (char*) TEST_ASEC_DIR;
6494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_asec_dir.len = strlen(TEST_ASEC_DIR);
6594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
6619803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_mnt_expand_dir.path = (char*) TEST_EXPAND_DIR;
6719803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_mnt_expand_dir.len = strlen(TEST_EXPAND_DIR);
6819803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey
6994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_system_dirs.count = 2;
7094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
7194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t));
7219803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_system_dirs.dirs[0].path = (char*) TEST_SYSTEM_DIR1;
7394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1);
7494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
7519803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey        android_system_dirs.dirs[1].path = (char*) TEST_SYSTEM_DIR2;
7694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2);
7794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
7894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
7994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    virtual void TearDown() {
8094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        free(android_system_dirs.dirs);
8194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
8294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood};
8394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
8494afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_BadPrefix) {
8594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    // Bad prefixes directories
8694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badprefix1 = "/etc/passwd";
8794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badprefix1))
8894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badprefix1 << " should be allowed as a valid path";
8994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
9094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badprefix2 = "../.." TEST_APP_DIR "../../../blah";
9194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badprefix2))
9294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badprefix2 << " should be allowed as a valid path";
9394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
9494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badprefix3 = "init.rc";
9594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badprefix3))
9694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badprefix3 << " should be allowed as a valid path";
9794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
9894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badprefix4 = "/init.rc";
9994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badprefix4))
10094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badprefix4 << " should be allowed as a valid path";
10194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
10294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
10394afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_Internal) {
10494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    // Internal directories
10594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *internal1 = TEST_APP_DIR "example.apk";
10694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, validate_apk_path(internal1))
10794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << internal1 << " should be allowed as a valid path";
10894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
109fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    // b/16888084
110fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    const char *path2 = TEST_APP_DIR "example.com/example.apk";
111fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    EXPECT_EQ(0, validate_apk_path(path2))
112fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle            << path2 << " should be allowed as a valid path";
113fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle
11494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badint1 = TEST_APP_DIR "../example.apk";
11594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badint1))
11694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badint1 << " should be rejected as a invalid path";
11794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
11894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badint2 = TEST_APP_DIR "/../example.apk";
11994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badint2))
12094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badint2 << " should be rejected as a invalid path";
12194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
122fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    // Only one subdir should be allowed.
123fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    const char *bad_path3 = TEST_APP_DIR "example.com/subdir/pkg.apk";
124fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    EXPECT_EQ(-1, validate_apk_path(bad_path3))
125fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle            << bad_path3 << " should be rejected as a invalid path";
126c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
127c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *bad_path4 = TEST_APP_DIR "example.com/subdir/../pkg.apk";
128c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(-1, validate_apk_path(bad_path4))
129c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << bad_path4 << " should be rejected as a invalid path";
130c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
131c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *bad_path5 = TEST_APP_DIR "example.com1/../example.com2/pkg.apk";
132c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(-1, validate_apk_path(bad_path5))
133c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << bad_path5 << " should be rejected as a invalid path";
13494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
13594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
13694afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_Private) {
13794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    // Internal directories
13894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *private1 = TEST_APP_PRIVATE_DIR "example.apk";
13994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, validate_apk_path(private1))
14094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << private1 << " should be allowed as a valid path";
14194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
142fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    // b/16888084
143fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    const char *path2 = TEST_APP_DIR "example.com/example.apk";
144fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    EXPECT_EQ(0, validate_apk_path(path2))
145fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle            << path2 << " should be allowed as a valid path";
146fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle
14794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badpriv1 = TEST_APP_PRIVATE_DIR "../example.apk";
14894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badpriv1))
14994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badpriv1 << " should be rejected as a invalid path";
15094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
15194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badpriv2 = TEST_APP_PRIVATE_DIR "/../example.apk";
15294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badpriv2))
15394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badpriv2 << " should be rejected as a invalid path";
15494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
155fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    // Only one subdir should be allowed.
156fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    const char *bad_path3 = TEST_APP_PRIVATE_DIR "example.com/subdir/pkg.apk";
157fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle    EXPECT_EQ(-1, validate_apk_path(bad_path3))
158fd88ff2edd954117e36372fb095b6f5f35aad0e3Calin Juravle            << bad_path3 << " should be rejected as a invalid path";
159c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
160c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *bad_path4 = TEST_APP_PRIVATE_DIR "example.com/subdir/../pkg.apk";
161c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(-1, validate_apk_path(bad_path4))
162c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << bad_path4 << " should be rejected as a invalid path";
163c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
164c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *bad_path5 = TEST_APP_PRIVATE_DIR "example.com1/../example.com2/pkg.apk";
165c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(-1, validate_apk_path(bad_path5))
166c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << bad_path5 << " should be rejected as a invalid path";
16794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
16894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
16994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
17094afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_AsecGood1) {
17194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *asec1 = TEST_ASEC_DIR "example.apk";
17294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, validate_apk_path(asec1))
17394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << asec1 << " should be allowed as a valid path";
17494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
17594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
17694afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_AsecGood2) {
17794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *asec2 = TEST_ASEC_DIR "com.example.asec/pkg.apk";
17894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, validate_apk_path(asec2))
17994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << asec2 << " should be allowed as a valid path";
18094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
18194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
18294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_EscapeFail) {
18394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badasec1 = TEST_ASEC_DIR "../example.apk";
18494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badasec1))
18594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badasec1 << " should be rejected as a invalid path";
18694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
18794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
18894afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) {
18994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk";
19094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badasec2))
19194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badasec2 << " should be rejected as a invalid path";
19294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
19394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
19494afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) {
19594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk";
19694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badasec3))
19794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badasec3  << " should be rejected as a invalid path";
19894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
19994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
20094afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_SlashEscapeFail) {
20194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badasec4 = TEST_ASEC_DIR "/../example.apk";
20294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badasec4))
20394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badasec4 << " should be rejected as a invalid path";
20494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
20594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
20694afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_CrazyDirFail) {
20794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badasec5 = TEST_ASEC_DIR ".//../..";
20894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badasec5))
20994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badasec5 << " should be rejected as a invalid path";
21094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
21194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
21294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_SubdirEscapeSingleFail) {
21394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badasec6 = TEST_ASEC_DIR "com.example.asec/../pkg.apk";
21494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badasec6))
21594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badasec6 << " should be rejected as a invalid path";
21694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
21794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
21894afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, IsValidApkPath_TwoSubdirFail) {
21994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badasec7 = TEST_ASEC_DIR "com.example.asec/subdir1/pkg.apk";
22094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_apk_path(badasec7))
22194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badasec7 << " should be rejected as a invalid path";
22294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
22394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
22494afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_Dir1) {
22594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *sysapp1 = TEST_SYSTEM_DIR1 "Voice.apk";
22694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, validate_system_app_path(sysapp1))
22794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << sysapp1 << " should be allowed as a system path";
22894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
22994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
23094afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_Dir2) {
23194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *sysapp2 = TEST_SYSTEM_DIR2 "com.example.myapp.apk";
23294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, validate_system_app_path(sysapp2))
23394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << sysapp2 << " should be allowed as a system path";
23494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
23594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
23694afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_EscapeFail) {
23794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badapp1 = TEST_SYSTEM_DIR1 "../com.example.apk";
23894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_system_app_path(badapp1))
23994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badapp1 << " should be rejected not a system path";
24094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
24194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
24294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_DoubleEscapeFail) {
24394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badapp2 = TEST_SYSTEM_DIR2 "/../../com.example.apk";
24494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_system_app_path(badapp2))
24594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badapp2 << " should be rejected not a system path";
24694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
24794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
24894afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) {
24994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char *badapp3 = TEST_APP_DIR "/../../com.example.apk";
25094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, validate_system_app_path(badapp3))
25194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << badapp3 << " should be rejected not a system path";
25294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
25394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
254c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin JuravleTEST_F(UtilsTest, CheckSystemApp_Subdir) {
255c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *sysapp = TEST_SYSTEM_DIR1 "com.example/com.example.apk";
256c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(0, validate_system_app_path(sysapp))
257c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << sysapp << " should be allowed as a system path";
258c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
259c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *badapp = TEST_SYSTEM_DIR1 "com.example/subdir/com.example.apk";
260c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(-1, validate_system_app_path(badapp))
261c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << badapp << " should be rejected not a system path";
262c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
263c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *badapp1 = TEST_SYSTEM_DIR1 "com.example/subdir/../com.example.apk";
264c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(-1, validate_system_app_path(badapp1))
265c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << badapp1 << " should be rejected not a system path";
266c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
267c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    const char *badapp2 = TEST_SYSTEM_DIR1 "com.example1/../com.example2/com.example.apk";
268c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle    EXPECT_EQ(-1, validate_system_app_path(badapp2))
269c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle            << badapp2 << " should be rejected not a system path";
270c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle}
271c597b6dd895dbb2b28c757ce7a2651b3cdc9b00cCalin Juravle
27294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_NullPathFail) {
27394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    dir_rec_t test1;
27494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL))
27594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should not allow NULL as a path.";
27694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
27794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
27894afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_EmptyPathFail) {
27994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    dir_rec_t test1;
28094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, get_path_from_string(&test1, ""))
28194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should not allow empty paths.";
28294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
28394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
28494afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_RelativePathFail) {
28594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    dir_rec_t test1;
28694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, get_path_from_string(&test1, "mnt/asec"))
28794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should not allow relative paths.";
28894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
28994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
29094afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_NonCanonical) {
29194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    dir_rec_t test1;
29294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
29394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, get_path_from_string(&test1, "/mnt/asec"))
29494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should be able to canonicalize directory /mnt/asec";
29594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ("/mnt/asec/", test1.path)
29694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "/mnt/asec should be canonicalized to /mnt/asec/";
29794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(10, (ssize_t) test1.len)
29894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "path len should be equal to the length of /mnt/asec/ (10)";
29994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    free(test1.path);
30094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
30194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
30294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, GetPathFromString_CanonicalPath) {
30394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    dir_rec_t test3;
30494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, get_path_from_string(&test3, "/data/app/"))
30594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should be able to canonicalize directory /data/app/";
30694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ("/data/app/", test3.path)
30794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "/data/app/ should be canonicalized to /data/app/";
30894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(10, (ssize_t) test3.len)
30994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "path len should be equal to the length of /data/app/ (10)";
31094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    free(test3.path);
31194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
31294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
31394afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_LongPkgNameSuccess) {
31494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
31594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
31694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    // Create long packagename of "aaaaa..."
31794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    size_t pkgnameSize = PKG_NAME_MAX;
31894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char pkgname[pkgnameSize + 1];
31994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    memset(pkgname, 'a', pkgnameSize);
32094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    pkgname[pkgnameSize] = '\0';
32194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
32294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, create_pkg_path(path, pkgname, "", 0))
32394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should successfully be able to create package name.";
32494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
32502d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe    std::string prefix = std::string(TEST_DATA_DIR) + PRIMARY_USER_PREFIX;
32602d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe    size_t offset = prefix.length();
327c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey
32894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ(pkgname, path + offset)
32994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood             << "Package path should be a really long string of a's";
33094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
33194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
33294afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_LongPkgNameFail) {
33394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
33494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
33594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    // Create long packagename of "aaaaa..."
33694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    size_t pkgnameSize = PKG_NAME_MAX + 1;
33794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char pkgname[pkgnameSize + 1];
33894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    memset(pkgname, 'a', pkgnameSize);
33994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    pkgname[pkgnameSize] = '\0';
34094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
34194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, create_pkg_path(path, pkgname, "", 0))
34294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should return error because package name is too long.";
34394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
34494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
34594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_LongPostfixFail) {
34694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
34794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
34894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    // Create long packagename of "aaaaa..."
34994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    size_t postfixSize = PKG_PATH_MAX;
35094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char postfix[postfixSize + 1];
35194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    memset(postfix, 'a', postfixSize);
35294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    postfix[postfixSize] = '\0';
35394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
35494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, create_pkg_path(path, "com.example.package", postfix, 0))
35594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should return error because postfix is too long.";
35694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
35794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
35894afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_PrimaryUser) {
35994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
36094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
36194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 0))
36294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should return error because postfix is too long.";
36394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
36402d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe    std::string p = std::string(TEST_DATA_DIR)
36502d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe                    + PRIMARY_USER_PREFIX
36602d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe                    + "com.example.package";
36702d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe    EXPECT_STREQ(p.c_str(), path)
36894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Package path should be in /data/data/";
36994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
37094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
37194afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreatePkgPath_SecondaryUser) {
37294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
37394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
37494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 1))
37594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should successfully create package path.";
37694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
37702d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe    std::string p = std::string(TEST_DATA_DIR)
37802d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe                    + SECONDARY_USER_PREFIX
37902d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe                    + "1/com.example.package";
38002d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe    EXPECT_STREQ(p.c_str(), path)
38194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Package path should be in /data/user/";
38294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
38394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
38494afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreateMovePath_Primary) {
38594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
38694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
38794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0))
38894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should be able to create move path for primary user";
38994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
39094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path)
39194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Primary user package directory should be created correctly";
39294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
39394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
39494afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) {
39594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
39694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
39794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0))
39894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should fail to create move path for primary user";
39994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
40094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
40194afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) {
40294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char path[PKG_PATH_MAX];
40394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
40494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0))
40594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should fail to create move path for primary user";
40694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
40794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
40894afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, CopyAndAppend_Normal) {
40994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix)
41094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    dir_rec_t dst;
41194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    dir_rec_t src;
41294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
41319803807cd7ae01868fcfa50305f4a7dd13765e2Jeff Sharkey    src.path = (char*) "/data/";
41494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    src.len = strlen(src.path);
41594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
41694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, copy_and_append(&dst, &src, "app/"))
41794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Should return error because postfix is too long.";
41894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
41994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ("/data/app/", dst.path)
42094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Appended path should be correct";
42194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
42294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(10, (ssize_t) dst.len)
42394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "Appended path should be length of '/data/app/' (10)";
42494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
42594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
42694afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, AppendAndIncrement_Normal) {
42794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    size_t dst_size = 10;
42894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char dst[dst_size];
42994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char *dstp = dst;
43094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char* src = "FOO";
43194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
43294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
43394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "String should append successfully";
43494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
43594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ("FOO", dst)
43694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "String should append correctly";
43794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
43894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
43994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "String should append successfully again";
44094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
44194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ("FOOFOO", dst)
44294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "String should append correctly again";
44394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
44494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
44594afecf4b6f437b3ee9a076242402e421c6c07a6Mike LockwoodTEST_F(UtilsTest, AppendAndIncrement_TooBig) {
44694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    size_t dst_size = 5;
44794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char dst[dst_size];
44894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    char *dstp = dst;
44994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    const char* src = "FOO";
45094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
45194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
45294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "String should append successfully";
45394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
45494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_STREQ("FOO", dst)
45594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "String should append correctly";
45694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
45794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    EXPECT_EQ(-1, append_and_increment(&dstp, src, &dst_size))
45894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            << "String should fail because it's too large to fit";
45994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
46094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
46141ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff SharkeyTEST_F(UtilsTest, CreateDataPath) {
46241ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/data", create_data_path(nullptr));
46341ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b",
46441ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey            create_data_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b"));
46541ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey}
46641ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey
467d792118c493806eeb24a8203f508e6e18fe93bd7Jeff SharkeyTEST_F(UtilsTest, CreateDataAppPath) {
468d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey    EXPECT_EQ("/data/app", create_data_app_path(nullptr));
469d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey
470d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app",
471d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey            create_data_app_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b"));
472d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey}
473d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey
47441ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff SharkeyTEST_F(UtilsTest, CreateDataUserPath) {
4752f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey    EXPECT_EQ("/data/data", create_data_user_ce_path(nullptr, 0));
4762f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey    EXPECT_EQ("/data/user/10", create_data_user_ce_path(nullptr, 10));
47741ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey
47841ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0",
4792f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey            create_data_user_ce_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0));
48041ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10",
4812f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey            create_data_user_ce_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10));
48241ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey}
48341ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey
48441ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff SharkeyTEST_F(UtilsTest, CreateDataMediaPath) {
48541ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/data/media/0", create_data_media_path(nullptr, 0));
48641ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/data/media/10", create_data_media_path(nullptr, 10));
48741ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey
48841ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/0",
48941ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey            create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0));
49041ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/media/10",
49141ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey            create_data_media_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10));
49241ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey}
49341ea424413c0381ef2aa15fc5bd5d4b88abd23c4Jeff Sharkey
494d792118c493806eeb24a8203f508e6e18fe93bd7Jeff SharkeyTEST_F(UtilsTest, CreateDataAppPackagePath) {
495d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey    EXPECT_EQ("/data/app/com.example", create_data_app_package_path(nullptr, "com.example"));
496d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey
497d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/app/com.example",
498d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey            create_data_app_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", "com.example"));
499d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey}
500d792118c493806eeb24a8203f508e6e18fe93bd7Jeff Sharkey
501d792118c493806eeb24a8203f508e6e18fe93bd7Jeff SharkeyTEST_F(UtilsTest, CreateDataUserPackagePath) {
5022f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey    EXPECT_EQ("/data/data/com.example", create_data_user_ce_package_path(nullptr, 0, "com.example"));
5032f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey    EXPECT_EQ("/data/user/10/com.example", create_data_user_ce_package_path(nullptr, 10, "com.example"));
504c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey
505c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/0/com.example",
5062f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey            create_data_user_ce_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 0, "com.example"));
507c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey    EXPECT_EQ("/mnt/expand/57f8f4bc-abf4-655f-bf67-946fc0f9f25b/user/10/com.example",
5082f720f7ec5c9d0b91defc85878e7330b10f8e89aJeff Sharkey            create_data_user_ce_package_path("57f8f4bc-abf4-655f-bf67-946fc0f9f25b", 10, "com.example"));
509c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey}
510c03de09173f98506e73e7cf7df21fe11795d4b24Jeff Sharkey
51102d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe}  // namespace installd
51202d0de56c75347a0cb8d5a8565dc8c4ee7616057Andreas Gampe}  // namespace android
513