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