From nobody Mon Feb 9 19:30:47 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3305FC761A6 for ; Wed, 29 Mar 2023 09:24:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230081AbjC2JYg (ORCPT ); Wed, 29 Mar 2023 05:24:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56824 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229549AbjC2JYd (ORCPT ); Wed, 29 Mar 2023 05:24:33 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A5056269E for ; Wed, 29 Mar 2023 02:23:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1680081825; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=mYk5Vd+Cw2j906cJQiXMpCJj7sRVVRcz7eKjR8ZmdUk=; b=fzNArQizBXnBqvEYCXTSHvjZmrYsBlOKOi+2e4edG18VRA2XvrKj4q5u0r18A9WFdsUXPp sEAR4bU5aTqXC1WtLCs9C92/vI5y2RcjDNG02DzY2EV+caIUbYIM8ruOF4Kar23K+9to5I 5ZFJzbmDAXh8jBtOQBhg3wnF/4rLNW8= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-331-qpnBuqA9MkWXxD_4wo8ZNg-1; Wed, 29 Mar 2023 05:23:44 -0400 X-MC-Unique: qpnBuqA9MkWXxD_4wo8ZNg-1 Received: by mail-wm1-f69.google.com with SMTP id ay37-20020a05600c1e2500b003ee69edec16so8544940wmb.5 for ; Wed, 29 Mar 2023 02:23:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680081823; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=mYk5Vd+Cw2j906cJQiXMpCJj7sRVVRcz7eKjR8ZmdUk=; b=fa2T+IM1BJfFmOquNjA6BkYOKMlp0vvexpJGN7uno0UpNWHmJzGg+y28eFJNUuHVBb 4hglPOoUIODfTmd1GeXZfAczQEpkRm09WQ/ZWTErhC4yPdUtobFB6jDZqp6gnRS7EqaW s6MAbuVTxUtO+LSfuTKPXtOeRIzM8i0ZTHHD4Zi6peaQBN5oe91kfJBzj8ckbX9Vfips yD7o8f91ywHl8Fe+XPD8l9hvEAg4QxkBP8nYLWe6Ue70JrMVMDyj3RZeyeSkJa21n6Qv 0d0O7vF9xwvXUbrFLMauNbOY7jfLiAGPlionNTt9gZ2WDHtEKIc4/M5ZC+gvxxe5Og55 4cbg== X-Gm-Message-State: AAQBX9e8oMI0J16OuJ9z5WQdl0FEpMcmtauXnyeeN4ee/magkCrGW9TP 8JriaFXYjGIXHoAas30fStr0rR1j7wQtkzDd+TRJS45DMs0OwVfwGRssJTlKzRNDzzWMSsUIX80 LnrDkFbdLRXB2eUQwUOb9c1+vPj1tNEalaa4bBK5IA+6GApYNzaS/z9jUUV7iK+gFgm9h8nncoo UAlZcEIqw= X-Received: by 2002:a1c:4c11:0:b0:3ef:6ea4:a675 with SMTP id z17-20020a1c4c11000000b003ef6ea4a675mr8271713wmf.36.1680081822790; Wed, 29 Mar 2023 02:23:42 -0700 (PDT) X-Google-Smtp-Source: AKy350YTIyv31nTZptEcX2RsNGbTwhTNTBAHponC3oHY6a+YXFKPgSWGFARGvtpGsKg6qg5oGHwhXw== X-Received: by 2002:a1c:4c11:0:b0:3ef:6ea4:a675 with SMTP id z17-20020a1c4c11000000b003ef6ea4a675mr8271689wmf.36.1680081822369; Wed, 29 Mar 2023 02:23:42 -0700 (PDT) Received: from minerva.redhat.com (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id l7-20020a05600c4f0700b003ef5deb4188sm1672219wmq.17.2023.03.29.02.23.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Mar 2023 02:23:42 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Brendan Higgins , Maxime Ripard , linux-kselftest@vger.kernel.org, Enric Balletbo i Serra , David Gow , kunit-dev@googlegroups.com, Javier Martinez Canillas , Dmitry Torokhov , linux-input@vger.kernel.org Subject: [PATCH] Input: Add KUnit tests for some of the input core helper functions Date: Wed, 29 Mar 2023 11:23:31 +0200 Message-Id: <20230329092332.2143623-1-javierm@redhat.com> X-Mailer: git-send-email 2.40.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The input subsystem doesn't currently have any unit tests, let's add a CONFIG_INPUT_KUNIT_TEST option that builds a test suite to be executed with the KUnit test infrastructure. For now, only three tests were added for some of the input core helper functions that are trivial to test: * input_test_polling: set/get poll interval and set-up a poll handler. * input_test_timestamp: set/get input event timestamps. * input_test_match_device_id: match a device by bus, vendor, product and events that is capable of handling. But having the minimal KUnit support allows to add more tests and suites as follow-up changes. The tests can be run with the following command: $ ./tools/testing/kunit/kunit.py run \ --kunitconfig=3Ddrivers/input/tests/.kunitconfig Signed-off-by: Javier Martinez Canillas Tested-by: Enric Balletbo i Serra --- drivers/input/Kconfig | 12 +++ drivers/input/Makefile | 1 + drivers/input/tests/Makefile | 3 + drivers/input/tests/input_test.c | 144 +++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+) create mode 100644 drivers/input/tests/Makefile create mode 100644 drivers/input/tests/input_test.c diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig index e2752f7364bc..e094e5bbaa0c 100644 --- a/drivers/input/Kconfig +++ b/drivers/input/Kconfig @@ -166,6 +166,18 @@ config INPUT_EVBUG To compile this driver as a module, choose M here: the module will be called evbug. =20 +config INPUT_KUNIT_TEST + tristate "KUnit tests for Input" if !KUNIT_ALL_TESTS + depends on INPUT && KUNIT=3Dy + default KUNIT_ALL_TESTS + help + Say Y here if you want to build the KUnit tests for the input + subsystem. For more information about KUnit and unit tests in + general, please refer to the KUnit documentation in + Documentation/dev-tools/kunit/. + + If in doubt, say "N". + config INPUT_APMPOWER tristate "Input Power Event -> APM Bridge" if EXPERT depends on INPUT && APM_EMULATION diff --git a/drivers/input/Makefile b/drivers/input/Makefile index 2266c7d010ef..c78753274921 100644 --- a/drivers/input/Makefile +++ b/drivers/input/Makefile @@ -26,6 +26,7 @@ obj-$(CONFIG_INPUT_JOYSTICK) +=3D joystick/ obj-$(CONFIG_INPUT_TABLET) +=3D tablet/ obj-$(CONFIG_INPUT_TOUCHSCREEN) +=3D touchscreen/ obj-$(CONFIG_INPUT_MISC) +=3D misc/ +obj-$(CONFIG_INPUT_KUNIT_TEST) +=3D tests/ =20 obj-$(CONFIG_INPUT_APMPOWER) +=3D apm-power.o =20 diff --git a/drivers/input/tests/Makefile b/drivers/input/tests/Makefile new file mode 100644 index 000000000000..90cf954181bc --- /dev/null +++ b/drivers/input/tests/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_INPUT_KUNIT_TEST) +=3D input_test.o diff --git a/drivers/input/tests/input_test.c b/drivers/input/tests/input_t= est.c new file mode 100644 index 000000000000..25bbf51b5c87 --- /dev/null +++ b/drivers/input/tests/input_test.c @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * KUnit test for the input core. + * + * Copyright (c) 2023 Red Hat Inc + */ + +#include +#include + +#include + +#define POLL_INTERVAL 100 + +static int input_test_init(struct kunit *test) +{ + struct input_dev *input_dev; + int ret; + + input_dev =3D input_allocate_device(); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, input_dev); + + input_dev->name =3D "Test input device"; + input_dev->id.bustype =3D BUS_VIRTUAL; + input_dev->id.vendor =3D 1; + input_dev->id.product =3D 1; + input_dev->id.version =3D 1; + input_set_capability(input_dev, EV_KEY, BTN_LEFT); + input_set_capability(input_dev, EV_KEY, BTN_RIGHT); + + ret =3D input_register_device(input_dev); + KUNIT_ASSERT_EQ(test, ret, 0); + + test->priv =3D input_dev; + + return 0; +} + +static void input_test_exit(struct kunit *test) +{ + struct input_dev *input_dev =3D test->priv; + + input_unregister_device(input_dev); +} + +static void input_test_poll(struct input_dev *input) { } + +static void input_test_polling(struct kunit *test) +{ + struct input_dev *input_dev =3D test->priv; + int ret; + + ret =3D input_get_poll_interval(input_dev); + KUNIT_ASSERT_EQ(test, ret, -EINVAL); + + ret =3D input_setup_polling(input_dev, input_test_poll); + KUNIT_ASSERT_EQ(test, ret, 0); + + input_set_poll_interval(input_dev, POLL_INTERVAL); + + ret =3D input_get_poll_interval(input_dev); + KUNIT_ASSERT_EQ(test, ret, POLL_INTERVAL); +} + +static void input_test_timestamp(struct kunit *test) +{ + const ktime_t invalid_timestamp =3D ktime_set(0, 0); + struct input_dev *input_dev =3D test->priv; + ktime_t *timestamp, time; + int ret; + + timestamp =3D input_get_timestamp(input_dev); + time =3D timestamp[INPUT_CLK_MONO]; + + ret =3D ktime_compare(time, invalid_timestamp); + KUNIT_ASSERT_EQ(test, ret, 1); + + time =3D ktime_get(); + input_set_timestamp(input_dev, time); + + timestamp =3D input_get_timestamp(input_dev); + KUNIT_ASSERT_EQ(test, ktime_compare(timestamp[INPUT_CLK_MONO], + time), 0); +} + +static void input_test_match_device_id(struct kunit *test) +{ + struct input_dev *input_dev =3D test->priv; + struct input_device_id id; + + id.flags =3D INPUT_DEVICE_ID_MATCH_BUS; + id.bustype =3D BUS_VIRTUAL; + KUNIT_ASSERT_TRUE(test, input_match_device_id(input_dev, &id)); + + id.bustype =3D BUS_I2C; + KUNIT_ASSERT_FALSE(test, input_match_device_id(input_dev, &id)); + + id.flags =3D INPUT_DEVICE_ID_MATCH_VENDOR; + id.vendor =3D 1; + KUNIT_ASSERT_TRUE(test, input_match_device_id(input_dev, &id)); + + id.vendor =3D 2; + KUNIT_ASSERT_FALSE(test, input_match_device_id(input_dev, &id)); + + id.flags =3D INPUT_DEVICE_ID_MATCH_PRODUCT; + id.product =3D 1; + KUNIT_ASSERT_TRUE(test, input_match_device_id(input_dev, &id)); + + id.product =3D 2; + KUNIT_ASSERT_FALSE(test, input_match_device_id(input_dev, &id)); + + id.flags =3D INPUT_DEVICE_ID_MATCH_VERSION; + id.version =3D 1; + KUNIT_ASSERT_TRUE(test, input_match_device_id(input_dev, &id)); + + id.version =3D 2; + KUNIT_ASSERT_FALSE(test, input_match_device_id(input_dev, &id)); + + id.flags =3D INPUT_DEVICE_ID_MATCH_EVBIT; + __set_bit(EV_KEY, id.evbit); + KUNIT_ASSERT_TRUE(test, input_match_device_id(input_dev, &id)); + + __set_bit(EV_ABS, id.evbit); + KUNIT_ASSERT_FALSE(test, input_match_device_id(input_dev, &id)); +} + +static struct kunit_case input_tests[] =3D { + KUNIT_CASE(input_test_polling), + KUNIT_CASE(input_test_timestamp), + KUNIT_CASE(input_test_match_device_id), + { /* sentinel */ } +}; + +static struct kunit_suite input_test_suite =3D { + .name =3D "input_core", + .init =3D input_test_init, + .exit =3D input_test_exit, + .test_cases =3D input_tests, +}; + +kunit_test_suite(input_test_suite); + +MODULE_AUTHOR("Javier Martinez Canillas "); +MODULE_LICENSE("GPL"); base-commit: 3a93e40326c8f470e71d20b4c42d36767450f38f --=20 2.40.0