Code

3d567ac606edf35d475526b19447fe1359f64043
[sysdb.git] / t / core / store_lookup_test.c
1 /*
2  * SysDB - t/core/store_lookup_test.c
3  * Copyright (C) 2014 Sebastian 'tokkee' Harl <sh@tokkee.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
28 #include "core/store.h"
29 #include "libsysdb_test.h"
31 #include <check.h>
32 #include <string.h>
34 static void
35 populate(void)
36 {
37         const char *hosts[] = { "a", "b", "c" };
39         struct {
40                 const char *host;
41                 const char *service;
42         } services[] = {
43                 { "a", "s1" },
44                 { "a", "s2" },
45                 { "b", "s1" },
46                 { "b", "s3" },
47         };
49         struct {
50                 const char *host;
51                 const char *name;
52                 sdb_data_t  value;
53         } attrs[] = {
54                 { "a", "k1", { SDB_TYPE_STRING, { .string = "v1" } } },
55         };
57         size_t i;
59         for (i = 0; i < SDB_STATIC_ARRAY_LEN(hosts); ++i) {
60                 int status = sdb_store_host(hosts[i], 1);
61                 fail_unless(status == 0,
62                                 "sdb_store_host(%s, 1) = %d; expected: 0",
63                                 hosts[i], status);
64         }
66         for (i = 0; i < SDB_STATIC_ARRAY_LEN(services); ++i) {
67                 int status = sdb_store_service(services[i].host,
68                                 services[i].service, 1);
69                 fail_unless(status == 0,
70                                 "sdb_store_service(%s, %s, 1) = %d; expected: 0",
71                                 services[i].host, services[i].service, status);
72         }
74         for (i = 0; i < SDB_STATIC_ARRAY_LEN(attrs); ++i) {
75                 int status = sdb_store_attribute(attrs[i].host,
76                                 attrs[i].name, &attrs[i].value, 1);
77                 fail_unless(status == 0,
78                                 "sdb_store_attribute(%s, %s, <val>, 1) = %d; expected: 0",
79                                 attrs[i].host, attrs[i].name, status);
80         }
81 } /* populate */
83 START_TEST(test_store_match)
84 {
85         sdb_store_base_t *obj;
87         struct {
88                 const char *hostname;
89                 const char *hostname_re;
91                 const char *service_name;
92                 const char *service_name_re;
94                 const char *attr_name;
95                 const char *attr_name_re;
96                 const char *attr_value;
97                 const char *attr_value_re;
99                 int expected;
100         } golden_data[] = {
101                 {
102                         /* host */ NULL, NULL,
103                         /* svc  */ NULL, NULL,
104                         /* attr */ NULL, NULL, NULL, NULL, 0
105                 },
106                 {
107                         /* host */ "a", NULL,
108                         /* svc  */ NULL, NULL,
109                         /* attr */ NULL, NULL, NULL, NULL, 0
110                 },
111                 {
112                         /* host */ "b", NULL,
113                         /* svc  */ NULL, NULL,
114                         /* attr */ NULL, NULL, NULL, NULL, -1
115                 },
116                 {
117                         /* host */ NULL, "^a$",
118                         /* svc  */ NULL, NULL,
119                         /* attr */ NULL, NULL, NULL, NULL, 0
120                 },
121                 {
122                         /* host */ NULL, "^b$",
123                         /* svc  */ NULL, NULL,
124                         /* attr */ NULL, NULL, NULL, NULL, -1
125                 },
126                 {
127                         /* host */ "a", "^a$",
128                         /* svc  */ NULL, NULL,
129                         /* attr */ NULL, NULL, NULL, NULL, 0
130                 },
131                 {
132                         /* host */ "a", "^b$",
133                         /* svc  */ NULL, NULL,
134                         /* attr */ NULL, NULL, NULL, NULL, -1
135                 },
136                 {
137                         /* host */ "b", "^a$",
138                         /* svc  */ NULL, NULL,
139                         /* attr */ NULL, NULL, NULL, NULL, -1
140                 },
141                 {
142                         /* host */ "a", "^a$",
143                         /* svc  */ "s1", NULL,
144                         /* attr */ NULL, NULL, NULL, NULL, 0
145                 },
146                 {
147                         /* host */ "a", "^a$",
148                         /* svc  */ NULL, "^s1$",
149                         /* attr */ NULL, NULL, NULL, NULL, 0
150                 },
151                 {
152                         /* host */ "a", "^a$",
153                         /* svc  */ "s1", "^s1$",
154                         /* attr */ NULL, NULL, NULL, NULL, 0
155                 },
156                 {
157                         /* host */ "a", "^a$",
158                         /* svc  */ "x1", NULL,
159                         /* attr */ NULL, NULL, NULL, NULL, -1
160                 },
161                 {
162                         /* host */ "a", "^a$",
163                         /* svc  */ NULL, "x",
164                         /* attr */ NULL, NULL, NULL, NULL, -1
165                 },
166                 {
167                         /* host */ "a", "^a$",
168                         /* svc  */ "x1", "x",
169                         /* attr */ NULL, NULL, NULL, NULL, -1
170                 },
171                 {
172                         /* host */ "a", "^a$",
173                         /* svc  */ "s1", "x",
174                         /* attr */ NULL, NULL, NULL, NULL, -1
175                 },
176                 {
177                         /* host */ "a", "^a$",
178                         /* svc  */ "x1", "s",
179                         /* attr */ NULL, NULL, NULL, NULL, -1
180                 },
181                 {
182                         /* host */ "a", "^a$",
183                         /* svc  */ "s1", "^s1$",
184                         /* attr */ "k1", NULL, NULL, NULL, 0
185                 },
186                 {
187                         /* host */ "a", "^a$",
188                         /* svc  */ "s1", "^s1$",
189                         /* attr */ NULL, "^k", NULL, NULL, 0
190                 },
191                 {
192                         /* host */ "a", "^a$",
193                         /* svc  */ "s1", "^s1$",
194                         /* attr */ NULL, NULL, "v1", NULL, 0
195                 },
196                 {
197                         /* host */ "a", "^a$",
198                         /* svc  */ "s1", "^s1$",
199                         /* attr */ NULL, NULL, NULL, "^v1$", 0
200                 },
201                 {
202                         /* host */ "a", "^a$",
203                         /* svc  */ "s1", "^s1$",
204                         /* attr */ "k1", "1", "v1", "1", 0
205                 },
206         };
208         size_t i;
210         obj = sdb_store_get_host("a");
211         fail_unless(obj != NULL,
212                         "sdb_store_get_host(a) = NULL; expected: <host>");
214         for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
215                 sdb_store_matcher_t *h, *s, *a;
216                 int status;
218                 s = sdb_store_service_matcher(golden_data[i].service_name,
219                                 golden_data[i].service_name_re, NULL);
220                 fail_unless(s != NULL,
221                                 "sdb_store_service_matcher() = NULL; expected: <matcher>");
223                 a = sdb_store_attr_matcher(golden_data[i].attr_name,
224                                 golden_data[i].attr_name_re, golden_data[i].attr_value,
225                                 golden_data[i].attr_value_re);
226                 fail_unless(a != NULL,
227                                 "sdb_store_attr_matcher() = NULL; expected: <matcher>");
229                 h = sdb_store_host_matcher(golden_data[i].hostname,
230                                 golden_data[i].hostname_re, s, a);
231                 fail_unless(h != NULL,
232                                 "sdb_store_host_matcher() = NULL: expected: <matcher>");
233                 /* pass ownership to the host matcher */
234                 sdb_object_deref(SDB_OBJ(s));
235                 sdb_object_deref(SDB_OBJ(a));
237                 status = sdb_store_matcher_matches(h, obj);
238                 fail_unless(status == golden_data[i].expected,
239                                 "sdb_store_matcher_matches({{%s, %s},{%s, %s},"
240                                 "{%s, %s, %s, %s}}, <host a>) = %d; expected: %d",
241                                 golden_data[i].hostname, golden_data[i].hostname_re,
242                                 golden_data[i].service_name, golden_data[i].service_name_re,
243                                 golden_data[i].attr_name, golden_data[i].attr_name_re,
244                                 golden_data[i].attr_value, golden_data[i].attr_value_re,
245                                 status, golden_data[i].expected);
247                 sdb_object_deref(SDB_OBJ(h));
248         }
250 END_TEST
252 Suite *
253 core_store_lookup_suite(void)
255         Suite *s = suite_create("core::store_lookup");
256         TCase *tc;
258         tc = tcase_create("core");
259         tcase_add_checked_fixture(tc, populate, sdb_store_clear);
260         tcase_add_test(tc, test_store_match);
261         suite_add_tcase(s, tc);
263         return s;
264 } /* core_store_lookup_suite */
266 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */