OpenDNSSEC-enforcer 2.1.12
test_key_state.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2014 Jerry Lundström <lundstrom.jerry@gmail.com>
3 * Copyright (c) 2014 .SE (The Internet Infrastructure Foundation).
4 * Copyright (c) 2014 OpenDNSSEC AB (svb)
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
24 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30#include "CUnit/Basic.h"
31
32#include "../db_configuration.h"
33#include "../db_connection.h"
34#include "../key_state.h"
35
36#include <string.h>
37
38static db_configuration_list_t* configuration_list = NULL;
39static db_configuration_t* configuration = NULL;
40static db_connection_t* connection = NULL;
41
42static key_state_t* object = NULL;
43static key_state_list_t* object_list = NULL;
44static db_value_t id = DB_VALUE_EMPTY;
45static db_clause_list_t* clause_list = NULL;
46
47static int db_sqlite = 0;
48static int db_mysql = 0;
49
50#if defined(ENFORCER_DATABASE_SQLITE3)
51int test_key_state_init_suite_sqlite(void) {
52 if (configuration_list) {
53 return 1;
54 }
55 if (configuration) {
56 return 1;
57 }
58 if (connection) {
59 return 1;
60 }
61
62 /*
63 * Setup the configuration for the connection
64 */
65 if (!(configuration_list = db_configuration_list_new())) {
66 return 1;
67 }
68 if (!(configuration = db_configuration_new())
69 || db_configuration_set_name(configuration, "backend")
70 || db_configuration_set_value(configuration, "sqlite")
71 || db_configuration_list_add(configuration_list, configuration))
72 {
73 db_configuration_free(configuration);
74 configuration = NULL;
75 db_configuration_list_free(configuration_list);
76 configuration_list = NULL;
77 return 1;
78 }
79 configuration = NULL;
80 if (!(configuration = db_configuration_new())
81 || db_configuration_set_name(configuration, "file")
82 || db_configuration_set_value(configuration, "test.db")
83 || db_configuration_list_add(configuration_list, configuration))
84 {
85 db_configuration_free(configuration);
86 configuration = NULL;
87 db_configuration_list_free(configuration_list);
88 configuration_list = NULL;
89 return 1;
90 }
91 configuration = NULL;
92
93 /*
94 * Connect to the database
95 */
96 if (!(connection = db_connection_new())
97 || db_connection_set_configuration_list(connection, configuration_list))
98 {
99 db_connection_free(connection);
100 connection = NULL;
101 db_configuration_list_free(configuration_list);
102 configuration_list = NULL;
103 return 1;
104 }
105 configuration_list = NULL;
106
107 if (db_connection_setup(connection)
108 || db_connection_connect(connection))
109 {
110 db_connection_free(connection);
111 connection = NULL;
112 return 1;
113 }
114
115 db_sqlite = 1;
116 db_mysql = 0;
117
118 return 0;
119}
120#endif
121
122#if defined(ENFORCER_DATABASE_MYSQL)
123int test_key_state_init_suite_mysql(void) {
124 if (configuration_list) {
125 return 1;
126 }
127 if (configuration) {
128 return 1;
129 }
130 if (connection) {
131 return 1;
132 }
133
134 /*
135 * Setup the configuration for the connection
136 */
137 if (!(configuration_list = db_configuration_list_new())) {
138 return 1;
139 }
140 if (!(configuration = db_configuration_new())
141 || db_configuration_set_name(configuration, "backend")
142 || db_configuration_set_value(configuration, "mysql")
143 || db_configuration_list_add(configuration_list, configuration))
144 {
145 db_configuration_free(configuration);
146 configuration = NULL;
147 db_configuration_list_free(configuration_list);
148 configuration_list = NULL;
149 return 1;
150 }
151 configuration = NULL;
152 if (!(configuration = db_configuration_new())
153 || db_configuration_set_name(configuration, "host")
154 || db_configuration_set_value(configuration, ENFORCER_DB_HOST)
155 || db_configuration_list_add(configuration_list, configuration))
156 {
157 db_configuration_free(configuration);
158 configuration = NULL;
159 db_configuration_list_free(configuration_list);
160 configuration_list = NULL;
161 return 1;
162 }
163 configuration = NULL;
164 if (!(configuration = db_configuration_new())
165 || db_configuration_set_name(configuration, "port")
166 || db_configuration_set_value(configuration, ENFORCER_DB_PORT_TEXT)
167 || db_configuration_list_add(configuration_list, configuration))
168 {
169 db_configuration_free(configuration);
170 configuration = NULL;
171 db_configuration_list_free(configuration_list);
172 configuration_list = NULL;
173 return 1;
174 }
175 configuration = NULL;
176 if (!(configuration = db_configuration_new())
177 || db_configuration_set_name(configuration, "user")
178 || db_configuration_set_value(configuration, ENFORCER_DB_USERNAME)
179 || db_configuration_list_add(configuration_list, configuration))
180 {
181 db_configuration_free(configuration);
182 configuration = NULL;
183 db_configuration_list_free(configuration_list);
184 configuration_list = NULL;
185 return 1;
186 }
187 configuration = NULL;
188 if (!(configuration = db_configuration_new())
189 || db_configuration_set_name(configuration, "pass")
190 || db_configuration_set_value(configuration, ENFORCER_DB_PASSWORD)
191 || db_configuration_list_add(configuration_list, configuration))
192 {
193 db_configuration_free(configuration);
194 configuration = NULL;
195 db_configuration_list_free(configuration_list);
196 configuration_list = NULL;
197 return 1;
198 }
199 configuration = NULL;
200 if (!(configuration = db_configuration_new())
201 || db_configuration_set_name(configuration, "db")
202 || db_configuration_set_value(configuration, ENFORCER_DB_DATABASE)
203 || db_configuration_list_add(configuration_list, configuration))
204 {
205 db_configuration_free(configuration);
206 configuration = NULL;
207 db_configuration_list_free(configuration_list);
208 configuration_list = NULL;
209 return 1;
210 }
211 configuration = NULL;
212
213 /*
214 * Connect to the database
215 */
216 if (!(connection = db_connection_new())
217 || db_connection_set_configuration_list(connection, configuration_list))
218 {
219 db_connection_free(connection);
220 connection = NULL;
221 db_configuration_list_free(configuration_list);
222 configuration_list = NULL;
223 return 1;
224 }
225 configuration_list = NULL;
226
227 if (db_connection_setup(connection)
228 || db_connection_connect(connection))
229 {
230 db_connection_free(connection);
231 connection = NULL;
232 return 1;
233 }
234
235 db_sqlite = 0;
236 db_mysql = 1;
237
238 return 0;
239}
240#endif
241
242static int test_key_state_clean_suite(void) {
243 db_connection_free(connection);
244 connection = NULL;
245 db_configuration_free(configuration);
246 configuration = NULL;
247 db_configuration_list_free(configuration_list);
248 configuration_list = NULL;
249 db_value_reset(&id);
250 db_clause_list_free(clause_list);
251 clause_list = NULL;
252 return 0;
253}
254
255static void test_key_state_new(void) {
256 CU_ASSERT_PTR_NOT_NULL_FATAL((object = key_state_new(connection)));
257 CU_ASSERT_PTR_NOT_NULL_FATAL((object_list = key_state_list_new(connection)));
258}
259
260static void test_key_state_set(void) {
262 if (db_sqlite) {
263 CU_ASSERT(!db_value_from_int32(&key_data_id, 1));
264 }
265 if (db_mysql) {
266 CU_ASSERT(!db_value_from_uint64(&key_data_id, 1));
267 }
268 CU_ASSERT(!key_state_set_key_data_id(object, &key_data_id));
269 CU_ASSERT(!key_state_set_type(object, KEY_STATE_TYPE_DS));
270 CU_ASSERT(!key_state_set_type(object, KEY_STATE_TYPE_RRSIG));
271 CU_ASSERT(!key_state_set_type(object, KEY_STATE_TYPE_DNSKEY));
273 CU_ASSERT(!key_state_set_state(object, KEY_STATE_STATE_HIDDEN));
277 CU_ASSERT(!key_state_set_state(object, KEY_STATE_STATE_NA));
278 CU_ASSERT(!key_state_set_last_change(object, 1));
279 CU_ASSERT(!key_state_set_minimize(object, 1));
280 CU_ASSERT(!key_state_set_ttl(object, 1));
282}
283
284static void test_key_state_get(void) {
285 int ret;
287 if (db_sqlite) {
288 CU_ASSERT(!db_value_from_int32(&key_data_id, 1));
289 }
290 if (db_mysql) {
291 CU_ASSERT(!db_value_from_uint64(&key_data_id, 1));
292 }
293 CU_ASSERT(!db_value_cmp(key_state_key_data_id(object), &key_data_id, &ret));
294 CU_ASSERT(!ret);
295 CU_ASSERT(key_state_type(object) == KEY_STATE_TYPE_RRSIGDNSKEY);
296 CU_ASSERT_PTR_NOT_NULL_FATAL(key_state_type_text(object));
297 CU_ASSERT(!strcmp(key_state_type_text(object), "RRSIGDNSKEY"));
298 CU_ASSERT(key_state_state(object) == KEY_STATE_STATE_NA);
299 CU_ASSERT_PTR_NOT_NULL_FATAL(key_state_state_text(object));
300 CU_ASSERT(!strcmp(key_state_state_text(object), "NA"));
301 CU_ASSERT(key_state_last_change(object) == 1);
302 CU_ASSERT(key_state_minimize(object) == 1);
303 CU_ASSERT(key_state_ttl(object) == 1);
305}
306
307static void test_key_state_create(void) {
308 CU_ASSERT_FATAL(!key_state_create(object));
309}
310
311static void test_key_state_clauses(void) {
312 CU_ASSERT_PTR_NOT_NULL_FATAL((clause_list = db_clause_list_new()));
313 CU_ASSERT_PTR_NOT_NULL(key_state_key_data_id_clause(clause_list, key_state_key_data_id(object)));
314 CU_ASSERT(!key_state_list_get_by_clauses(object_list, clause_list));
315 CU_ASSERT_PTR_NOT_NULL(key_state_list_next(object_list));
316 db_clause_list_free(clause_list);
317 clause_list = NULL;
318}
319
320static void test_key_state_verify(void) {
321 int ret;
323 if (db_sqlite) {
324 CU_ASSERT(!db_value_from_int32(&key_data_id, 1));
325 }
326 if (db_mysql) {
327 CU_ASSERT(!db_value_from_uint64(&key_data_id, 1));
328 }
329 CU_ASSERT(!db_value_cmp(key_state_key_data_id(object), &key_data_id, &ret));
330 CU_ASSERT(!ret);
331 CU_ASSERT(key_state_type(object) == KEY_STATE_TYPE_RRSIGDNSKEY);
332 CU_ASSERT_PTR_NOT_NULL_FATAL(key_state_type_text(object));
333 CU_ASSERT(!strcmp(key_state_type_text(object), "RRSIGDNSKEY"));
334 CU_ASSERT(key_state_state(object) == KEY_STATE_STATE_NA);
335 CU_ASSERT_PTR_NOT_NULL_FATAL(key_state_state_text(object));
336 CU_ASSERT(!strcmp(key_state_state_text(object), "NA"));
337 CU_ASSERT(key_state_last_change(object) == 1);
338 CU_ASSERT(key_state_minimize(object) == 1);
339 CU_ASSERT(key_state_ttl(object) == 1);
341}
342
343static void test_key_state_change(void) {
345 if (db_sqlite) {
346 CU_ASSERT(!db_value_from_int32(&key_data_id, 1));
347 }
348 if (db_mysql) {
349 CU_ASSERT(!db_value_from_uint64(&key_data_id, 1));
350 }
351 CU_ASSERT(!key_state_set_key_data_id(object, &key_data_id));
352 CU_ASSERT(!key_state_set_type(object, KEY_STATE_TYPE_DS));
353 CU_ASSERT(!key_state_set_state(object, KEY_STATE_STATE_HIDDEN));
354 CU_ASSERT(!key_state_set_last_change(object, 2));
355 CU_ASSERT(!key_state_set_minimize(object, 2));
356 CU_ASSERT(!key_state_set_ttl(object, 2));
358}
359
360static void test_key_state_update(void) {
361 CU_ASSERT_FATAL(!key_state_update(object));
362}
363
364static void test_key_state_read(void) {
366 if (db_sqlite) {
367 CU_ASSERT(!db_value_from_int32(&id, 1));
368 }
369 if (db_mysql) {
370 CU_ASSERT(!db_value_from_uint64(&id, 1));
371 }
372 CU_ASSERT_FATAL(!key_state_get_by_id(object, &id));
373}
374
375static void test_key_state_read2(void) {
377 if (db_sqlite) {
378 CU_ASSERT(!db_value_from_int32(&id, 1));
379 }
380 if (db_mysql) {
381 CU_ASSERT(!db_value_from_uint64(&id, 1));
382 }
383 CU_ASSERT_FATAL(!key_state_get_by_id(object, &id));
384}
385
386static void test_key_state_verify2(void) {
387 int ret;
389 if (db_sqlite) {
390 CU_ASSERT(!db_value_from_int32(&key_data_id, 1));
391 }
392 if (db_mysql) {
393 CU_ASSERT(!db_value_from_uint64(&key_data_id, 1));
394 }
395 CU_ASSERT(!db_value_cmp(key_state_key_data_id(object), &key_data_id, &ret));
396 CU_ASSERT(!ret);
397 CU_ASSERT(key_state_type(object) == KEY_STATE_TYPE_DS);
398 CU_ASSERT_PTR_NOT_NULL_FATAL(key_state_type_text(object));
399 CU_ASSERT(!strcmp(key_state_type_text(object), "DS"));
400 CU_ASSERT(key_state_state(object) == KEY_STATE_STATE_HIDDEN);
401 CU_ASSERT_PTR_NOT_NULL_FATAL(key_state_state_text(object));
402 CU_ASSERT(!strcmp(key_state_state_text(object), "hidden"));
403 CU_ASSERT(key_state_last_change(object) == 2);
404 CU_ASSERT(key_state_minimize(object) == 2);
405 CU_ASSERT(key_state_ttl(object) == 2);
407}
408
409static void test_key_state_delete(void) {
410 CU_ASSERT_FATAL(!key_state_delete(object));
411}
412
413static void test_key_state_end(void) {
414 if (object) {
415 key_state_free(object);
416 CU_PASS("key_state_free");
417 }
418 if (object_list) {
419 key_state_list_free(object_list);
420 CU_PASS("key_state_list_free");
421 }
422}
423
424static int test_key_state_add_tests(CU_pSuite pSuite) {
425 if (!CU_add_test(pSuite, "new object", test_key_state_new)
426 || !CU_add_test(pSuite, "set fields", test_key_state_set)
427 || !CU_add_test(pSuite, "get fields", test_key_state_get)
428 || !CU_add_test(pSuite, "create object", test_key_state_create)
429 || !CU_add_test(pSuite, "object clauses", test_key_state_clauses)
430 || !CU_add_test(pSuite, "read object by id", test_key_state_read)
431 || !CU_add_test(pSuite, "verify fields", test_key_state_verify)
432 || !CU_add_test(pSuite, "change object", test_key_state_change)
433 || !CU_add_test(pSuite, "update object", test_key_state_update)
434 || !CU_add_test(pSuite, "reread object by id", test_key_state_read2)
435 || !CU_add_test(pSuite, "verify fields after update", test_key_state_verify2)
436 || !CU_add_test(pSuite, "delete object", test_key_state_delete)
437 || !CU_add_test(pSuite, "end test", test_key_state_end))
438 {
439 return CU_get_error();
440 }
441 return 0;
442}
443
445 CU_pSuite pSuite = NULL;
446 int ret;
447
448#if defined(ENFORCER_DATABASE_SQLITE3)
449 pSuite = CU_add_suite("Test of key state (SQLite)", test_key_state_init_suite_sqlite, test_key_state_clean_suite);
450 if (!pSuite) {
451 return CU_get_error();
452 }
453 ret = test_key_state_add_tests(pSuite);
454 if (ret) {
455 return ret;
456 }
457#endif
458#if defined(ENFORCER_DATABASE_MYSQL)
459 pSuite = CU_add_suite("Test of key state (MySQL)", test_key_state_init_suite_mysql, test_key_state_clean_suite);
460 if (!pSuite) {
461 return CU_get_error();
462 }
463 ret = test_key_state_add_tests(pSuite);
464 if (ret) {
465 return ret;
466 }
467#endif
468 return 0;
469}
db_clause_list_t * db_clause_list_new(void)
Definition: db_clause.c:202
void db_clause_list_free(db_clause_list_t *clause_list)
Definition: db_clause.c:209
db_configuration_t * db_configuration_new(void)
db_configuration_list_t * db_configuration_list_new(void)
void db_configuration_free(db_configuration_t *configuration)
int db_configuration_set_name(db_configuration_t *configuration, const char *name)
int db_configuration_list_add(db_configuration_list_t *configuration_list, db_configuration_t *configuration)
int db_configuration_set_value(db_configuration_t *configuration, const char *value)
void db_configuration_list_free(db_configuration_list_t *configuration_list)
int db_connection_connect(const db_connection_t *connection)
Definition: db_connection.c:88
db_connection_t * db_connection_new(void)
Definition: db_connection.c:38
int db_connection_setup(db_connection_t *connection)
Definition: db_connection.c:66
void db_connection_free(db_connection_t *connection)
Definition: db_connection.c:45
int db_connection_set_configuration_list(db_connection_t *connection, const db_configuration_list_t *configuration_list)
Definition: db_connection.c:54
int db_value_from_int32(db_value_t *value, db_type_int32_t from_int32)
Definition: db_value.c:479
int db_value_cmp(const db_value_t *value_a, const db_value_t *value_b, int *result)
Definition: db_value.c:102
void db_value_reset(db_value_t *value)
Definition: db_value.c:60
int db_value_from_uint64(db_value_t *value, db_type_uint64_t from_uint64)
Definition: db_value.c:518
#define DB_VALUE_EMPTY
Definition: db_value.h:60
const db_value_t * key_data_id(const key_data_t *key_data)
Definition: key_data.c:553
unsigned int key_state_minimize(const key_state_t *key_state)
Definition: key_state.c:401
int key_state_set_minimize(key_state_t *key_state, unsigned int minimize)
Definition: key_state.c:472
db_clause_t * key_state_key_data_id_clause(db_clause_list_t *clause_list, const db_value_t *key_data_id)
Definition: key_state.c:492
int key_state_delete(const key_state_t *key_state)
Definition: key_state.c:831
const char * key_state_state_text(const key_state_t *key_state)
Definition: key_state.c:377
key_state_t * key_state_new(const db_connection_t *connection)
Definition: key_state.c:176
unsigned int key_state_ttl(const key_state_t *key_state)
Definition: key_state.c:409
key_state_list_t * key_state_list_new(const db_connection_t *connection)
Definition: key_state.c:881
int key_state_set_ttl(key_state_t *key_state, unsigned int ttl)
Definition: key_state.c:482
void key_state_free(key_state_t *key_state)
Definition: key_state.c:214
int key_state_get_by_id(key_state_t *key_state, const db_value_t *id)
Definition: key_state.c:631
int key_state_set_last_change(key_state_t *key_state, unsigned int last_change)
Definition: key_state.c:462
int key_state_set_type(key_state_t *key_state, key_state_type_t type)
Definition: key_state.c:436
const db_value_t * key_state_key_data_id(const key_state_t *key_state)
Definition: key_state.c:337
int key_state_create(key_state_t *key_state)
Definition: key_state.c:519
void key_state_list_free(key_state_list_t *key_state_list)
Definition: key_state.c:924
const char * key_state_type_text(const key_state_t *key_state)
Definition: key_state.c:353
int key_state_set_key_data_id(key_state_t *key_state, const db_value_t *key_data_id)
Definition: key_state.c:417
int key_state_list_get_by_clauses(key_state_list_t *key_state_list, const db_clause_list_t *clause_list)
Definition: key_state.c:1112
const key_state_t * key_state_list_next(key_state_list_t *key_state_list)
Definition: key_state.c:1332
unsigned int key_state_last_change(const key_state_t *key_state)
Definition: key_state.c:393
int key_state_set_state(key_state_t *key_state, key_state_state_t state)
Definition: key_state.c:449
int key_state_update(key_state_t *key_state)
Definition: key_state.c:684
key_state_type
Definition: key_state.h:40
@ KEY_STATE_TYPE_DNSKEY
Definition: key_state.h:44
@ KEY_STATE_TYPE_RRSIG
Definition: key_state.h:43
@ KEY_STATE_TYPE_DS
Definition: key_state.h:42
@ KEY_STATE_TYPE_RRSIGDNSKEY
Definition: key_state.h:45
key_state_state
Definition: key_state.h:49
@ KEY_STATE_STATE_NA
Definition: key_state.h:55
@ KEY_STATE_STATE_OMNIPRESENT
Definition: key_state.h:53
@ KEY_STATE_STATE_HIDDEN
Definition: key_state.h:51
@ KEY_STATE_STATE_RUMOURED
Definition: key_state.h:52
@ KEY_STATE_STATE_UNRETENTIVE
Definition: key_state.h:54
int test_key_state_add_suite(void)