1*cdfa2a7eSchristos /* $NetBSD: kodDatabase.c,v 1.2 2020/05/25 20:47:35 christos Exp $ */
2067f5680Schristos
3f17b710fSchristos #include "config.h"
4f17b710fSchristos
54c290c01Schristos #include "ntp_workimpl.h"
6f17b710fSchristos #include "ntp_types.h"
7f17b710fSchristos #include "sntptest.h"
8f17b710fSchristos #include "ntp_stdlib.h"
9f17b710fSchristos #include "sntp-opts.h"
10f17b710fSchristos #include "kod_management.h"
11a6f3f22fSchristos #include "ntp_io.h"
12f17b710fSchristos
13f17b710fSchristos #include "unity.h"
14f17b710fSchristos
15a6f3f22fSchristos void setUp(void);
16a6f3f22fSchristos void test_SingleEntryHandling(void);
17a6f3f22fSchristos void test_MultipleEntryHandling(void);
18a6f3f22fSchristos void test_NoMatchInSearch(void);
19a6f3f22fSchristos void test_AddDuplicate(void);
20a6f3f22fSchristos void test_DeleteEntry(void);
21a6f3f22fSchristos
22a6f3f22fSchristos
23a6f3f22fSchristos void
setUp(void)24a6f3f22fSchristos setUp(void) {
25f17b710fSchristos kod_init_kod_db("/dev/null", TRUE);
264c290c01Schristos init_lib();
27f17b710fSchristos }
28f17b710fSchristos
29f17b710fSchristos
30a6f3f22fSchristos void
test_SingleEntryHandling(void)31a6f3f22fSchristos test_SingleEntryHandling(void) {
32a6f3f22fSchristos const char HOST[] = "192.0.2.5";
33a6f3f22fSchristos const char REASON[] = "DENY";
34f17b710fSchristos
35f17b710fSchristos add_entry(HOST, REASON);
36f17b710fSchristos
37f17b710fSchristos struct kod_entry* result;
38f17b710fSchristos
39f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST, &result));
40f17b710fSchristos TEST_ASSERT_EQUAL_STRING(HOST, result->hostname);
41f17b710fSchristos TEST_ASSERT_EQUAL_STRING(REASON, result->type);
42f17b710fSchristos }
43f17b710fSchristos
44f17b710fSchristos
45a6f3f22fSchristos void
test_MultipleEntryHandling(void)46a6f3f22fSchristos test_MultipleEntryHandling(void) {
47a6f3f22fSchristos const char HOST1[] = "192.0.2.3";
48a6f3f22fSchristos const char REASON1[] = "DENY";
49f17b710fSchristos
50a6f3f22fSchristos const char HOST2[] = "192.0.5.5";
51a6f3f22fSchristos const char REASON2[] = "RATE";
52a6f3f22fSchristos
53a6f3f22fSchristos const char HOST3[] = "192.0.10.1";
54a6f3f22fSchristos const char REASON3[] = "DENY";
55f17b710fSchristos
56f17b710fSchristos add_entry(HOST1, REASON1);
57f17b710fSchristos add_entry(HOST2, REASON2);
58f17b710fSchristos add_entry(HOST3, REASON3);
59f17b710fSchristos
60f17b710fSchristos struct kod_entry* result;
61f17b710fSchristos
62f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST1, &result));
63f17b710fSchristos TEST_ASSERT_EQUAL_STRING(HOST1, result->hostname);
64f17b710fSchristos TEST_ASSERT_EQUAL_STRING(REASON1, result->type);
65f17b710fSchristos
66f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST2, &result));
67f17b710fSchristos TEST_ASSERT_EQUAL_STRING(HOST2, result->hostname);
68f17b710fSchristos TEST_ASSERT_EQUAL_STRING(REASON2, result->type);
69f17b710fSchristos
70f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST3, &result));
71f17b710fSchristos TEST_ASSERT_EQUAL_STRING(HOST3, result->hostname);
72f17b710fSchristos TEST_ASSERT_EQUAL_STRING(REASON3, result->type);
73f17b710fSchristos
74f17b710fSchristos free(result);
75f17b710fSchristos }
76f17b710fSchristos
77a6f3f22fSchristos
78a6f3f22fSchristos void
test_NoMatchInSearch(void)79a6f3f22fSchristos test_NoMatchInSearch(void) {
80a6f3f22fSchristos const char HOST_ADD[] = "192.0.2.6";
81a6f3f22fSchristos const char HOST_NOTADD[] = "192.0.6.1";
82a6f3f22fSchristos const char REASON[] = "DENY";
83f17b710fSchristos
84f17b710fSchristos add_entry(HOST_ADD, REASON);
85f17b710fSchristos
86f17b710fSchristos struct kod_entry* result;
87f17b710fSchristos
88f17b710fSchristos TEST_ASSERT_EQUAL(0, search_entry(HOST_NOTADD, &result));
89f17b710fSchristos TEST_ASSERT_TRUE(result == NULL);
90f17b710fSchristos }
91f17b710fSchristos
92a6f3f22fSchristos
93a6f3f22fSchristos void
test_AddDuplicate(void)94a6f3f22fSchristos test_AddDuplicate(void) {
95a6f3f22fSchristos const char HOST[] = "192.0.2.3";
96a6f3f22fSchristos const char REASON1[] = "RATE";
97a6f3f22fSchristos const char REASON2[] = "DENY";
98f17b710fSchristos
99f17b710fSchristos add_entry(HOST, REASON1);
100f17b710fSchristos struct kod_entry* result1;
101f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST, &result1));
102f17b710fSchristos
103f17b710fSchristos /*
104f17b710fSchristos * Sleeps for two seconds since we want to ensure that
105f17b710fSchristos * the timestamp is updated to a new value.
106f17b710fSchristos */
107f17b710fSchristos sleep(2);
108f17b710fSchristos
109f17b710fSchristos add_entry(HOST, REASON2);
110f17b710fSchristos struct kod_entry* result2;
111f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST, &result2));
112f17b710fSchristos
113f17b710fSchristos TEST_ASSERT_FALSE(result1->timestamp == result2->timestamp);
114f17b710fSchristos
115f17b710fSchristos free(result1);
116f17b710fSchristos free(result2);
117f17b710fSchristos }
118f17b710fSchristos
119a6f3f22fSchristos
120a6f3f22fSchristos void
test_DeleteEntry(void)121a6f3f22fSchristos test_DeleteEntry(void) {
122a6f3f22fSchristos const char HOST1[] = "192.0.2.1";
123a6f3f22fSchristos const char HOST2[] = "192.0.2.2";
124a6f3f22fSchristos const char HOST3[] = "192.0.2.3";
125a6f3f22fSchristos const char REASON[] = "DENY";
126f17b710fSchristos
127f17b710fSchristos add_entry(HOST1, REASON);
128f17b710fSchristos add_entry(HOST2, REASON);
129f17b710fSchristos add_entry(HOST3, REASON);
130f17b710fSchristos
131f17b710fSchristos struct kod_entry* result;
132f17b710fSchristos
133f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST2, &result));
134f17b710fSchristos free(result);
135f17b710fSchristos
136f17b710fSchristos delete_entry(HOST2, REASON);
137f17b710fSchristos
138f17b710fSchristos TEST_ASSERT_EQUAL(0, search_entry(HOST2, &result));
139f17b710fSchristos
140f17b710fSchristos // Ensure that the other entry is still there.
141f17b710fSchristos TEST_ASSERT_EQUAL(1, search_entry(HOST1, &result));
142f17b710fSchristos free(result);
143f17b710fSchristos }
144