blob: 57d8e0f5b940e95e6db8e0577ca84b3aeebc56cf [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 Cherry81f5d3e2017-06-22 12:53:17 -070027namespace android {
28namespace init {
29
Tom Cherryed506f72017-05-25 15:58:59 -070030class DeviceHandlerTester {
31 public:
Sandeep Patilcd2ba0d2017-06-21 12:46:41 -070032 void TestGetSymlinks(const std::string& platform_device, const Uevent& uevent,
Tom Cherryed506f72017-05-25 15:58:59 -070033 const std::vector<std::string> expected_links, bool block) {
Sandeep Patilcd2ba0d2017-06-21 12:46:41 -070034 TemporaryDir fake_sys_root;
35 device_handler_.sysfs_mount_point_ = fake_sys_root.path;
36
37 std::string platform_device_dir = fake_sys_root.path + platform_device;
38 mkdir_recursive(platform_device_dir, 0777, nullptr);
39
40 std::string platform_bus = fake_sys_root.path + "/bus/platform"s;
41 mkdir_recursive(platform_bus, 0777, nullptr);
42 symlink(platform_bus.c_str(), (platform_device_dir + "/subsystem").c_str());
43
44 mkdir_recursive(android::base::Dirname(fake_sys_root.path + uevent.path), 0777, nullptr);
Tom Cherryed506f72017-05-25 15:58:59 -070045
46 std::vector<std::string> result;
47 if (block) {
48 result = device_handler_.GetBlockDeviceSymlinks(uevent);
49 } else {
50 result = device_handler_.GetCharacterDeviceSymlinks(uevent);
51 }
52
53 auto expected_size = expected_links.size();
54 ASSERT_EQ(expected_size, result.size());
55 if (expected_size == 0) return;
56
57 // Explicitly iterate so the results are visible if a failure occurs
58 for (unsigned int i = 0; i < expected_size; ++i) {
59 EXPECT_EQ(expected_links[i], result[i]);
60 }
61 }
62
63 private:
64 DeviceHandler device_handler_;
65};
66
Tom Cherryed506f72017-05-25 15:58:59 -070067TEST(device_handler, get_character_device_symlinks_success) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070068 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -070069 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -070070 .path = "/devices/platform/some_device_name/usb/usb_device/name/tty2-1:1.0",
71 .subsystem = "tty",
72 };
73 std::vector<std::string> expected_result{"/dev/usb/ttyname"};
74
Tom Cherryed506f72017-05-25 15:58:59 -070075 DeviceHandlerTester device_handler_tester_;
76 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -070077}
78
Tom Cherryed506f72017-05-25 15:58:59 -070079TEST(device_handler, get_character_device_symlinks_no_pdev_match) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070080 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -070081 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -070082 .path = "/device/name/tty2-1:1.0", .subsystem = "tty",
83 };
84 std::vector<std::string> expected_result;
85
Tom Cherryed506f72017-05-25 15:58:59 -070086 DeviceHandlerTester device_handler_tester_;
87 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -070088}
89
Tom Cherryed506f72017-05-25 15:58:59 -070090TEST(device_handler, get_character_device_symlinks_nothing_after_platform_device) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070091 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -070092 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -070093 .path = "/devices/platform/some_device_name", .subsystem = "tty",
94 };
95 std::vector<std::string> expected_result;
96
Tom Cherryed506f72017-05-25 15:58:59 -070097 DeviceHandlerTester device_handler_tester_;
98 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -070099}
100
Tom Cherryed506f72017-05-25 15:58:59 -0700101TEST(device_handler, get_character_device_symlinks_no_usb_found) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700102 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700103 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700104 .path = "/devices/platform/some_device_name/bad/bad/", .subsystem = "tty",
105 };
106 std::vector<std::string> expected_result;
107
Tom Cherryed506f72017-05-25 15:58:59 -0700108 DeviceHandlerTester device_handler_tester_;
109 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700110}
111
Tom Cherryed506f72017-05-25 15:58:59 -0700112TEST(device_handler, get_character_device_symlinks_no_roothub) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700113 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700114 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700115 .path = "/devices/platform/some_device_name/usb/", .subsystem = "tty",
116 };
117 std::vector<std::string> expected_result;
118
Tom Cherryed506f72017-05-25 15:58:59 -0700119 DeviceHandlerTester device_handler_tester_;
120 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700121}
122
Tom Cherryed506f72017-05-25 15:58:59 -0700123TEST(device_handler, get_character_device_symlinks_no_usb_device) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700124 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700125 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700126 .path = "/devices/platform/some_device_name/usb/usb_device/", .subsystem = "tty",
127 };
128 std::vector<std::string> expected_result;
129
Tom Cherryed506f72017-05-25 15:58:59 -0700130 DeviceHandlerTester device_handler_tester_;
131 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700132}
133
Tom Cherryed506f72017-05-25 15:58:59 -0700134TEST(device_handler, get_character_device_symlinks_no_final_slash) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700135 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700136 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700137 .path = "/devices/platform/some_device_name/usb/usb_device/name", .subsystem = "tty",
138 };
139 std::vector<std::string> expected_result;
140
Tom Cherryed506f72017-05-25 15:58:59 -0700141 DeviceHandlerTester device_handler_tester_;
142 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700143}
144
Tom Cherryed506f72017-05-25 15:58:59 -0700145TEST(device_handler, get_character_device_symlinks_no_final_name) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700146 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700147 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700148 .path = "/devices/platform/some_device_name/usb/usb_device//", .subsystem = "tty",
149 };
150 std::vector<std::string> expected_result;
151
Tom Cherryed506f72017-05-25 15:58:59 -0700152 DeviceHandlerTester device_handler_tester_;
153 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700154}
155
Tom Cherryed506f72017-05-25 15:58:59 -0700156TEST(device_handler, get_block_device_symlinks_success_platform) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700157 // These are actual paths from bullhead
158 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700159 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700160 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0",
Tom Cherrye3e48212017-04-11 13:53:37 -0700161 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700162 .partition_num = -1,
163 };
164 std::vector<std::string> expected_result{"/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0"};
165
Tom Cherryed506f72017-05-25 15:58:59 -0700166 DeviceHandlerTester device_handler_tester_;
167 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700168}
169
Tom Cherryed506f72017-05-25 15:58:59 -0700170TEST(device_handler, get_block_device_symlinks_success_platform_with_partition) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700171 // These are actual paths from bullhead
172 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700173 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700174 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
175 .partition_name = "modem",
176 .partition_num = 1,
177 };
178 std::vector<std::string> expected_result{
179 "/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem",
180 "/dev/block/platform/soc.0/f9824900.sdhci/by-num/p1",
181 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
182 };
183
Tom Cherryed506f72017-05-25 15:58:59 -0700184 DeviceHandlerTester device_handler_tester_;
185 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700186}
187
Tom Cherryed506f72017-05-25 15:58:59 -0700188TEST(device_handler, get_block_device_symlinks_success_platform_with_partition_only_num) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700189 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700190 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700191 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
Tom Cherrye3e48212017-04-11 13:53:37 -0700192 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700193 .partition_num = 1,
194 };
195 std::vector<std::string> expected_result{
196 "/dev/block/platform/soc.0/f9824900.sdhci/by-num/p1",
197 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
198 };
199
Tom Cherryed506f72017-05-25 15:58:59 -0700200 DeviceHandlerTester device_handler_tester_;
201 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700202}
203
Tom Cherryed506f72017-05-25 15:58:59 -0700204TEST(device_handler, get_block_device_symlinks_success_platform_with_partition_only_name) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700205 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700206 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700207 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
208 .partition_name = "modem",
209 .partition_num = -1,
210 };
211 std::vector<std::string> expected_result{
212 "/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem",
213 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
214 };
215
Tom Cherryed506f72017-05-25 15:58:59 -0700216 DeviceHandlerTester device_handler_tester_;
217 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700218}
219
Tom Cherryed506f72017-05-25 15:58:59 -0700220TEST(device_handler, get_block_device_symlinks_success_pci) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700221 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700222 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700223 .path = "/devices/pci0000:00/0000:00:1f.2/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherryc44f6a42017-04-05 15:58:31 -0700224 };
225 std::vector<std::string> expected_result{"/dev/block/pci/pci0000:00/0000:00:1f.2/mmcblk0"};
226
Tom Cherryed506f72017-05-25 15:58:59 -0700227 DeviceHandlerTester device_handler_tester_;
228 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700229}
230
Tom Cherryed506f72017-05-25 15:58:59 -0700231TEST(device_handler, get_block_device_symlinks_pci_bad_format) {
Tom Cherry2e344f92017-04-04 17:53:45 -0700232 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700233 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700234 .path = "/devices/pci//mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherry2e344f92017-04-04 17:53:45 -0700235 };
236 std::vector<std::string> expected_result{};
237
Tom Cherryed506f72017-05-25 15:58:59 -0700238 DeviceHandlerTester device_handler_tester_;
239 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherry2e344f92017-04-04 17:53:45 -0700240}
241
Tom Cherryed506f72017-05-25 15:58:59 -0700242TEST(device_handler, get_block_device_symlinks_success_vbd) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700243 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700244 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700245 .path = "/devices/vbd-1234/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherryc44f6a42017-04-05 15:58:31 -0700246 };
247 std::vector<std::string> expected_result{"/dev/block/vbd/1234/mmcblk0"};
248
Tom Cherryed506f72017-05-25 15:58:59 -0700249 DeviceHandlerTester device_handler_tester_;
250 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700251}
252
Tom Cherryed506f72017-05-25 15:58:59 -0700253TEST(device_handler, get_block_device_symlinks_vbd_bad_format) {
Tom Cherry2e344f92017-04-04 17:53:45 -0700254 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700255 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700256 .path = "/devices/vbd-/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherry2e344f92017-04-04 17:53:45 -0700257 };
258 std::vector<std::string> expected_result{};
259
Tom Cherryed506f72017-05-25 15:58:59 -0700260 DeviceHandlerTester device_handler_tester_;
261 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherry2e344f92017-04-04 17:53:45 -0700262}
263
Tom Cherryed506f72017-05-25 15:58:59 -0700264TEST(device_handler, get_block_device_symlinks_no_matches) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700265 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700266 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700267 .path = "/devices/soc.0/not_the_device/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
Tom Cherrye3e48212017-04-11 13:53:37 -0700268 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700269 .partition_num = -1,
270 };
271 std::vector<std::string> expected_result;
272
Tom Cherryed506f72017-05-25 15:58:59 -0700273 DeviceHandlerTester device_handler_tester_;
274 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700275}
276
Tom Cherryed506f72017-05-25 15:58:59 -0700277TEST(device_handler, sanitize_null) {
278 SanitizePartitionName(nullptr);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700279}
280
Tom Cherryed506f72017-05-25 15:58:59 -0700281TEST(device_handler, sanitize_empty) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700282 std::string empty;
Tom Cherryed506f72017-05-25 15:58:59 -0700283 SanitizePartitionName(&empty);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700284 EXPECT_EQ(0u, empty.size());
285}
286
Tom Cherryed506f72017-05-25 15:58:59 -0700287TEST(device_handler, sanitize_allgood) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700288 std::string good =
289 "abcdefghijklmnopqrstuvwxyz"
290 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
291 "0123456789"
292 "_-.";
293 std::string good_copy = good;
Tom Cherryed506f72017-05-25 15:58:59 -0700294 SanitizePartitionName(&good);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700295 EXPECT_EQ(good_copy, good);
296}
297
Tom Cherryed506f72017-05-25 15:58:59 -0700298TEST(device_handler, sanitize_somebad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700299 std::string string = "abc!@#$%^&*()";
Tom Cherryed506f72017-05-25 15:58:59 -0700300 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700301 EXPECT_EQ("abc__________", string);
302}
303
Tom Cherryed506f72017-05-25 15:58:59 -0700304TEST(device_handler, sanitize_allbad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700305 std::string string = "!@#$%^&*()";
Tom Cherryed506f72017-05-25 15:58:59 -0700306 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700307 EXPECT_EQ("__________", string);
308}
309
Tom Cherryed506f72017-05-25 15:58:59 -0700310TEST(device_handler, sanitize_onebad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700311 std::string string = ")";
Tom Cherryed506f72017-05-25 15:58:59 -0700312 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700313 EXPECT_EQ("_", string);
314}
Tom Cherrycc054c92017-04-05 17:55:46 -0700315
Tom Cherryed506f72017-05-25 15:58:59 -0700316TEST(device_handler, DevPermissionsMatchNormal) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700317 // Basic from ueventd.rc
318 // /dev/null 0666 root root
319 Permissions permissions("/dev/null", 0666, 0, 0);
320 EXPECT_TRUE(permissions.Match("/dev/null"));
321 EXPECT_FALSE(permissions.Match("/dev/nullsuffix"));
322 EXPECT_FALSE(permissions.Match("/dev/nul"));
323 EXPECT_EQ(0666U, permissions.perm());
324 EXPECT_EQ(0U, permissions.uid());
325 EXPECT_EQ(0U, permissions.gid());
326}
327
Tom Cherryed506f72017-05-25 15:58:59 -0700328TEST(device_handler, DevPermissionsMatchPrefix) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700329 // Prefix from ueventd.rc
330 // /dev/dri/* 0666 root graphics
331 Permissions permissions("/dev/dri/*", 0666, 0, 1000);
332 EXPECT_TRUE(permissions.Match("/dev/dri/some_dri_device"));
333 EXPECT_TRUE(permissions.Match("/dev/dri/some_other_dri_device"));
334 EXPECT_TRUE(permissions.Match("/dev/dri/"));
335 EXPECT_FALSE(permissions.Match("/dev/dr/non_match"));
336 EXPECT_EQ(0666U, permissions.perm());
337 EXPECT_EQ(0U, permissions.uid());
338 EXPECT_EQ(1000U, permissions.gid());
339}
340
Tom Cherryed506f72017-05-25 15:58:59 -0700341TEST(device_handler, DevPermissionsMatchWildcard) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700342 // Wildcard example
343 // /dev/device*name 0666 root graphics
344 Permissions permissions("/dev/device*name", 0666, 0, 1000);
345 EXPECT_TRUE(permissions.Match("/dev/devicename"));
346 EXPECT_TRUE(permissions.Match("/dev/device123name"));
347 EXPECT_TRUE(permissions.Match("/dev/deviceabcname"));
348 EXPECT_FALSE(permissions.Match("/dev/device123name/subdevice"));
349 EXPECT_FALSE(permissions.Match("/dev/deviceame"));
350 EXPECT_EQ(0666U, permissions.perm());
351 EXPECT_EQ(0U, permissions.uid());
352 EXPECT_EQ(1000U, permissions.gid());
353}
354
Tom Cherryed506f72017-05-25 15:58:59 -0700355TEST(device_handler, DevPermissionsMatchWildcardPrefix) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700356 // Wildcard+Prefix example
357 // /dev/device*name* 0666 root graphics
358 Permissions permissions("/dev/device*name*", 0666, 0, 1000);
359 EXPECT_TRUE(permissions.Match("/dev/devicename"));
360 EXPECT_TRUE(permissions.Match("/dev/device123name"));
361 EXPECT_TRUE(permissions.Match("/dev/deviceabcname"));
362 EXPECT_TRUE(permissions.Match("/dev/device123namesomething"));
363 // FNM_PATHNAME doesn't match '/' with *
364 EXPECT_FALSE(permissions.Match("/dev/device123name/something"));
365 EXPECT_FALSE(permissions.Match("/dev/deviceame"));
366 EXPECT_EQ(0666U, permissions.perm());
367 EXPECT_EQ(0U, permissions.uid());
368 EXPECT_EQ(1000U, permissions.gid());
369}
370
Tom Cherryed506f72017-05-25 15:58:59 -0700371TEST(device_handler, SysfsPermissionsMatchWithSubsystemNormal) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700372 // /sys/devices/virtual/input/input* enable 0660 root input
373 SysfsPermissions permissions("/sys/devices/virtual/input/input*", "enable", 0660, 0, 1001);
374 EXPECT_TRUE(permissions.MatchWithSubsystem("/sys/devices/virtual/input/input0", "input"));
375 EXPECT_FALSE(permissions.MatchWithSubsystem("/sys/devices/virtual/input/not_input0", "input"));
376 EXPECT_EQ(0660U, permissions.perm());
377 EXPECT_EQ(0U, permissions.uid());
378 EXPECT_EQ(1001U, permissions.gid());
379}
380
Tom Cherryed506f72017-05-25 15:58:59 -0700381TEST(device_handler, SysfsPermissionsMatchWithSubsystemClass) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700382 // /sys/class/input/event* enable 0660 root input
383 SysfsPermissions permissions("/sys/class/input/event*", "enable", 0660, 0, 1001);
384 EXPECT_TRUE(permissions.MatchWithSubsystem(
385 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/event0", "input"));
386 EXPECT_FALSE(permissions.MatchWithSubsystem(
387 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/not_event0", "input"));
388 EXPECT_FALSE(permissions.MatchWithSubsystem(
389 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/event0", "not_input"));
390 EXPECT_EQ(0660U, permissions.perm());
391 EXPECT_EQ(0U, permissions.uid());
392 EXPECT_EQ(1001U, permissions.gid());
393}
394
Tom Cherryed506f72017-05-25 15:58:59 -0700395TEST(device_handler, SysfsPermissionsMatchWithSubsystemBus) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700396 // /sys/bus/i2c/devices/i2c-* enable 0660 root input
397 SysfsPermissions permissions("/sys/bus/i2c/devices/i2c-*", "enable", 0660, 0, 1001);
398 EXPECT_TRUE(permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/i2c-5", "i2c"));
399 EXPECT_FALSE(permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/not-i2c", "i2c"));
400 EXPECT_FALSE(
401 permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/i2c-5", "not_i2c"));
402 EXPECT_EQ(0660U, permissions.perm());
403 EXPECT_EQ(0U, permissions.uid());
404 EXPECT_EQ(1001U, permissions.gid());
405}
Tom Cherry81f5d3e2017-06-22 12:53:17 -0700406
407} // namespace init
408} // namespace android