blob: 41b101b22f8ae7d2df24921f234b79bd74552150 [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
19#include <string>
20#include <vector>
21
22#include <android-base/scopeguard.h>
23#include <gtest/gtest.h>
24
Tom Cherryed506f72017-05-25 15:58:59 -070025class DeviceHandlerTester {
26 public:
27 void AddPlatformDevice(const std::string& path) {
28 Uevent uevent = {
29 .action = "add", .subsystem = "platform", .path = path,
30 };
31 device_handler_.HandlePlatformDeviceEvent(uevent);
Tom Cherryc44f6a42017-04-05 15:58:31 -070032 }
Tom Cherryc44f6a42017-04-05 15:58:31 -070033
Tom Cherryed506f72017-05-25 15:58:59 -070034 void RemovePlatformDevice(const std::string& path) {
35 Uevent uevent = {
36 .action = "remove", .subsystem = "platform", .path = path,
37 };
38 device_handler_.HandlePlatformDeviceEvent(uevent);
39 }
Tom Cherry1ab8f552017-04-06 14:41:30 -070040
Tom Cherryed506f72017-05-25 15:58:59 -070041 void TestGetSymlinks(const std::string& platform_device_name, const Uevent& uevent,
42 const std::vector<std::string> expected_links, bool block) {
43 AddPlatformDevice(platform_device_name);
44 auto platform_device_remover = android::base::make_scope_guard(
45 [this, &platform_device_name]() { RemovePlatformDevice(platform_device_name); });
46
47 std::vector<std::string> result;
48 if (block) {
49 result = device_handler_.GetBlockDeviceSymlinks(uevent);
50 } else {
51 result = device_handler_.GetCharacterDeviceSymlinks(uevent);
52 }
53
54 auto expected_size = expected_links.size();
55 ASSERT_EQ(expected_size, result.size());
56 if (expected_size == 0) return;
57
58 // Explicitly iterate so the results are visible if a failure occurs
59 for (unsigned int i = 0; i < expected_size; ++i) {
60 EXPECT_EQ(expected_links[i], result[i]);
61 }
62 }
63
64 private:
65 DeviceHandler device_handler_;
66};
67
68TEST(device_handler, PlatformDeviceList) {
69 PlatformDeviceList platform_device_list;
70
71 platform_device_list.Add("/devices/platform/some_device_name");
72 platform_device_list.Add("/devices/platform/some_device_name/longer");
73 platform_device_list.Add("/devices/platform/other_device_name");
74 EXPECT_EQ(3U, platform_device_list.size());
Tom Cherry1ab8f552017-04-06 14:41:30 -070075
76 std::string out_path;
Tom Cherryed506f72017-05-25 15:58:59 -070077 EXPECT_FALSE(platform_device_list.Find("/devices/platform/not_found", &out_path));
Tom Cherry1ab8f552017-04-06 14:41:30 -070078 EXPECT_EQ("", out_path);
79
Tom Cherryed506f72017-05-25 15:58:59 -070080 EXPECT_FALSE(platform_device_list.Find("/devices/platform/some_device_name_with_same_prefix",
81 &out_path));
Tom Cherry1ab8f552017-04-06 14:41:30 -070082
Tom Cherryed506f72017-05-25 15:58:59 -070083 EXPECT_TRUE(platform_device_list.Find("/devices/platform/some_device_name/longer/longer_child",
84 &out_path));
Tom Cherry1ab8f552017-04-06 14:41:30 -070085 EXPECT_EQ("/devices/platform/some_device_name/longer", out_path);
86
Tom Cherryed506f72017-05-25 15:58:59 -070087 EXPECT_TRUE(
88 platform_device_list.Find("/devices/platform/some_device_name/other_child", &out_path));
Tom Cherry1ab8f552017-04-06 14:41:30 -070089 EXPECT_EQ("/devices/platform/some_device_name", out_path);
90}
91
Tom Cherryed506f72017-05-25 15:58:59 -070092TEST(device_handler, get_character_device_symlinks_success) {
Tom Cherryc44f6a42017-04-05 15:58:31 -070093 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -070094 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -070095 .path = "/devices/platform/some_device_name/usb/usb_device/name/tty2-1:1.0",
96 .subsystem = "tty",
97 };
98 std::vector<std::string> expected_result{"/dev/usb/ttyname"};
99
Tom Cherryed506f72017-05-25 15:58:59 -0700100 DeviceHandlerTester device_handler_tester_;
101 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700102}
103
Tom Cherryed506f72017-05-25 15:58:59 -0700104TEST(device_handler, get_character_device_symlinks_no_pdev_match) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700105 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700106 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700107 .path = "/device/name/tty2-1:1.0", .subsystem = "tty",
108 };
109 std::vector<std::string> expected_result;
110
Tom Cherryed506f72017-05-25 15:58:59 -0700111 DeviceHandlerTester device_handler_tester_;
112 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700113}
114
Tom Cherryed506f72017-05-25 15:58:59 -0700115TEST(device_handler, get_character_device_symlinks_nothing_after_platform_device) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700116 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700117 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700118 .path = "/devices/platform/some_device_name", .subsystem = "tty",
119 };
120 std::vector<std::string> expected_result;
121
Tom Cherryed506f72017-05-25 15:58:59 -0700122 DeviceHandlerTester device_handler_tester_;
123 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700124}
125
Tom Cherryed506f72017-05-25 15:58:59 -0700126TEST(device_handler, get_character_device_symlinks_no_usb_found) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700127 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700128 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700129 .path = "/devices/platform/some_device_name/bad/bad/", .subsystem = "tty",
130 };
131 std::vector<std::string> expected_result;
132
Tom Cherryed506f72017-05-25 15:58:59 -0700133 DeviceHandlerTester device_handler_tester_;
134 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700135}
136
Tom Cherryed506f72017-05-25 15:58:59 -0700137TEST(device_handler, get_character_device_symlinks_no_roothub) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700138 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700139 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700140 .path = "/devices/platform/some_device_name/usb/", .subsystem = "tty",
141 };
142 std::vector<std::string> expected_result;
143
Tom Cherryed506f72017-05-25 15:58:59 -0700144 DeviceHandlerTester device_handler_tester_;
145 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700146}
147
Tom Cherryed506f72017-05-25 15:58:59 -0700148TEST(device_handler, get_character_device_symlinks_no_usb_device) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700149 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700150 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700151 .path = "/devices/platform/some_device_name/usb/usb_device/", .subsystem = "tty",
152 };
153 std::vector<std::string> expected_result;
154
Tom Cherryed506f72017-05-25 15:58:59 -0700155 DeviceHandlerTester device_handler_tester_;
156 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700157}
158
Tom Cherryed506f72017-05-25 15:58:59 -0700159TEST(device_handler, get_character_device_symlinks_no_final_slash) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700160 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700161 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700162 .path = "/devices/platform/some_device_name/usb/usb_device/name", .subsystem = "tty",
163 };
164 std::vector<std::string> expected_result;
165
Tom Cherryed506f72017-05-25 15:58:59 -0700166 DeviceHandlerTester device_handler_tester_;
167 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700168}
169
Tom Cherryed506f72017-05-25 15:58:59 -0700170TEST(device_handler, get_character_device_symlinks_no_final_name) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700171 const char* platform_device = "/devices/platform/some_device_name";
Tom Cherryed506f72017-05-25 15:58:59 -0700172 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700173 .path = "/devices/platform/some_device_name/usb/usb_device//", .subsystem = "tty",
174 };
175 std::vector<std::string> expected_result;
176
Tom Cherryed506f72017-05-25 15:58:59 -0700177 DeviceHandlerTester device_handler_tester_;
178 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, false);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700179}
180
Tom Cherryed506f72017-05-25 15:58:59 -0700181TEST(device_handler, get_block_device_symlinks_success_platform) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700182 // These are actual paths from bullhead
183 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700184 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700185 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0",
Tom Cherrye3e48212017-04-11 13:53:37 -0700186 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700187 .partition_num = -1,
188 };
189 std::vector<std::string> expected_result{"/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0"};
190
Tom Cherryed506f72017-05-25 15:58:59 -0700191 DeviceHandlerTester device_handler_tester_;
192 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700193}
194
Tom Cherryed506f72017-05-25 15:58:59 -0700195TEST(device_handler, get_block_device_symlinks_success_platform_with_partition) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700196 // These are actual paths from bullhead
197 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700198 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700199 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
200 .partition_name = "modem",
201 .partition_num = 1,
202 };
203 std::vector<std::string> expected_result{
204 "/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem",
205 "/dev/block/platform/soc.0/f9824900.sdhci/by-num/p1",
206 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
207 };
208
Tom Cherryed506f72017-05-25 15:58:59 -0700209 DeviceHandlerTester device_handler_tester_;
210 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700211}
212
Tom Cherryed506f72017-05-25 15:58:59 -0700213TEST(device_handler, get_block_device_symlinks_success_platform_with_partition_only_num) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700214 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700215 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700216 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
Tom Cherrye3e48212017-04-11 13:53:37 -0700217 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700218 .partition_num = 1,
219 };
220 std::vector<std::string> expected_result{
221 "/dev/block/platform/soc.0/f9824900.sdhci/by-num/p1",
222 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
223 };
224
Tom Cherryed506f72017-05-25 15:58:59 -0700225 DeviceHandlerTester device_handler_tester_;
226 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700227}
228
Tom Cherryed506f72017-05-25 15:58:59 -0700229TEST(device_handler, get_block_device_symlinks_success_platform_with_partition_only_name) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700230 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700231 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700232 .path = "/devices/soc.0/f9824900.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
233 .partition_name = "modem",
234 .partition_num = -1,
235 };
236 std::vector<std::string> expected_result{
237 "/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem",
238 "/dev/block/platform/soc.0/f9824900.sdhci/mmcblk0p1",
239 };
240
Tom Cherryed506f72017-05-25 15:58:59 -0700241 DeviceHandlerTester device_handler_tester_;
242 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700243}
244
Tom Cherryed506f72017-05-25 15:58:59 -0700245TEST(device_handler, get_block_device_symlinks_success_pci) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700246 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700247 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700248 .path = "/devices/pci0000:00/0000:00:1f.2/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherryc44f6a42017-04-05 15:58:31 -0700249 };
250 std::vector<std::string> expected_result{"/dev/block/pci/pci0000:00/0000:00:1f.2/mmcblk0"};
251
Tom Cherryed506f72017-05-25 15:58:59 -0700252 DeviceHandlerTester device_handler_tester_;
253 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700254}
255
Tom Cherryed506f72017-05-25 15:58:59 -0700256TEST(device_handler, get_block_device_symlinks_pci_bad_format) {
Tom Cherry2e344f92017-04-04 17:53:45 -0700257 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700258 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700259 .path = "/devices/pci//mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherry2e344f92017-04-04 17:53:45 -0700260 };
261 std::vector<std::string> expected_result{};
262
Tom Cherryed506f72017-05-25 15:58:59 -0700263 DeviceHandlerTester device_handler_tester_;
264 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherry2e344f92017-04-04 17:53:45 -0700265}
266
Tom Cherryed506f72017-05-25 15:58:59 -0700267TEST(device_handler, get_block_device_symlinks_success_vbd) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700268 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700269 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700270 .path = "/devices/vbd-1234/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherryc44f6a42017-04-05 15:58:31 -0700271 };
272 std::vector<std::string> expected_result{"/dev/block/vbd/1234/mmcblk0"};
273
Tom Cherryed506f72017-05-25 15:58:59 -0700274 DeviceHandlerTester device_handler_tester_;
275 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700276}
277
Tom Cherryed506f72017-05-25 15:58:59 -0700278TEST(device_handler, get_block_device_symlinks_vbd_bad_format) {
Tom Cherry2e344f92017-04-04 17:53:45 -0700279 const char* platform_device = "/devices/do/not/match";
Tom Cherryed506f72017-05-25 15:58:59 -0700280 Uevent uevent = {
Tom Cherrye3e48212017-04-11 13:53:37 -0700281 .path = "/devices/vbd-/mmcblk0", .partition_name = "", .partition_num = -1,
Tom Cherry2e344f92017-04-04 17:53:45 -0700282 };
283 std::vector<std::string> expected_result{};
284
Tom Cherryed506f72017-05-25 15:58:59 -0700285 DeviceHandlerTester device_handler_tester_;
286 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherry2e344f92017-04-04 17:53:45 -0700287}
288
Tom Cherryed506f72017-05-25 15:58:59 -0700289TEST(device_handler, get_block_device_symlinks_no_matches) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700290 const char* platform_device = "/devices/soc.0/f9824900.sdhci";
Tom Cherryed506f72017-05-25 15:58:59 -0700291 Uevent uevent = {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700292 .path = "/devices/soc.0/not_the_device/mmc_host/mmc0/mmc0:0001/block/mmcblk0p1",
Tom Cherrye3e48212017-04-11 13:53:37 -0700293 .partition_name = "",
Tom Cherryc44f6a42017-04-05 15:58:31 -0700294 .partition_num = -1,
295 };
296 std::vector<std::string> expected_result;
297
Tom Cherryed506f72017-05-25 15:58:59 -0700298 DeviceHandlerTester device_handler_tester_;
299 device_handler_tester_.TestGetSymlinks(platform_device, uevent, expected_result, true);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700300}
301
Tom Cherryed506f72017-05-25 15:58:59 -0700302TEST(device_handler, sanitize_null) {
303 SanitizePartitionName(nullptr);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700304}
305
Tom Cherryed506f72017-05-25 15:58:59 -0700306TEST(device_handler, sanitize_empty) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700307 std::string empty;
Tom Cherryed506f72017-05-25 15:58:59 -0700308 SanitizePartitionName(&empty);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700309 EXPECT_EQ(0u, empty.size());
310}
311
Tom Cherryed506f72017-05-25 15:58:59 -0700312TEST(device_handler, sanitize_allgood) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700313 std::string good =
314 "abcdefghijklmnopqrstuvwxyz"
315 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
316 "0123456789"
317 "_-.";
318 std::string good_copy = good;
Tom Cherryed506f72017-05-25 15:58:59 -0700319 SanitizePartitionName(&good);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700320 EXPECT_EQ(good_copy, good);
321}
322
Tom Cherryed506f72017-05-25 15:58:59 -0700323TEST(device_handler, sanitize_somebad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700324 std::string string = "abc!@#$%^&*()";
Tom Cherryed506f72017-05-25 15:58:59 -0700325 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700326 EXPECT_EQ("abc__________", string);
327}
328
Tom Cherryed506f72017-05-25 15:58:59 -0700329TEST(device_handler, sanitize_allbad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700330 std::string string = "!@#$%^&*()";
Tom Cherryed506f72017-05-25 15:58:59 -0700331 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700332 EXPECT_EQ("__________", string);
333}
334
Tom Cherryed506f72017-05-25 15:58:59 -0700335TEST(device_handler, sanitize_onebad) {
Tom Cherryc44f6a42017-04-05 15:58:31 -0700336 std::string string = ")";
Tom Cherryed506f72017-05-25 15:58:59 -0700337 SanitizePartitionName(&string);
Tom Cherryc44f6a42017-04-05 15:58:31 -0700338 EXPECT_EQ("_", string);
339}
Tom Cherrycc054c92017-04-05 17:55:46 -0700340
Tom Cherryed506f72017-05-25 15:58:59 -0700341TEST(device_handler, DevPermissionsMatchNormal) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700342 // Basic from ueventd.rc
343 // /dev/null 0666 root root
344 Permissions permissions("/dev/null", 0666, 0, 0);
345 EXPECT_TRUE(permissions.Match("/dev/null"));
346 EXPECT_FALSE(permissions.Match("/dev/nullsuffix"));
347 EXPECT_FALSE(permissions.Match("/dev/nul"));
348 EXPECT_EQ(0666U, permissions.perm());
349 EXPECT_EQ(0U, permissions.uid());
350 EXPECT_EQ(0U, permissions.gid());
351}
352
Tom Cherryed506f72017-05-25 15:58:59 -0700353TEST(device_handler, DevPermissionsMatchPrefix) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700354 // Prefix from ueventd.rc
355 // /dev/dri/* 0666 root graphics
356 Permissions permissions("/dev/dri/*", 0666, 0, 1000);
357 EXPECT_TRUE(permissions.Match("/dev/dri/some_dri_device"));
358 EXPECT_TRUE(permissions.Match("/dev/dri/some_other_dri_device"));
359 EXPECT_TRUE(permissions.Match("/dev/dri/"));
360 EXPECT_FALSE(permissions.Match("/dev/dr/non_match"));
361 EXPECT_EQ(0666U, permissions.perm());
362 EXPECT_EQ(0U, permissions.uid());
363 EXPECT_EQ(1000U, permissions.gid());
364}
365
Tom Cherryed506f72017-05-25 15:58:59 -0700366TEST(device_handler, DevPermissionsMatchWildcard) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700367 // Wildcard example
368 // /dev/device*name 0666 root graphics
369 Permissions permissions("/dev/device*name", 0666, 0, 1000);
370 EXPECT_TRUE(permissions.Match("/dev/devicename"));
371 EXPECT_TRUE(permissions.Match("/dev/device123name"));
372 EXPECT_TRUE(permissions.Match("/dev/deviceabcname"));
373 EXPECT_FALSE(permissions.Match("/dev/device123name/subdevice"));
374 EXPECT_FALSE(permissions.Match("/dev/deviceame"));
375 EXPECT_EQ(0666U, permissions.perm());
376 EXPECT_EQ(0U, permissions.uid());
377 EXPECT_EQ(1000U, permissions.gid());
378}
379
Tom Cherryed506f72017-05-25 15:58:59 -0700380TEST(device_handler, DevPermissionsMatchWildcardPrefix) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700381 // Wildcard+Prefix example
382 // /dev/device*name* 0666 root graphics
383 Permissions permissions("/dev/device*name*", 0666, 0, 1000);
384 EXPECT_TRUE(permissions.Match("/dev/devicename"));
385 EXPECT_TRUE(permissions.Match("/dev/device123name"));
386 EXPECT_TRUE(permissions.Match("/dev/deviceabcname"));
387 EXPECT_TRUE(permissions.Match("/dev/device123namesomething"));
388 // FNM_PATHNAME doesn't match '/' with *
389 EXPECT_FALSE(permissions.Match("/dev/device123name/something"));
390 EXPECT_FALSE(permissions.Match("/dev/deviceame"));
391 EXPECT_EQ(0666U, permissions.perm());
392 EXPECT_EQ(0U, permissions.uid());
393 EXPECT_EQ(1000U, permissions.gid());
394}
395
Tom Cherryed506f72017-05-25 15:58:59 -0700396TEST(device_handler, SysfsPermissionsMatchWithSubsystemNormal) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700397 // /sys/devices/virtual/input/input* enable 0660 root input
398 SysfsPermissions permissions("/sys/devices/virtual/input/input*", "enable", 0660, 0, 1001);
399 EXPECT_TRUE(permissions.MatchWithSubsystem("/sys/devices/virtual/input/input0", "input"));
400 EXPECT_FALSE(permissions.MatchWithSubsystem("/sys/devices/virtual/input/not_input0", "input"));
401 EXPECT_EQ(0660U, permissions.perm());
402 EXPECT_EQ(0U, permissions.uid());
403 EXPECT_EQ(1001U, permissions.gid());
404}
405
Tom Cherryed506f72017-05-25 15:58:59 -0700406TEST(device_handler, SysfsPermissionsMatchWithSubsystemClass) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700407 // /sys/class/input/event* enable 0660 root input
408 SysfsPermissions permissions("/sys/class/input/event*", "enable", 0660, 0, 1001);
409 EXPECT_TRUE(permissions.MatchWithSubsystem(
410 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/event0", "input"));
411 EXPECT_FALSE(permissions.MatchWithSubsystem(
412 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/not_event0", "input"));
413 EXPECT_FALSE(permissions.MatchWithSubsystem(
414 "/sys/devices/soc.0/f9924000.i2c/i2c-2/2-0020/input/input0/event0", "not_input"));
415 EXPECT_EQ(0660U, permissions.perm());
416 EXPECT_EQ(0U, permissions.uid());
417 EXPECT_EQ(1001U, permissions.gid());
418}
419
Tom Cherryed506f72017-05-25 15:58:59 -0700420TEST(device_handler, SysfsPermissionsMatchWithSubsystemBus) {
Tom Cherrycc054c92017-04-05 17:55:46 -0700421 // /sys/bus/i2c/devices/i2c-* enable 0660 root input
422 SysfsPermissions permissions("/sys/bus/i2c/devices/i2c-*", "enable", 0660, 0, 1001);
423 EXPECT_TRUE(permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/i2c-5", "i2c"));
424 EXPECT_FALSE(permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/not-i2c", "i2c"));
425 EXPECT_FALSE(
426 permissions.MatchWithSubsystem("/sys/devices/soc.0/f9967000.i2c/i2c-5", "not_i2c"));
427 EXPECT_EQ(0660U, permissions.perm());
428 EXPECT_EQ(0U, permissions.uid());
429 EXPECT_EQ(1001U, permissions.gid());
430}