• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

proftpd / proftpd / 28259826111

26 Jun 2026 07:20PM UTC coverage: 93.032% (+0.6%) from 92.469%
28259826111

push

github

51363 of 55210 relevant lines covered (93.03%)

200.05 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.44
/tests/api/event.c
1
/*
2
 * ProFTPD - FTP server testsuite
3
 * Copyright (c) 2008-2026 The ProFTPD Project team
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, see <https://www.gnu.org/licenses/>.
17
 *
18
 * As a special exemption, The ProFTPD Project team and other respective
19
 * copyright holders give permission to link this program with OpenSSL, and
20
 * distribute the resulting executable, without including the source code for
21
 * OpenSSL in the source distribution.
22
 */
23

24
/* Event API tests */
25

26
#include "tests.h"
27

28
static pool *p = NULL;
29

30
/* Fixtures */
31

32
static void set_up(void) {
33
  if (p == NULL) {
5✔
34
    p = permanent_pool = make_sub_pool(NULL);
5✔
35
  }
5✔
36

37
  pr_event_unregister(NULL, NULL, NULL);
38
}
5✔
39

5✔
40
static void tear_down(void) {
41
  if (p) {
5✔
42
    destroy_pool(p);
5✔
43
    p = permanent_pool = NULL;
5✔
44
  }
5✔
45
}
46

5✔
47
/* Helper functions */
48

49
static unsigned int event_triggered = 0;
50

51
static void event_cb(const void *event_data, void *user_data) {
52
  event_triggered++;
2✔
53
}
2✔
54

2✔
55
static void event_cb2(const void *event_data, void *user_data) {
56
}
×
57

×
58
static void event_cb3(const void *event_data, void *user_data) {
59
}
×
60

×
61
static unsigned int event_dumped = 0;
62

63
static void event_dump(const char *fmt, ...) {
64
  if (strncmp(fmt, "  ", 2) == 0) {
8✔
65
    event_dumped++;
8✔
66
  }
4✔
67
}
68

8✔
69
/* Tests */
70

71
START_TEST (event_register_test) {
72
  int res;
1✔
73
  const char *event = "foo";
1✔
74
  module m;
1✔
75

1✔
76
  res = pr_event_register(NULL, NULL, NULL, NULL);
77
  ck_assert_msg(res == -1, "Failed to handle null arguments");
1✔
78
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
1✔
79

1✔
80
  res = pr_event_register(NULL, event, NULL, NULL);
81
  ck_assert_msg(res == -1, "Failed to handle null callback");
1✔
82
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
1✔
83

1✔
84
  res = pr_event_register(NULL, NULL, event_cb, NULL);
85
  ck_assert_msg(res == -1, "Failed to handle null event");
1✔
86
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
1✔
87

1✔
88
  res = pr_event_register(NULL, event, event_cb, NULL);
89
  ck_assert_msg(res == 0, "Failed to register event: %s", strerror(errno));
1✔
90

1✔
91
  res = pr_event_register(NULL, event, event_cb, NULL);
92
  ck_assert_msg(res == -1, "Failed to handle duplicate registration");
1✔
93
  ck_assert_msg(errno == EEXIST, "Failed to set errno to EEXIST");
1✔
94

1✔
95
  memset(&m, 0, sizeof(m));
96
  m.name = "testsuite";
1✔
97

1✔
98
  (void) pr_event_unregister(NULL, event, NULL);
99

1✔
100
  res = pr_event_register(&m, event, event_cb, NULL);
101
  ck_assert_msg(res == 0, "Failed to register event with module: %s",
1✔
102
    strerror(errno));
1✔
103

104
  res = pr_event_register(&m, event, event_cb2, NULL);
105
  ck_assert_msg(res == 0, "Failed to register event with module: %s",
1✔
106
    strerror(errno));
1✔
107

108
  pr_event_unregister(&m, event, event_cb2);
109
  pr_event_unregister(&m, event, event_cb);
1✔
110
  pr_event_unregister(&m, NULL, NULL);
1✔
111
}
1✔
112
END_TEST
1✔
113

