Message ID | 17ec7e3f553fa8c36c19d2cbf4cc0e6d03c7e443.1740499185.git.jerome.forissier@linaro.org |
---|---|
State | New |
Headers | show |
Series | Uthreads | expand |
On Tue, 25 Feb 2025 at 18:35, Jerome Forissier <jerome.forissier@linaro.org> wrote: > > Add a uhread framework test to the lib tests. > > Signed-off-by: Jerome Forissier <jerome.forissier@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.apalodimas@linaro.org>
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);
Add a uhread framework test to the lib tests. Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> --- test/lib/Makefile | 1 + test/lib/uthread.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 test/lib/uthread.c