OpenDNSSEC-enforcer  2.1.7
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 
38 static db_configuration_list_t* configuration_list = NULL;
39 static db_configuration_t* configuration = NULL;
40 static db_connection_t* connection = NULL;
41 
42 static key_state_t* object = NULL;
43 static key_state_list_t* object_list = NULL;
44 static db_value_t id = DB_VALUE_EMPTY;
45 static db_clause_list_t* clause_list = NULL;
46 
47 static int db_sqlite = 0;
48 static int db_mysql = 0;
49 
50 #if defined(ENFORCER_DATABASE_SQLITE3)
51 int 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)
123 int 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 
242 static 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 
255 static 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 
260 static 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));
272  CU_ASSERT(!key_state_set_type(object, KEY_STATE_TYPE_RRSIGDNSKEY));
273  CU_ASSERT(!key_state_set_state(object, KEY_STATE_STATE_HIDDEN));
274  CU_ASSERT(!key_state_set_state(object, KEY_STATE_STATE_RUMOURED));
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 
284 static 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 
307 static void test_key_state_create(void) {
308  CU_ASSERT_FATAL(!key_state_create(object));
309 }
310 
311 static 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 
320 static 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 
343 static 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 
360 static void test_key_state_update(void) {
361  CU_ASSERT_FATAL(!key_state_update(object));
362 }
363 
364 static 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 
375 static 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 
386 static 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 
409 static void test_key_state_delete(void) {
410  CU_ASSERT_FATAL(!key_state_delete(object));
411 }
412 
413 static 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 
424 static 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
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
unsigned int key_state_ttl(const key_state_t *key_state)
Definition: key_state.c:409
int key_state_set_ttl(key_state_t *key_state, unsigned int ttl)
Definition: key_state.c:482
const db_value_t * key_state_key_data_id(const key_state_t *key_state)
Definition: key_state.c:337
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
key_state_t * key_state_new(const db_connection_t *connection)
Definition: key_state.c:176
int key_state_set_type(key_state_t *key_state, key_state_type_t type)
Definition: key_state.c:436
const char * key_state_type_text(const key_state_t *key_state)
Definition: key_state.c:353
int key_state_create(key_state_t *key_state)
Definition: key_state.c:519
const key_state_t * key_state_list_next(key_state_list_t *key_state_list)
Definition: key_state.c:1332
void key_state_list_free(key_state_list_t *key_state_list)
Definition: key_state.c:924
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_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
key_state_list_t * key_state_list_new(const db_connection_t *connection)
Definition: key_state.c:881
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)