114
START_TEST (event_unregister_test) {
115
  int res;
1✔
116
  const char *event = "foo";
1✔
117

1✔
118
  res = pr_event_unregister(NULL, NULL, NULL);
119
  ck_assert_msg(res == 0, "Failed to handle empty event lists");
1✔
120

1✔
121
  res = pr_event_register(NULL, event, event_cb, NULL);
122
  ck_assert_msg(res == 0, "Failed to register event: %s", strerror(errno));
1✔
123

1✔
124
  res = pr_event_unregister(NULL, "bar", NULL);
125
  ck_assert_msg(res == -1, "Failed to handle unregistered event");
1✔
126
  ck_assert_msg(errno == ENOENT, "Failed to set errno to ENOENT");
1✔
127

1✔
128
  res = pr_event_unregister(NULL, event, event_cb2);
129
  ck_assert_msg(res == -1, "Failed to handle unregistered event");
1✔
130
  ck_assert_msg(errno == ENOENT, "Failed to set errno to ENOENT");
1✔
131

1✔
132
  res = pr_event_unregister(NULL, event, event_cb);
133
  ck_assert_msg(res == 0, "Failed to unregister event: %s", strerror(errno));
1✔
134

1✔
135
  res = pr_event_register(NULL, event, event_cb, NULL);
136
  ck_assert_msg(res == 0, "Failed to register event: %s", strerror(errno));
1✔
137

1✔
138
  res = pr_event_unregister(NULL, event, NULL);
139
  ck_assert_msg(res == 0, "Failed to unregister event: %s", strerror(errno));
1✔
140

1✔
141
  res = pr_event_register(NULL, event, event_cb, NULL);
142
  ck_assert_msg(res == 0, "Failed to register event: %s", strerror(errno));
1✔
143

1✔
144
  res = pr_event_unregister(NULL, NULL, NULL);
145
  ck_assert_msg(res == 0, "Failed to unregister event: %s", strerror(errno));
1✔
146
}
1✔
147
END_TEST
1✔
148

149
START_TEST (event_listening_test) {
150
  const char *event = "foo", *event2 = "bar";
1✔
151
  int res;
1✔
152

1✔
153
  res = pr_event_listening(NULL);
154
  ck_assert_msg(res < 0, "Failed to handle null arguments");
1✔
155
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
1✔
156
    strerror(errno), errno);
1✔
157

158
  res = pr_event_listening(event);
159
  ck_assert_msg(res == 0, "Failed to check for '%s' listeners: %s", event,
1✔
160
    strerror(errno));
1✔
161

162
  res = pr_event_register(NULL, event, event_cb2, NULL);
163
  ck_assert_msg(res == 0, "Failed to register event '%s: %s", event,
1✔
164
    strerror(errno));
1✔
165

166
  res = pr_event_register(NULL, event2, event_cb2, NULL);
167
  ck_assert_msg(res == 0, "Failed to register event '%s: %s", event2,
1✔
168
    strerror(errno));
1✔
169

170
  res = pr_event_listening(event);
171
  ck_assert_msg(res == 1, "Expected 1 listener, got %d", res);
1✔
172

1✔
173
  res = pr_event_register(NULL, event, event_cb3, NULL);
174
  ck_assert_msg(res == 0, "Failed to register event '%s: %s", event,
1✔
175
    strerror(errno));
1✔
176

177
  res = pr_event_listening(event);
178
  ck_assert_msg(res == 2, "Expected 2 listeners, got %d", res);
1✔
179

1✔
180
  /* Unregister our listener, and make sure that the API indicates there
181
   * are no more listeners.
182
   */
183
  res = pr_event_unregister(NULL, event, NULL);
184
  ck_assert_msg(res == 0, "Failed to unregister event '%s': %s", event,
1✔
185
    strerror(errno));
1✔
186

187
  res = pr_event_listening(event);
188
  ck_assert_msg(res == 0, "Failed to check for '%s' listeners: %s", event,
1✔
189
    strerror(errno));
1✔
190

191
  res = pr_event_unregister(NULL, event2, NULL);
192
  ck_assert_msg(res == 0, "Failed to unregister event '%s': %s", event2,
1✔
193
    strerror(errno));
1✔
194

195
  res = pr_event_listening(event);
196
  ck_assert_msg(res == 0, "Failed to check for '%s' listeners: %s", event,
1✔
197
    strerror(errno));
1✔
198
}
199
END_TEST
1✔
200

