fix: relayd: unaligned access in trace_chunk_registry_ht_key_hash
[lttng-tools.git] / tests / unit / test_payload.cpp
CommitLineData
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/payload-view.hpp>
28ab034a
JG
9#include <common/payload.hpp>
10
671e39d7 11#include <fcntl.h>
c0a66c84 12#include <tap/tap.h>
28ab034a 13#include <unistd.h>
c0a66c84
JG
14
15static const int TEST_COUNT = 5;
16
17/* For error.h */
18int lttng_opt_quiet = 1;
19int lttng_opt_verbose;
20int lttng_opt_mi;
21
cd9adb8b 22static 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 68static 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;
113fail:
411b3154 114 fail("%s", test_description);
c0a66c84
JG
115 lttng_payload_reset(&payload);
116}
117
cd9adb8b 118static 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;
160fail:
161 lttng_payload_reset(&payload);
411b3154 162 fail("%s", test_description);
fe489250 163 fd_handle_put(handle);
c0a66c84
JG
164}
165
cd9adb8b 166static 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;
214fail:
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 223int 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}
This page took 0.053084 seconds and 4 git commands to generate.