Commit | Line | Data |
---|---|---|
c0a66c84 JG |
1 | /* |
2 | * Copyright (C) 2020 Jérémie Galarneau <jeremie.galarneau@efficios.com> | |
3 | * | |
4 | * SPDX-License-Identifier: LGPL-2.1-only | |
5 | * | |
6 | */ | |
7 | ||
c9e313bc | 8 | #include <common/compat/fcntl.hpp> |
c9e313bc | 9 | #include <common/payload-view.hpp> |
28ab034a JG |
10 | #include <common/payload.hpp> |
11 | ||
c0a66c84 | 12 | #include <tap/tap.h> |
28ab034a | 13 | #include <unistd.h> |
c0a66c84 JG |
14 | |
15 | static const int TEST_COUNT = 5; | |
16 | ||
17 | /* For error.h */ | |
18 | int lttng_opt_quiet = 1; | |
19 | int lttng_opt_verbose; | |
20 | int lttng_opt_mi; | |
21 | ||
cd9adb8b | 22 | static void test_fd_push_pop_order() |
c0a66c84 JG |
23 | { |
24 | int ret, i; | |
25 | struct lttng_payload payload; | |
fe489250 | 26 | int fds[3]; |
c0a66c84 JG |
27 | |
28 | lttng_payload_init(&payload); | |
29 | ||
30 | diag("Validating fd push/pop order"); | |
31 | for (i = 0; i < 3; i++) { | |
7b0027b3 | 32 | int fd = fcntl(STDOUT_FILENO, F_DUPFD, 0); |
fe489250 JG |
33 | struct fd_handle *handle; |
34 | ||
a0377dfe | 35 | LTTNG_ASSERT(fd >= 0); |
fe489250 JG |
36 | fds[i] = fd; |
37 | ||
38 | handle = fd_handle_create(fd); | |
a0377dfe | 39 | LTTNG_ASSERT(handle); |
fe489250 JG |
40 | |
41 | ret = lttng_payload_push_fd_handle(&payload, handle); | |
42 | fd_handle_put(handle); | |
c0a66c84 JG |
43 | if (ret) { |
44 | break; | |
45 | } | |
46 | } | |
fe489250 | 47 | |
c0a66c84 JG |
48 | ok(ret == 0, "Added three file descriptors to an lttng_payload"); |
49 | ||
50 | { | |
51 | bool fail_pop = false; | |
28ab034a | 52 | struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1); |
c0a66c84 JG |
53 | |
54 | for (i = 0; i < 3; i++) { | |
28ab034a | 55 | struct fd_handle *handle = lttng_payload_view_pop_fd_handle(&view); |
fe489250 JG |
56 | |
57 | fail_pop |= fd_handle_get_fd(handle) != fds[i]; | |
58 | fd_handle_put(handle); | |
c0a66c84 JG |
59 | } |
60 | ||
28ab034a JG |
61 | ok(!fail_pop, |
62 | "File descriptors are popped from a payload view in the order of insertion"); | |
c0a66c84 JG |
63 | } |
64 | ||
65 | lttng_payload_reset(&payload); | |
66 | } | |
67 | ||
cd9adb8b | 68 | static void test_fd_push_pop_imbalance() |
c0a66c84 JG |
69 | { |
70 | int ret, i; | |
71 | struct lttng_payload payload; | |
28ab034a JG |
72 | const char *const test_description = |
73 | "Error reported when popping more file descriptors than were pushed"; | |
c0a66c84 JG |
74 | |
75 | lttng_payload_init(&payload); | |
76 | ||
77 | diag("Validating fd pop imbalance"); | |
78 | for (i = 0; i < 10; i++) { | |
fe489250 | 79 | struct fd_handle *handle; |
7b0027b3 | 80 | int fd = fcntl(STDOUT_FILENO, F_DUPFD, 0); |
fe489250 | 81 | |
a0377dfe | 82 | LTTNG_ASSERT(fd >= 0); |
fe489250 JG |
83 | |
84 | handle = fd_handle_create(fd); | |
a0377dfe | 85 | LTTNG_ASSERT(handle); |
fe489250 JG |
86 | |
87 | ret = lttng_payload_push_fd_handle(&payload, handle); | |
88 | fd_handle_put(handle); | |
c0a66c84 JG |
89 | if (ret) { |
90 | break; | |
91 | } | |
92 | } | |
93 | ||
94 | { | |
fe489250 | 95 | struct fd_handle *handle; |
28ab034a | 96 | struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1); |
c0a66c84 JG |
97 | |
98 | for (i = 0; i < 10; i++) { | |
fe489250 JG |
99 | handle = lttng_payload_view_pop_fd_handle(&view); |
100 | fd_handle_put(handle); | |
101 | if (!handle) { | |
c0a66c84 JG |
102 | goto fail; |
103 | } | |
104 | } | |
105 | ||
fe489250 | 106 | handle = lttng_payload_view_pop_fd_handle(&view); |
411b3154 | 107 | ok(!handle, "%s", test_description); |
fe489250 | 108 | fd_handle_put(handle); |
c0a66c84 JG |
109 | } |
110 | ||
111 | lttng_payload_reset(&payload); | |
112 | return; | |
113 | fail: | |
411b3154 | 114 | fail("%s", test_description); |
c0a66c84 JG |
115 | lttng_payload_reset(&payload); |
116 | } | |
117 | ||
cd9adb8b | 118 | static void test_fd_pop_fd_root_views() |
c0a66c84 JG |
119 | { |
120 | int ret, i; | |
7b0027b3 MJ |
121 | int fd = fcntl(STDOUT_FILENO, F_DUPFD, 0); |
122 | struct fd_handle *handle; | |
c0a66c84 | 123 | struct lttng_payload payload; |
28ab034a JG |
124 | const char *const test_description = |
125 | "Same file descriptor returned when popping from different top-level views"; | |
c0a66c84 | 126 | |
a0377dfe | 127 | LTTNG_ASSERT(fd >= 0); |
7b0027b3 | 128 | handle = fd_handle_create(fd); |
a0377dfe | 129 | LTTNG_ASSERT(handle); |
c0a66c84 | 130 | |
7b0027b3 MJ |
131 | lttng_payload_init(&payload); |
132 | ||
c0a66c84 | 133 | diag("Validating root view fd pop behaviour"); |
fe489250 | 134 | ret = lttng_payload_push_fd_handle(&payload, handle); |
c0a66c84 JG |
135 | if (ret) { |
136 | goto fail; | |
137 | } | |
138 | ||
139 | for (i = 0; i < 5; i++) { | |
fe489250 JG |
140 | int view_fd; |
141 | struct fd_handle *view_handle; | |
28ab034a | 142 | struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1); |
c0a66c84 | 143 | |
fe489250 JG |
144 | view_handle = lttng_payload_view_pop_fd_handle(&view); |
145 | if (!view_handle) { | |
146 | goto fail; | |
147 | } | |
148 | ||
149 | view_fd = fd_handle_get_fd(view_handle); | |
150 | fd_handle_put(view_handle); | |
151 | if (view_fd != fd || view_handle != handle) { | |
c0a66c84 JG |
152 | goto fail; |
153 | } | |
154 | } | |
155 | ||
156 | lttng_payload_reset(&payload); | |
411b3154 | 157 | pass("%s", test_description); |
fe489250 | 158 | fd_handle_put(handle); |
c0a66c84 JG |
159 | return; |
160 | fail: | |
161 | lttng_payload_reset(&payload); | |
411b3154 | 162 | fail("%s", test_description); |
fe489250 | 163 | fd_handle_put(handle); |
c0a66c84 JG |
164 | } |
165 | ||
cd9adb8b | 166 | static void test_fd_pop_fd_descendant_views() |
c0a66c84 JG |
167 | { |
168 | int ret; | |
169 | const int fd1 = 42, fd2 = 1837; | |
fe489250 JG |
170 | struct fd_handle *handle1 = fd_handle_create(fd1); |
171 | struct fd_handle *handle2 = fd_handle_create(fd2); | |
cd9adb8b | 172 | struct fd_handle *view_handle1 = nullptr, *view_handle2 = nullptr; |
c0a66c84 | 173 | struct lttng_payload payload; |
28ab034a JG |
174 | const char *const test_description = |
175 | "Different file descriptors returned when popping from descendant views"; | |
c0a66c84 JG |
176 | |
177 | lttng_payload_init(&payload); | |
a0377dfe FD |
178 | LTTNG_ASSERT(handle1); |
179 | LTTNG_ASSERT(handle2); | |
c0a66c84 JG |
180 | |
181 | diag("Validating descendant view fd pop behaviour"); | |
fe489250 | 182 | ret = lttng_payload_push_fd_handle(&payload, handle1); |
c0a66c84 JG |
183 | if (ret) { |
184 | goto fail; | |
185 | } | |
186 | ||
fe489250 | 187 | ret = lttng_payload_push_fd_handle(&payload, handle2); |
c0a66c84 JG |
188 | if (ret) { |
189 | goto fail; | |
190 | } | |
191 | ||
192 | { | |
28ab034a JG |
193 | struct lttng_payload_view view1 = lttng_payload_view_from_payload(&payload, 0, -1); |
194 | struct lttng_payload_view view2 = lttng_payload_view_from_view(&view1, 0, -1); | |
c0a66c84 | 195 | |
fe489250 JG |
196 | view_handle1 = lttng_payload_view_pop_fd_handle(&view1); |
197 | if (!view_handle1 || fd_handle_get_fd(view_handle1) != fd1) { | |
c0a66c84 JG |
198 | goto fail; |
199 | } | |
200 | ||
fe489250 JG |
201 | view_handle2 = lttng_payload_view_pop_fd_handle(&view2); |
202 | if (!view_handle2 || fd_handle_get_fd(view_handle2) != fd2) { | |
c0a66c84 JG |
203 | goto fail; |
204 | } | |
205 | } | |
206 | ||
207 | lttng_payload_reset(&payload); | |
411b3154 | 208 | pass("%s", test_description); |
fe489250 JG |
209 | fd_handle_put(handle1); |
210 | fd_handle_put(handle2); | |
211 | fd_handle_put(view_handle1); | |
212 | fd_handle_put(view_handle2); | |
c0a66c84 JG |
213 | return; |
214 | fail: | |
215 | lttng_payload_reset(&payload); | |
411b3154 | 216 | fail("%s", test_description); |
fe489250 JG |
217 | fd_handle_put(handle1); |
218 | fd_handle_put(handle2); | |
219 | fd_handle_put(view_handle1); | |
220 | fd_handle_put(view_handle2); | |
c0a66c84 JG |
221 | } |
222 | ||
cd9adb8b | 223 | int main() |
c0a66c84 JG |
224 | { |
225 | plan_tests(TEST_COUNT); | |
226 | ||
227 | test_fd_push_pop_order(); | |
228 | test_fd_push_pop_imbalance(); | |
229 | test_fd_pop_fd_root_views(); | |
230 | test_fd_pop_fd_descendant_views(); | |
231 | ||
232 | return exit_status(); | |
233 | } |