test: add tests for journal_find_boot_by_offset() and friends

This commit is contained in:
Yu Watanabe
2023-09-26 13:26:22 +09:00
parent 0141b2143d
commit 7c1784db83
+102 -32
View File
@@ -11,6 +11,7 @@
#include "io-util.h"
#include "journal-vacuum.h"
#include "log.h"
#include "logs-show.h"
#include "managed-journal-file.h"
#include "parse-util.h"
#include "rm-rf.h"
@@ -48,11 +49,12 @@ static void test_close(ManagedJournalFile *f) {
(void) managed_journal_file_close(f);
}
static void append_number(ManagedJournalFile *f, int n, uint64_t *seqnum) {
char *p;
static void append_number(ManagedJournalFile *f, int n, const sd_id128_t *boot_id, uint64_t *seqnum) {
_cleanup_free_ char *p = NULL, *q = NULL;
dual_timestamp ts;
static dual_timestamp previous_ts = {};
struct iovec iovec[1];
struct iovec iovec[2];
size_t n_iov = 0;
dual_timestamp_get(&ts);
@@ -65,20 +67,27 @@ static void append_number(ManagedJournalFile *f, int n, uint64_t *seqnum) {
previous_ts = ts;
assert_se(asprintf(&p, "NUMBER=%d", n) >= 0);
iovec[0] = IOVEC_MAKE_STRING(p);
assert_ret(journal_file_append_entry(f->file, &ts, NULL, iovec, 1, seqnum, NULL, NULL, NULL));
free(p);
iovec[n_iov++] = IOVEC_MAKE_STRING(p);
if (boot_id) {
assert_se(q = strjoin("_BOOT_ID=", SD_ID128_TO_STRING(*boot_id)));
iovec[n_iov++] = IOVEC_MAKE_STRING(q);
}
assert_ret(journal_file_append_entry(f->file, &ts, boot_id, iovec, n_iov, seqnum, NULL, NULL, NULL));
}
static void test_check_number(sd_journal *j, int n) {
sd_id128_t boot_id;
const void *d;
_cleanup_free_ char *k = NULL;
size_t l;
int x;
assert_se(sd_journal_get_monotonic_usec(j, NULL, &boot_id) >= 0);
assert_ret(sd_journal_get_data(j, "NUMBER", &d, &l));
assert_se(k = strndup(d, l));
printf("%s (expected=%i)\n", k, n);
printf("%s %s (expected=%i)\n", SD_ID128_TO_STRING(boot_id), k, n);
assert_se(safe_atoi(k + STRLEN("NUMBER="), &x) >= 0);
assert_se(n == x);
@@ -114,19 +123,26 @@ static void test_check_numbers_up(sd_journal *j, int count) {
static void setup_sequential(void) {
ManagedJournalFile *f1, *f2, *f3;
sd_id128_t id;
f1 = test_open("one.journal");
f2 = test_open("two.journal");
f3 = test_open("three.journal");
append_number(f1, 1, NULL);
append_number(f1, 2, NULL);
append_number(f1, 3, NULL);
append_number(f2, 4, NULL);
append_number(f2, 5, NULL);
append_number(f2, 6, NULL);
append_number(f3, 7, NULL);
append_number(f3, 8, NULL);
append_number(f3, 9, NULL);
assert_se(sd_id128_randomize(&id) >= 0);
log_info("boot_id: %s", SD_ID128_TO_STRING(id));
append_number(f1, 1, &id, NULL);
append_number(f1, 2, &id, NULL);
append_number(f1, 3, &id, NULL);
append_number(f2, 4, &id, NULL);
assert_se(sd_id128_randomize(&id) >= 0);
log_info("boot_id: %s", SD_ID128_TO_STRING(id));
append_number(f2, 5, &id, NULL);
append_number(f2, 6, &id, NULL);
append_number(f3, 7, &id, NULL);
append_number(f3, 8, &id, NULL);
assert_se(sd_id128_randomize(&id) >= 0);
log_info("boot_id: %s", SD_ID128_TO_STRING(id));
append_number(f3, 9, &id, NULL);
test_close(f1);
test_close(f2);
test_close(f3);
@@ -134,19 +150,22 @@ static void setup_sequential(void) {
static void setup_interleaved(void) {
ManagedJournalFile *f1, *f2, *f3;
sd_id128_t id;
f1 = test_open("one.journal");
f2 = test_open("two.journal");
f3 = test_open("three.journal");
append_number(f1, 1, NULL);
append_number(f2, 2, NULL);
append_number(f3, 3, NULL);
append_number(f1, 4, NULL);
append_number(f2, 5, NULL);
append_number(f3, 6, NULL);
append_number(f1, 7, NULL);
append_number(f2, 8, NULL);
append_number(f3, 9, NULL);
assert_se(sd_id128_randomize(&id) >= 0);
log_info("boot_id: %s", SD_ID128_TO_STRING(id));
append_number(f1, 1, &id, NULL);
append_number(f2, 2, &id, NULL);
append_number(f3, 3, &id, NULL);
append_number(f1, 4, &id, NULL);
append_number(f2, 5, &id, NULL);
append_number(f3, 6, &id, NULL);
append_number(f1, 7, &id, NULL);
append_number(f2, 8, &id, NULL);
append_number(f3, 9, &id, NULL);
test_close(f1);
test_close(f2);
test_close(f3);
@@ -320,6 +339,57 @@ TEST(skip) {
test_skip_one(setup_interleaved);
}
static void test_boot_id_one(void (*setup)(void), size_t n_boots_expected) {
char t[] = "/var/tmp/journal-boot-id-XXXXXX";
sd_journal *j;
_cleanup_free_ BootId *boots = NULL;
size_t n_boots;
mkdtemp_chdir_chattr(t);
setup();
assert_ret(sd_journal_open_directory(&j, t, 0));
assert_se(journal_get_boots(j, &boots, &n_boots) >= 0);
assert_se(boots);
assert_se(n_boots == n_boots_expected);
sd_journal_close(j);
FOREACH_ARRAY(b, boots, n_boots) {
assert_ret(sd_journal_open_directory(&j, t, 0));
assert_se(journal_find_boot_by_id(j, b->id) == 1);
sd_journal_close(j);
}
for (int i = - (int) n_boots + 1; i <= (int) n_boots; i++) {
sd_id128_t id;
assert_ret(sd_journal_open_directory(&j, t, 0));
assert_se(journal_find_boot_by_offset(j, i, &id) == 1);
if (i <= 0)
assert_se(sd_id128_equal(id, boots[n_boots + i - 1].id));
else
assert_se(sd_id128_equal(id, boots[i - 1].id));
sd_journal_close(j);
}
log_info("Done...");
if (arg_keep)
log_info("Not removing %s", t);
else {
journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
}
puts("------------------------------------------------------------");
}
TEST(boot_id) {
test_boot_id_one(setup_sequential, 3);
}
static void test_sequence_numbers_one(void) {
_cleanup_(mmap_cache_unrefp) MMapCache *m = NULL;
char t[] = "/var/tmp/journal-seq-XXXXXX";
@@ -335,10 +405,10 @@ static void test_sequence_numbers_one(void) {
assert_se(managed_journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, JOURNAL_COMPRESS, 0644,
UINT64_MAX, NULL, m, NULL, NULL, &one) == 0);
append_number(one, 1, &seqnum);
append_number(one, 1, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 1);
append_number(one, 2, &seqnum);
append_number(one, 2, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 2);
@@ -358,10 +428,10 @@ static void test_sequence_numbers_one(void) {
assert_se(sd_id128_is_null(two->file->header->tail_entry_boot_id)); /* Not written yet. */
assert_se(sd_id128_equal(two->file->header->seqnum_id, one->file->header->seqnum_id));
append_number(two, 3, &seqnum);
append_number(two, 3, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 3);
append_number(two, 4, &seqnum);
append_number(two, 4, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 4);
@@ -370,11 +440,11 @@ static void test_sequence_numbers_one(void) {
test_close(two);
append_number(one, 5, &seqnum);
append_number(one, 5, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 5);
append_number(one, 6, &seqnum);
append_number(one, 6, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 6);
@@ -391,7 +461,7 @@ static void test_sequence_numbers_one(void) {
assert_se(sd_id128_equal(two->file->header->seqnum_id, seqnum_id));
append_number(two, 7, &seqnum);
append_number(two, 7, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 5);