blob: 41924e2359e531d72cb493b7313287a3bcece0bf [file] [log] [blame]
Tom Cherry5f0198b2018-07-17 15:28:16 -07001/*
2 * Copyright (C) 2018 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 "ueventd_parser.h"
18
Mark Salyzyn9f1cf252018-11-12 12:45:59 -080019#include <android-base/file.h>
Tom Cherry5f0198b2018-07-17 15:28:16 -070020#include <gtest/gtest.h>
21#include <private/android_filesystem_config.h>
22
Tom Cherrydcb3d152019-08-07 16:02:28 -070023#include "firmware_handler.h"
24
Tom Cherry5f0198b2018-07-17 15:28:16 -070025namespace android {
26namespace init {
27
28void TestSubsystems(const Subsystem& expected, const Subsystem& test) {
29 EXPECT_EQ(expected.name_, test.name_);
30 EXPECT_EQ(expected.devname_source_, test.devname_source_) << expected.name_;
31 EXPECT_EQ(expected.dir_name_, test.dir_name_) << expected.name_;
32}
33
34void TestPermissions(const Permissions& expected, const Permissions& test) {
35 EXPECT_EQ(expected.name_, test.name_);
36 EXPECT_EQ(expected.perm_, test.perm_) << expected.name_;
37 EXPECT_EQ(expected.uid_, test.uid_) << expected.name_;
38 EXPECT_EQ(expected.gid_, test.gid_) << expected.name_;
39 EXPECT_EQ(expected.prefix_, test.prefix_) << expected.name_;
40 EXPECT_EQ(expected.wildcard_, test.wildcard_) << expected.name_;
41}
42
43void TestSysfsPermissions(const SysfsPermissions& expected, const SysfsPermissions& test) {
44 TestPermissions(expected, test);
45 EXPECT_EQ(expected.attribute_, test.attribute_);
46}
47
Suchang Woo8681f7e2021-04-06 10:55:34 +090048void TestExternalFirmwareHandler(const ExternalFirmwareHandler& expected,
49 const ExternalFirmwareHandler& test) {
50 EXPECT_EQ(expected.devpath, test.devpath) << expected.devpath;
51 EXPECT_EQ(expected.uid, test.uid) << expected.uid;
Suchang Woo10c63742021-05-13 18:56:31 +090052 EXPECT_EQ(expected.gid, test.gid) << expected.gid;
Suchang Woo8681f7e2021-04-06 10:55:34 +090053 EXPECT_EQ(expected.handler_path, test.handler_path) << expected.handler_path;
54}
55
Tom Cherry5f0198b2018-07-17 15:28:16 -070056template <typename T, typename F>
57void TestVector(const T& expected, const T& test, F function) {
58 ASSERT_EQ(expected.size(), test.size());
59 auto expected_it = expected.begin();
60 auto test_it = test.begin();
61
62 for (; expected_it != expected.end(); ++expected_it, ++test_it) {
63 function(*expected_it, *test_it);
64 }
65}
66
67void TestUeventdFile(const std::string& content, const UeventdConfiguration& expected) {
68 TemporaryFile tf;
69 ASSERT_TRUE(tf.fd != -1);
70 ASSERT_TRUE(android::base::WriteStringToFd(content, tf.fd));
71
72 auto result = ParseConfig({tf.path});
73
74 TestVector(expected.subsystems, result.subsystems, TestSubsystems);
75 TestVector(expected.sysfs_permissions, result.sysfs_permissions, TestSysfsPermissions);
76 TestVector(expected.dev_permissions, result.dev_permissions, TestPermissions);
77 EXPECT_EQ(expected.firmware_directories, result.firmware_directories);
Suchang Woo8681f7e2021-04-06 10:55:34 +090078 TestVector(expected.external_firmware_handlers, result.external_firmware_handlers,
79 TestExternalFirmwareHandler);
yuehu middffa0e2021-05-01 14:36:58 +080080 EXPECT_EQ(expected.parallel_restorecon_dirs, result.parallel_restorecon_dirs);
Tom Cherry5f0198b2018-07-17 15:28:16 -070081}
82
83TEST(ueventd_parser, EmptyFile) {
84 TestUeventdFile("", {});
85}
86
87TEST(ueventd_parser, Subsystems) {
88 auto ueventd_file = R"(
89subsystem test_devname
90 devname uevent_devname
91
92subsystem test_devpath_no_dirname
93 devname uevent_devpath
94
95subsystem test_devname2
96 devname uevent_devname
97
98subsystem test_devpath_dirname
99 devname uevent_devpath
100 dirname /dev/graphics
101)";
102
103 auto subsystems = std::vector<Subsystem>{
104 {"test_devname", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"},
105 {"test_devpath_no_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev"},
106 {"test_devname2", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"},
107 {"test_devpath_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev/graphics"}};
108
yuehu middffa0e2021-05-01 14:36:58 +0800109 TestUeventdFile(ueventd_file, {subsystems, {}, {}, {}, {}, {}});
Tom Cherry5f0198b2018-07-17 15:28:16 -0700110}
111
112TEST(ueventd_parser, Permissions) {
113 auto ueventd_file = R"(
114/dev/rtc0 0640 system system
115/dev/graphics/* 0660 root graphics
116/dev/*/test 0660 root system
117
Tom Cherry47031c82020-12-07 13:33:46 -0800118/sys/devices/platform/trusty.* trusty_version 0440 root log
119/sys/devices/virtual/input/input enable 0660 root input
120/sys/devices/virtual/*/input poll_delay 0660 root input no_fnm_pathname
Tom Cherry5f0198b2018-07-17 15:28:16 -0700121)";
122
123 auto permissions = std::vector<Permissions>{
Tom Cherry47031c82020-12-07 13:33:46 -0800124 {"/dev/rtc0", 0640, AID_SYSTEM, AID_SYSTEM, false},
125 {"/dev/graphics/*", 0660, AID_ROOT, AID_GRAPHICS, false},
126 {"/dev/*/test", 0660, AID_ROOT, AID_SYSTEM, false},
Tom Cherry5f0198b2018-07-17 15:28:16 -0700127 };
128
129 auto sysfs_permissions = std::vector<SysfsPermissions>{
Tom Cherry47031c82020-12-07 13:33:46 -0800130 {"/sys/devices/platform/trusty.*", "trusty_version", 0440, AID_ROOT, AID_LOG, false},
131 {"/sys/devices/virtual/input/input", "enable", 0660, AID_ROOT, AID_INPUT, false},
132 {"/sys/devices/virtual/*/input", "poll_delay", 0660, AID_ROOT, AID_INPUT, true},
Tom Cherry5f0198b2018-07-17 15:28:16 -0700133 };
134
yuehu middffa0e2021-05-01 14:36:58 +0800135 TestUeventdFile(ueventd_file, {{}, sysfs_permissions, permissions, {}, {}, {}});
Tom Cherry5f0198b2018-07-17 15:28:16 -0700136}
137
138TEST(ueventd_parser, FirmwareDirectories) {
139 auto ueventd_file = R"(
140firmware_directories /first/ /second /third
141firmware_directories /more
142)";
143
144 auto firmware_directories = std::vector<std::string>{
145 "/first/",
146 "/second",
147 "/third",
148 "/more",
149 };
150
yuehu middffa0e2021-05-01 14:36:58 +0800151 TestUeventdFile(ueventd_file, {{}, {}, {}, firmware_directories, {}, {}});
Tom Cherrydcb3d152019-08-07 16:02:28 -0700152}
153
154TEST(ueventd_parser, ExternalFirmwareHandlers) {
155 auto ueventd_file = R"(
156external_firmware_handler devpath root handler_path
157external_firmware_handler /devices/path/firmware/something001.bin system /vendor/bin/firmware_handler.sh
Suchang Woo8681f7e2021-04-06 10:55:34 +0900158external_firmware_handler /devices/path/firmware/something002.bin radio "/vendor/bin/firmware_handler.sh --has --arguments"
Suchang Woo22fdd0a2021-04-06 11:22:49 +0900159external_firmware_handler /devices/path/firmware/* root "/vendor/bin/firmware_handler.sh"
160external_firmware_handler /devices/path/firmware/something* system "/vendor/bin/firmware_handler.sh"
161external_firmware_handler /devices/path/*/firmware/something*.bin radio "/vendor/bin/firmware_handler.sh"
Suchang Woo10c63742021-05-13 18:56:31 +0900162external_firmware_handler /devices/path/firmware/something003.bin system system /vendor/bin/firmware_handler.sh
163external_firmware_handler /devices/path/firmware/something004.bin radio radio "/vendor/bin/firmware_handler.sh --has --arguments"
Tom Cherrydcb3d152019-08-07 16:02:28 -0700164)";
165
166 auto external_firmware_handlers = std::vector<ExternalFirmwareHandler>{
167 {
168 "devpath",
169 AID_ROOT,
Suchang Woo10c63742021-05-13 18:56:31 +0900170 AID_ROOT,
Tom Cherrydcb3d152019-08-07 16:02:28 -0700171 "handler_path",
172 },
173 {
174 "/devices/path/firmware/something001.bin",
175 AID_SYSTEM,
Suchang Woo10c63742021-05-13 18:56:31 +0900176 AID_ROOT,
Tom Cherrydcb3d152019-08-07 16:02:28 -0700177 "/vendor/bin/firmware_handler.sh",
178 },
179 {
Suchang Woo8681f7e2021-04-06 10:55:34 +0900180 "/devices/path/firmware/something002.bin",
Tom Cherrydcb3d152019-08-07 16:02:28 -0700181 AID_RADIO,
Suchang Woo10c63742021-05-13 18:56:31 +0900182 AID_ROOT,
Tom Cherrydcb3d152019-08-07 16:02:28 -0700183 "/vendor/bin/firmware_handler.sh --has --arguments",
184 },
Suchang Woo22fdd0a2021-04-06 11:22:49 +0900185 {
186 "/devices/path/firmware/",
187 AID_ROOT,
Suchang Woo10c63742021-05-13 18:56:31 +0900188 AID_ROOT,
Suchang Woo22fdd0a2021-04-06 11:22:49 +0900189 "/vendor/bin/firmware_handler.sh",
190 },
191 {
192 "/devices/path/firmware/something",
193 AID_SYSTEM,
Suchang Woo10c63742021-05-13 18:56:31 +0900194 AID_ROOT,
Suchang Woo22fdd0a2021-04-06 11:22:49 +0900195 "/vendor/bin/firmware_handler.sh",
196 },
197 {
198 "/devices/path/*/firmware/something*.bin",
199 AID_RADIO,
Suchang Woo10c63742021-05-13 18:56:31 +0900200 AID_ROOT,
Suchang Woo22fdd0a2021-04-06 11:22:49 +0900201 "/vendor/bin/firmware_handler.sh",
202 },
Suchang Woo10c63742021-05-13 18:56:31 +0900203 {
204 "/devices/path/firmware/something003.bin",
205 AID_SYSTEM,
206 AID_SYSTEM,
207 "/vendor/bin/firmware_handler.sh",
208 },
209 {
210 "/devices/path/firmware/something004.bin",
211 AID_RADIO,
212 AID_RADIO,
213 "/vendor/bin/firmware_handler.sh --has --arguments",
214 },
Tom Cherrydcb3d152019-08-07 16:02:28 -0700215 };
216
yuehu middffa0e2021-05-01 14:36:58 +0800217 TestUeventdFile(ueventd_file, {{}, {}, {}, {}, external_firmware_handlers, {}});
Tom Cherrydcb3d152019-08-07 16:02:28 -0700218}
219
220TEST(ueventd_parser, ExternalFirmwareHandlersDuplicate) {
221 auto ueventd_file = R"(
222external_firmware_handler devpath root handler_path
223external_firmware_handler devpath root handler_path2
224)";
225
226 auto external_firmware_handlers = std::vector<ExternalFirmwareHandler>{
227 {
228 "devpath",
229 AID_ROOT,
Suchang Woo10c63742021-05-13 18:56:31 +0900230 AID_ROOT,
Tom Cherrydcb3d152019-08-07 16:02:28 -0700231 "handler_path",
232 },
233 };
234
yuehu middffa0e2021-05-01 14:36:58 +0800235 TestUeventdFile(ueventd_file, {{}, {}, {}, {}, external_firmware_handlers, {}});
236}
237
238TEST(ueventd_parser, ParallelRestoreconDirs) {
239 auto ueventd_file = R"(
240parallel_restorecon_dir /sys
241parallel_restorecon_dir /sys/devices
242)";
243
244 auto parallel_restorecon_dirs = std::vector<std::string>{
245 "/sys",
246 "/sys/devices",
247 };
248
249 TestUeventdFile(ueventd_file, {{}, {}, {}, {}, {}, parallel_restorecon_dirs});
Tom Cherry5f0198b2018-07-17 15:28:16 -0700250}
251
Tom Cherrye2910102018-12-06 13:29:30 -0800252TEST(ueventd_parser, UeventSocketRcvbufSize) {
253 auto ueventd_file = R"(
254uevent_socket_rcvbuf_size 8k
255uevent_socket_rcvbuf_size 8M
256)";
257
yuehu middffa0e2021-05-01 14:36:58 +0800258 TestUeventdFile(ueventd_file, {{}, {}, {}, {}, {}, {}, false, 8 * 1024 * 1024});
Tom Cherrye2910102018-12-06 13:29:30 -0800259}
260
Tom Cherry4233ec72019-09-06 10:52:31 -0700261TEST(ueventd_parser, EnabledDisabledLines) {
262 auto ueventd_file = R"(
263modalias_handling enabled
264parallel_restorecon enabled
265modalias_handling disabled
266)";
267
yuehu middffa0e2021-05-01 14:36:58 +0800268 TestUeventdFile(ueventd_file, {{}, {}, {}, {}, {}, {}, false, 0, true});
Tom Cherry4233ec72019-09-06 10:52:31 -0700269
270 auto ueventd_file2 = R"(
271parallel_restorecon enabled
272modalias_handling enabled
273parallel_restorecon disabled
274)";
275
yuehu middffa0e2021-05-01 14:36:58 +0800276 TestUeventdFile(ueventd_file2, {{}, {}, {}, {}, {}, {}, true, 0, false});
Tom Cherry4233ec72019-09-06 10:52:31 -0700277}
278
Tom Cherry5f0198b2018-07-17 15:28:16 -0700279TEST(ueventd_parser, AllTogether) {
280 auto ueventd_file = R"(
281
282/dev/rtc0 0640 system system
283firmware_directories /first/ /second /third
284/sys/devices/platform/trusty.* trusty_version 0440 root log
285
286subsystem test_devname
287 devname uevent_devname
288
289/dev/graphics/* 0660 root graphics
290
291subsystem test_devpath_no_dirname
292 devname uevent_devpath
293
294/sys/devices/virtual/input/input enable 0660 root input
295
296## this is a comment
297
298subsystem test_devname2
299## another comment
300 devname uevent_devname
301
302subsystem test_devpath_dirname
303 devname uevent_devpath
304 dirname /dev/graphics
305
306/dev/*/test 0660 root system
Tom Cherry47031c82020-12-07 13:33:46 -0800307/sys/devices/virtual/*/input poll_delay 0660 root input no_fnm_pathname
Tom Cherry5f0198b2018-07-17 15:28:16 -0700308firmware_directories /more
309
Tom Cherrydcb3d152019-08-07 16:02:28 -0700310external_firmware_handler /devices/path/firmware/firmware001.bin root /vendor/bin/touch.sh
311
Tom Cherrye2910102018-12-06 13:29:30 -0800312uevent_socket_rcvbuf_size 6M
Tom Cherry4233ec72019-09-06 10:52:31 -0700313modalias_handling enabled
314parallel_restorecon enabled
Tom Cherrye2910102018-12-06 13:29:30 -0800315
yuehu middffa0e2021-05-01 14:36:58 +0800316parallel_restorecon_dir /sys
317parallel_restorecon_dir /sys/devices
318
Tom Cherry5f0198b2018-07-17 15:28:16 -0700319#ending comment
320)";
321
322 auto subsystems = std::vector<Subsystem>{
323 {"test_devname", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"},
324 {"test_devpath_no_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev"},
325 {"test_devname2", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"},
326 {"test_devpath_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev/graphics"}};
327
328 auto permissions = std::vector<Permissions>{
Tom Cherry47031c82020-12-07 13:33:46 -0800329 {"/dev/rtc0", 0640, AID_SYSTEM, AID_SYSTEM, false},
330 {"/dev/graphics/*", 0660, AID_ROOT, AID_GRAPHICS, false},
331 {"/dev/*/test", 0660, AID_ROOT, AID_SYSTEM, false},
Tom Cherry5f0198b2018-07-17 15:28:16 -0700332 };
333
334 auto sysfs_permissions = std::vector<SysfsPermissions>{
Tom Cherry47031c82020-12-07 13:33:46 -0800335 {"/sys/devices/platform/trusty.*", "trusty_version", 0440, AID_ROOT, AID_LOG, false},
336 {"/sys/devices/virtual/input/input", "enable", 0660, AID_ROOT, AID_INPUT, false},
337 {"/sys/devices/virtual/*/input", "poll_delay", 0660, AID_ROOT, AID_INPUT, true},
Tom Cherry5f0198b2018-07-17 15:28:16 -0700338 };
339
340 auto firmware_directories = std::vector<std::string>{
341 "/first/",
342 "/second",
343 "/third",
344 "/more",
345 };
346
Tom Cherrydcb3d152019-08-07 16:02:28 -0700347 auto external_firmware_handlers = std::vector<ExternalFirmwareHandler>{
Suchang Woo10c63742021-05-13 18:56:31 +0900348 {"/devices/path/firmware/firmware001.bin", AID_ROOT, AID_ROOT, "/vendor/bin/touch.sh"},
Tom Cherrydcb3d152019-08-07 16:02:28 -0700349 };
350
yuehu middffa0e2021-05-01 14:36:58 +0800351 auto parallel_restorecon_dirs = std::vector<std::string>{
352 "/sys",
353 "/sys/devices",
354 };
355
Tom Cherrye2910102018-12-06 13:29:30 -0800356 size_t uevent_socket_rcvbuf_size = 6 * 1024 * 1024;
357
Tom Cherrydcb3d152019-08-07 16:02:28 -0700358 TestUeventdFile(ueventd_file,
359 {subsystems, sysfs_permissions, permissions, firmware_directories,
yuehu middffa0e2021-05-01 14:36:58 +0800360 external_firmware_handlers, parallel_restorecon_dirs, true,
361 uevent_socket_rcvbuf_size, true});
Tom Cherry5f0198b2018-07-17 15:28:16 -0700362}
363
364// All of these lines are ill-formed, so test that there is 0 output.
365TEST(ueventd_parser, ParseErrors) {
366 auto ueventd_file = R"(
367
368/dev/rtc0 badmode baduidbad system
369/dev/rtc0 0640 baduidbad system
370/dev/rtc0 0640 system baduidbad
371firmware_directories #no directory listed
372/sys/devices/platform/trusty.* trusty_version badmode root log
373/sys/devices/platform/trusty.* trusty_version 0440 baduidbad log
374/sys/devices/platform/trusty.* trusty_version 0440 root baduidbad
Tom Cherry47031c82020-12-07 13:33:46 -0800375/sys/devices/platform/trusty.* trusty_version 0440 root root bad_option
Tom Cherry5f0198b2018-07-17 15:28:16 -0700376
Tom Cherrye2910102018-12-06 13:29:30 -0800377uevent_socket_rcvbuf_size blah
378
Tom Cherry5f0198b2018-07-17 15:28:16 -0700379subsystem #no name
380
Tom Cherry4233ec72019-09-06 10:52:31 -0700381modalias_handling
382modalias_handling enabled enabled
383modalias_handling blah
384
385parallel_restorecon
386parallel_restorecon enabled enabled
387parallel_restorecon blah
Tom Cherrydcb3d152019-08-07 16:02:28 -0700388
389external_firmware_handler
390external_firmware_handler blah blah
391external_firmware_handler blah blah blah blah
392
yuehu middffa0e2021-05-01 14:36:58 +0800393parallel_restorecon_dir
394parallel_restorecon_dir /sys /sys/devices
395
Tom Cherry5f0198b2018-07-17 15:28:16 -0700396)";
397
398 TestUeventdFile(ueventd_file, {});
399}
400
401} // namespace init
402} // namespace android