]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/test-journal.c
Partially revert "seccomp: add mmap and address family restrictions for MIPS" (#8563)
[thirdparty/systemd.git] / src / journal / test-journal.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
87d2c1ff
LP
2/***
3 This file is part of systemd.
4
5 Copyright 2011 Lennart Poettering
6
7 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
87d2c1ff
LP
10 (at your option) any later version.
11
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 15 Lesser General Public License for more details.
87d2c1ff 16
5430f7f2 17 You should have received a copy of the GNU Lesser General Public License
87d2c1ff
LP
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
19***/
20
21#include <fcntl.h>
0ac38b70 22#include <unistd.h>
87d2c1ff 23
0284adc6 24#include "journal-authenticate.h"
cf0fbc49 25#include "journal-file.h"
0284adc6 26#include "journal-vacuum.h"
cf0fbc49
TA
27#include "log.h"
28#include "rm-rf.h"
87d2c1ff 29
6eb7a9a0
ZJS
30static bool arg_keep = false;
31
32static void test_non_empty(void) {
87d2c1ff
LP
33 dual_timestamp ts;
34 JournalFile *f;
35 struct iovec iovec;
3c1668da 36 static const char test[] = "TEST1=1", test2[] = "TEST2=2";
87d2c1ff 37 Object *o;
de190aef 38 uint64_t p;
95ea1b90 39 char t[] = "/tmp/journal-XXXXXX";
87d2c1ff
LP
40
41 log_set_max_level(LOG_DEBUG);
42
95ea1b90
LP
43 assert_se(mkdtemp(t));
44 assert_se(chdir(t) >= 0);
0ac38b70 45
57850536 46 assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f) == 0);
87d2c1ff
LP
47
48 dual_timestamp_get(&ts);
49
50 iovec.iov_base = (void*) test;
51 iovec.iov_len = strlen(test);
c2373f84 52 assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff
LP
53
54 iovec.iov_base = (void*) test2;
55 iovec.iov_len = strlen(test2);
c2373f84 56 assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff
LP
57
58 iovec.iov_base = (void*) test;
59 iovec.iov_len = strlen(test);
c2373f84 60 assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff 61
349cc4a5 62#if HAVE_GCRYPT
b0af6f41 63 journal_file_append_tag(f);
feb12d3e 64#endif
87d2c1ff
LP
65 journal_file_dump(f);
66
f534928a 67 assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
787784c4 68 assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff 69
f534928a 70 assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
787784c4 71 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 72
f534928a 73 assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
787784c4 74 assert_se(le64toh(o->entry.seqnum) == 3);
87d2c1ff 75
f534928a 76 assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 0);
87d2c1ff 77
f534928a 78 assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
787784c4 79 assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff 80
787784c4
RC
81 assert_se(journal_file_find_data_object(f, test, strlen(test), NULL, &p) == 1);
82 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
83 assert_se(le64toh(o->entry.seqnum) == 1);
de190aef 84
787784c4
RC
85 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
86 assert_se(le64toh(o->entry.seqnum) == 3);
de190aef 87
787784c4
RC
88 assert_se(journal_file_find_data_object(f, test2, strlen(test2), NULL, &p) == 1);
89 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
90 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 91
787784c4
RC
92 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
93 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 94
787784c4 95 assert_se(journal_file_find_data_object(f, "quux", 4, NULL, &p) == 0);
87d2c1ff 96
787784c4
RC
97 assert_se(journal_file_move_to_entry_by_seqnum(f, 1, DIRECTION_DOWN, &o, NULL) == 1);
98 assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff 99
787784c4
RC
100 assert_se(journal_file_move_to_entry_by_seqnum(f, 3, DIRECTION_DOWN, &o, NULL) == 1);
101 assert_se(le64toh(o->entry.seqnum) == 3);
87d2c1ff 102
787784c4
RC
103 assert_se(journal_file_move_to_entry_by_seqnum(f, 2, DIRECTION_DOWN, &o, NULL) == 1);
104 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 105
787784c4 106 assert_se(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0);
87d2c1ff 107
57850536
AG
108 journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
109 journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
0ac38b70 110
69a3a6fd 111 (void) journal_file_close(f);
87d2c1ff 112
6eb7a9a0
ZJS
113 log_info("Done...");
114
115 if (arg_keep)
116 log_info("Not removing %s", t);
117 else {
8580d1f7 118 journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
6eb7a9a0 119
c6878637 120 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
6eb7a9a0
ZJS
121 }
122
123 puts("------------------------------------------------------------");
124}
125
126static void test_empty(void) {
127 JournalFile *f1, *f2, *f3, *f4;
128 char t[] = "/tmp/journal-XXXXXX";
129
130 log_set_max_level(LOG_DEBUG);
0ac38b70 131
6eb7a9a0
ZJS
132 assert_se(mkdtemp(t));
133 assert_se(chdir(t) >= 0);
134
57850536 135 assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, false, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f1) == 0);
6eb7a9a0 136
57850536 137 assert_se(journal_file_open(-1, "test-compress.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f2) == 0);
6eb7a9a0 138
57850536 139 assert_se(journal_file_open(-1, "test-seal.journal", O_RDWR|O_CREAT, 0666, false, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f3) == 0);
6eb7a9a0 140
57850536 141 assert_se(journal_file_open(-1, "test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f4) == 0);
6eb7a9a0
ZJS
142
143 journal_file_print_header(f1);
144 puts("");
145 journal_file_print_header(f2);
146 puts("");
147 journal_file_print_header(f3);
148 puts("");
149 journal_file_print_header(f4);
150 puts("");
151
152 log_info("Done...");
153
154 if (arg_keep)
155 log_info("Not removing %s", t);
156 else {
8580d1f7 157 journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
6eb7a9a0 158
c6878637 159 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
6eb7a9a0 160 }
510b857f 161
69a3a6fd
VC
162 (void) journal_file_close(f1);
163 (void) journal_file_close(f2);
164 (void) journal_file_close(f3);
165 (void) journal_file_close(f4);
6eb7a9a0
ZJS
166}
167
57850536
AG
168#if HAVE_XZ || HAVE_LZ4
169static bool check_compressed(uint64_t compress_threshold, uint64_t data_size) {
170 dual_timestamp ts;
171 JournalFile *f;
172 struct iovec iovec;
173 Object *o;
174 uint64_t p;
175 char t[] = "/tmp/journal-XXXXXX";
176 char data[2048] = {0};
177 bool is_compressed;
178 int r;
179
180 assert_se(data_size <= sizeof(data));
181
182 log_set_max_level(LOG_DEBUG);
183
184 assert_se(mkdtemp(t));
185 assert_se(chdir(t) >= 0);
186
187 assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, compress_threshold, true, NULL, NULL, NULL, NULL, &f) == 0);
188
189 dual_timestamp_get(&ts);
190
191 iovec.iov_base = (void*) data;
192 iovec.iov_len = data_size;
193 assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
194
195#if HAVE_GCRYPT
196 journal_file_append_tag(f);
197#endif
198 journal_file_dump(f);
199
200 /* We have to partially reimplement some of the dump logic, because the normal next_entry does the
201 * decompression for us. */
202 p = le64toh(f->header->header_size);
203 while (true) {
204 r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &o);
205 assert_se(r == 0);
206 if (o->object.type == OBJECT_DATA)
207 break;
208
209 assert_se(p < le64toh(f->header->tail_object_offset));
210 p = p + ALIGN64(le64toh(o->object.size));
211 }
212
213 is_compressed = (o->object.flags & OBJECT_COMPRESSION_MASK) != 0;
214
215 (void) journal_file_close(f);
216
217 log_info("Done...");
218
219 if (arg_keep)
220 log_info("Not removing %s", t);
221 else {
222 journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
223
224 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
225 }
226
227 puts("------------------------------------------------------------");
228
229 return is_compressed;
230}
231
232static void test_min_compress_size(void) {
233 /* Note that XZ will actually fail to compress anything under 80 bytes, so you have to choose the limits
234 * carefully */
235
236 /* DEFAULT_MIN_COMPRESS_SIZE is 512 */
237 assert_se(!check_compressed((uint64_t) -1, 255));
238 assert_se(check_compressed((uint64_t) -1, 513));
239
240 /* compress everything */
241 assert_se(check_compressed(0, 96));
242 assert_se(check_compressed(8, 96));
243
244 /* Ensure we don't try to compress less than 8 bytes */
245 assert_se(!check_compressed(0, 7));
246
247 /* check boundary conditions */
248 assert_se(check_compressed(256, 256));
249 assert_se(!check_compressed(256, 255));
250}
251#endif
252
6eb7a9a0
ZJS
253int main(int argc, char *argv[]) {
254 arg_keep = argc > 1;
6ad1d1c3 255
143bfdaf
HHPF
256 /* journal_file_open requires a valid machine id */
257 if (access("/etc/machine-id", F_OK) != 0)
258 return EXIT_TEST_SKIP;
259
6eb7a9a0
ZJS
260 test_non_empty();
261 test_empty();
57850536
AG
262#if HAVE_XZ || HAVE_LZ4
263 test_min_compress_size();
264#endif
95ea1b90 265
87d2c1ff
LP
266 return 0;
267}