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