1 /*
2 * Copyright 2022-2023 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 <openssl/trace.h>
11
12 #include "testutil.h"
13
test_trace_categories(void)14 static int test_trace_categories(void)
15 {
16 int cat_num;
17
18 for (cat_num = -1; cat_num <= OSSL_TRACE_CATEGORY_NUM + 1; ++cat_num) {
19 const char *cat_name = OSSL_trace_get_category_name(cat_num);
20 int is_cat_name_eq = 0;
21 int ret_cat_num;
22 int expected_ret;
23
24 switch (cat_num) {
25 #define CASE(name) \
26 case OSSL_TRACE_CATEGORY_##name: \
27 is_cat_name_eq = TEST_str_eq(cat_name, #name); \
28 break
29
30 CASE(ALL);
31 CASE(TRACE);
32 CASE(INIT);
33 CASE(TLS);
34 CASE(TLS_CIPHER);
35 CASE(CONF);
36 CASE(ENGINE_TABLE);
37 CASE(ENGINE_REF_COUNT);
38 CASE(PKCS5V2);
39 CASE(PKCS12_KEYGEN);
40 CASE(PKCS12_DECRYPT);
41 CASE(X509V3_POLICY);
42 CASE(BN_CTX);
43 CASE(CMP);
44 CASE(STORE);
45 CASE(DECODER);
46 CASE(ENCODER);
47 CASE(REF_COUNT);
48 #undef CASE
49 default:
50 is_cat_name_eq = TEST_ptr_null(cat_name);
51 break;
52 }
53
54 if (!TEST_true(is_cat_name_eq))
55 return 0;
56 ret_cat_num =
57 OSSL_trace_get_category_num(cat_name);
58 expected_ret = cat_name != NULL ? cat_num : -1;
59 if (!TEST_int_eq(expected_ret, ret_cat_num))
60 return 0;
61 }
62
63 return 1;
64 }
65
66 #ifndef OPENSSL_NO_TRACE
put_trace_output(void)67 static void put_trace_output(void)
68 {
69 OSSL_TRACE_BEGIN(REF_COUNT) {
70 BIO_printf(trc_out, "Hello World\n");
71 BIO_printf(trc_out, "Good Bye Universe\n");
72 } OSSL_TRACE_END(REF_COUNT);
73 }
74
test_trace_channel(void)75 static int test_trace_channel(void)
76 {
77 static const char expected[] = "xyz-\nHello World\nGood Bye Universe\n-abc\n";
78 static const char expected_len = sizeof(expected) - 1;
79 BIO *bio = NULL;
80 char *p_buf = NULL;
81 long len = 0;
82 int ret = 0;
83
84 bio = BIO_new(BIO_s_mem());
85 if (!TEST_ptr(bio))
86 goto end;
87
88 if (!TEST_int_eq(OSSL_trace_set_channel(OSSL_TRACE_CATEGORY_REF_COUNT, bio), 1))
89 goto end;
90
91 if (!TEST_true(OSSL_trace_enabled(OSSL_TRACE_CATEGORY_REF_COUNT)))
92 goto end;
93
94 if (!TEST_int_eq(OSSL_trace_set_prefix(OSSL_TRACE_CATEGORY_REF_COUNT, "xyz-"), 1))
95 goto end;
96 if (!TEST_int_eq(OSSL_trace_set_suffix(OSSL_TRACE_CATEGORY_REF_COUNT, "-abc"), 1))
97 goto end;
98
99 put_trace_output();
100 len = BIO_get_mem_data(bio, &p_buf);
101 if (!TEST_strn2_eq(p_buf, len, expected, expected_len))
102 goto end;
103 if (!TEST_int_eq(OSSL_trace_set_channel(OSSL_TRACE_CATEGORY_REF_COUNT, NULL), 1))
104 goto end;
105 bio = NULL;
106
107 ret = 1;
108 end:
109 BIO_free(bio);
110 return ret;
111 }
112
113 static int trace_cb_failure;
114 static int trace_cb_called;
115
trace_cb(const char * buffer,size_t count,int category,int cmd,void * data)116 static size_t trace_cb(const char *buffer, size_t count,
117 int category, int cmd, void *data)
118 {
119 trace_cb_called = 1;
120 if (!TEST_true(category == OSSL_TRACE_CATEGORY_TRACE))
121 trace_cb_failure = 1;
122 return count;
123 }
124
test_trace_callback(void)125 static int test_trace_callback(void)
126 {
127 int ret = 0;
128
129 if (!TEST_true(OSSL_trace_set_callback(OSSL_TRACE_CATEGORY_TRACE, trace_cb,
130 NULL)))
131 goto end;
132
133 put_trace_output();
134
135 if (!TEST_false(trace_cb_failure) || !TEST_true(trace_cb_called))
136 goto end;
137
138 ret = 1;
139 end:
140 return ret;
141 }
142 #endif
143
144 OPT_TEST_DECLARE_USAGE("\n")
145
setup_tests(void)146 int setup_tests(void)
147 {
148 if (!test_skip_common_options()) {
149 TEST_error("Error parsing test options\n");
150 return 0;
151 }
152
153 ADD_TEST(test_trace_categories);
154 #ifndef OPENSSL_NO_TRACE
155 ADD_TEST(test_trace_channel);
156 ADD_TEST(test_trace_callback);
157 #endif
158 return 1;
159 }
160
cleanup_tests(void)161 void cleanup_tests(void)
162 {
163 }
164