]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/test-journal.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / journal / test-journal.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
87d2c1ff
LP
2
3#include <fcntl.h>
0ac38b70 4#include <unistd.h>
87d2c1ff 5
5cfa2c3d 6#include "io-util.h"
0284adc6 7#include "journal-authenticate.h"
cf0fbc49 8#include "journal-file.h"
0284adc6 9#include "journal-vacuum.h"
cf0fbc49
TA
10#include "log.h"
11#include "rm-rf.h"
317bb217 12#include "tests.h"
87d2c1ff 13
6eb7a9a0
ZJS
14static bool arg_keep = false;
15
16static void test_non_empty(void) {
87d2c1ff
LP
17 dual_timestamp ts;
18 JournalFile *f;
19 struct iovec iovec;
3c1668da 20 static const char test[] = "TEST1=1", test2[] = "TEST2=2";
87d2c1ff 21 Object *o;
de190aef 22 uint64_t p;
d180c349 23 sd_id128_t fake_boot_id;
95ea1b90 24 char t[] = "/tmp/journal-XXXXXX";
87d2c1ff 25
6d7c4033 26 test_setup_logging(LOG_DEBUG);
87d2c1ff 27
95ea1b90
LP
28 assert_se(mkdtemp(t));
29 assert_se(chdir(t) >= 0);
0ac38b70 30
57850536 31 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 32
d180c349
ZJS
33 assert_se(dual_timestamp_get(&ts));
34 assert_se(sd_id128_randomize(&fake_boot_id) == 0);
87d2c1ff 35
5cfa2c3d 36 iovec = IOVEC_MAKE_STRING(test);
d180c349 37 assert_se(journal_file_append_entry(f, &ts, NULL, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff 38
5cfa2c3d 39 iovec = IOVEC_MAKE_STRING(test2);
d180c349 40 assert_se(journal_file_append_entry(f, &ts, NULL, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff 41
5cfa2c3d 42 iovec = IOVEC_MAKE_STRING(test);
d180c349 43 assert_se(journal_file_append_entry(f, &ts, &fake_boot_id, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff 44
349cc4a5 45#if HAVE_GCRYPT
b0af6f41 46 journal_file_append_tag(f);
feb12d3e 47#endif
87d2c1ff
LP
48 journal_file_dump(f);
49
f534928a 50 assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
787784c4 51 assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff 52
f534928a 53 assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
787784c4 54 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 55
f534928a 56 assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
787784c4 57 assert_se(le64toh(o->entry.seqnum) == 3);
d180c349 58 assert_se(sd_id128_equal(o->entry.boot_id, fake_boot_id));
87d2c1ff 59
f534928a 60 assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 0);
87d2c1ff 61
f534928a 62 assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
787784c4 63 assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff 64
787784c4
RC
65 assert_se(journal_file_find_data_object(f, test, strlen(test), NULL, &p) == 1);
66 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
67 assert_se(le64toh(o->entry.seqnum) == 1);
de190aef 68
787784c4
RC
69 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
70 assert_se(le64toh(o->entry.seqnum) == 3);
de190aef 71
787784c4
RC
72 assert_se(journal_file_find_data_object(f, test2, strlen(test2), NULL, &p) == 1);
73 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
74 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 75
787784c4
RC
76 assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
77 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 78
787784c4 79 assert_se(journal_file_find_data_object(f, "quux", 4, NULL, &p) == 0);
87d2c1ff 80
787784c4
RC
81 assert_se(journal_file_move_to_entry_by_seqnum(f, 1, DIRECTION_DOWN, &o, NULL) == 1);
82 assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff 83
787784c4
RC
84 assert_se(journal_file_move_to_entry_by_seqnum(f, 3, DIRECTION_DOWN, &o, NULL) == 1);
85 assert_se(le64toh(o->entry.seqnum) == 3);
87d2c1ff 86
787784c4
RC
87 assert_se(journal_file_move_to_entry_by_seqnum(f, 2, DIRECTION_DOWN, &o, NULL) == 1);
88 assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff 89
787784c4 90 assert_se(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0);
87d2c1ff 91
57850536
AG
92 journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
93 journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
0ac38b70 94
69a3a6fd 95 (void) journal_file_close(f);
87d2c1ff 96
6eb7a9a0
ZJS
97 log_info("Done...");
98
99 if (arg_keep)
100 log_info("Not removing %s", t);
101 else {
8580d1f7 102 journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
6eb7a9a0 103
c6878637 104 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
6eb7a9a0
ZJS
105 }
106
107 puts("------------------------------------------------------------");
108}
109
110static void test_empty(void) {
111 JournalFile *f1, *f2, *f3, *f4;
112 char t[] = "/tmp/journal-XXXXXX";
113
6d7c4033 114 test_setup_logging(LOG_DEBUG);
0ac38b70 115
6eb7a9a0
ZJS
116 assert_se(mkdtemp(t));
117 assert_se(chdir(t) >= 0);
118
57850536 119 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 120
57850536 121 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 122
57850536 123 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 124
57850536 125 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
126
127 journal_file_print_header(f1);
128 puts("");
129 journal_file_print_header(f2);
130 puts("");
131 journal_file_print_header(f3);
132 puts("");
133 journal_file_print_header(f4);
134 puts("");
135
136 log_info("Done...");
137
138 if (arg_keep)
139 log_info("Not removing %s", t);
140 else {
8580d1f7 141 journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
6eb7a9a0 142
c6878637 143 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
6eb7a9a0 144 }
510b857f 145
69a3a6fd
VC
146 (void) journal_file_close(f1);
147 (void) journal_file_close(f2);
148 (void) journal_file_close(f3);
149 (void) journal_file_close(f4);
6eb7a9a0
ZJS
150}
151
57850536
AG
152#if HAVE_XZ || HAVE_LZ4
153static bool check_compressed(uint64_t compress_threshold, uint64_t data_size) {
154 dual_timestamp ts;
155 JournalFile *f;
156 struct iovec iovec;
157 Object *o;
158 uint64_t p;
159 char t[] = "/tmp/journal-XXXXXX";
160 char data[2048] = {0};
161 bool is_compressed;
162 int r;
163
164 assert_se(data_size <= sizeof(data));
165
6d7c4033 166 test_setup_logging(LOG_DEBUG);
57850536
AG
167
168 assert_se(mkdtemp(t));
169 assert_se(chdir(t) >= 0);
170
171 assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, compress_threshold, true, NULL, NULL, NULL, NULL, &f) == 0);
172
173 dual_timestamp_get(&ts);
174
5cfa2c3d 175 iovec = IOVEC_MAKE(data, data_size);
d180c349 176 assert_se(journal_file_append_entry(f, &ts, NULL, &iovec, 1, NULL, NULL, NULL) == 0);
57850536
AG
177
178#if HAVE_GCRYPT
179 journal_file_append_tag(f);
180#endif
181 journal_file_dump(f);
182
183 /* We have to partially reimplement some of the dump logic, because the normal next_entry does the
184 * decompression for us. */
185 p = le64toh(f->header->header_size);
d2f64682 186 for (;;) {
57850536
AG
187 r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &o);
188 assert_se(r == 0);
189 if (o->object.type == OBJECT_DATA)
190 break;
191
192 assert_se(p < le64toh(f->header->tail_object_offset));
193 p = p + ALIGN64(le64toh(o->object.size));
194 }
195
196 is_compressed = (o->object.flags & OBJECT_COMPRESSION_MASK) != 0;
197
198 (void) journal_file_close(f);
199
200 log_info("Done...");
201
202 if (arg_keep)
203 log_info("Not removing %s", t);
204 else {
205 journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
206
207 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
208 }
209
210 puts("------------------------------------------------------------");
211
212 return is_compressed;
213}
214
215static void test_min_compress_size(void) {
216 /* Note that XZ will actually fail to compress anything under 80 bytes, so you have to choose the limits
217 * carefully */
218
219 /* DEFAULT_MIN_COMPRESS_SIZE is 512 */
220 assert_se(!check_compressed((uint64_t) -1, 255));
221 assert_se(check_compressed((uint64_t) -1, 513));
222
223 /* compress everything */
224 assert_se(check_compressed(0, 96));
225 assert_se(check_compressed(8, 96));
226
227 /* Ensure we don't try to compress less than 8 bytes */
228 assert_se(!check_compressed(0, 7));
229
230 /* check boundary conditions */
231 assert_se(check_compressed(256, 256));
232 assert_se(!check_compressed(256, 255));
233}
234#endif
235
6eb7a9a0
ZJS
236int main(int argc, char *argv[]) {
237 arg_keep = argc > 1;
6ad1d1c3 238
6d7c4033
ZJS
239 test_setup_logging(LOG_INFO);
240
143bfdaf 241 /* journal_file_open requires a valid machine id */
317bb217
ZJS
242 if (access("/etc/machine-id", F_OK) != 0)
243 return log_tests_skipped("/etc/machine-id not found");
143bfdaf 244
6eb7a9a0
ZJS
245 test_non_empty();
246 test_empty();
57850536
AG
247#if HAVE_XZ || HAVE_LZ4
248 test_min_compress_size();
249#endif
95ea1b90 250
87d2c1ff
LP
251 return 0;
252}