Fix openssl req with -addext subjectAltName=dirName
[openssl.git] / test / quic_qlog_test.c
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 }