xref: /openbmc/linux/tools/testing/selftests/user_events/user_events_selftests.h (revision 50768a425b46ad7d98f6d88c22d41aa026c463cf)
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