Fix: sessiond: ODR violation results in memory corruption
[lttng-tools.git] / tests / unit / test_relayd_backward_compat_group_by_session.cpp
CommitLineData
73e9abbe 1/*
4942c256 2 * Copyright (C) 2019 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
73e9abbe 3 *
9d16b343 4 * SPDX-License-Identifier: GPL-2.0-only
73e9abbe 5 *
73e9abbe
JR
6 */
7
73e9abbe
JR
8#include <stdbool.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12#include <tap/tap.h>
13
c9e313bc 14#include <common/time.hpp>
d2cb4a90 15
c9e313bc 16#include "backward-compatibility-group-by.hpp"
73e9abbe
JR
17
18/* Number of TAP tests in this file */
19#define NUM_TESTS_PER_TEST 1
20
f1494934 21namespace {
73e9abbe 22struct test {
b53d4e59
SM
23 const char *stream_path;
24 const char *session_name;
25 const char *hostname;
26 const char *creation_time;
27 const char *extra_path;
28 const char *leftover;
73e9abbe
JR
29 bool is_valid;
30};
f1494934 31} /* namespace */
73e9abbe
JR
32
33int lttng_opt_quiet;
34int lttng_opt_mi;
35int lttng_opt_verbose;
36
37struct test tests[] = {
38 /* Default name session streaming. */
39 {"hostname/auto-20190918-164429/ust/uid/1000/64-bit",
40 "auto-20190918-164429", "hostname",
41 "20190918-164429", "", "ust/uid/1000/64-bit",
42 true},
43 /* Custom default name session */
44 {"hostname/custom_auto-20190319-120000/ust/uid/1000/64-bit",
45 "custom_auto-20190319-120000", "hostname",
46 "20190319-120000", "", "ust/uid/1000/64-bit",
47 true},
48 /* Named session streaming */
49 {"hostname/test-20190918-164709/ust/uid/1000/64-bit", "test",
50 "hostname", "20190918-164709", "",
51 "ust/uid/1000/64-bit", true},
52 /* Default session snapshot streaming */
53 {"hostname//snapshot-1-20190918-164829-0/ust//uid/1000/64-bit",
54 "my_session", "hostname", "", "",
55 "snapshot-1-20190918-164829-0/ust//uid/1000/64-bit",
56 true},
57 /* Named session snapshot streaming */
58 {"hostname//snapshot-1-20190918-175919-0/ust//uid/1000/64-bit",
59 "my_session", "hostname", "", "",
60 "snapshot-1-20190918-175919-0/ust//uid/1000/64-bit",
61 true},
62 /* Default name session, live */
63 {"hostname//auto-20190918-171641/ust/uid/1000/64-bit",
64 "auto-20190918-171641", "hostname",
65 "20190918-171641", "", "ust/uid/1000/64-bit",
66 true},
67 /* Named session, live */
68 {"hostname//test-20190918-180333//ust/uid/1000/64-bit",
69 "test-20190918-180333", "hostname",
70 "20190918-180333", "", "/ust/uid/1000/64-bit",
71 true},
72 /* Default name session, streaming & live , extra path */
73 {"hostname/extra/path/ust/uid/1000/64-bit",
74 "auto-20190919-122110", "hostname",
75 "20190919-122110", "extra",
76 "path/ust/uid/1000/64-bit", true},
77 /* Named session, live, extra path */
78 {"hostname/extra/path/ust/uid/1000/64-bit", "test", "hostname",
79 "", "extra", "path/ust/uid/1000/64-bit", true},
80 /* Named session, snapshot, extra path */
81 {"hostname/extra/path/snapshot-1-20190919-140702-0/ust//uid/1000/64-bit",
82 "test", "hostname", "", "extra",
83 "path/snapshot-1-20190919-140702-0/ust//uid/1000/64-bit",
84 true},
85 /* Corner cases*/
86 /* Named session with valid datetime in it */
87 /* Default name session, extra path with session name in it*/
88 {"hostname/test-20190319-120000-20190918-180921/ust/uid/1000/64-bit",
89 "test-20190319-120000", "hostname",
90 "20190918-180921", "", "ust/uid/1000/64-bit",
91 true},
92 /* Empty path */
93 {"", "test", "", "", "", "", false},
94 /* Path without second token */
95 {"hostname", "test", "hostname", "", "", "", false},
96 /* No leftover */
97 {"hostname/test", "test", "hostname", "", "", "", true},
98 /* Path with ession name but no datetime */
99 {"hostname/test/ust/uid/1000/64-bit", "test", "hostname", "",
100 "", "ust/uid/1000/64-bit", true},
101};
102
d2cb4a90 103static char *craft_expected(struct test *test, time_t relay_session_creation_time)
73e9abbe
JR
104{
105 int ret;
106 char *result = NULL;
d2cb4a90
JG
107 char relay_session_creation_datetime[DATETIME_STR_LEN];
108
109 ret = time_to_datetime_str(relay_session_creation_time,
110 relay_session_creation_datetime,
111 sizeof(relay_session_creation_datetime));
112 if (ret < 0) {
113 result = NULL;
114 goto end;
115 }
73e9abbe 116
d2cb4a90 117 ret = asprintf(&result, "%s/%s-%s/%s%s%s", test->session_name,
73e9abbe 118 test->hostname,
d2cb4a90
JG
119 test->creation_time[0] == '\0' ?
120 relay_session_creation_datetime :
121 test->creation_time,
122 test->extra_path,
73e9abbe
JR
123 test->extra_path[0] != '\0' ? "/" : "", test->leftover);
124 if (ret < 0) {
125 result = NULL;
d2cb4a90 126 goto end;
73e9abbe 127 }
d2cb4a90 128end:
73e9abbe
JR
129 return result;
130}
131
f46376a1 132int main(void)
73e9abbe 133{
9df6c82a 134 int i;
73e9abbe 135 int num_test = sizeof(tests) / sizeof(struct test);
d2cb4a90 136 const time_t test_time = time(NULL);
73e9abbe
JR
137
138 plan_tests(NUM_TESTS_PER_TEST * num_test);
139 diag("Backward compatibility utils for lttng-relayd --group-by-session");
d2cb4a90
JG
140
141 if (test_time == (time_t) -1) {
142 perror("Failed to sample time");
143 return exit_status();
144 }
145
9df6c82a 146 for (i = 0; i < num_test; i++) {
73e9abbe
JR
147 char *expected = NULL;
148 char *result = NULL;
149
d2cb4a90 150 expected = craft_expected(&tests[i], test_time);
73e9abbe
JR
151 if (!expected) {
152 fprintf(stderr, "Failed to craft expected output\n");
153 goto loop;
154 }
155
d2cb4a90
JG
156 result = backward_compat_group_by_session(tests[i].stream_path,
157 tests[i].session_name, test_time);
73e9abbe
JR
158 if (!result && tests[i].is_valid) {
159 fprintf(stderr, "Failed to get result\n");
160 goto loop;
161 } else if (!result && tests[i].is_valid == false) {
162 pass("Returned null as expected");
163 goto loop;
164 }
165
166 ok(strncmp(expected, result, strlen(expected)) == 0,
167 "In: %s, out: %s, expected: %s",
168 tests[i].stream_path, result, expected);
169 loop:
170 free(expected);
171 free(result);
172 }
173 return exit_status();
174}
This page took 0.039461 seconds and 4 git commands to generate.