50f08cd759661e3e12981130d5cb554b66b5a273
[lttng-tools.git] / tests / unit / test_payload.c
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
8 #include <common/sessiond-comm/payload.h>
9 #include <common/sessiond-comm/payload-view.h>
10 #include <tap/tap.h>
11
12 static const int TEST_COUNT = 5;
13
14 /* For error.h */
15 int lttng_opt_quiet = 1;
16 int lttng_opt_verbose;
17 int lttng_opt_mi;
18
19 static void test_fd_push_pop_order(void)
20 {
21 int ret, i;
22 struct lttng_payload payload;
23
24 lttng_payload_init(&payload);
25
26 diag("Validating fd push/pop order");
27 for (i = 0; i < 3; i++) {
28 ret = lttng_payload_push_fd(&payload, i);
29 if (ret) {
30 break;
31 }
32 }
33 ok(ret == 0, "Added three file descriptors to an lttng_payload");
34
35 {
36 bool fail_pop = false;
37 struct lttng_payload_view view =
38 lttng_payload_view_from_payload(
39 &payload, 0, -1);
40
41 for (i = 0; i < 3; i++) {
42 ret = lttng_payload_view_pop_fd(&view);
43 fail_pop |= ret != i;
44 }
45
46 ok(!fail_pop, "File descriptors are popped from a payload view in the order of insertion");
47 }
48
49 lttng_payload_reset(&payload);
50 }
51
52 static void test_fd_push_pop_imbalance(void)
53 {
54 int ret, i;
55 struct lttng_payload payload;
56 const char * const test_description = "Error reported when popping more file descriptors than were pushed";
57
58 lttng_payload_init(&payload);
59
60 diag("Validating fd pop imbalance");
61 for (i = 0; i < 10; i++) {
62 ret = lttng_payload_push_fd(&payload, i);
63 if (ret) {
64 break;
65 }
66 }
67
68 {
69 struct lttng_payload_view view =
70 lttng_payload_view_from_payload(
71 &payload, 0, -1);
72
73 for (i = 0; i < 10; i++) {
74 ret = lttng_payload_view_pop_fd(&view);
75 if (ret == -1) {
76 goto fail;
77 }
78 }
79
80 ret = lttng_payload_view_pop_fd(&view);
81 ok(ret == -1, test_description);
82 }
83
84 lttng_payload_reset(&payload);
85 return;
86 fail:
87 fail(test_description);
88 lttng_payload_reset(&payload);
89 }
90
91 static void test_fd_pop_fd_root_views(void)
92 {
93 int ret, i;
94 const int fd = 42;
95 struct lttng_payload payload;
96 const char * const test_description = "Same file descriptor returned when popping from different top-level views";
97
98 lttng_payload_init(&payload);
99
100 diag("Validating root view fd pop behaviour");
101 ret = lttng_payload_push_fd(&payload, fd);
102 if (ret) {
103 goto fail;
104 }
105
106 for (i = 0; i < 5; i++) {
107 struct lttng_payload_view view =
108 lttng_payload_view_from_payload(
109 &payload, 0, -1);
110
111 ret = lttng_payload_view_pop_fd(&view);
112 if (ret != fd) {
113 goto fail;
114 }
115 }
116
117 lttng_payload_reset(&payload);
118 pass(test_description);
119 return;
120 fail:
121 lttng_payload_reset(&payload);
122 fail(test_description);
123 }
124
125 static void test_fd_pop_fd_descendant_views(void)
126 {
127 int ret;
128 const int fd1 = 42, fd2 = 1837;
129 struct lttng_payload payload;
130 const char * const test_description = "Different file descriptors returned when popping from descendant views";
131
132 lttng_payload_init(&payload);
133
134 diag("Validating descendant view fd pop behaviour");
135 ret = lttng_payload_push_fd(&payload, fd1);
136 if (ret) {
137 goto fail;
138 }
139
140 ret = lttng_payload_push_fd(&payload, fd2);
141 if (ret) {
142 goto fail;
143 }
144
145 {
146 struct lttng_payload_view view1 =
147 lttng_payload_view_from_payload(
148 &payload, 0, -1);
149 struct lttng_payload_view view2 =
150 lttng_payload_view_from_view(
151 &view1, 0, -1);
152
153 ret = lttng_payload_view_pop_fd(&view1);
154 if (ret != fd1) {
155 goto fail;
156 }
157
158 ret = lttng_payload_view_pop_fd(&view2);
159 if (ret != fd2) {
160 goto fail;
161 }
162 }
163
164 lttng_payload_reset(&payload);
165 pass(test_description);
166 return;
167 fail:
168 lttng_payload_reset(&payload);
169 fail(test_description);
170 }
171
172 int main(void)
173 {
174 plan_tests(TEST_COUNT);
175
176 test_fd_push_pop_order();
177 test_fd_push_pop_imbalance();
178 test_fd_pop_fd_root_views();
179 test_fd_pop_fd_descendant_views();
180
181 return exit_status();
182 }
This page took 0.033011 seconds and 4 git commands to generate.