Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2016 Intel Corporation.
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #include "spdk/stdinc.h"
7 : :
8 : : #include "spdk_internal/cunit.h"
9 : : #include "spdk/log.h"
10 : : #include "spdk/env.h"
11 : : #include "spdk/string.h"
12 : :
13 : : #include "log/log.c"
14 : : #include "log/log_flags.c"
15 : : #include "log/log_deprecated.c"
16 : :
17 : : static void
18 : 6 : log_test(void)
19 : : {
20 : 6 : spdk_log_set_level(SPDK_LOG_ERROR);
21 : 6 : CU_ASSERT_EQUAL(spdk_log_get_level(), SPDK_LOG_ERROR);
22 : 6 : spdk_log_set_level(SPDK_LOG_WARN);
23 : 6 : CU_ASSERT_EQUAL(spdk_log_get_level(), SPDK_LOG_WARN);
24 : 6 : spdk_log_set_level(SPDK_LOG_NOTICE);
25 : 6 : CU_ASSERT_EQUAL(spdk_log_get_level(), SPDK_LOG_NOTICE);
26 : 6 : spdk_log_set_level(SPDK_LOG_INFO);
27 : 6 : CU_ASSERT_EQUAL(spdk_log_get_level(), SPDK_LOG_INFO);
28 : 6 : spdk_log_set_level(SPDK_LOG_DEBUG);
29 : 6 : CU_ASSERT_EQUAL(spdk_log_get_level(), SPDK_LOG_DEBUG);
30 : :
31 : 6 : spdk_log_set_print_level(SPDK_LOG_ERROR);
32 : 6 : CU_ASSERT_EQUAL(spdk_log_get_print_level(), SPDK_LOG_ERROR);
33 : 6 : spdk_log_set_print_level(SPDK_LOG_WARN);
34 : 6 : CU_ASSERT_EQUAL(spdk_log_get_print_level(), SPDK_LOG_WARN);
35 : 6 : spdk_log_set_print_level(SPDK_LOG_NOTICE);
36 : 6 : CU_ASSERT_EQUAL(spdk_log_get_print_level(), SPDK_LOG_NOTICE);
37 : 6 : spdk_log_set_print_level(SPDK_LOG_INFO);
38 : 6 : CU_ASSERT_EQUAL(spdk_log_get_print_level(), SPDK_LOG_INFO);
39 : 6 : spdk_log_set_print_level(SPDK_LOG_DEBUG);
40 : 6 : CU_ASSERT_EQUAL(spdk_log_get_print_level(), SPDK_LOG_DEBUG);
41 : :
42 : : #ifdef DEBUG
43 : 6 : CU_ASSERT(spdk_log_get_flag("LOG") == false);
44 : :
45 : 6 : spdk_log_set_flag("log");
46 : 6 : CU_ASSERT(spdk_log_get_flag("LOG") == true);
47 : :
48 : 6 : spdk_log_clear_flag("LOG");
49 : 6 : CU_ASSERT(spdk_log_get_flag("LOG") == false);
50 : : #endif
51 : :
52 : 6 : spdk_log_open(NULL);
53 : 6 : spdk_log_set_flag("log");
54 : 6 : SPDK_WARNLOG("log warning unit test\n");
55 [ + + + - ]: 6 : SPDK_DEBUGLOG(log, "log test\n");
56 [ + + + - ]: 6 : SPDK_LOGDUMP(log, "log dump test:", "log dump", 8);
57 : 6 : spdk_log_dump(stderr, "spdk dump test:", "spdk dump", 9);
58 : : /* Test spdk_log_dump with more than 16 chars and less than 32 chars */
59 : 6 : spdk_log_dump(stderr, "spdk dump test:", "spdk dump 16 more chars", 23);
60 : :
61 : 6 : spdk_log_close();
62 : 6 : }
63 : :
64 [ - + ]: 6 : SPDK_LOG_DEPRECATION_REGISTER(unit_test_not_limited, "not rate limited", "never", 0)
65 [ - + ]: 6 : SPDK_LOG_DEPRECATION_REGISTER(unit_test_limited, "with rate limit", "sometime", 1)
66 [ - + ]: 6 : SPDK_LOG_DEPRECATION_REGISTER(unit_test_never_called, "not called", "maybe", 0)
67 : :
68 : : int g_ut_dep_expect_line;
69 : : const char *g_ut_dep_expect_func;
70 : : const char *g_ut_dep_expect_msg;
71 : : uint32_t g_ut_dep_log_times;
72 : : bool g_ut_dep_saw_suppressed_log;
73 : :
74 : : static void
75 : 30 : log_deprecations(int level, const char *file, const int line, const char *func,
76 : : const char *format, va_list args)
77 : : {
78 : : char *msg;
79 : :
80 : 30 : g_ut_dep_log_times++;
81 : :
82 : 30 : CU_ASSERT(level == SPDK_LOG_WARN);
83 : :
84 [ + + + + ]: 30 : if (strcmp("spdk_log_deprecated", func) == 0) {
85 : 6 : g_ut_dep_saw_suppressed_log = true;
86 : : } else {
87 [ - + - + ]: 24 : CU_ASSERT(strcmp(g_ut_dep_expect_func, func) == 0);
88 : 24 : CU_ASSERT(g_ut_dep_expect_line == line);
89 : : }
90 : :
91 : : /* A "starts with" check */
92 : 30 : msg = spdk_vsprintf_alloc(format, args);
93 [ - + ]: 30 : SPDK_CU_ASSERT_FATAL(msg != NULL);
94 [ - + - + : 30 : CU_ASSERT(strncmp(g_ut_dep_expect_msg, msg, strlen(g_ut_dep_expect_msg)) == 0)
- + ]
95 : :
96 : 30 : free(msg);
97 : 30 : }
98 : :
99 : : bool g_found_not_limited;
100 : : bool g_found_limited;
101 : : bool g_found_never_called;
102 : :
103 : : static int
104 : 18 : iter_dep_cb(void *ctx, struct spdk_deprecation *dep)
105 : : {
106 : : /* The getters work from the callback. */
107 [ + + ]: 18 : if (dep == _deprecated_unit_test_not_limited) {
108 [ - + ]: 6 : CU_ASSERT(!g_found_not_limited);
109 : 6 : g_found_not_limited = true;
110 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_tag(dep), "unit_test_not_limited") == 0);
111 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_description(dep), "not rate limited") == 0);
112 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_remove_release(dep), "never") == 0);
113 : 6 : CU_ASSERT(spdk_deprecation_get_hits(dep) != 0);
114 [ + + ]: 12 : } else if (dep == _deprecated_unit_test_limited) {
115 [ - + ]: 6 : CU_ASSERT(!g_found_limited);
116 : 6 : g_found_limited = true;
117 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_tag(dep), "unit_test_limited") == 0);
118 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_description(dep), "with rate limit") == 0);
119 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_remove_release(dep), "sometime") == 0);
120 : 6 : CU_ASSERT(spdk_deprecation_get_hits(dep) != 0);
121 [ + - ]: 6 : } else if (dep == _deprecated_unit_test_never_called) {
122 [ - + ]: 6 : CU_ASSERT(!g_found_never_called);
123 : 6 : g_found_never_called = true;
124 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_tag(dep), "unit_test_never_called") == 0);
125 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_description(dep), "not called") == 0);
126 [ - + ]: 6 : CU_ASSERT(strcmp(spdk_deprecation_get_remove_release(dep), "maybe") == 0);
127 : 6 : CU_ASSERT(spdk_deprecation_get_hits(dep) == 0);
128 : : } else {
129 : 0 : CU_ASSERT(false);
130 : : }
131 : :
132 : 18 : return 0;
133 : : }
134 : :
135 : : static void
136 : 6 : deprecation(void)
137 : : {
138 : : int rc;
139 : :
140 : 6 : spdk_log_open(log_deprecations);
141 : :
142 : : /* A log message is emitted for every message without rate limiting. */
143 : 6 : g_ut_dep_saw_suppressed_log = false;
144 : 6 : g_ut_dep_log_times = 0;
145 : 6 : g_ut_dep_expect_func = __func__;
146 : 6 : g_ut_dep_expect_msg = "unit_test_not_limited:";
147 : 6 : g_ut_dep_expect_line = __LINE__ + 1;
148 : 6 : SPDK_LOG_DEPRECATED(unit_test_not_limited);
149 : 6 : CU_ASSERT(_deprecated_unit_test_not_limited->hits == 1);
150 : 6 : CU_ASSERT(_deprecated_unit_test_not_limited->deferred == 0);
151 : 6 : CU_ASSERT(g_ut_dep_log_times == 1);
152 : 6 : g_ut_dep_expect_line = __LINE__ + 1;
153 : 6 : SPDK_LOG_DEPRECATED(unit_test_not_limited);
154 : 6 : CU_ASSERT(_deprecated_unit_test_not_limited->hits == 2);
155 : 6 : CU_ASSERT(_deprecated_unit_test_not_limited->deferred == 0);
156 : 6 : CU_ASSERT(g_ut_dep_log_times == 2);
157 [ - + ]: 6 : CU_ASSERT(!g_ut_dep_saw_suppressed_log);
158 : :
159 : : /* Rate limiting keeps track of deferred messages */
160 : 6 : g_ut_dep_saw_suppressed_log = false;
161 : 6 : g_ut_dep_log_times = 0;
162 : 6 : g_ut_dep_expect_msg = "unit_test_limited:";
163 : 6 : g_ut_dep_expect_line = __LINE__ + 1;
164 : 6 : SPDK_LOG_DEPRECATED(unit_test_limited);
165 : 6 : CU_ASSERT(_deprecated_unit_test_limited->hits == 1);
166 : 6 : CU_ASSERT(_deprecated_unit_test_limited->deferred == 0);
167 : 6 : CU_ASSERT(g_ut_dep_log_times == 1);
168 : 6 : SPDK_LOG_DEPRECATED(unit_test_limited);
169 : 6 : CU_ASSERT(_deprecated_unit_test_limited->hits == 2);
170 : 6 : CU_ASSERT(_deprecated_unit_test_limited->deferred == 1);
171 : 6 : CU_ASSERT(g_ut_dep_log_times == 1);
172 [ - + ]: 6 : CU_ASSERT(!g_ut_dep_saw_suppressed_log);
173 : :
174 : : /* After a delay, the next log message prints the normal message followed by one that says
175 : : * that some messages were suppressed.
176 : : */
177 : 6 : g_ut_dep_saw_suppressed_log = false;
178 : 6 : sleep(1);
179 : 6 : g_ut_dep_expect_line = __LINE__ + 1;
180 : 6 : SPDK_LOG_DEPRECATED(unit_test_limited);
181 : 6 : CU_ASSERT(_deprecated_unit_test_limited->hits == 3);
182 : 6 : CU_ASSERT(_deprecated_unit_test_limited->deferred == 0);
183 : 6 : CU_ASSERT(g_ut_dep_log_times == 3);
184 [ - + ]: 6 : CU_ASSERT(g_ut_dep_saw_suppressed_log);
185 : :
186 : : /* spdk_log_for_each_deprecation() visits each registered deprecation */
187 : 6 : rc = spdk_log_for_each_deprecation(NULL, iter_dep_cb);
188 : 6 : CU_ASSERT(rc == 0);
189 [ - + ]: 6 : CU_ASSERT(g_found_not_limited);
190 [ - + ]: 6 : CU_ASSERT(g_found_limited);
191 [ - + ]: 6 : CU_ASSERT(g_found_never_called);
192 : :
193 : 6 : g_log = NULL;
194 : 6 : }
195 : :
196 : : int
197 : 6 : main(int argc, char **argv)
198 : : {
199 : 6 : CU_pSuite suite = NULL;
200 : : unsigned int num_failures;
201 : :
202 : 6 : CU_initialize_registry();
203 : :
204 : 6 : suite = CU_add_suite("log", NULL, NULL);
205 : :
206 : 6 : CU_ADD_TEST(suite, log_test);
207 : 6 : CU_ADD_TEST(suite, deprecation);
208 : :
209 : 6 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
210 : 6 : CU_cleanup_registry();
211 : 6 : return num_failures;
212 : : }
|