Skip to content

Commit fd0e524

Browse files
committed
tests: kernel: device: Add tests for deferred init failure
These tests verify the expected returned value and device state for error cases (-EALREADY, -errno) conform to the device_init() documentation. Signed-off-by: Loic Domaigne <tech@domaigne.com>
1 parent e086fc8 commit fd0e524

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

tests/kernel/device/app.overlay

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@
6666
zephyr,deferred-init;
6767
};
6868

69+
fakedeferdriver@F9000000 {
70+
compatible = "fakedeferdriver";
71+
reg = <0xF9000000 0x2000>;
72+
status = "okay";
73+
zephyr,deferred-init;
74+
};
75+
6976
fakedomain_0: fakedomain_0 {
7077
compatible = "fakedomain";
7178
status = "okay";

tests/kernel/device/src/main.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#define FAKEDEFERDRIVER0 DEVICE_DT_GET(DT_PATH(fakedeferdriver_e7000000))
2626
#define FAKEDEFERDRIVER1 DEVICE_DT_GET(DT_PATH(fakedeferdriver_e8000000))
27+
#define FAKEDEFERDRIVER2 DEVICE_DT_GET(DT_PATH(fakedeferdriver_f9000000))
2728

2829
/* A device without init call */
2930
DEVICE_DEFINE(dummy_noinit, DUMMY_NOINIT, NULL, NULL, NULL, NULL,
@@ -39,6 +40,12 @@ DEVICE_DT_DEFINE(DT_INST(1, fakedeferdriver), NULL, NULL, NULL, NULL,
3940
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
4041
&fakedeferdriverapi);
4142

43+
/* fake devices used to test deferred initialization failure */
44+
static int fakedeferdriver_init(const struct device *dev);
45+
46+
DEVICE_DT_DEFINE(DT_INST(2, fakedeferdriver), fakedeferdriver_init, NULL, NULL, NULL, POST_KERNEL,
47+
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, NULL);
48+
4249
/**
4350
* @brief Test cases to verify device objects
4451
*
@@ -415,6 +422,38 @@ ZTEST(device, test_deferred_init)
415422
zassert_true(device_is_ready(FAKEDEFERDRIVER0));
416423
}
417424

425+
static int fakedeferdriver_init(const struct device *dev)
426+
{
427+
return -EIO;
428+
}
429+
430+
/**
431+
* @brief Test deferred initialization error
432+
*
433+
* @details Verify device_init error cases and expected device states
434+
*
435+
* - case -errno: if the device initialization fails
436+
* - case -EALREADY: if the device is already initialized.
437+
*
438+
* @see device_init
439+
* @ingroup kernel_device_tests
440+
*/
441+
ZTEST(device, test_deferred_init_failure)
442+
{
443+
int ret;
444+
const struct device *dev = FAKEDEFERDRIVER2;
445+
446+
zassert_false(device_is_ready(dev));
447+
ret = device_init(dev);
448+
zassert_equal(ret, -EIO);
449+
zassert_false(device_is_ready(dev));
450+
zassert_equal(dev->state->init_res, EIO);
451+
452+
ret = device_init(dev);
453+
zassert_equal(ret, -EALREADY);
454+
zassert_equal(dev->state->init_res, EIO);
455+
}
456+
418457
ZTEST(device, test_device_api)
419458
{
420459
const struct device *dev;

0 commit comments

Comments
 (0)