On Tue, 25 Feb 2025 at 18:35, Jerome Forissier
<jerome.foriss...@linaro.org> wrote:
>
> Add a uhread framework test to the lib tests.
>
> Signed-off-by: Jerome Forissier <jerome.foriss...@linaro.org>
> ---
>  test/lib/Makefile  |  1 +
>  test/lib/uthread.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 69 insertions(+)
>  create mode 100644 test/lib/uthread.c
>
> diff --git a/test/lib/Makefile b/test/lib/Makefile
> index bf04685dae1..c991dff1c63 100644
> --- a/test/lib/Makefile
> +++ b/test/lib/Makefile
> @@ -31,6 +31,7 @@ obj-$(CONFIG_CRC8) += test_crc8.o
>  obj-$(CONFIG_UT_LIB_CRYPT) += test_crypt.o
>  obj-$(CONFIG_UT_TIME) += time.o
>  obj-$(CONFIG_$(XPL_)UT_UNICODE) += unicode.o
> +obj-$(CONFIG_UTHREAD) += uthread.o
>  obj-$(CONFIG_LIB_UUID) += uuid.o
>  else
>  obj-$(CONFIG_SANDBOX) += kconfig_spl.o
> diff --git a/test/lib/uthread.c b/test/lib/uthread.c
> new file mode 100644
> index 00000000000..84c41d35875
> --- /dev/null
> +++ b/test/lib/uthread.c
> @@ -0,0 +1,68 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2025 Linaro Limited
> + *
> + * Unit test for uthread
> + */
> +
> +#include <stdbool.h>
> +#include <test/lib.h>
> +#include <test/ut.h>
> +#include <uthread.h>
> +
> +static int count;
> +
> +static void worker(void *arg)
> +{
> +       int loops = (int)(unsigned long)arg;
> +       int i;
> +
> +       for (i = 0; i < loops; i++) {
> +               count++;
> +               uthread_schedule();
> +       }
> +}
> +
> +static int lib_uthread(struct unit_test_state *uts)
> +{
> +       int i;
> +       int id1, id2;
> +
> +       count = 0;
> +       id1 = uthread_grp_new_id();
> +       ut_assert(id1 != 0);
> +       id2 = uthread_grp_new_id();
> +       ut_assert(id2 != 0);
> +       ut_assert(id1 != id2);
> +       ut_assertok(uthread_create(worker, (void *)5, 0, id1));
> +       ut_assertok(uthread_create(worker, (void *)10, 0, 0));
> +       /*
> +        * The first call is expected to schedule the first worker, which will
> +        * schedule the second one, which will schedule back to the main 
> thread
> +        * (here). Therefore count should be 2.
> +        */
> +       ut_assert(uthread_schedule());
> +       ut_asserteq(2, count);
> +       ut_assert(!uthread_grp_done(id1));
> +       /* Four more calls should bring the count to 10 */
> +       for (i = 0; i < 4; i++) {
> +               ut_assert(!uthread_grp_done(id1));
> +               ut_assert(uthread_schedule());
> +       }
> +       ut_asserteq(10, count);
> +       /* This one allows the first worker to exit */
> +       ut_assert(uthread_schedule());
> +       /* At this point there should be no runnable thread in group 'id1' */
> +       ut_assert(uthread_grp_done(id1));
> +       /* Five more calls for the second worker to finish incrementing  */
> +       for (i = 0; i < 5; i++)
> +               ut_assert(uthread_schedule());
> +       ut_asserteq(15, count);
> +       /* Plus one call to let the second worker return from its entry point 
> */
> +       ut_assert(uthread_schedule());
> +       /* Now both tasks should be done, schedule should return false */
> +       ut_assert(!uthread_schedule());
> +
> +       return 0;
> +}
> +LIB_TEST(lib_uthread, 0);
> --
> 2.43.0
>
Acked-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>

Reply via email to