1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include "sd-journal.h"
8 #include "alloc-util.h"
9 #include "chattr-util.h"
10 #include "journal-file.h"
11 #include "journal-internal.h"
14 #include "parse-util.h"
21 static void verify_contents(sd_journal
*j
, unsigned skip
) {
27 SD_JOURNAL_FOREACH(j
) {
33 assert_se(sd_journal_get_cursor(j
, &k
) >= 0);
34 printf("cursor: %s\n", k
);
37 assert_se(sd_journal_get_data(j
, "MAGIC", &d
, &l
) >= 0);
38 printf("\t%.*s\n", (int) l
, (const char*) d
);
40 assert_se(sd_journal_get_data(j
, "NUMBER", &d
, &l
) >= 0);
41 assert_se(k
= strndup(d
, l
));
45 assert_se(safe_atou(k
+ 7, &u
) >= 0);
52 assert_se(sd_journal_get_cursor(j
, &c
) >= 0);
53 assert_se(sd_journal_test_cursor(j
, c
) > 0);
58 assert_se(i
== N_ENTRIES
);
61 static void run_test(void) {
62 JournalFile
*one
, *two
, *three
;
63 char t
[] = "/var/tmp/journal-stream-XXXXXX";
65 _cleanup_(sd_journal_closep
) sd_journal
*j
= NULL
;
69 dual_timestamp previous_ts
= DUAL_TIMESTAMP_NULL
;
71 assert_se(mkdtemp(t
));
72 assert_se(chdir(t
) >= 0);
73 (void) chattr_path(t
, FS_NOCOW_FL
, FS_NOCOW_FL
, NULL
);
75 assert_se(journal_file_open(-1, "one.journal", O_RDWR
|O_CREAT
, 0666, true, (uint64_t) -1, false, NULL
, NULL
, NULL
, NULL
, &one
) == 0);
76 assert_se(journal_file_open(-1, "two.journal", O_RDWR
|O_CREAT
, 0666, true, (uint64_t) -1, false, NULL
, NULL
, NULL
, NULL
, &two
) == 0);
77 assert_se(journal_file_open(-1, "three.journal", O_RDWR
|O_CREAT
, 0666, true, (uint64_t) -1, false, NULL
, NULL
, NULL
, NULL
, &three
) == 0);
79 for (i
= 0; i
< N_ENTRIES
; i
++) {
82 struct iovec iovec
[2];
84 dual_timestamp_get(&ts
);
86 if (ts
.monotonic
<= previous_ts
.monotonic
)
87 ts
.monotonic
= previous_ts
.monotonic
+ 1;
89 if (ts
.realtime
<= previous_ts
.realtime
)
90 ts
.realtime
= previous_ts
.realtime
+ 1;
94 assert_se(asprintf(&p
, "NUMBER=%u", i
) >= 0);
95 iovec
[0].iov_base
= p
;
96 iovec
[0].iov_len
= strlen(p
);
98 assert_se(asprintf(&q
, "MAGIC=%s", i
% 5 == 0 ? "quux" : "waldo") >= 0);
100 iovec
[1].iov_base
= q
;
101 iovec
[1].iov_len
= strlen(q
);
104 assert_se(journal_file_append_entry(three
, &ts
, NULL
, iovec
, 2, NULL
, NULL
, NULL
) == 0);
107 assert_se(journal_file_append_entry(two
, &ts
, NULL
, iovec
, 2, NULL
, NULL
, NULL
) == 0);
109 assert_se(journal_file_append_entry(one
, &ts
, NULL
, iovec
, 2, NULL
, NULL
, NULL
) == 0);
116 (void) journal_file_close(one
);
117 (void) journal_file_close(two
);
118 (void) journal_file_close(three
);
120 assert_se(sd_journal_open_directory(&j
, t
, 0) >= 0);
122 assert_se(sd_journal_add_match(j
, "MAGIC=quux", 0) >= 0);
123 SD_JOURNAL_FOREACH_BACKWARDS(j
) {
124 _cleanup_free_
char *c
;
126 assert_se(sd_journal_get_data(j
, "NUMBER", &data
, &l
) >= 0);
127 printf("\t%.*s\n", (int) l
, (const char*) data
);
129 assert_se(sd_journal_get_cursor(j
, &c
) >= 0);
130 assert_se(sd_journal_test_cursor(j
, c
) > 0);
133 SD_JOURNAL_FOREACH(j
) {
134 _cleanup_free_
char *c
;
136 assert_se(sd_journal_get_data(j
, "NUMBER", &data
, &l
) >= 0);
137 printf("\t%.*s\n", (int) l
, (const char*) data
);
139 assert_se(sd_journal_get_cursor(j
, &c
) >= 0);
140 assert_se(sd_journal_test_cursor(j
, c
) > 0);
143 sd_journal_flush_matches(j
);
145 verify_contents(j
, 1);
147 printf("NEXT TEST\n");
148 assert_se(sd_journal_add_match(j
, "MAGIC=quux", 0) >= 0);
150 assert_se(z
= journal_make_match_string(j
));
151 printf("resulting match expression is: %s\n", z
);
154 verify_contents(j
, 5);
156 printf("NEXT TEST\n");
157 sd_journal_flush_matches(j
);
158 assert_se(sd_journal_add_match(j
, "MAGIC=waldo", 0) >= 0);
159 assert_se(sd_journal_add_match(j
, "NUMBER=10", 0) >= 0);
160 assert_se(sd_journal_add_match(j
, "NUMBER=11", 0) >= 0);
161 assert_se(sd_journal_add_match(j
, "NUMBER=12", 0) >= 0);
163 assert_se(z
= journal_make_match_string(j
));
164 printf("resulting match expression is: %s\n", z
);
167 verify_contents(j
, 0);
169 assert_se(sd_journal_query_unique(j
, "NUMBER") >= 0);
170 SD_JOURNAL_FOREACH_UNIQUE(j
, data
, l
)
171 printf("%.*s\n", (int) l
, (const char*) data
);
173 assert_se(rm_rf(t
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
176 int main(int argc
, char *argv
[]) {
178 /* journal_file_open requires a valid machine id */
179 if (access("/etc/machine-id", F_OK
) != 0)
180 return log_tests_skipped("/etc/machine-id not found");
182 test_setup_logging(LOG_DEBUG
);
184 /* Run this test twice. Once with old hashing and once with new hashing */
185 assert_se(setenv("SYSTEMD_JOURNAL_KEYED_HASH", "1", 1) >= 0);
188 assert_se(setenv("SYSTEMD_JOURNAL_KEYED_HASH", "0", 1) >= 0);