From 19872d0156801292e36fd40893f0fbf68880cf46 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 16 Apr 2021 13:33:56 -0700 Subject: [PATCH] init: Add tests and document the new fnmatch behavior in ExternalFirmwareHandler. Bug: N/A Test: atest CtsInitTestCases Change-Id: I232db8416318ba31ea3f78cc07f235d9a47efac4 --- init/README.ueventd.md | 4 ++++ init/firmware_handler_test.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/init/README.ueventd.md b/init/README.ueventd.md index 3ffca882a..d22f68fb0 100644 --- a/init/README.ueventd.md +++ b/init/README.ueventd.md @@ -130,6 +130,10 @@ For example Will launch `/vendor/bin/led_coeffs.bin` as the system user instead of serving the default firmware for `/devices/leds/red/firmware/coeffs.bin`. +The `devpath` argument may include asterisks (`*`) to match multiple paths. For example, the string +`/dev/*/red` will match `/dev/leds/red` as well as `/dev/lights/red`. The pattern matching follows +the rules of the fnmatch() function. + Ueventd will provide the uevent `DEVPATH` and `FIRMWARE` to this external program on the environment via environment variables with the same names. Ueventd will use the string written to stdout as the new name of the firmware to load. It will still look for the new firmware in the list of firmware diff --git a/init/firmware_handler_test.cpp b/init/firmware_handler_test.cpp index 5124a6f41..f6e75b01f 100644 --- a/init/firmware_handler_test.cpp +++ b/init/firmware_handler_test.cpp @@ -103,6 +103,23 @@ int HandleBadPath(int argc, char** argv) { return 0; } +TEST(firmware_handler, Matching) { + ExternalFirmwareHandler h("/dev/path/a.bin", getuid(), "/test"); + ASSERT_TRUE(h.match("/dev/path/a.bin")); + ASSERT_FALSE(h.match("/dev/path/a.bi")); + + h = ExternalFirmwareHandler("/dev/path/a.*", getuid(), "/test"); + ASSERT_TRUE(h.match("/dev/path/a.bin")); + ASSERT_TRUE(h.match("/dev/path/a.bix")); + ASSERT_FALSE(h.match("/dev/path/b.bin")); + + h = ExternalFirmwareHandler("/dev/*/a.bin", getuid(), "/test"); + ASSERT_TRUE(h.match("/dev/path/a.bin")); + ASSERT_TRUE(h.match("/dev/other/a.bin")); + ASSERT_FALSE(h.match("/dev/other/c.bin")); + ASSERT_FALSE(h.match("/dev/path/b.bin")); +} + } // namespace init } // namespace android