201
START_TEST (event_generate_test) {
202
  int res;
1✔
203
  const char *event = "foo";
1✔
204

1✔
205
  pr_event_generate(NULL, NULL);
206
  ck_assert_msg(event_triggered == 0, "Expected triggered count %u, got %u",
1✔
207
    0, event_triggered);
1✔
208

209
  pr_event_generate(event, NULL);
210
  ck_assert_msg(event_triggered == 0, "Expected triggered count %u, got %u",
1✔
211
    0, event_triggered);
1✔
212

213
  res = pr_event_register(NULL, event, event_cb, NULL);
214
  ck_assert_msg(res == 0, "Failed to register event: %s", strerror(errno));
1✔
215

1✔
216
  pr_event_generate("bar", NULL);
217
  ck_assert_msg(event_triggered == 0, "Expected triggered count %u, got %u",
1✔
218
    0, event_triggered);
1✔
219

220
  pr_event_generate(event, NULL);
221
  ck_assert_msg(event_triggered == 1, "Expected triggered count %u, got %u",
1✔
222
    1, event_triggered);
1✔
223

224
  pr_event_generate(event, NULL);
225
  ck_assert_msg(event_triggered == 2, "Expected triggered count %u, got %u",
1✔
226
    2, event_triggered);
1✔
227

228
  res = pr_event_unregister(NULL, NULL, NULL);
229
  ck_assert_msg(res == 0, "Failed to unregister events: %s", strerror(errno));
1✔
230

1✔
231
  pr_event_generate(event, NULL);
232
  ck_assert_msg(event_triggered == 2, "Expected triggered count %u, got %u",
1✔
233
    2, event_triggered);
1✔
234
}
235
END_TEST
1✔
236

237
START_TEST (event_dump_test) {
238
  int res;
1✔
239
  const char *event = "foo";
1✔
240
  module m;
1✔
241

1✔
242
  pr_event_dump(NULL);
243
  ck_assert_msg(event_dumped == 0, "Expected dumped count of %u, got %u",
1✔
244
    0, event_dumped);
1✔
245

246
  pr_event_dump(event_dump);
247
  ck_assert_msg(event_dumped == 0, "Expected dumped count of %u, got %u",
1✔
248
    0, event_dumped);
1✔
249

250
  memset(&m, 0, sizeof(m));
251
  m.name = "testsuite";
1✔
252
  res = pr_event_register(&m, event, event_cb, NULL);
1✔
253
  ck_assert_msg(res == 0, "Failed to register event '%s', callback %p: %s",
1✔
254
    event, event_cb, strerror(errno));
1✔
255

256
  pr_event_dump(event_dump);
257
  ck_assert_msg(event_dumped == 1, "Expected dumped count of %u, got %u",
1✔
258
    1, event_dumped);
1✔
259

260
  event_dumped = 0;
261

1✔
262
  res = pr_event_register(NULL, event, event_cb2, NULL);
263
  ck_assert_msg(res == 0, "Failed to register event '%s', callback %p: %s",
1✔
264
    event, event_cb2, strerror(errno));
1✔
265

266
  res = pr_event_register(NULL, "bar", event_cb2, NULL);
267
  ck_assert_msg(res == 0, "Failed to register event 'bar', callback %p: %s",
1✔
268
    event_cb2, strerror(errno));
1✔
269

270
  pr_event_dump(event_dump);
271
  ck_assert_msg(event_dumped == 3, "Expected dumped count of %u, got %u",
1✔
272
    3, event_dumped);
1✔
273
}
274
END_TEST
1✔
275

276
Suite *tests_get_event_suite(void) {
277
  Suite *suite;
890✔
278
  TCase *testcase;
890✔
279

890✔
280
  suite = suite_create("event");
281

890✔
282
  testcase = tcase_create("base");
283
  tcase_add_checked_fixture(testcase, set_up, tear_down);
890✔
284

890✔
285
  tcase_add_test(testcase, event_register_test);
286
  tcase_add_test(testcase, event_unregister_test);
890✔
287
  tcase_add_test(testcase, event_listening_test);
890✔
288
  tcase_add_test(testcase, event_generate_test);
890✔
289
  tcase_add_test(testcase, event_dump_test);
890✔
290

890✔
291
  suite_add_tcase(suite, testcase);
292

890✔
293
  return suite;
294
}
890✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc