1 /*
2  * Nsock regression test suite
3  * Same license as nmap -- see https://nmap.org/book/man-legal.html
4  */
5 
6 #include "test-common.h"
7 
8 
9 struct log_test_data {
10   nsock_pool nsp;
11   nsock_loglevel_t current_level;
12   unsigned int got_dbgfull: 1;
13   unsigned int got_dbg: 1;
14   unsigned int got_info: 1;
15   unsigned int got_error: 1;
16   unsigned int total;
17   int errcode;
18 };
19 
20 static struct log_test_data *GlobalLTD;
21 
log_handler(const struct nsock_log_rec * rec)22 static void log_handler(const struct nsock_log_rec *rec) {
23   GlobalLTD->total++;
24   switch(rec->level) {
25     case NSOCK_LOG_DBG_ALL:
26       GlobalLTD->got_dbgfull = 1;
27       break;
28 
29     case NSOCK_LOG_DBG:
30       GlobalLTD->got_dbg = 1;
31       break;
32 
33     case NSOCK_LOG_INFO:
34       GlobalLTD->got_info = 1;
35       break;
36 
37     case NSOCK_LOG_ERROR:
38       GlobalLTD->got_error = 1;
39       break;
40 
41     default:
42       fprintf(stderr, "UNEXPECTED LOG LEVEL (%d)!\n", (int)rec->level);
43       GlobalLTD->errcode = -EINVAL;
44   }
45 }
46 
nop_handler(nsock_pool nsp,nsock_event nse,void * udata)47 static void nop_handler(nsock_pool nsp, nsock_event nse, void *udata) {
48 }
49 
check_loglevel(struct log_test_data * ltd,nsock_loglevel_t level)50 static int check_loglevel(struct log_test_data *ltd, nsock_loglevel_t level) {
51   int rc = 0;
52   nsock_event_id id;
53 
54   nsock_set_loglevel(level);
55 
56   ltd->current_level = level;
57 
58   ltd->got_dbgfull = 0;
59   ltd->got_dbg     = 0;
60   ltd->got_info    = 0;
61   ltd->got_error   = 0;
62 
63   ltd->total   = 0;
64   ltd->errcode = 0;
65 
66   id = nsock_timer_create(ltd->nsp, nop_handler, 200, NULL);
67   nsock_event_cancel(ltd->nsp, id, 0);
68 
69   if (ltd->errcode)
70     return ltd->errcode;
71 
72   if (ltd->total < 1)
73     return -EINVAL;
74 
75   return rc;
76 }
77 
check_errlevel(struct log_test_data * ltd,nsock_loglevel_t level)78 static int check_errlevel(struct log_test_data *ltd, nsock_loglevel_t level) {
79   nsock_event_id id;
80 
81   nsock_set_loglevel(level);
82 
83   ltd->current_level = level;
84 
85   ltd->got_dbgfull = 0;
86   ltd->got_dbg     = 0;
87   ltd->got_info    = 0;
88   ltd->got_error   = 0;
89 
90   ltd->total   = 0;
91   ltd->errcode = 0;
92 
93   id = nsock_timer_create(ltd->nsp, nop_handler, 200, NULL);
94   nsock_event_cancel(ltd->nsp, id, 0);
95 
96   if (ltd->errcode)
97     return ltd->errcode;
98 
99   if (ltd->total > 0)
100     return -EINVAL;
101 
102   return 0;
103 }
104 
log_setup(void ** tdata)105 static int log_setup(void **tdata) {
106   struct log_test_data *ltd;
107 
108   ltd = calloc(1, sizeof(struct log_test_data));
109   if (ltd == NULL)
110     return -ENOMEM;
111 
112   ltd->nsp = nsock_pool_new(ltd);
113   AssertNonNull(ltd->nsp);
114 
115   *tdata = GlobalLTD = ltd;
116   return 0;
117 }
118 
log_teardown(void * tdata)119 static int log_teardown(void *tdata) {
120   struct log_test_data *ltd = (struct log_test_data *)tdata;
121 
122   if (tdata) {
123     nsock_pool_delete(ltd->nsp);
124     free(tdata);
125   }
126   GlobalLTD = NULL;
127   return 0;
128 }
129 
log_check_std_levels(void * tdata)130 static int log_check_std_levels(void *tdata) {
131   struct log_test_data *ltd = (struct log_test_data *)tdata;
132   nsock_loglevel_t lvl;
133   int rc = 0;
134 
135   nsock_set_log_function(log_handler);
136 
137   for (lvl = NSOCK_LOG_DBG_ALL; lvl < NSOCK_LOG_ERROR; lvl++) {
138     rc = check_loglevel(ltd, lvl);
139     if (rc)
140       return rc;
141   }
142 
143   return 0;
144 }
145 
log_check_err_levels(void * tdata)146 static int log_check_err_levels(void *tdata) {
147   struct log_test_data *ltd = (struct log_test_data *)tdata;
148   nsock_loglevel_t lvl;
149   int rc = 0;
150 
151   nsock_set_log_function(log_handler);
152 
153   for (lvl = NSOCK_LOG_ERROR; lvl <= NSOCK_LOG_NONE; lvl++) {
154     rc = check_errlevel(ltd, NSOCK_LOG_ERROR);
155     if (rc)
156       return rc;
157   }
158 
159   return 0;
160 }
161 
162 
163 const struct test_case TestLogLevels = {
164   .t_name     = "set standard log levels",
165   .t_setup    = log_setup,
166   .t_run      = log_check_std_levels,
167   .t_teardown = log_teardown
168 };
169 
170 const struct test_case TestErrLevels = {
171   .t_name     = "check error log levels",
172   .t_setup    = log_setup,
173   .t_run      = log_check_err_levels,
174   .t_teardown = log_teardown
175 };
176