Platform Device API

KUnit platform device API 用於測試 platform 裝置。

struct platform_device *kunit_platform_device_alloc(struct kunit *test, const char *name, int id)

分配 KUnit 測試管理的 platform 裝置

引數

struct kunit *test

測試上下文

const char *name

要分配的 platform 裝置的裝置名稱

int id

要分配的 platform 裝置的識別符號。

描述

分配一個測試管理的 platform 裝置。測試完成後,該裝置將被釋放。

返回

成功時返回已分配的 platform 裝置,失敗時返回 NULL。

int kunit_platform_device_add(struct kunit *test, struct platform_device *pdev)

註冊 KUnit 測試管理的 platform 裝置

引數

struct kunit *test

測試上下文

struct platform_device *pdev

要新增的 platform 裝置

描述

註冊一個測試管理的 platform 裝置。測試完成後,該裝置將被登出。

返回

成功時返回 0,失敗時返回負的 errno。

int kunit_platform_device_prepare_wait_for_probe(struct kunit *test, struct platform_device *pdev, struct completion *x)

準備一個 completion 變數,用於等待 platform 裝置探測

引數

struct kunit *test

測試上下文

struct platform_device *pdev

要準備等待探測的 platform 裝置

struct completion *x

dev 探測完成時,完成 completion 變數

描述

準備一個 completion 變數 x,用於等待 pdev 探測。等待 completion 強制進行搶佔,允許 platform 驅動程式探測。

例子

static int kunit_platform_driver_probe(struct platform_device *pdev)
{
        return 0;
}

static void kunit_platform_driver_test(struct kunit *test)
{
        struct platform_device *pdev;
        struct platform_driver *pdrv;
        DECLARE_COMPLETION_ONSTACK(comp);

        pdev = kunit_platform_device_alloc(test, "kunit-platform", -1);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev);
        KUNIT_ASSERT_EQ(test, 0, kunit_platform_device_add(test, pdev));

        pdrv = kunit_kzalloc(test, sizeof(*pdrv), GFP_KERNEL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdrv);

        pdrv->probe = kunit_platform_driver_probe;
        pdrv->driver.name = "kunit-platform";
        pdrv->driver.owner = THIS_MODULE;

        KUNIT_ASSERT_EQ(test, 0, kunit_platform_device_prepare_wait_for_probe(test, pdev, &comp));
        KUNIT_ASSERT_EQ(test, 0, kunit_platform_driver_register(test, pdrv));

        KUNIT_EXPECT_NE(test, 0, wait_for_completion_timeout(&comp, 3 * HZ));
}

返回

成功時返回 0,失敗時返回負的 errno。

int kunit_platform_driver_register(struct kunit *test, struct platform_driver *drv)

註冊 KUnit 測試管理的 platform 驅動程式

引數

struct kunit *test

測試上下文

struct platform_driver *drv

要註冊的 platform 驅動程式

描述

註冊一個測試管理的 platform 驅動程式。這允許呼叫者將 drv 嵌入到容器結構中,並在探測函式中使用 container_of() 將資訊傳遞給 KUnit 測試。

例子

struct kunit_test_context {
        struct platform_driver pdrv;
        const char *data;
};

static inline struct kunit_test_context *
to_test_context(struct platform_device *pdev)
{
        return container_of(to_platform_driver(pdev->dev.driver),
                            struct kunit_test_context,
                            pdrv);
}

static int kunit_platform_driver_probe(struct platform_device *pdev)
{
        struct kunit_test_context *ctx;

        ctx = to_test_context(pdev);
        ctx->data = "test data";

        return 0;
}

static void kunit_platform_driver_test(struct kunit *test)
{
        struct kunit_test_context *ctx;

        ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);

        ctx->pdrv.probe = kunit_platform_driver_probe;
        ctx->pdrv.driver.name = "kunit-platform";
        ctx->pdrv.driver.owner = THIS_MODULE;

        KUNIT_EXPECT_EQ(test, 0, kunit_platform_driver_register(test, &ctx->pdrv));
        <... wait for driver to probe ...>
        KUNIT_EXPECT_STREQ(test, ctx->data, "test data");
}

返回

成功時返回 0,失敗時返回負的 errno。