]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/test-catalog.c
test: introduce test_is_running_from_builddir()
[thirdparty/systemd.git] / src / journal / test-catalog.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
d4205751 2
844ec79b 3#include <errno.h>
2d5bdf5b 4#include <fcntl.h>
cf0fbc49
TA
5#include <locale.h>
6#include <unistd.h>
d4205751 7
07630cea
LP
8#include "sd-messages.h"
9
b5efdb8a 10#include "alloc-util.h"
3ffd4af2
LP
11#include "catalog.h"
12#include "fd-util.h"
627d2bac 13#include "fs-util.h"
0d39fa9c 14#include "fileio.h"
d4205751 15#include "log.h"
844ec79b 16#include "macro.h"
07630cea 17#include "string-util.h"
3ffd4af2 18#include "util.h"
d4205751 19
143bfdaf
HHPF
20static const char *catalog_dirs[] = {
21 CATALOG_DIR,
22 NULL,
23};
24
25static const char *no_catalog_dirs[] = {
26 "/bin/hopefully/with/no/catalog",
27 NULL
28};
29
627d2bac
ZJS
30static Hashmap* test_import(const char* contents, ssize_t size, int code) {
31 _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-catalog.XXXXXX";
2d5bdf5b 32 _cleanup_close_ int fd;
9d85882a
SW
33 Hashmap *h;
34
35 if (size < 0)
36 size = strlen(contents);
37
38 assert_se(h = hashmap_new(&catalog_hash_ops));
2d5bdf5b 39
646853bd 40 fd = mkostemp_safe(name);
787784c4 41 assert_se(fd >= 0);
844ec79b
ZJS
42 assert_se(write(fd, contents, size) == size);
43
627d2bac 44 assert_se(catalog_import_file(h, name) == code);
844ec79b 45
9d85882a
SW
46 return h;
47}
844ec79b 48
9d85882a
SW
49static void test_catalog_import_invalid(void) {
50 _cleanup_hashmap_free_free_free_ Hashmap *h = NULL;
844ec79b 51
9d85882a 52 h = test_import("xxx", -1, -EINVAL);
787784c4 53 assert_se(hashmap_isempty(h));
9d85882a 54}
844ec79b 55
9d85882a
SW
56static void test_catalog_import_badid(void) {
57 _cleanup_hashmap_free_free_free_ Hashmap *h = NULL;
58 const char *input =
844ec79b
ZJS
59"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededede\n" \
60"Subject: message\n" \
61"\n" \
9d85882a
SW
62"payload\n";
63 h = test_import(input, -1, -EINVAL);
64}
844ec79b 65
9d85882a
SW
66static void test_catalog_import_one(void) {
67 _cleanup_hashmap_free_free_free_ Hashmap *h = NULL;
68 char *payload;
69 Iterator j;
844ec79b 70
9d85882a 71 const char *input =
844ec79b
ZJS
72"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
73"Subject: message\n" \
74"\n" \
9d85882a
SW
75"payload\n";
76 const char *expect =
77"Subject: message\n" \
78"\n" \
79"payload\n";
844ec79b 80
9d85882a 81 h = test_import(input, -1, 0);
787784c4 82 assert_se(hashmap_size(h) == 1);
d4205751 83
9d85882a 84 HASHMAP_FOREACH(payload, h, j) {
06466a7f
ZJS
85 printf("expect: %s\n", expect);
86 printf("actual: %s\n", payload);
9d85882a
SW
87 assert_se(streq(expect, payload));
88 }
844ec79b
ZJS
89}
90
c059b62f
SW
91static void test_catalog_import_merge(void) {
92 _cleanup_hashmap_free_free_free_ Hashmap *h = NULL;
93 char *payload;
94 Iterator j;
95
96 const char *input =
97"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
98"Subject: message\n" \
99"Defined-By: me\n" \
100"\n" \
101"payload\n" \
102"\n" \
103"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
104"Subject: override subject\n" \
105"X-Header: hello\n" \
106"\n" \
107"override payload\n";
108
109 const char *combined =
110"Subject: override subject\n" \
111"X-Header: hello\n" \
112"Subject: message\n" \
113"Defined-By: me\n" \
114"\n" \
115"override payload\n";
116
117 h = test_import(input, -1, 0);
118 assert_se(hashmap_size(h) == 1);
119
120 HASHMAP_FOREACH(payload, h, j) {
121 assert_se(streq(combined, payload));
122 }
123}
124
125static void test_catalog_import_merge_no_body(void) {
126 _cleanup_hashmap_free_free_free_ Hashmap *h = NULL;
127 char *payload;
128 Iterator j;
129
130 const char *input =
131"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
132"Subject: message\n" \
133"Defined-By: me\n" \
134"\n" \
135"payload\n" \
136"\n" \
137"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
138"Subject: override subject\n" \
139"X-Header: hello\n" \
140"\n";
141
142 const char *combined =
143"Subject: override subject\n" \
144"X-Header: hello\n" \
145"Subject: message\n" \
146"Defined-By: me\n" \
147"\n" \
148"payload\n";
149
150 h = test_import(input, -1, 0);
151 assert_se(hashmap_size(h) == 1);
152
153 HASHMAP_FOREACH(payload, h, j) {
154 assert_se(streq(combined, payload));
155 }
156}
157
627d2bac 158static void test_catalog_update(const char *database) {
844ec79b 159 int r;
844ec79b 160
844ec79b
ZJS
161 /* Test what happens if there are no files. */
162 r = catalog_update(database, NULL, NULL);
f201daec 163 assert_se(r == 0);
844ec79b 164
143bfdaf
HHPF
165 /* Test what happens if there are no files in the directory. */
166 r = catalog_update(database, NULL, no_catalog_dirs);
f201daec 167 assert_se(r == 0);
143bfdaf
HHPF
168
169 /* Make sure that we at least have some files loaded or the
170 catalog_list below will fail. */
171 r = catalog_update(database, NULL, catalog_dirs);
f201daec 172 assert_se(r == 0);
844ec79b
ZJS
173}
174
c7332b08 175static void test_catalog_file_lang(void) {
4b8268f8 176 _cleanup_free_ char *lang = NULL, *lang2 = NULL, *lang3 = NULL, *lang4 = NULL;
c7332b08
ZJS
177
178 assert_se(catalog_file_lang("systemd.de_DE.catalog", &lang) == 1);
179 assert_se(streq(lang, "de_DE"));
180
181 assert_se(catalog_file_lang("systemd..catalog", &lang2) == 0);
182 assert_se(lang2 == NULL);
183
184 assert_se(catalog_file_lang("systemd.fr.catalog", &lang2) == 1);
185 assert_se(streq(lang2, "fr"));
186
187 assert_se(catalog_file_lang("systemd.fr.catalog.gz", &lang3) == 0);
188 assert_se(lang3 == NULL);
189
190 assert_se(catalog_file_lang("systemd.01234567890123456789012345678901.catalog", &lang3) == 0);
191 assert_se(lang3 == NULL);
192
193 assert_se(catalog_file_lang("systemd.0123456789012345678901234567890.catalog", &lang3) == 1);
194 assert_se(streq(lang3, "0123456789012345678901234567890"));
4b8268f8
ZJS
195
196 assert_se(catalog_file_lang("/x/y/systemd.catalog", &lang4) == 0);
197 assert_se(lang4 == NULL);
198
199 assert_se(catalog_file_lang("/x/y/systemd.ru_RU.catalog", &lang4) == 1);
200 assert_se(streq(lang4, "ru_RU"));
c7332b08
ZJS
201}
202
844ec79b 203int main(int argc, char *argv[]) {
627d2bac 204 _cleanup_(unlink_tempfilep) char database[] = "/tmp/test-catalog.XXXXXX";
d4205751 205 _cleanup_free_ char *text = NULL;
844ec79b 206 int r;
d4205751
LP
207
208 setlocale(LC_ALL, "de_DE.UTF-8");
209
e3b9d9c8
ZJS
210 log_parse_environment();
211 log_open();
d4205751 212
4b8268f8
ZJS
213 test_catalog_file_lang();
214
9d85882a
SW
215 test_catalog_import_invalid();
216 test_catalog_import_badid();
217 test_catalog_import_one();
c059b62f
SW
218 test_catalog_import_merge();
219 test_catalog_import_merge_no_body();
d4205751 220
627d2bac
ZJS
221 assert_se(mkostemp_safe(database) >= 0);
222
223 test_catalog_update(database);
54b7254c 224
844ec79b
ZJS
225 r = catalog_list(stdout, database, true);
226 assert_se(r >= 0);
d4205751 227
844ec79b
ZJS
228 r = catalog_list(stdout, database, false);
229 assert_se(r >= 0);
d4205751 230
844ec79b 231 assert_se(catalog_get(database, SD_MESSAGE_COREDUMP, &text) >= 0);
d4205751
LP
232 printf(">>>%s<<<\n", text);
233
d4205751
LP
234 return 0;
235}