blob: e1e4e49f667e20dd125a46429af4a1f838687b1b [file] [log] [blame]
Tom Cherryc44f6a42017-04-05 15:58:31 -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 "devices.h"
18
Tom Cherryc44f6a42017-04-05 15:58:31 -070019#include <android-base/scopeguard.h>
Sandeep Patilcd2ba0d2017-06-21 12:46:41 -070020#include <android-base/test_utils.h>
Tom Cherryc44f6a42017-04-05 15:58:31 -070021#include <gtest/gtest.h>
22
Sandeep Patilcd2ba0d2017-06-21 12:46:41 -070023#include "util.h"
24
25using namespace std::string_literals;
26
Tom Cherryed506f72017-05-25 15:58:59 -070027class DeviceHandlerTester {
28 public:
Sandeep Patilcd2ba0d2017-06-21 12:46:41 -070029 void TestGetSymlinks(const std::string& platform_device, const Uevent& uevent,
Tom Cherryed506f72017-05-25 15:58:59 -070030 const std::vector<std::string> expected_links, bool block) {
Sandeep Patilcd2ba0d2017-06-21 12:46:41 -070031 TemporaryDir fake_sys_root;
32 device_handler_.sysfs_mount_point_ = fake_sys_root.path;
33
34 std::string platform_device_dir = fake_sys_root.path + platform_device;
35 mkdir_recursive(platform_device_dir, 0777, nullptr);
36
37 std::string platform_bus = fake_sys_root.path + "/bus/platform"s;
38 mkdir_recursive(platform_bus, 0777, nullptr);
39 symlink(platform_bus.c_str(), (platform_device_dir + "/subsystem").c_str());
40
41 mkdir_recursive(android::base::Dirname(fake_sys_root.path + uevent.path), 0777, nullptr);
Tom Cherryed506f72017-05-25 15:58:59 -070042
43 std::vector<std::string> result;
44 if (block) {
45 result = device_handler_.GetBlockDeviceSymlinks(uevent);
46 } else {
47 result = device_handler_.GetCharacterDeviceSymlinks(uevent);
48 }
49
50 auto expected_size = expected_links.size();
51 ASSERT_EQ(expected_size, result.size());
52 if (expected_size == 0) return;
53
54 // Explicitly iterate so the results are visible if a failure occurs
55 for (unsigned int i = 0; i < expected_size; ++i) {
56 EXPECT_EQ(expected_links[i], result[i]);
57 }
58 }
59
60 private:
61 DeviceHandler device_handler_;
62};
63
Tom Cherryed506f72017-05-25 15:58:59 -070064TEST(device_handler, get_character_device_symlinks_success) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070065 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -070066 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -070067 .path = "/devices/platform/some_device_name/usb/usb_device/name/tty2-1:1.0",
68 .subsystem = "tty",
69 };
70 std::vector<std::string> expected_result{"/dev/usb/ttyname"};
71
Tom Cherryed506f72017-05-25 15:58:59 -070072 DeviceHandlerTester device_handler_tester_;
73 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -070074}
75
Tom Cherryed506f72017-05-25 15:58:59 -070076TEST(device_handler, get_character_device_symlinks_no_pdev_match) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070077 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -070078 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -070079 .path = "/device/name/tty2-1:1.0", .subsystem = "tty",
80 };
81 std::vector<std::string> expected_result;
82
Tom Cherryed506f72017-05-25 15:58:59 -070083 DeviceHandlerTester device_handler_tester_;
84 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -070085}
86
Tom Cherryed506f72017-05-25 15:58:59 -070087TEST(device_handler, get_character_device_symlinks_nothing_after_platform_device) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070088 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -070089 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -070090 .path = "/devices/platform/some_device_name", .subsystem = "tty",
91 };
92 std::vector<std::string> expected_result;
93
Tom Cherryed506f72017-05-25 15:58:59 -070094 DeviceHandlerTester device_handler_tester_;
95 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -070096}
97
Tom Cherryed506f72017-05-25 15:58:59 -070098TEST(device_handler, get_character_device_symlinks_no_usb_found) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070099 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700100 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700101 .path = "/devices/platform/some_device_name/bad/bad/", .subsystem = "tty",
102 };
103 std::vector<std::string> expected_result;
104
Tom Cherryed506f72017-05-25 15:58:59 -0700105 DeviceHandlerTester device_handler_tester_;
106 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700107}
108
Tom Cherryed506f72017-05-25 15:58:59 -0700109TEST(device_handler, get_character_device_symlinks_no_roothub) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700110 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700111 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700112 .path = "/devices/platform/some_device_name/usb/", .subsystem = "tty",
113 };
114 std::vector<std::string> expected_result;
115
Tom Cherryed506f72017-05-25 15:58:59 -0700116 DeviceHandlerTester device_handler_tester_;
117 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700118}
119
Tom Cherryed506f72017-05-25 15:58:59 -0700120TEST(device_handler, get_character_device_symlinks_no_usb_device) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700121 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700122 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700123 .path = "/devices/platform/some_device_name/usb/usb_device/", .subsystem = "tty",
124 };
125 std::vector<std::string> expected_result;
126
Tom Cherryed506f72017-05-25 15:58:59 -0700127 DeviceHandlerTester device_handler_tester_;
128 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700129}
130
Tom Cherryed506f72017-05-25 15:58:59 -0700131TEST(device_handler, get_character_device_symlinks_no_final_slash) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700132 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700133 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700134 .path = "/devices/platform/some_device_name/usb/usb_device/name", .subsystem = "tty",
135 };
136 std::vector<std::string> expected_result;
137
Tom Cherryed506f72017-05-25 15:58:59 -0700138 DeviceHandlerTester device_handler_tester_;
139 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700140}
141
Tom Cherryed506f72017-05-25 15:58:59 -0700142TEST(device_handler, get_character_device_symlinks_no_final_name) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700143 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700144 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700145 .path = "/devices/platform/some_device_name/usb/usb_device//", .subsystem = "tty",
146 };
147 std::vector<std::string> expected_result;
148
Tom Cherryed506f72017-05-25 15:58:59 -0700149 DeviceHandlerTester device_handler_tester_;
150 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700151}
152
Tom Cherryed506f72017-05-25 15:58:59 -0700153TEST(device_handler, get_block_device_symlinks_success_platform) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700154 // These are actual paths from bullhead
155 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700156 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700157 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0",
Tom Cherrye3e48212017-04-11 13:53:37 -0700158 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700159 .partition_num = -1,
160 };
161 std::vector<std::string> expected_result{"/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0"};
162
Tom Cherryed506f72017-05-25 15:58:59 -0700163 DeviceHandlerTester device_handler_tester_;
164 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700165}
166
Tom Cherryed506f72017-05-25 15:58:59 -0700167TEST(device_handler, get_block_device_symlinks_success_platform_with_partition) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700168 // These are actual paths from bullhead
169 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700170 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700171 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
172 .partition_name = "modem",
173 .partition_num = 1,
174 };
175 std::vector<std::string> expected_result{
176 "/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem",
177 "/dev/block/platform/soc.0/f9824900.sdhci/by-num/p1",
178 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
179 };
180
Tom Cherryed506f72017-05-25 15:58:59 -0700181 DeviceHandlerTester device_handler_tester_;
182 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700183}
184
Tom Cherryed506f72017-05-25 15:58:59 -0700185TEST(device_handler, get_block_device_symlinks_success_platform_with_partition_only_num) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700186 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700187 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700188 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
Tom Cherrye3e48212017-04-11 13:53:37 -0700189 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700190 .partition_num = 1,
191 };
192 std::vector<std::string> expected_result{
193 "/dev/block/platform/soc.0/f9824900.sdhci/by-num/p1",
194 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
195 };
196
Tom Cherryed506f72017-05-25 15:58:59 -0700197 DeviceHandlerTester device_handler_tester_;
198 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700199}
200
Tom Cherryed506f72017-05-25 15:58:59 -0700201TEST(device_handler, get_block_device_symlinks_success_platform_with_partition_only_name) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700202 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700203 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700204 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
205 .partition_name = "modem",
206 .partition_num = -1,
207 };
208 std::vector<std::string> expected_result{
209 "/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem",
210 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
211 };
212
Tom Cherryed506f72017-05-25 15:58:59 -0700213 DeviceHandlerTester device_handler_tester_;
214 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700215}
216
Tom Cherryed506f72017-05-25 15:58:59 -0700217TEST(device_handler, get_block_device_symlinks_success_pci) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700218 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700219 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700220 .path = "/devices/pci0000:00/0000:00:1f.2/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherryc44f6a42017-04-05 15:58:31 -0700221 };
222 std::vector<std::string> expected_result{"/dev/block/pci/pci0000:00/0000:00:1f.2/mmcblk0"};
223
Tom Cherryed506f72017-05-25 15:58:59 -0700224 DeviceHandlerTester device_handler_tester_;
225 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700226}
227
Tom Cherryed506f72017-05-25 15:58:59 -0700228TEST(device_handler, get_block_device_symlinks_pci_bad_format) {
Tom Cherry2e344f92017-04-04 17:53:45 -0700229 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700230 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700231 .path = "/devices/pci//mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherry2e344f92017-04-04 17:53:45 -0700232 };
233 std::vector<std::string> expected_result{};
234
Tom Cherryed506f72017-05-25 15:58:59 -0700235 DeviceHandlerTester device_handler_tester_;
236 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherry2e344f92017-04-04 17:53:45 -0700237}
238
Tom Cherryed506f72017-05-25 15:58:59 -0700239TEST(device_handler, get_block_device_symlinks_success_vbd) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700240 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700241 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700242 .path = "/devices/vbd-1234/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherryc44f6a42017-04-05 15:58:31 -0700243 };
244 std::vector<std::string> expected_result{"/dev/block/vbd/1234/mmcblk0"};
245
Tom Cherryed506f72017-05-25 15:58:59 -0700246 DeviceHandlerTester device_handler_tester_;
247 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700248}
249
Tom Cherryed506f72017-05-25 15:58:59 -0700250TEST(device_handler, get_block_device_symlinks_vbd_bad_format) {
Tom Cherry2e344f92017-04-04 17:53:45 -0700251 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700252 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700253 .path = "/devices/vbd-/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherry2e344f92017-04-04 17:53:45 -0700254 };
255 std::vector<std::string> expected_result{};
256
Tom Cherryed506f72017-05-25 15:58:59 -0700257 DeviceHandlerTester device_handler_tester_;
258 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherry2e344f92017-04-04 17:53:45 -0700259}
260
Tom Cherryed506f72017-05-25 15:58:59 -0700261TEST(device_handler, get_block_device_symlinks_no_matches) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700262 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700263 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700264 .path = "/devices/soc.0/not_the_device/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
Tom Cherrye3e48212017-04-11 13:53:37 -0700265 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700266 .partition_num = -1,
267 };
268 std::vector<std::string> expected_result;
269
Tom Cherryed506f72017-05-25 15:58:59 -0700270 DeviceHandlerTester device_handler_tester_;
271 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700272}
273
Tom Cherryed506f72017-05-25 15:58:59 -0700274TEST(device_handler, sanitize_null) {
275 SanitizePartitionName(nullptr);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700276}
277
Tom Cherryed506f72017-05-25 15:58:59 -0700278TEST(device_handler, sanitize_empty) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700279 std::string empty;
Tom Cherryed506f72017-05-25 15:58:59 -0700280 SanitizePartitionName(&empty);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700281 EXPECT_EQ(0u, empty.size());
282}
283
Tom Cherryed506f72017-05-25 15:58:59 -0700284TEST(device_handler, sanitize_allgood) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700285 std::string good =
286 "abcdefghijklmnopqrstuvwxyz"
287 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
288 "0123456789"
289 "_-.";
290 std::string good_copy = good;
Tom Cherryed506f72017-05-25 15:58:59 -0700291 SanitizePartitionName(&good);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700292 EXPECT_EQ(good_copy, good);
293}
294
Tom Cherryed506f72017-05-25 15:58:59 -0700295TEST(device_handler, sanitize_somebad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700296 std::string string = "abc!@#$%^&*()";
Tom Cherryed506f72017-05-25 15:58:59 -0700297 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700298 EXPECT_EQ("abc__________", string);
299}
300
Tom Cherryed506f72017-05-25 15:58:59 -0700301TEST(device_handler, sanitize_allbad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700302 std::string string = "!@#$%^&*()";
Tom Cherryed506f72017-05-25 15:58:59 -0700303 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700304 EXPECT_EQ("__________", string);
305}
306
Tom Cherryed506f72017-05-25 15:58:59 -0700307TEST(device_handler, sanitize_onebad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700308 std::string string = ")";
Tom Cherryed506f72017-05-25 15:58:59 -0700309 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700310 EXPECT_EQ("_", string);
311}
Tom Cherrycc054c92017-04-05 17:55:46 -0700312
Tom Cherryed506f72017-05-25 15:58:59 -0700313TEST(device_handler, DevPermissionsMatchNormal) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700314 // Basic from ueventd.rc
315 // /dev/null 0666 root root
316 Permissions permissions("/dev/null", 0666, 0, 0);
317 EXPECT_TRUE(permissions.Match("/dev/null"));
318 EXPECT_FALSE(permissions.Match("/dev/nullsuffix"));
319 EXPECT_FALSE(permissions.Match("/dev/nul"));
320 EXPECT_EQ(0666U, permissions.perm());
321 EXPECT_EQ(0U, permissions.uid());
322 EXPECT_EQ(0U, permissions.gid());
323}
324
Tom Cherryed506f72017-05-25 15:58:59 -0700325TEST(device_handler, DevPermissionsMatchPrefix) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700326 // Prefix from ueventd.rc
327 // /dev/dri/* 0666 root graphics
328 Permissions permissions("/dev/dri/*", 0666, 0, 1000);
329 EXPECT_TRUE(permissions.Match("/dev/dri/some_dri_device"));
330 EXPECT_TRUE(permissions.Match("/dev/dri/some_other_dri_device"));
331 EXPECT_TRUE(permissions.Match("/dev/dri/"));
332 EXPECT_FALSE(permissions.Match("/dev/dr/non_match"));
333 EXPECT_EQ(0666U, permissions.perm());
334 EXPECT_EQ(0U, permissions.uid());
335 EXPECT_EQ(1000U, permissions.gid());
336}
337
Tom Cherryed506f72017-05-25 15:58:59 -0700338TEST(device_handler, DevPermissionsMatchWildcard) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700339 // Wildcard example
340 // /dev/device*name 0666 root graphics
341 Permissions permissions("/dev/device*name", 0666, 0, 1000);
342 EXPECT_TRUE(permissions.Match("/dev/devicename"));
343 EXPECT_TRUE(permissions.Match("/dev/device123name"));
344 EXPECT_TRUE(permissions.Match("/dev/deviceabcname"));
345 EXPECT_FALSE(permissions.Match("/dev/device123name/subdevice"));
346 EXPECT_FALSE(permissions.Match("/dev/deviceame"));
347 EXPECT_EQ(0666U, permissions.perm());
348 EXPECT_EQ(0U, permissions.uid());
349 EXPECT_EQ(1000U, permissions.gid());
350}
351
Tom Cherryed506f72017-05-25 15:58:59 -0700352TEST(device_handler, DevPermissionsMatchWildcardPrefix) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700353 // Wildcard+Prefix example
354 // /dev/device*name* 0666 root graphics
355 Permissions permissions("/dev/device*name*", 0666, 0, 1000);
356 EXPECT_TRUE(permissions.Match("/dev/devicename"));
357 EXPECT_TRUE(permissions.Match("/dev/device123name"));
358 EXPECT_TRUE(permissions.Match("/dev/deviceabcname"));
359 EXPECT_TRUE(permissions.Match("/dev/device123namesomething"));
360 // FNM_PATHNAME doesn't match '/' with *
361 EXPECT_FALSE(permissions.Match("/dev/device123name/something"));
362 EXPECT_FALSE(permissions.Match("/dev/deviceame"));
363 EXPECT_EQ(0666U, permissions.perm());
364 EXPECT_EQ(0U, permissions.uid());
365 EXPECT_EQ(1000U, permissions.gid());
366}
367
Tom Cherryed506f72017-05-25 15:58:59 -0700368TEST(device_handler, SysfsPermissionsMatchWithSubsystemNormal) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700369 // /sys/devices/virtual/input/input* enable 0660 root input
370 SysfsPermissions permissions("/sys/devices/virtual/input/input*", "enable", 0660, 0, 1001);
371 EXPECT_TRUE(permissions.MatchWithSubsystem("/sys/devices/virtual/input/input0", "input"));
372 EXPECT_FALSE(permissions.MatchWithSubsystem("/sys/devices/virtual/input/not_input0", "input"));
373 EXPECT_EQ(0660U, permissions.perm());
374 EXPECT_EQ(0U, permissions.uid());
375 EXPECT_EQ(1001U, permissions.gid());
376}
377
Tom Cherryed506f72017-05-25 15:58:59 -0700378TEST(device_handler, SysfsPermissionsMatchWithSubsystemClass) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700379 // /sys/class/input/event* enable 0660 root input
380 SysfsPermissions permissions("/sys/class/input/event*", "enable", 0660, 0, 1001);
381 EXPECT_TRUE(permissions.MatchWithSubsystem(
382 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/event0", "input"));
383 EXPECT_FALSE(permissions.MatchWithSubsystem(
384 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/not_event0", "input"));
385 EXPECT_FALSE(permissions.MatchWithSubsystem(
386 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/event0", "not_input"));
387 EXPECT_EQ(0660U, permissions.perm());
388 EXPECT_EQ(0U, permissions.uid());
389 EXPECT_EQ(1001U, permissions.gid());
390}
391
Tom Cherryed506f72017-05-25 15:58:59 -0700392TEST(device_handler, SysfsPermissionsMatchWithSubsystemBus) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700393 // /sys/bus/i2c/devices/i2c-* enable 0660 root input
394 SysfsPermissions permissions("/sys/bus/i2c/devices/i2c-*", "enable", 0660, 0, 1001);
395 EXPECT_TRUE(permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/i2c-5", "i2c"));
396 EXPECT_FALSE(permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/not-i2c", "i2c"));
397 EXPECT_FALSE(
398 permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/i2c-5", "not_i2c"));
399 EXPECT_EQ(0660U, permissions.perm());
400 EXPECT_EQ(0U, permissions.uid());
401 EXPECT_EQ(1001U, permissions.gid());
402}