Mercurial > sci
comparison tests/test-db.c @ 5:566bc028cdcb
tests: initial tests coming
- Add tests for database access.
- While here transform common code into libsci.a
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 16 Jun 2021 13:25:42 +0200 |
parents | |
children | 3ef8128e244f |
comparison
equal
deleted
inserted
replaced
4:9c4fea43803c | 5:566bc028cdcb |
---|---|
1 /* | |
2 * test-db.c -- test database access | |
3 * | |
4 * Copyright (c) 2021 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <stdio.h> | |
20 #include <string.h> | |
21 #include <err.h> | |
22 | |
23 #define GREATEST_USE_ABBREVS 0 | |
24 #include <greatest.h> | |
25 | |
26 #include "db.h" | |
27 #include "types.h" | |
28 #include "util.h" | |
29 | |
30 #define DB "test.db" | |
31 | |
32 static void | |
33 setup(void *data) | |
34 { | |
35 (void)data; | |
36 | |
37 remove(DB); | |
38 | |
39 if (db_open(DB) < 0) | |
40 err(1, "unable to create database"); | |
41 } | |
42 | |
43 static void | |
44 teardown(void *data) | |
45 { | |
46 (void)data; | |
47 | |
48 db_finish(); | |
49 remove(DB); | |
50 } | |
51 | |
52 GREATEST_TEST | |
53 test_projects_add(void) | |
54 { | |
55 struct project proj = {0}; | |
56 | |
57 proj.name = "test"; | |
58 proj.desc = "Test project"; | |
59 proj.url = "example.org"; | |
60 proj.script = "#!/bin/sh exit 0"; | |
61 | |
62 GREATEST_ASSERT_EQ(db_project_add(&proj), 0); | |
63 GREATEST_ASSERT(proj.id > 0); | |
64 | |
65 GREATEST_PASS(); | |
66 } | |
67 | |
68 GREATEST_TEST | |
69 test_projects_list(void) | |
70 { | |
71 struct project projs[] = { | |
72 { | |
73 .name = "example 1", | |
74 .desc = "Example project 1", | |
75 .url = "example.org", | |
76 .script = "#!/bin/sh exit 0" | |
77 }, | |
78 { | |
79 .name = "example 2", | |
80 .desc = "Example project 2", | |
81 .url = "example.org", | |
82 .script = "#!/bin/sh exit 0" | |
83 } | |
84 }; | |
85 struct db_ctx ctx; | |
86 | |
87 for (size_t i = 0; i < UTIL_SIZE(projs); ++i) { | |
88 GREATEST_ASSERT_EQ(db_project_add(&projs[i]), 0); | |
89 GREATEST_ASSERT(projs[i].id > 0); | |
90 } | |
91 | |
92 memset(projs, 0, sizeof (projs)); | |
93 | |
94 GREATEST_ASSERT_EQ(db_project_list(&ctx, projs, UTIL_SIZE(projs)), 2LL); | |
95 GREATEST_ASSERT(projs[0].id > 0); | |
96 GREATEST_ASSERT_STR_EQ(projs[0].name, "example 1"); | |
97 GREATEST_ASSERT_STR_EQ(projs[0].desc, "Example project 1"); | |
98 GREATEST_ASSERT_STR_EQ(projs[0].url, "example.org"); | |
99 GREATEST_ASSERT_STR_EQ(projs[0].script, "#!/bin/sh exit 0"); | |
100 GREATEST_ASSERT(projs[1].id > 0); | |
101 GREATEST_ASSERT_STR_EQ(projs[1].name, "example 2"); | |
102 GREATEST_ASSERT_STR_EQ(projs[1].desc, "Example project 2"); | |
103 GREATEST_ASSERT_STR_EQ(projs[1].url, "example.org"); | |
104 GREATEST_ASSERT_STR_EQ(projs[1].script, "#!/bin/sh exit 0"); | |
105 | |
106 db_ctx_finish(&ctx); | |
107 | |
108 GREATEST_PASS(); | |
109 } | |
110 | |
111 GREATEST_TEST | |
112 test_projects_find(void) | |
113 { | |
114 struct project projs[] = { | |
115 { | |
116 .name = "example 1", | |
117 .desc = "Example project 1", | |
118 .url = "example.org", | |
119 .script = "#!/bin/sh exit 0" | |
120 }, | |
121 { | |
122 .name = "example 2", | |
123 .desc = "Example project 2", | |
124 .url = "example.org", | |
125 .script = "#!/bin/sh exit 0" | |
126 } | |
127 }; | |
128 struct project find = { .name = "example 2" }; | |
129 struct db_ctx ctx; | |
130 | |
131 for (size_t i = 0; i < UTIL_SIZE(projs); ++i) { | |
132 GREATEST_ASSERT_EQ(db_project_add(&projs[i]), 0); | |
133 GREATEST_ASSERT(projs[i].id > 0); | |
134 } | |
135 | |
136 GREATEST_ASSERT_EQ(db_project_find(&ctx, &find), 0); | |
137 GREATEST_ASSERT_EQ(find.id, 2); | |
138 GREATEST_ASSERT_STR_EQ(find.name, "example 2"); | |
139 GREATEST_ASSERT_STR_EQ(find.desc, "Example project 2"); | |
140 GREATEST_ASSERT_STR_EQ(find.url, "example.org"); | |
141 GREATEST_ASSERT_STR_EQ(find.script, "#!/bin/sh exit 0"); | |
142 | |
143 db_ctx_finish(&ctx); | |
144 | |
145 GREATEST_PASS(); | |
146 } | |
147 | |
148 GREATEST_TEST | |
149 test_projects_find_id(void) | |
150 { | |
151 struct project projs[] = { | |
152 { | |
153 .name = "example 1", | |
154 .desc = "Example project 1", | |
155 .url = "example.org", | |
156 .script = "#!/bin/sh exit 0" | |
157 }, | |
158 { | |
159 .name = "example 2", | |
160 .desc = "Example project 2", | |
161 .url = "example.org", | |
162 .script = "#!/bin/sh exit 0" | |
163 } | |
164 }; | |
165 struct project find = { .id = 2 }; | |
166 struct db_ctx ctx; | |
167 | |
168 for (size_t i = 0; i < UTIL_SIZE(projs); ++i) { | |
169 GREATEST_ASSERT_EQ(db_project_add(&projs[i]), 0); | |
170 GREATEST_ASSERT(projs[i].id > 0); | |
171 } | |
172 | |
173 /* First generated id should start at 1. */ | |
174 GREATEST_ASSERT_EQ(db_project_find_id(&ctx, &find), 0); | |
175 GREATEST_ASSERT_EQ(find.id, 2); | |
176 GREATEST_ASSERT_STR_EQ(find.name, "example 2"); | |
177 GREATEST_ASSERT_STR_EQ(find.desc, "Example project 2"); | |
178 GREATEST_ASSERT_STR_EQ(find.url, "example.org"); | |
179 GREATEST_ASSERT_STR_EQ(find.script, "#!/bin/sh exit 0"); | |
180 | |
181 db_ctx_finish(&ctx); | |
182 | |
183 GREATEST_PASS(); | |
184 } | |
185 | |
186 GREATEST_SUITE(suite_projects) | |
187 { | |
188 GREATEST_SET_SETUP_CB(setup, NULL); | |
189 GREATEST_SET_TEARDOWN_CB(teardown, NULL); | |
190 GREATEST_RUN_TEST(test_projects_add); | |
191 GREATEST_RUN_TEST(test_projects_list); | |
192 GREATEST_RUN_TEST(test_projects_find); | |
193 GREATEST_RUN_TEST(test_projects_find_id); | |
194 } | |
195 | |
196 GREATEST_TEST | |
197 test_workers_add(void) | |
198 { | |
199 struct worker wk = {0}; | |
200 | |
201 wk.name = "test"; | |
202 wk.desc = "Test worker"; | |
203 | |
204 GREATEST_ASSERT_EQ(db_worker_add(&wk), 0); | |
205 GREATEST_ASSERT(wk.id > 0); | |
206 | |
207 GREATEST_PASS(); | |
208 } | |
209 | |
210 GREATEST_TEST | |
211 test_workers_list(void) | |
212 { | |
213 struct worker wks[] = { | |
214 { | |
215 .name = "example 1", | |
216 .desc = "Example worker 1", | |
217 }, | |
218 { | |
219 .name = "example 2", | |
220 .desc = "Example worker 2", | |
221 } | |
222 }; | |
223 struct db_ctx ctx; | |
224 | |
225 for (size_t i = 0; i < UTIL_SIZE(wks); ++i) { | |
226 GREATEST_ASSERT_EQ(db_worker_add(&wks[i]), 0); | |
227 GREATEST_ASSERT(wks[i].id > 0); | |
228 } | |
229 | |
230 memset(wks, 0, sizeof (wks)); | |
231 | |
232 GREATEST_ASSERT_EQ(db_worker_list(&ctx, wks, UTIL_SIZE(wks)), 2LL); | |
233 GREATEST_ASSERT(wks[0].id > 0); | |
234 GREATEST_ASSERT_STR_EQ(wks[0].name, "example 1"); | |
235 GREATEST_ASSERT_STR_EQ(wks[0].desc, "Example worker 1"); | |
236 GREATEST_ASSERT(wks[1].id > 0); | |
237 GREATEST_ASSERT_STR_EQ(wks[1].name, "example 2"); | |
238 GREATEST_ASSERT_STR_EQ(wks[1].desc, "Example worker 2"); | |
239 | |
240 db_ctx_finish(&ctx); | |
241 | |
242 GREATEST_PASS(); | |
243 } | |
244 | |
245 GREATEST_TEST | |
246 test_workers_find(void) | |
247 { | |
248 struct worker wks[] = { | |
249 { | |
250 .name = "example 1", | |
251 .desc = "Example worker 1", | |
252 }, | |
253 { | |
254 .name = "example 2", | |
255 .desc = "Example worker 2", | |
256 } | |
257 }; | |
258 struct worker find = { .name = "example 1" }; | |
259 struct db_ctx ctx; | |
260 | |
261 for (size_t i = 0; i < UTIL_SIZE(wks); ++i) { | |
262 GREATEST_ASSERT_EQ(db_worker_add(&wks[i]), 0); | |
263 GREATEST_ASSERT(wks[i].id > 0); | |
264 } | |
265 | |
266 GREATEST_ASSERT_EQ(db_worker_find(&ctx, &find), 0); | |
267 GREATEST_ASSERT_EQ(find.id, 1); | |
268 GREATEST_ASSERT_STR_EQ(find.name, "example 1"); | |
269 GREATEST_ASSERT_STR_EQ(find.desc, "Example worker 1"); | |
270 | |
271 db_ctx_finish(&ctx); | |
272 | |
273 GREATEST_PASS(); | |
274 } | |
275 | |
276 GREATEST_TEST | |
277 test_workers_find_id(void) | |
278 { | |
279 struct worker wks[] = { | |
280 { | |
281 .name = "example 1", | |
282 .desc = "Example worker 1", | |
283 }, | |
284 { | |
285 .name = "example 2", | |
286 .desc = "Example worker 2", | |
287 } | |
288 }; | |
289 struct worker find = { .id = 1 }; | |
290 struct db_ctx ctx; | |
291 | |
292 for (size_t i = 0; i < UTIL_SIZE(wks); ++i) { | |
293 GREATEST_ASSERT_EQ(db_worker_add(&wks[i]), 0); | |
294 GREATEST_ASSERT(wks[i].id > 0); | |
295 } | |
296 | |
297 /* First generated id should start at 1. */ | |
298 GREATEST_ASSERT_EQ(db_worker_find_id(&ctx, &find), 0); | |
299 GREATEST_ASSERT_EQ(find.id, 1); | |
300 GREATEST_ASSERT_STR_EQ(find.name, "example 1"); | |
301 GREATEST_ASSERT_STR_EQ(find.desc, "Example worker 1"); | |
302 | |
303 db_ctx_finish(&ctx); | |
304 | |
305 GREATEST_PASS(); | |
306 } | |
307 | |
308 GREATEST_SUITE(suite_workers) | |
309 { | |
310 GREATEST_SET_SETUP_CB(setup, NULL); | |
311 GREATEST_SET_TEARDOWN_CB(teardown, NULL); | |
312 GREATEST_RUN_TEST(test_workers_add); | |
313 GREATEST_RUN_TEST(test_workers_list); | |
314 GREATEST_RUN_TEST(test_workers_find); | |
315 GREATEST_RUN_TEST(test_workers_find_id); | |
316 } | |
317 | |
318 GREATEST_TEST | |
319 test_jobs_add(void) | |
320 { | |
321 struct project proj = {0}; | |
322 struct job job = {0}; | |
323 | |
324 proj.name = "test"; | |
325 proj.desc = "Test project"; | |
326 proj.url = "example.org"; | |
327 proj.script = "#!/bin/sh exit 0"; | |
328 | |
329 GREATEST_ASSERT_EQ(db_project_add(&proj), 0); | |
330 GREATEST_ASSERT(proj.id > 0); | |
331 | |
332 job.project_id = proj.id; | |
333 job.tag = "123456"; | |
334 | |
335 GREATEST_ASSERT_EQ(db_job_add(&job), 0); | |
336 GREATEST_ASSERT(job.id > 0); | |
337 | |
338 GREATEST_PASS(); | |
339 } | |
340 | |
341 GREATEST_TEST | |
342 test_jobs_todo(void) | |
343 { | |
344 struct project proj = {0}; | |
345 struct job job = {0}; | |
346 struct worker wk = {0}; | |
347 struct job todo[16] = {0}; | |
348 struct db_ctx ctx; | |
349 | |
350 proj.name = "test"; | |
351 proj.desc = "Test project"; | |
352 proj.url = "example.org"; | |
353 proj.script = "#!/bin/sh exit 0"; | |
354 | |
355 GREATEST_ASSERT_EQ(db_project_add(&proj), 0); | |
356 GREATEST_ASSERT(proj.id > 0); | |
357 | |
358 job.project_id = proj.id; | |
359 job.tag = "123456"; | |
360 | |
361 GREATEST_ASSERT_EQ(db_job_add(&job), 0); | |
362 GREATEST_ASSERT(job.id > 0); | |
363 | |
364 wk.name = "test"; | |
365 wk.desc = "Test worker"; | |
366 | |
367 GREATEST_ASSERT_EQ(db_worker_add(&wk), 0); | |
368 GREATEST_ASSERT(wk.id > 0); | |
369 | |
370 GREATEST_ASSERT_EQ(db_job_todo(&ctx, todo, UTIL_SIZE(todo), wk.id), 1); | |
371 GREATEST_ASSERT(todo[0].id > 0); | |
372 GREATEST_ASSERT_STR_EQ(todo[0].tag, "123456"); | |
373 GREATEST_ASSERT_EQ(todo[0].project_id, proj.id); | |
374 | |
375 db_ctx_finish(&ctx); | |
376 | |
377 GREATEST_PASS(); | |
378 } | |
379 | |
380 GREATEST_SUITE(suite_jobs) | |
381 { | |
382 GREATEST_SET_SETUP_CB(setup, NULL); | |
383 GREATEST_SET_TEARDOWN_CB(teardown, NULL); | |
384 GREATEST_RUN_TEST(test_jobs_add); | |
385 GREATEST_RUN_TEST(test_jobs_todo); | |
386 } | |
387 | |
388 | |
389 GREATEST_TEST | |
390 test_jobresults_add(void) | |
391 { | |
392 struct project projs[] = { | |
393 { | |
394 .name = "example 1", | |
395 .desc = "Example project 1", | |
396 .url = "example.org", | |
397 .script = "#!/bin/sh exit 0" | |
398 }, | |
399 { | |
400 .name = "example 2", | |
401 .desc = "Example project 2", | |
402 .url = "example.org", | |
403 .script = "#!/bin/sh exit 0" | |
404 } | |
405 }; | |
406 struct job jobs[] = { | |
407 { | |
408 .project_id = 0, /* will be project 1 */ | |
409 .tag = "123456" | |
410 }, | |
411 { | |
412 .project_id = 0, /* will be project 2 */ | |
413 .tag = "abcdef" | |
414 }, | |
415 }; | |
416 struct worker wks[] = { | |
417 { | |
418 .name = "alpine-aarch64", | |
419 .desc = "alpine-aarch64" | |
420 }, | |
421 { | |
422 .name = "alpine-armhf", | |
423 .desc = "alpine-armhf" | |
424 }, | |
425 }; | |
426 struct job todo[16] = {0}; | |
427 struct jobresult res = {0}; | |
428 struct db_ctx ctx; | |
429 | |
430 for (size_t i = 0; i < UTIL_SIZE(projs); ++i) { | |
431 GREATEST_ASSERT_EQ(db_project_add(&projs[i]), 0); | |
432 GREATEST_ASSERT(projs[i].id > 0); | |
433 } | |
434 | |
435 /* Update jobs with newly created projects. */ | |
436 jobs[0].project_id = projs[0].id; | |
437 jobs[1].project_id = projs[1].id; | |
438 | |
439 for (size_t i = 0; i < UTIL_SIZE(jobs); ++i) { | |
440 GREATEST_ASSERT_EQ(db_job_add(&jobs[i]), 0); | |
441 GREATEST_ASSERT(jobs[i].id > 0); | |
442 } | |
443 | |
444 for (size_t i = 0; i < UTIL_SIZE(wks); ++i) { | |
445 GREATEST_ASSERT_EQ(db_worker_add(&wks[i]), 0); | |
446 GREATEST_ASSERT(wks[i].id > 0); | |
447 } | |
448 | |
449 /* | |
450 * Now add a jobresult for worker alpine-aarch64 and the job "abcdef", | |
451 * this means that this worker will only have the job "123456" to do | |
452 * while the other worker will have all to do. | |
453 */ | |
454 res.job_id = jobs[1].id; | |
455 res.worker_id = wks[0].id; | |
456 res.exitcode = 0; | |
457 res.log = "Success"; | |
458 | |
459 GREATEST_ASSERT_EQ(db_jobresult_add(&res), 0); | |
460 GREATEST_ASSERT(res.id > 0); | |
461 | |
462 /* 1 job left for alpine-aarch64 -> [123456]. */ | |
463 GREATEST_ASSERT_EQ(db_job_todo(&ctx, todo, UTIL_SIZE(todo), wks[0].id), 1); | |
464 GREATEST_ASSERT(todo[0].id > 0); | |
465 GREATEST_ASSERT_STR_EQ(todo[0].tag, "123456"); | |
466 GREATEST_ASSERT_EQ(todo[0].project_id, projs[0].id); | |
467 | |
468 db_ctx_finish(&ctx); | |
469 | |
470 /* 2 jobs left for alpine-armhf -> [123456, abcdef]. */ | |
471 GREATEST_ASSERT_EQ(db_job_todo(&ctx, todo, UTIL_SIZE(todo), wks[1].id), 2); | |
472 GREATEST_ASSERT(todo[0].id > 0); | |
473 GREATEST_ASSERT_STR_EQ(todo[0].tag, "123456"); | |
474 GREATEST_ASSERT_EQ(todo[0].project_id, projs[0].id); | |
475 GREATEST_ASSERT(todo[1].id > 0); | |
476 GREATEST_ASSERT_STR_EQ(todo[1].tag, "abcdef"); | |
477 GREATEST_ASSERT_EQ(todo[1].project_id, projs[1].id); | |
478 | |
479 db_ctx_finish(&ctx); | |
480 | |
481 GREATEST_PASS(); | |
482 } | |
483 | |
484 GREATEST_SUITE(suite_jobresults) | |
485 { | |
486 GREATEST_SET_SETUP_CB(setup, NULL); | |
487 GREATEST_SET_TEARDOWN_CB(teardown, NULL); | |
488 GREATEST_RUN_TEST(test_jobresults_add); | |
489 } | |
490 | |
491 GREATEST_MAIN_DEFS(); | |
492 | |
493 int | |
494 main(int argc, char **argv) | |
495 { | |
496 GREATEST_MAIN_BEGIN(); | |
497 GREATEST_RUN_SUITE(suite_projects); | |
498 GREATEST_RUN_SUITE(suite_workers); | |
499 GREATEST_RUN_SUITE(suite_jobs); | |
500 GREATEST_RUN_SUITE(suite_jobresults); | |
501 GREATEST_MAIN_END(); | |
502 } |