blob: 916c615e229b18bb87dcd527f5f49a03ac285b86 [file] [log] [blame]
Mark Salyzyn5649b312017-03-22 08:46:55 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdio.h>
18#include <sys/cdefs.h>
19
20#include <string>
Mark Salyzyn256d3392017-03-22 08:46:55 -070021#include <vector>
Mark Salyzyn5649b312017-03-22 08:46:55 -070022
23#include <android-base/file.h>
24#include <android-base/macros.h>
Mark Salyzyn256d3392017-03-22 08:46:55 -070025#include <android-base/strings.h>
Mark Salyzyn5649b312017-03-22 08:46:55 -070026#include <gtest/gtest.h>
27#include <private/android_filesystem_config.h>
28#include <private/fs_config.h>
29
30#include "android_filesystem_config_test_data.h"
31
32// must run test in the test directory
Mark Salyzyncf343a62018-11-16 09:44:07 -080033static const std::string fs_config_generate_command = "./fs_config_generate_test";
Mark Salyzyn5649b312017-03-22 08:46:55 -070034
Mark Salyzyncf343a62018-11-16 09:44:07 -080035static std::string popenToString(const std::string command) {
Mark Salyzyn5649b312017-03-22 08:46:55 -070036 std::string ret;
37
Mark Salyzyncf343a62018-11-16 09:44:07 -080038 auto fp = popen(command.c_str(), "r");
Mark Salyzyn5649b312017-03-22 08:46:55 -070039 if (fp) {
40 if (!android::base::ReadFdToString(fileno(fp), &ret)) ret = "";
41 pclose(fp);
42 }
43 return ret;
44}
45
46static void confirm(std::string&& data, const fs_path_config* config,
47 ssize_t num_config) {
Mark Salyzyncf343a62018-11-16 09:44:07 -080048 auto pc = reinterpret_cast<const fs_path_config_from_file*>(data.c_str());
49 auto len = data.size();
Mark Salyzyn5649b312017-03-22 08:46:55 -070050
51 ASSERT_TRUE(config != NULL);
52 ASSERT_LT(0, num_config);
53
54 while (len > 0) {
Mark Salyzyncf343a62018-11-16 09:44:07 -080055 auto host_len = pc->len;
Mark Salyzyn5649b312017-03-22 08:46:55 -070056 if (host_len > len) break;
57
58 EXPECT_EQ(config->mode, pc->mode);
59 EXPECT_EQ(config->uid, pc->uid);
60 EXPECT_EQ(config->gid, pc->gid);
61 EXPECT_EQ(config->capabilities, pc->capabilities);
62 EXPECT_STREQ(config->prefix, pc->prefix);
63
64 EXPECT_LT(0, num_config);
65 --num_config;
66 if (num_config >= 0) ++config;
67 pc = reinterpret_cast<const fs_path_config_from_file*>(
68 reinterpret_cast<const char*>(pc) + host_len);
69 len -= host_len;
70 }
71 EXPECT_EQ(0, num_config);
72}
73
74/* See local android_filesystem_config.h for test data */
75
76TEST(fs_conf_test, dirs) {
Mark Salyzyncf343a62018-11-16 09:44:07 -080077 confirm(popenToString(fs_config_generate_command + " -D"),
Mark Salyzyn5649b312017-03-22 08:46:55 -070078 android_device_dirs, arraysize(android_device_dirs));
79}
80
81TEST(fs_conf_test, files) {
Mark Salyzyncf343a62018-11-16 09:44:07 -080082 confirm(popenToString(fs_config_generate_command + " -F"),
Mark Salyzyn5649b312017-03-22 08:46:55 -070083 android_device_files, arraysize(android_device_files));
84}
Mark Salyzyn256d3392017-03-22 08:46:55 -070085
Mark Salyzyncf343a62018-11-16 09:44:07 -080086static bool is_system(const char* prefix) {
87 return !android::base::StartsWith(prefix, "vendor/") &&
88 !android::base::StartsWith(prefix, "system/vendor/") &&
89 !android::base::StartsWith(prefix, "oem/") &&
90 !android::base::StartsWith(prefix, "system/oem/") &&
91 !android::base::StartsWith(prefix, "odm/") &&
92 !android::base::StartsWith(prefix, "system/odm/") &&
93 !android::base::StartsWith(prefix, "product/") &&
94 !android::base::StartsWith(prefix, "system/product/") &&
95 !android::base::StartsWith(prefix, "product_services/") &&
96 !android::base::StartsWith(prefix, "system/product_services/");
97}
Mark Salyzyn256d3392017-03-22 08:46:55 -070098
99TEST(fs_conf_test, system_dirs) {
100 std::vector<fs_path_config> dirs;
Mark Salyzyncf343a62018-11-16 09:44:07 -0800101 auto config = android_device_dirs;
102 for (auto num = arraysize(android_device_dirs); num; --num) {
103 if (is_system(config->prefix)) {
Mark Salyzyn256d3392017-03-22 08:46:55 -0700104 dirs.emplace_back(*config);
105 }
106 ++config;
107 }
Mark Salyzyncf343a62018-11-16 09:44:07 -0800108 confirm(popenToString(fs_config_generate_command + " -D -P -vendor,-oem,-odm,-product,-product_services"),
109 &dirs[0], dirs.size());
110}
111
112static void fs_conf_test_dirs(const std::string& partition_name) {
113 std::vector<fs_path_config> dirs;
114 auto config = android_device_dirs;
115 const auto str = partition_name + "/";
116 const auto alt_str = "system/" + partition_name + "/";
117 for (auto num = arraysize(android_device_dirs); num; --num) {
118 if (android::base::StartsWith(config->prefix, str) ||
119 android::base::StartsWith(config->prefix, alt_str)) {
120 dirs.emplace_back(*config);
121 }
122 ++config;
123 }
124 confirm(popenToString(fs_config_generate_command + " -D -P " + partition_name),
Mark Salyzyn256d3392017-03-22 08:46:55 -0700125 &dirs[0], dirs.size());
126}
127
128TEST(fs_conf_test, vendor_dirs) {
Mark Salyzyncf343a62018-11-16 09:44:07 -0800129 fs_conf_test_dirs("vendor");
Mark Salyzyn256d3392017-03-22 08:46:55 -0700130}
131
132TEST(fs_conf_test, oem_dirs) {
Mark Salyzyncf343a62018-11-16 09:44:07 -0800133 fs_conf_test_dirs("oem");
Mark Salyzyn256d3392017-03-22 08:46:55 -0700134}
135
136TEST(fs_conf_test, odm_dirs) {
Mark Salyzyncf343a62018-11-16 09:44:07 -0800137 fs_conf_test_dirs("odm");
Mark Salyzyn256d3392017-03-22 08:46:55 -0700138}
139
140TEST(fs_conf_test, system_files) {
141 std::vector<fs_path_config> files;
Mark Salyzyncf343a62018-11-16 09:44:07 -0800142 auto config = android_device_files;
143 for (auto num = arraysize(android_device_files); num; --num) {
144 if (is_system(config->prefix)) {
Mark Salyzyn256d3392017-03-22 08:46:55 -0700145 files.emplace_back(*config);
146 }
147 ++config;
148 }
Mark Salyzyncf343a62018-11-16 09:44:07 -0800149 confirm(popenToString(fs_config_generate_command + " -F -P -vendor,-oem,-odm,-product,-product_services"),
150 &files[0], files.size());
151}
152
153static void fs_conf_test_files(const std::string& partition_name) {
154 std::vector<fs_path_config> files;
155 auto config = android_device_files;
156 const auto str = partition_name + "/";
157 const auto alt_str = "system/" + partition_name + "/";
158 for (auto num = arraysize(android_device_files); num; --num) {
159 if (android::base::StartsWith(config->prefix, str) ||
160 android::base::StartsWith(config->prefix, alt_str)) {
161 files.emplace_back(*config);
162 }
163 ++config;
164 }
165 confirm(popenToString(fs_config_generate_command + " -F -P " + partition_name),
Mark Salyzyn256d3392017-03-22 08:46:55 -0700166 &files[0], files.size());
167}
168
169TEST(fs_conf_test, vendor_files) {
Mark Salyzyncf343a62018-11-16 09:44:07 -0800170 fs_conf_test_files("vendor");
Mark Salyzyn256d3392017-03-22 08:46:55 -0700171}
172
173TEST(fs_conf_test, oem_files) {
Mark Salyzyncf343a62018-11-16 09:44:07 -0800174 fs_conf_test_files("oem");
Mark Salyzyn256d3392017-03-22 08:46:55 -0700175}
176
177TEST(fs_conf_test, odm_files) {
Mark Salyzyncf343a62018-11-16 09:44:07 -0800178 fs_conf_test_files("odm");
179}
180
181TEST(fs_conf_test, product_files) {
182 fs_conf_test_files("product");
183}
184
185TEST(fs_conf_test, product_services_files) {
186 fs_conf_test_files("product_services");
Mark Salyzyn256d3392017-03-22 08:46:55 -0700187}