]>
Commit | Line | Data |
---|---|---|
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 |
20 | static const char *catalog_dirs[] = { |
21 | CATALOG_DIR, | |
22 | NULL, | |
23 | }; | |
24 | ||
25 | static const char *no_catalog_dirs[] = { | |
26 | "/bin/hopefully/with/no/catalog", | |
27 | NULL | |
28 | }; | |
29 | ||
627d2bac ZJS |
30 | static 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 |
49 | static 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 |
56 | static 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 |
66 | static 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 |
91 | static 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 | ||
125 | static 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 | 158 | static 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 | 175 | static 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 | 203 | int 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 | } |