Greenbone Vulnerability Management Libraries 22.32.0
gmp_tests.c
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Greenbone AG
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later
4 */
5
6#include "gmp.c"
7
8#include <cgreen/cgreen.h>
9#include <cgreen/mocks.h>
10
11/* Mock implementations of external functions */
12
13int
14__wrap_gvm_server_sendf (gnutls_session_t *session, const char *fmt, ...);
15int
16__wrap_gvm_server_sendf (gnutls_session_t *session, const char *fmt, ...)
17{
18 return (int) mock (session, fmt);
19}
20
21int
22__wrap_gvm_server_sendf_xml (gnutls_session_t *session, const char *fmt, ...);
23int
24__wrap_gvm_server_sendf_xml (gnutls_session_t *session, const char *fmt, ...)
25{
26 return (int) mock (session, fmt);
27}
28
29int
30__wrap_gvm_server_sendf_xml_quiet (gnutls_session_t *session, const char *fmt,
31 ...);
32int
33__wrap_gvm_server_sendf_xml_quiet (gnutls_session_t *session, const char *fmt,
34 ...)
35{
36 return (int) mock (session, fmt);
37}
38
39int
40__wrap_read_entity (gnutls_session_t *session, entity_t *entity);
41int
42__wrap_read_entity (gnutls_session_t *session, entity_t *entity)
43{
44 int result = (int) mock (session, entity);
45 if (result == 0 && entity != NULL)
46 {
47 *entity = (entity_t) mock ();
48 }
49 return result;
50}
51
52int
53__wrap_try_read_entity (gnutls_session_t *session, int timeout,
54 entity_t *entity);
55int
56__wrap_try_read_entity (gnutls_session_t *session, int timeout,
57 entity_t *entity)
58{
59 int result = (int) mock (session, timeout, entity);
60 if (result == 0 && entity != NULL)
61 {
62 *entity = (entity_t) mock ();
63 }
64 return result;
65}
66
67int
68__wrap_gvm_connection_sendf (gvm_connection_t *connection, const char *fmt,
69 ...);
70int
71__wrap_gvm_connection_sendf (gvm_connection_t *connection, const char *fmt, ...)
72{
73 return (int) mock (connection, fmt);
74}
75
76int
78 const char *fmt, ...);
79int
81 const char *fmt, ...)
82{
83 return (int) mock (connection, fmt);
84}
85
86int
88int
90{
91 int result = (int) mock (connection, entity);
92 if (result == 0 && entity != NULL)
93 {
94 *entity = (entity_t) mock ();
95 }
96 return result;
97}
98
99int
100__wrap_try_read_entity_c (gvm_connection_t *connection, int timeout,
101 entity_t *entity);
102int
104 entity_t *entity)
105{
106 int result = (int) mock (connection, timeout, entity);
107 if (result == 0 && entity != NULL)
108 {
109 *entity = (entity_t) mock ();
110 }
111 return result;
112}
113
116{
117}
118
120{
121}
122
123/* Helper function to create mock entities */
124static entity_t
125create_mock_entity (const char *name, const char *text)
126{
127 entity_t entity = g_malloc0 (sizeof (struct entity_s));
128 entity->name = g_strdup (name);
129 entity->text = g_strdup (text);
130 entity->attributes =
131 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
132 return entity;
133}
134
135/* Helper function to add attributes to mock entities */
136static void
137add_mock_attribute (entity_t entity, const char *name, const char *value)
138{
139 g_hash_table_insert (entity->attributes, g_strdup (name), g_strdup (value));
140}
141
142/* gmp_task_status */
143
144Ensure (gmp, gmp_task_status_returns_correct_string_for_valid_response)
145{
146 entity_t response = create_mock_entity ("get_tasks_response", "");
147 entity_t task = create_mock_entity ("task", "");
148 response->entities = g_slist_append (NULL, task);
149 entity_t status = create_mock_entity ("status", "Running");
150 task->entities = g_slist_append (NULL, status);
151
152 const char *result = gmp_task_status (response);
153
154 assert_that (result, is_not_null);
155 assert_that (result, is_equal_to_string ("Running"));
156
157 free_entity (response);
158}
159
160Ensure (gmp, gmp_task_status_returns_null_when_no_task)
161{
162 entity_t response = create_mock_entity ("get_tasks_response", "");
163
164 const char *result = gmp_task_status (response);
165
166 assert_that (result, is_null);
167
168 free_entity (response);
169}
170
171Ensure (gmp, gmp_task_status_returns_null_when_no_status)
172{
173 entity_t response = create_mock_entity ("get_tasks_response", "");
174 entity_t task = create_mock_entity ("task", "");
175 response->entities = g_slist_append (NULL, task);
176
177 const char *result = gmp_task_status (response);
178
179 assert_that (result, is_null);
180
181 free_entity (response);
182}
183
184/* gmp_read_create_response */
185
186Ensure (gmp, gmp_read_create_response_returns_uuid_on_success)
187{
188 entity_t mock_entity = create_mock_entity ("create_response", "");
189 add_mock_attribute (mock_entity, "status", "201");
190 add_mock_attribute (mock_entity, "id",
191 "12345678-1234-1234-1234-123456789012");
192
193 expect (__wrap_read_entity, will_return (0));
194 expect (__wrap_read_entity, will_return (mock_entity));
195
196 gchar *uuid = NULL;
197 int result = gmp_read_create_response (NULL, &uuid);
198
199 assert_that (result, is_equal_to (201));
200 assert_that (uuid, is_not_null);
201 assert_that (uuid,
202 is_equal_to_string ("12345678-1234-1234-1234-123456789012"));
203
204 g_free (uuid);
205}
206
207Ensure (gmp, gmp_read_create_response_succeeds_without_uuid_parameter)
208{
209 entity_t mock_entity = create_mock_entity ("create_response", "");
210 add_mock_attribute (mock_entity, "status", "201");
211 add_mock_attribute (mock_entity, "id",
212 "12345678-1234-1234-1234-123456789012");
213
214 expect (__wrap_read_entity, will_return (0));
215 expect (__wrap_read_entity, will_return (mock_entity));
216
217 int result = gmp_read_create_response (NULL, NULL);
218
219 assert_that (result, is_equal_to (201));
220}
221
222Ensure (gmp, gmp_read_create_response_returns_error_when_no_status)
223{
224 entity_t mock_entity = create_mock_entity ("create_response", "");
225
226 expect (__wrap_read_entity, will_return (0));
227 expect (__wrap_read_entity, will_return (mock_entity));
228
229 gchar *uuid = NULL;
230 int result = gmp_read_create_response (NULL, &uuid);
231
232 assert_that (result, is_equal_to (-1));
233 assert_that (uuid, is_null);
234}
235
236Ensure (gmp, gmp_read_create_response_returns_error_on_read_failure)
237{
238 expect (__wrap_read_entity, will_return (-1));
239
240 gchar *uuid = NULL;
241 int result = gmp_read_create_response (NULL, &uuid);
242
243 assert_that (result, is_equal_to (-1));
244 assert_that (uuid, is_null);
245}
246
247/* gmp_check_response */
248
249Ensure (gmp, gmp_check_response_succeeds_with_valid_response)
250{
251 entity_t mock_entity = create_mock_entity ("response", "");
252 add_mock_attribute (mock_entity, "status", "200");
253
254 expect (__wrap_read_entity, will_return (0));
255 expect (__wrap_read_entity, will_return (mock_entity));
256
257 entity_t entity = NULL;
258 int result = gmp_check_response (NULL, &entity);
259
260 assert_that (result, is_equal_to (0));
261 assert_that (entity, is_not_null);
262
263 free_entity (mock_entity);
264}
265
266Ensure (gmp, gmp_check_response_returns_gmp_error_code)
267{
268 entity_t mock_entity = create_mock_entity ("response", "");
269 add_mock_attribute (mock_entity, "status", "400");
270
271 expect (__wrap_read_entity, will_return (0));
272 expect (__wrap_read_entity, will_return (mock_entity));
273
274 entity_t entity = NULL;
275 int result = gmp_check_response (NULL, &entity);
276
277 assert_that (result, is_equal_to (400));
278 assert_that (entity, is_null);
279}
280
281Ensure (gmp, gmp_check_response_returns_error_on_read_failure)
282{
283 expect (__wrap_read_entity, will_return (-1));
284
285 entity_t entity = NULL;
286 int result = gmp_check_response (NULL, &entity);
287
288 assert_that (result, is_equal_to (-1));
289 assert_that (entity, is_null);
290}
291
292Ensure (gmp, gmp_check_response_returns_error_when_no_status)
293{
294 entity_t mock_entity = create_mock_entity ("response", "");
295
296 expect (__wrap_read_entity, will_return (0));
297 expect (__wrap_read_entity, will_return (mock_entity));
298
299 entity_t entity = NULL;
300 int result = gmp_check_response (NULL, &entity);
301
302 assert_that (result, is_equal_to (-1));
303 assert_that (entity, is_null);
304}
305
306/* gmp_ping */
307
308Ensure (gmp, gmp_ping_succeeds_with_valid_response)
309{
310 expect (__wrap_gvm_server_sendf, will_return (0));
311
312 entity_t mock_entity = create_mock_entity ("get_version_response", "");
313 add_mock_attribute (mock_entity, "status", "200");
314
315 expect (__wrap_try_read_entity, will_return (0));
316 expect (__wrap_try_read_entity, will_return (mock_entity));
317
318 int result = gmp_ping (NULL, 0);
319
320 assert_that (result, is_equal_to (0));
321}
322
323Ensure (gmp, gmp_ping_returns_error_on_send_failure)
324{
325 expect (__wrap_gvm_server_sendf, will_return (-1));
326
327 int result = gmp_ping (NULL, 0);
328
329 assert_that (result, is_equal_to (-1));
330}
331
332Ensure (gmp, gmp_ping_returns_error_on_read_failure)
333{
334 expect (__wrap_gvm_server_sendf, will_return (0));
335 expect (__wrap_try_read_entity, will_return (-1));
336
337 int result = gmp_ping (NULL, 0);
338
339 assert_that (result, is_equal_to (-1));
340}
341
342Ensure (gmp, gmp_ping_returns_error_with_invalid_status)
343{
344 expect (__wrap_gvm_server_sendf, will_return (0));
345
346 entity_t mock_entity = create_mock_entity ("get_version_response", "");
347 add_mock_attribute (mock_entity, "status", "500");
348
349 expect (__wrap_try_read_entity, will_return (0));
350 expect (__wrap_try_read_entity, will_return (mock_entity));
351
352 int result = gmp_ping (NULL, 0);
353
354 assert_that (result, is_equal_to (-1));
355}
356
357/* Test suite. */
358
359int
360main (int argc, char **argv)
361{
362 int ret;
363 TestSuite *suite;
364
365 suite = create_test_suite ();
366
367 add_test_with_context (
368 suite, gmp, gmp_task_status_returns_correct_string_for_valid_response);
369 add_test_with_context (suite, gmp, gmp_task_status_returns_null_when_no_task);
370 add_test_with_context (suite, gmp,
371 gmp_task_status_returns_null_when_no_status);
372
373 add_test_with_context (suite, gmp,
374 gmp_read_create_response_returns_uuid_on_success);
375 add_test_with_context (
376 suite, gmp, gmp_read_create_response_succeeds_without_uuid_parameter);
377 add_test_with_context (suite, gmp,
378 gmp_read_create_response_returns_error_when_no_status);
379 add_test_with_context (
380 suite, gmp, gmp_read_create_response_returns_error_on_read_failure);
381
382 add_test_with_context (suite, gmp,
383 gmp_check_response_succeeds_with_valid_response);
384 add_test_with_context (suite, gmp, gmp_check_response_returns_gmp_error_code);
385 add_test_with_context (suite, gmp,
386 gmp_check_response_returns_error_on_read_failure);
387 add_test_with_context (suite, gmp,
388 gmp_check_response_returns_error_when_no_status);
389
390 add_test_with_context (suite, gmp, gmp_ping_succeeds_with_valid_response);
391 add_test_with_context (suite, gmp, gmp_ping_returns_error_on_send_failure);
392 add_test_with_context (suite, gmp, gmp_ping_returns_error_on_read_failure);
393 add_test_with_context (suite, gmp,
394 gmp_ping_returns_error_with_invalid_status);
395
396 if (argc > 1)
397 ret = run_single_test (suite, argv[1], create_text_reporter ());
398 else
399 ret = run_test_suite (suite, create_text_reporter ());
400
401 destroy_test_suite (suite);
402
403 return ret;
404}
API for Greenbone Management Protocol communication.
const char * gmp_task_status(entity_t response)
Get the task status from a GMP GET_TASKS response.
Definition gmp.c:48
int gmp_ping(gnutls_session_t *session, int timeout)
"Ping" the manager.
Definition gmp.c:190
int gmp_read_create_response(gnutls_session_t *session, gchar **uuid)
Read response status and resource UUID.
Definition gmp.c:888
static int gmp_check_response(gnutls_session_t *session, entity_t *entity)
Read response and convert status of response to a return value.
Definition gmp.c:70
int __wrap_read_entity(gnutls_session_t *session, entity_t *entity)
Definition gmp_tests.c:42
static void add_mock_attribute(entity_t entity, const char *name, const char *value)
Definition gmp_tests.c:137
int __wrap_gvm_server_sendf(gnutls_session_t *session, const char *fmt,...)
Definition gmp_tests.c:16
int __wrap_gvm_connection_sendf(gvm_connection_t *connection, const char *fmt,...)
Definition gmp_tests.c:71
int main(int argc, char **argv)
Definition gmp_tests.c:360
int __wrap_gvm_connection_sendf_xml_quiet(gvm_connection_t *connection, const char *fmt,...)
Definition gmp_tests.c:80
static entity_t create_mock_entity(const char *name, const char *text)
Definition gmp_tests.c:125
int __wrap_gvm_server_sendf_xml(gnutls_session_t *session, const char *fmt,...)
Definition gmp_tests.c:24
int __wrap_try_read_entity_c(gvm_connection_t *connection, int timeout, entity_t *entity)
Definition gmp_tests.c:103
BeforeEach(gmp)
Definition gmp_tests.c:115
Describe(gmp)
Ensure(gmp, gmp_task_status_returns_correct_string_for_valid_response)
Definition gmp_tests.c:144
AfterEach(gmp)
Definition gmp_tests.c:119
int __wrap_gvm_server_sendf_xml_quiet(gnutls_session_t *session, const char *fmt,...)
Definition gmp_tests.c:33
int __wrap_read_entity_c(gvm_connection_t *connection, entity_t *entity)
Definition gmp_tests.c:89
int __wrap_try_read_entity(gnutls_session_t *session, int timeout, entity_t *entity)
Definition gmp_tests.c:56
XML element.
Definition xmlutils.h:52
entities_t entities
Children.
Definition xmlutils.h:56
char * text
Text.
Definition xmlutils.h:54
GHashTable * attributes
Attributes.
Definition xmlutils.h:55
char * name
Name.
Definition xmlutils.h:53
Connection.
Definition serverutils.h:30
void free_entity(entity_t entity)
Free an entity, recursively.
Definition xmlutils.c:115
struct entity_s * entity_t
Definition xmlutils.h:58