1 | /*
|
---|
2 | * Copyright 2024 The OpenSSL Project Authors. All Rights Reserved.
|
---|
3 | *
|
---|
4 | * Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
5 | * this file except in compliance with the License. You can obtain a copy
|
---|
6 | * in the file LICENSE in the source distribution or at
|
---|
7 | * https://www.openssl.org/source/license.html
|
---|
8 | */
|
---|
9 |
|
---|
10 | #include "internal/qlog.h"
|
---|
11 | #include "testutil.h"
|
---|
12 |
|
---|
13 | /*
|
---|
14 | * Unfortunately, this must be expressed as an array and not a string literal as
|
---|
15 | * ANSI C only guarantees support for up to 509 characters in a string literal.
|
---|
16 | */
|
---|
17 | static const char expected[] = {
|
---|
18 | 30, '{', '"', 'q', 'l', 'o', 'g', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n',
|
---|
19 | '"', ':', '"', '0', '.', '3', '"', ',', '"', 'q', 'l', 'o', 'g', '_', 'f',
|
---|
20 | 'o', 'r', 'm', 'a', 't', '"', ':', '"', 'J', 'S', 'O', 'N', '-', 'S', 'E',
|
---|
21 | 'Q', '"', ',', '"', 't', 'i', 't', 'l', 'e', '"', ':', '"', 't', 'e', 's',
|
---|
22 | 't', ' ', 't', 'i', 't', 'l', 'e', '"', ',', '"', 'd', 'e', 's', 'c', 'r',
|
---|
23 | 'i', 'p', 't', 'i', 'o', 'n', '"', ':', '"', 't', 'e', 's', 't', ' ', 'd',
|
---|
24 | 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', '"', ',', '"', 't', 'r',
|
---|
25 | 'a', 'c', 'e', '"', ':', '{', '"', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'f',
|
---|
26 | 'i', 'e', 'l', 'd', 's', '"', ':', '{', '"', 't', 'i', 'm', 'e', '_', 'f',
|
---|
27 | 'o', 'r', 'm', 'a', 't', '"', ':', '"', 'd', 'e', 'l', 't', 'a', '"', ',',
|
---|
28 | '"', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 't', 'y', 'p', 'e', '"',
|
---|
29 | ':', '[', '"', 'Q', 'U', 'I', 'C', '"', ']', ',', '"', 'g', 'r', 'o', 'u',
|
---|
30 | 'p', '_', 'i', 'd', '"', ':', '"', 't', 'e', 's', 't', ' ', 'g', 'r', 'o',
|
---|
31 | 'u', 'p', ' ', 'I', 'D', '"', ',', '"', 's', 'y', 's', 't', 'e', 'm', '_',
|
---|
32 | 'i', 'n', 'f', 'o', '"', ':', '{', '"', 'p', 'r', 'o', 'c', 'e', 's', 's',
|
---|
33 | '_', 'i', 'd', '"', ':', '1', '2', '3', '}', '}', ',', '"', 'v', 'a', 'n',
|
---|
34 | 't', 'a', 'g', 'e', '_', 'p', 'o', 'i', 'n', 't', '"', ':', '{', '"', 't',
|
---|
35 | 'y', 'p', 'e', '"', ':', '"', 'c', 'l', 'i', 'e', 'n', 't', '"', ',', '"',
|
---|
36 | 'n', 'a', 'm', 'e', '"', ':', '"', 'O', 'p', 'e', 'n', 'S', 'S', 'L', '/',
|
---|
37 | 'x', '.', 'y', '.', 'z', '"', '}', '}', '}', 10, 30, '{', '"', 'n', 'a',
|
---|
38 | 'm', 'e', '"', ':', '"', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', ':',
|
---|
39 | 'p', 'a', 'c', 'k', 'e', 't', '_', 's', 'e', 'n', 't', '"', ',', '"', 'd',
|
---|
40 | 'a', 't', 'a', '"', ':', '{', '"', 'f', 'i', 'e', 'l', 'd', '1', '"', ':',
|
---|
41 | '"', 'f', 'o', 'o', '"', ',', '"', 'f', 'i', 'e', 'l', 'd', '2', '"', ':',
|
---|
42 | '"', 'b', 'a', 'r', '"', ',', '"', 'f', 'i', 'e', 'l', 'd', '3', '"', ':',
|
---|
43 | '4', '2', ',', '"', 'f', 'i', 'e', 'l', 'd', '4', '"', ':', '"', '1', '1',
|
---|
44 | '5', '2', '9', '2', '1', '5', '0', '4', '6', '0', '6', '8', '4', '6', '9',
|
---|
45 | '7', '6', '"', ',', '"', 'f', 'i', 'e', 'l', 'd', '5', '"', ':', '"', '1',
|
---|
46 | '8', '4', '4', '6', '7', '4', '4', '0', '7', '3', '7', '0', '9', '5', '5',
|
---|
47 | '1', '6', '1', '5', '"', ',', '"', 'f', 'i', 'e', 'l', 'd', '6', '"', ':',
|
---|
48 | 'f', 'a', 'l', 's', 'e', ',', '"', 'f', 'i', 'e', 'l', 'd', '7', '"', ':',
|
---|
49 | 't', 'r', 'u', 'e', ',', '"', 'f', 'i', 'e', 'l', 'd', '8', '"', ':', '"',
|
---|
50 | '0', '1', 'a', 'f', '"', ',', '"', 'f', 'i', 'e', 'l', 'd', '9', '"', ':',
|
---|
51 | '"', '5', '5', '"', ',', '"', 's', 'u', 'b', 'g', 'r', 'o', 'u', 'p', '"',
|
---|
52 | ':', '{', '"', 'f', 'i', 'e', 'l', 'd', '1', '0', '"', ':', '"', 'b', 'a',
|
---|
53 | 'z', '"', '}', ',', '"', 'a', 'r', 'r', 'a', 'y', '"', ':', '[', '"', 'a',
|
---|
54 | '"', ',', '"', 'b', '"', ']', '}', ',', '"', 't', 'i', 'm', 'e', '"', ':',
|
---|
55 | '1', '7', '0', '6', '5', '3', '1', '1', '7', '0', '0', '0', '}', 10, 30,
|
---|
56 | '{', '"', 'n', 'a', 'm', 'e', '"', ':', '"', 't', 'r', 'a', 'n', 's', 'p',
|
---|
57 | 'o', 'r', 't', ':', 'p', 'a', 'c', 'k', 'e', 't', '_', 's', 'e', 'n', 't',
|
---|
58 | '"', ',', '"', 'd', 'a', 't', 'a', '"', ':', '{', '"', 'f', 'i', 'e', 'l',
|
---|
59 | 'd', '1', '"', ':', '"', 'b', 'a', 'r', '"', '}', ',', '"', 't', 'i', 'm',
|
---|
60 | 'e', '"', ':', '1', '0', '0', '0', '}', 10
|
---|
61 | };
|
---|
62 |
|
---|
63 | static const unsigned char bin_buf[] = {
|
---|
64 | 0x01, 0xaf
|
---|
65 | };
|
---|
66 |
|
---|
67 | static OSSL_TIME last_time;
|
---|
68 |
|
---|
69 | static OSSL_TIME now(void *arg)
|
---|
70 | {
|
---|
71 | OSSL_TIME t = last_time;
|
---|
72 |
|
---|
73 | last_time = ossl_time_add(t, ossl_ms2time(1000));
|
---|
74 | return t;
|
---|
75 | }
|
---|
76 |
|
---|
77 | static int test_qlog(void)
|
---|
78 | {
|
---|
79 | int testresult = 0;
|
---|
80 | QLOG_TRACE_INFO qti = {0};
|
---|
81 | QLOG *qlog;
|
---|
82 | BIO *bio;
|
---|
83 | char *buf = NULL;
|
---|
84 | size_t buf_len = 0;
|
---|
85 |
|
---|
86 | last_time = ossl_time_from_time_t(170653117);
|
---|
87 |
|
---|
88 | qti.odcid.id_len = 1;
|
---|
89 | qti.odcid.id[0] = 0x55;
|
---|
90 | qti.title = "test title";
|
---|
91 | qti.description = "test description";
|
---|
92 | qti.group_id = "test group ID";
|
---|
93 | qti.override_process_id = 123;
|
---|
94 | qti.now_cb = now;
|
---|
95 | qti.override_impl_name = "OpenSSL/x.y.z";
|
---|
96 |
|
---|
97 | if (!TEST_ptr(qlog = ossl_qlog_new(&qti)))
|
---|
98 | goto err;
|
---|
99 |
|
---|
100 | if (!TEST_true(ossl_qlog_set_event_type_enabled(qlog, QLOG_EVENT_TYPE_transport_packet_sent, 1)))
|
---|
101 | goto err;
|
---|
102 |
|
---|
103 | if (!TEST_ptr(bio = BIO_new(BIO_s_mem())))
|
---|
104 | goto err;
|
---|
105 |
|
---|
106 | if (!TEST_true(ossl_qlog_set_sink_bio(qlog, bio)))
|
---|
107 | goto err;
|
---|
108 |
|
---|
109 | QLOG_EVENT_BEGIN(qlog, transport, packet_sent)
|
---|
110 | QLOG_STR("field1", "foo");
|
---|
111 | QLOG_STR_LEN("field2", "bar", 3);
|
---|
112 | QLOG_I64("field3", 42);
|
---|
113 | QLOG_I64("field4", 1ULL << 60);
|
---|
114 | QLOG_U64("field5", UINT64_MAX);
|
---|
115 | QLOG_BOOL("field6", 0);
|
---|
116 | QLOG_BOOL("field7", 1);
|
---|
117 | QLOG_BIN("field8", bin_buf, sizeof(bin_buf));
|
---|
118 | QLOG_CID("field9", &qti.odcid);
|
---|
119 | QLOG_BEGIN("subgroup")
|
---|
120 | QLOG_STR("field10", "baz");
|
---|
121 | QLOG_END()
|
---|
122 | QLOG_BEGIN_ARRAY("array")
|
---|
123 | QLOG_STR(NULL, "a");
|
---|
124 | QLOG_STR(NULL, "b");
|
---|
125 | QLOG_END_ARRAY()
|
---|
126 | QLOG_EVENT_END()
|
---|
127 |
|
---|
128 | /* not enabled */
|
---|
129 | QLOG_EVENT_BEGIN(qlog, transport, packet_received)
|
---|
130 | QLOG_STR("field1", "foo");
|
---|
131 | QLOG_EVENT_END()
|
---|
132 |
|
---|
133 | /* test delta time calculation */
|
---|
134 | QLOG_EVENT_BEGIN(qlog, transport, packet_sent)
|
---|
135 | QLOG_STR("field1", "bar");
|
---|
136 | QLOG_EVENT_END()
|
---|
137 |
|
---|
138 | if (!TEST_true(ossl_qlog_flush(qlog)))
|
---|
139 | goto err;
|
---|
140 |
|
---|
141 | buf_len = BIO_get_mem_data(bio, &buf);
|
---|
142 | if (!TEST_size_t_gt(buf_len, 0))
|
---|
143 | goto err;
|
---|
144 |
|
---|
145 | if (!TEST_mem_eq(buf, buf_len, expected, sizeof(expected)))
|
---|
146 | goto err;
|
---|
147 |
|
---|
148 | testresult = 1;
|
---|
149 | err:
|
---|
150 | ossl_qlog_free(qlog);
|
---|
151 | return testresult;
|
---|
152 | }
|
---|
153 |
|
---|
154 | struct filter_spec {
|
---|
155 | const char *filter;
|
---|
156 | int expect_ok;
|
---|
157 | uint32_t expect_event_type;
|
---|
158 | int expect_event_enable;
|
---|
159 | };
|
---|
160 |
|
---|
161 | static const struct filter_spec filters[] = {
|
---|
162 | { "*", 1,
|
---|
163 | QLOG_EVENT_TYPE_transport_packet_sent, 1 },
|
---|
164 | { "-*", 1,
|
---|
165 | QLOG_EVENT_TYPE_transport_packet_sent, 0 },
|
---|
166 | { "+*", 1,
|
---|
167 | QLOG_EVENT_TYPE_transport_packet_sent, 1 },
|
---|
168 | { "* *", 1,
|
---|
169 | QLOG_EVENT_TYPE_transport_packet_received, 1 },
|
---|
170 | { "-* +*", 1,
|
---|
171 | QLOG_EVENT_TYPE_transport_packet_received, 1 },
|
---|
172 | { "-* +* -*", 1,
|
---|
173 | QLOG_EVENT_TYPE_transport_packet_received, 0 },
|
---|
174 | { " *", 1,
|
---|
175 | QLOG_EVENT_TYPE_transport_packet_sent, 1 },
|
---|
176 | { " ", 1,
|
---|
177 | QLOG_EVENT_TYPE_transport_packet_sent, 0 },
|
---|
178 | { "", 1,
|
---|
179 | QLOG_EVENT_TYPE_transport_packet_sent, 0 },
|
---|
180 | { "transport:packet_sent", 1,
|
---|
181 | QLOG_EVENT_TYPE_transport_packet_sent, 1 },
|
---|
182 | { "transport:packet_sent", 1,
|
---|
183 | QLOG_EVENT_TYPE_transport_packet_received, 0 },
|
---|
184 | { "* -transport:packet_sent", 1,
|
---|
185 | QLOG_EVENT_TYPE_transport_packet_received, 1 },
|
---|
186 | { "* -transport:packet_sent", 1,
|
---|
187 | QLOG_EVENT_TYPE_transport_packet_sent, 0 },
|
---|
188 | { "unknown:event", 1,
|
---|
189 | QLOG_EVENT_TYPE_transport_packet_sent, 0 },
|
---|
190 | { "unknown:event +transport:packet_sent", 1,
|
---|
191 | QLOG_EVENT_TYPE_transport_packet_sent, 1 },
|
---|
192 | { "unknown:event transport:*", 1,
|
---|
193 | QLOG_EVENT_TYPE_transport_packet_sent, 1 },
|
---|
194 | { "unknown:event +transport:* -transport:packet_sent", 1,
|
---|
195 | QLOG_EVENT_TYPE_transport_packet_received, 1 },
|
---|
196 | { "unknown:event transport:* -transport:packet_sent", 1,
|
---|
197 | QLOG_EVENT_TYPE_transport_packet_sent, 0 },
|
---|
198 | { "* -transport:*", 1,
|
---|
199 | QLOG_EVENT_TYPE_connectivity_connection_started, 1 },
|
---|
200 | { "* -transport:*", 1,
|
---|
201 | QLOG_EVENT_TYPE_transport_parameters_set, 0 },
|
---|
202 | { "&", 0 },
|
---|
203 | { "event_name_without_category", 0 },
|
---|
204 | { "event_name_with_@badchar:foo", 0 },
|
---|
205 | { "event_name_with_badchar:f@oo", 0 },
|
---|
206 | { "category:", 0 },
|
---|
207 | { ":name", 0 },
|
---|
208 | { ":", 0 },
|
---|
209 | { "**", 0 },
|
---|
210 | { "foo:bar*", 0 },
|
---|
211 | { "foo:*bar", 0 },
|
---|
212 | { "foo*:bar", 0 },
|
---|
213 | { "*foo:bar", 0 },
|
---|
214 | };
|
---|
215 |
|
---|
216 | static int test_qlog_filter(int idx)
|
---|
217 | {
|
---|
218 | int testresult = 0;
|
---|
219 | QLOG_TRACE_INFO qti = {0};
|
---|
220 | QLOG *qlog;
|
---|
221 |
|
---|
222 | qti.odcid.id_len = 1;
|
---|
223 | qti.odcid.id[0] = 0x55;
|
---|
224 |
|
---|
225 | if (!TEST_ptr(qlog = ossl_qlog_new(&qti)))
|
---|
226 | goto err;
|
---|
227 |
|
---|
228 | if (!TEST_int_eq(ossl_qlog_set_filter(qlog, filters[idx].filter),
|
---|
229 | filters[idx].expect_ok))
|
---|
230 | goto err;
|
---|
231 |
|
---|
232 | if (filters[idx].expect_event_type != QLOG_EVENT_TYPE_NONE)
|
---|
233 | if (!TEST_int_eq(ossl_qlog_enabled(qlog, filters[idx].expect_event_type),
|
---|
234 | filters[idx].expect_event_enable))
|
---|
235 | goto err;
|
---|
236 |
|
---|
237 | testresult = 1;
|
---|
238 | err:
|
---|
239 | ossl_qlog_free(qlog);
|
---|
240 | return testresult;
|
---|
241 | }
|
---|
242 |
|
---|
243 | int setup_tests(void)
|
---|
244 | {
|
---|
245 | ADD_TEST(test_qlog);
|
---|
246 | ADD_ALL_TESTS(test_qlog_filter, OSSL_NELEM(filters));
|
---|
247 | return 1;
|
---|
248 | }
|
---|