aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLee Jones <lee@kernel.org>2025-05-01 09:19:12 +0100
committerLee Jones <lee@kernel.org>2025-05-14 09:25:06 +0100
commiteb58933b78cdad9b879dc2dd248e7284341a1cfc (patch)
tree42cf64d8633bbf688ea69417e2cdf59df025291e
parentleds: led-test: Remove standard error checking after KUNIT_ASSERT_*() (diff)
downloadwireguard-linux-eb58933b78cdad9b879dc2dd248e7284341a1cfc.tar.xz
wireguard-linux-eb58933b78cdad9b879dc2dd248e7284341a1cfc.zip
leds: led-test: Fill out the registration test to cover more test cases
Upon successful LED class device registration, it is expected that certain attributes are filled out in pre-defined ways. For instance, if provided, the .brightness_get() call-back should be called to populate the class device 'brightness' attribute, 'max_brightness' should be initialised as LED_FULL (at least until we can rid these pesky enums) and the sysfs group should be created with the class device name supplied by the caller. If subsequent registrations take place that would result in name conflicts, various outcomes are expected depending on which flags are set. If LED_REJECT_NAME_CONFLICT is disabled, registration should succeed resulting in an iteration on the provided name. Conversely, if it's enabled, then registration is expected to fail outright. We test for all of these scenarios here. Link: https://lore.kernel.org/r/20250501081918.3621432-2-lee@kernel.org Signed-off-by: Lee Jones <lee@kernel.org>
Diffstat (limited to '')
-rw-r--r--drivers/leds/led-test.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/leds/led-test.c b/drivers/leds/led-test.c
index 23820189abe3..bc85e4513745 100644
--- a/drivers/leds/led-test.c
+++ b/drivers/leds/led-test.c
@@ -10,22 +10,51 @@
#include <linux/device.h>
#include <linux/leds.h>
+#define LED_TEST_POST_REG_BRIGHTNESS 10
+
struct led_test_ddata {
struct led_classdev cdev;
struct device *dev;
};
+static enum led_brightness led_test_brightness_get(struct led_classdev *cdev)
+{
+ return LED_TEST_POST_REG_BRIGHTNESS;
+}
+
static void led_test_class_register(struct kunit *test)
{
struct led_test_ddata *ddata = test->priv;
- struct led_classdev *cdev = &ddata->cdev;
+ struct led_classdev *cdev_clash, *cdev = &ddata->cdev;
struct device *dev = ddata->dev;
int ret;
+ /* Register a LED class device */
cdev->name = "led-test";
+ cdev->brightness_get = led_test_brightness_get;
+ cdev->brightness = 0;
ret = devm_led_classdev_register(dev, cdev);
KUNIT_ASSERT_EQ(test, ret, 0);
+
+ KUNIT_EXPECT_EQ(test, cdev->max_brightness, LED_FULL);
+ KUNIT_EXPECT_EQ(test, cdev->brightness, LED_TEST_POST_REG_BRIGHTNESS);
+ KUNIT_EXPECT_STREQ(test, cdev->dev->kobj.name, "led-test");
+
+ /* Register again with the same name - expect it to pass with the LED renamed */
+ cdev_clash = devm_kmemdup(dev, cdev, sizeof(*cdev), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cdev_clash);
+
+ ret = devm_led_classdev_register(dev, cdev_clash);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+
+ KUNIT_EXPECT_STREQ(test, cdev_clash->dev->kobj.name, "led-test_1");
+ KUNIT_EXPECT_STREQ(test, cdev_clash->name, "led-test");
+
+ /* Enable name conflict rejection and register with the same name again - expect failure */
+ cdev_clash->flags |= LED_REJECT_NAME_CONFLICT;
+ ret = devm_led_classdev_register(dev, cdev_clash);
+ KUNIT_EXPECT_EQ(test, ret, -EEXIST);
}
static struct kunit_case led_test_cases[] = {