diff --git a/tests/journal.c b/tests/journal.c index e8a627f15724b7e0046be0166bd7fd1264569722..1592624535a272b07d039f1aef534f2d939c7bcb 100644 --- a/tests/journal.c +++ b/tests/journal.c @@ -35,6 +35,35 @@ static int randstr(char* dst, size_t len) return 0; } +/*! \brief Journal fillup test with size check. */ +static void test_fillup(journal_t *journal, int fsize, const char *note) +{ + const int chunk = 512 + rand() % 512; + int ret = KNOT_EOK; + char *mptr = NULL; + size_t large_entry_len = chunk * 1024; + char *large_entry = malloc(chunk * 1024); + assert(large_entry); + randstr(large_entry, large_entry_len); + for (int i = 0; i < chunk; ++i) { + uint64_t chk_key = (uint64_t)journal + i; + ret = journal_map(journal, chk_key, &mptr, large_entry_len, false); + if (ret != KNOT_EOK) { + break; + } + + memcpy(mptr, large_entry, large_entry_len); + journal_unmap(journal, chk_key, mptr, 1); + } + is_int(KNOT_EBUSY, ret, "journal: %s fillup", note); + free(large_entry); + + /* Check file size. */ + struct stat st; + fstat(journal->fd, &st); + ok(st.st_size < fsize + large_entry_len, "journal: %s fillup file size check", note); +} + int main(int argc, char *argv[]) { plan_lazy(); @@ -96,10 +125,9 @@ int main(int argc, char *argv[]) is_int(KNOT_EOK, ret, "journal: data integrity check after close/open"); /* Write random data. */ - ret = 0; - uint64_t tskey = 0xDEAD0000; + ret = KNOT_EOK; for (int i = 0; i < 512; ++i) { - chk_key = tskey + i; + chk_key = 0xDEAD0000 + i; ret = journal_map(journal, chk_key, &mptr, sizeof(chk_buf), false); if (ret != KNOT_EOK) { diag("journal_map failed: %s", knot_strerror(ret)); @@ -118,27 +146,17 @@ int main(int argc, char *argv[]) is_int(KNOT_ESPACE, ret, "journal: overfill"); /* Fillup */ - tskey = 0xBEEF0000; - size_t large_entry_len = 512 * 1024; - char *large_entry = malloc(512 * 1024); - assert(large_entry); - randstr(large_entry, large_entry_len); - for (int i = 0; i < 512; ++i) { - chk_key = tskey + i; - ret = journal_map(journal, chk_key, &mptr, large_entry_len, false); - if (ret != KNOT_EOK) { - break; - } - - journal_unmap(journal, chk_key, mptr, 1); - } - is_int(KNOT_EBUSY, ret, "journal: fillup"); - free(large_entry); - - /* Check file size. */ - struct stat st; - stat(journal->path, &st); - ok(st.st_size < fsize + large_entry_len, "journal: fillup file size check"); + test_fillup(journal, fsize, "iter#1"); + + /* Journal flush + refill. */ + journal_close(journal); + ret = journal_mark_synced(jfilename); + is_int(KNOT_EOK, ret, "journal: flush after fillup"); + journal = journal_open(jfilename, fsize); + ok(journal != NULL, "journal: reopen after flush"); + + /* Fillup */ + test_fillup(journal, fsize, "iter#2"); /* Close journal. */ journal_close(journal);