1a06023a8SBeau Belgrave /* SPDX-License-Identifier: GPL-2.0 */
2a06023a8SBeau Belgrave
3a06023a8SBeau Belgrave #ifndef _USER_EVENTS_SELFTESTS_H
4a06023a8SBeau Belgrave #define _USER_EVENTS_SELFTESTS_H
5a06023a8SBeau Belgrave
6a06023a8SBeau Belgrave #include <sys/stat.h>
7a06023a8SBeau Belgrave #include <sys/types.h>
8a06023a8SBeau Belgrave #include <sys/mount.h>
9a06023a8SBeau Belgrave #include <unistd.h>
10a06023a8SBeau Belgrave #include <errno.h>
11a06023a8SBeau Belgrave
12a06023a8SBeau Belgrave #include "../kselftest.h"
13a06023a8SBeau Belgrave
tracefs_unmount(void)14*8ed99af4SBeau Belgrave static inline void tracefs_unmount(void)
15*8ed99af4SBeau Belgrave {
16*8ed99af4SBeau Belgrave umount("/sys/kernel/tracing");
17*8ed99af4SBeau Belgrave }
18*8ed99af4SBeau Belgrave
tracefs_enabled(char ** message,bool * fail,bool * umount)19*8ed99af4SBeau Belgrave static inline bool tracefs_enabled(char **message, bool *fail, bool *umount)
20a06023a8SBeau Belgrave {
21a06023a8SBeau Belgrave struct stat buf;
22a06023a8SBeau Belgrave int ret;
23a06023a8SBeau Belgrave
24a06023a8SBeau Belgrave *message = "";
25a06023a8SBeau Belgrave *fail = false;
26*8ed99af4SBeau Belgrave *umount = false;
27a06023a8SBeau Belgrave
28a06023a8SBeau Belgrave /* Ensure tracefs is installed */
29a06023a8SBeau Belgrave ret = stat("/sys/kernel/tracing", &buf);
30a06023a8SBeau Belgrave
31a06023a8SBeau Belgrave if (ret == -1) {
32a06023a8SBeau Belgrave *message = "Tracefs is not installed";
33a06023a8SBeau Belgrave return false;
34a06023a8SBeau Belgrave }
35a06023a8SBeau Belgrave
36a06023a8SBeau Belgrave /* Ensure mounted tracefs */
37a06023a8SBeau Belgrave ret = stat("/sys/kernel/tracing/README", &buf);
38a06023a8SBeau Belgrave
39a06023a8SBeau Belgrave if (ret == -1 && errno == ENOENT) {
40a06023a8SBeau Belgrave if (mount(NULL, "/sys/kernel/tracing", "tracefs", 0, NULL) != 0) {
41a06023a8SBeau Belgrave *message = "Cannot mount tracefs";
42a06023a8SBeau Belgrave *fail = true;
43a06023a8SBeau Belgrave return false;
44a06023a8SBeau Belgrave }
45a06023a8SBeau Belgrave
46*8ed99af4SBeau Belgrave *umount = true;
47*8ed99af4SBeau Belgrave
48a06023a8SBeau Belgrave ret = stat("/sys/kernel/tracing/README", &buf);
49a06023a8SBeau Belgrave }
50a06023a8SBeau Belgrave
51a06023a8SBeau Belgrave if (ret == -1) {
52a06023a8SBeau Belgrave *message = "Cannot access tracefs";
53a06023a8SBeau Belgrave *fail = true;
54a06023a8SBeau Belgrave return false;
55a06023a8SBeau Belgrave }
56a06023a8SBeau Belgrave
57a06023a8SBeau Belgrave return true;
58a06023a8SBeau Belgrave }
59a06023a8SBeau Belgrave
user_events_enabled(char ** message,bool * fail,bool * umount)60*8ed99af4SBeau Belgrave static inline bool user_events_enabled(char **message, bool *fail, bool *umount)
61a06023a8SBeau Belgrave {
62a06023a8SBeau Belgrave struct stat buf;
63a06023a8SBeau Belgrave int ret;
64a06023a8SBeau Belgrave
65a06023a8SBeau Belgrave *message = "";
66a06023a8SBeau Belgrave *fail = false;
67*8ed99af4SBeau Belgrave *umount = false;
68a06023a8SBeau Belgrave
69a06023a8SBeau Belgrave if (getuid() != 0) {
70a06023a8SBeau Belgrave *message = "Must be run as root";
71a06023a8SBeau Belgrave *fail = true;
72a06023a8SBeau Belgrave return false;
73a06023a8SBeau Belgrave }
74a06023a8SBeau Belgrave
75*8ed99af4SBeau Belgrave if (!tracefs_enabled(message, fail, umount))
76a06023a8SBeau Belgrave return false;
77a06023a8SBeau Belgrave
78a06023a8SBeau Belgrave /* Ensure user_events is installed */
79a06023a8SBeau Belgrave ret = stat("/sys/kernel/tracing/user_events_data", &buf);
80a06023a8SBeau Belgrave
81a06023a8SBeau Belgrave if (ret == -1) {
82a06023a8SBeau Belgrave switch (errno) {
83a06023a8SBeau Belgrave case ENOENT:
84a06023a8SBeau Belgrave *message = "user_events is not installed";
85a06023a8SBeau Belgrave return false;
86a06023a8SBeau Belgrave
87a06023a8SBeau Belgrave default:
88a06023a8SBeau Belgrave *message = "Cannot access user_events_data";
89a06023a8SBeau Belgrave *fail = true;
90a06023a8SBeau Belgrave return false;
91a06023a8SBeau Belgrave }
92a06023a8SBeau Belgrave }
93a06023a8SBeau Belgrave
94a06023a8SBeau Belgrave return true;
95a06023a8SBeau Belgrave }
96a06023a8SBeau Belgrave
97*8ed99af4SBeau Belgrave #define USER_EVENT_FIXTURE_SETUP(statement, umount) do { \
98a06023a8SBeau Belgrave char *message; \
99a06023a8SBeau Belgrave bool fail; \
100*8ed99af4SBeau Belgrave if (!user_events_enabled(&message, &fail, &(umount))) { \
101a06023a8SBeau Belgrave if (fail) { \
102a06023a8SBeau Belgrave TH_LOG("Setup failed due to: %s", message); \
103a06023a8SBeau Belgrave ASSERT_FALSE(fail); \
104a06023a8SBeau Belgrave } \
105a06023a8SBeau Belgrave SKIP(statement, "Skipping due to: %s", message); \
106a06023a8SBeau Belgrave } \
107a06023a8SBeau Belgrave } while (0)
108a06023a8SBeau Belgrave
109*8ed99af4SBeau Belgrave #define USER_EVENT_FIXTURE_TEARDOWN(umount) do { \
110*8ed99af4SBeau Belgrave if ((umount)) \
111*8ed99af4SBeau Belgrave tracefs_unmount(); \
112*8ed99af4SBeau Belgrave } while (0)
113*8ed99af4SBeau Belgrave
114a06023a8SBeau Belgrave #endif /* _USER_EVENTS_SELFTESTS_H */
115