xref: /linux/include/rv/kunit.h (revision 55ee4b931a7ffedc886175d265dd6e6d08fd4151)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2026-2029 Red Hat, Inc. Gabriele Monaco <gmonaco@redhat.com>
4  *
5  * Declaration of wrappers to allow mocking core functionality, like current,
6  * and other testing utilities.
7  * Necessary only when mocking may be needed. If the RV KUnit test is
8  * enabled, the wrappers incur an additional function call overhead.
9  */
10 
11 #ifndef _RV_KUNIT_H
12 #define _RV_KUNIT_H
13 
14 #if IS_ENABLED(CONFIG_RV_MONITORS_KUNIT_TEST)
15 
16 #include <kunit/test.h>
17 #include <kunit/test-bug.h>
18 #include <linux/delay.h>
19 
20 int rv_set_testing(struct kunit_suite *suite);
21 void rv_clear_testing(struct kunit_suite *suite);
22 
23 #define RV_KUNIT_MAX_MOCK_TASKS 8
24 
25 struct rv_kunit_ctx {
26 	int reactions, expected;
27 	int mock_task_count;
28 	struct task_struct *mock_tasks[RV_KUNIT_MAX_MOCK_TASKS];
29 };
30 
31 #define RV_KUNIT_EXPECT_REACTION(test, ctx)                             \
32 	do {                                                            \
33 		KUNIT_EXPECT_EQ(test, ctx->reactions, ++ctx->expected); \
34 		if (ctx->reactions != ctx->expected)                    \
35 			ctx->expected = ctx->reactions;                 \
36 	} while (0)
37 
38 #define RV_KUNIT_EXPECT_NO_REACTION(test, ctx)                        \
39 	do {                                                          \
40 		KUNIT_EXPECT_EQ(test, ctx->reactions, ctx->expected); \
41 		if (ctx->reactions != ctx->expected)                  \
42 			ctx->expected = ctx->reactions;               \
43 	} while (0)
44 
45 #define RV_KUNIT_EXPECT_REACTION_HERE(test, ctx)                             \
46 	for (int __done = ({ RV_KUNIT_EXPECT_NO_REACTION(test, ctx); 0; });  \
47 	     !__done;                                                        \
48 	     __done = ({ RV_KUNIT_EXPECT_REACTION(test, ctx); 1; }))
49 
50 struct rv_kunit_mon {
51 	struct rv_monitor *rv_this;
52 	int (*monitor_init)(void);
53 	void (*monitor_destroy)(void);
54 	bool is_per_task;
55 	int *task_slot;
56 	void (*task_reset)(struct task_struct *task);
57 };
58 
59 void prepare_test(struct kunit *test, const struct rv_kunit_mon *mon);
60 void teardown_test(void *arg);
61 struct task_struct *rv_kunit_alloc_mock_task(struct kunit *test);
62 
63 void rv_mock_current(struct task_struct *tsk);
64 struct task_struct *rv_get_mock_current(void);
65 
66 #define rv_get_current() (unlikely(kunit_get_current_test()) ? rv_get_mock_current() : current)
67 
68 #else /* !CONFIG_RV_MONITORS_KUNIT_TEST */
69 
70 #define rv_get_current() current
71 
72 #endif /* CONFIG_RV_MONITORS_KUNIT_TEST */
73 #endif /* _RV_KUNIT_H */
74