X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Ftest-compress.c;h=0806145d4bdc352dd2a44c8b618ea44b7f023ffc;hb=347272731e15d3c4a70fad7ccd7185e8e8059d01;hp=15b3f9aa00b2f4b76be210e408f21272fff0890f;hpb=843fecc076c8a58cda13e51362d145f7452db0e9;p=elogind.git diff --git a/src/journal/test-compress.c b/src/journal/test-compress.c index 15b3f9aa0..0806145d4 100644 --- a/src/journal/test-compress.c +++ b/src/journal/test-compress.c @@ -68,9 +68,63 @@ static void test_uncompress_startswith(void) { "barbarbar", 9, ' ')); } +static void test_compress_stream(const char *srcfile) { + _cleanup_close_ int src = -1, dst = -1, dst2 = -1; + char pattern[] = "/tmp/systemd-test.xz.XXXXXX", + pattern2[] = "/tmp/systemd-test.xz.XXXXXX"; + int r; + _cleanup_free_ char *cmd, *cmd2; + struct stat st = {}; + + log_debug("/* create source from %s */", srcfile); + + assert_se((src = open(srcfile, O_RDONLY|O_CLOEXEC)) >= 0); + + log_debug("/* test compression */"); + + assert_se((dst = mkostemp_safe(pattern, O_RDWR|O_CLOEXEC)) >= 0); + + r = compress_stream(src, dst, 1, -1); + assert(r == 0); + + assert_se(asprintf(&cmd, "xzcat %s | diff %s -", pattern, srcfile) > 0); + assert_se(system(cmd) == 0); + + log_debug("/* test decompression */"); + + assert_se((dst2 = mkostemp_safe(pattern2, O_RDWR|O_CLOEXEC)) >= 0); + + assert_se(stat(srcfile, &st) == 0); + + assert_se(lseek(dst, 0, SEEK_SET) == 0); + r = decompress_stream(dst, dst2, st.st_size); + assert(r == 0); + + assert_se(asprintf(&cmd2, "diff %s %s", srcfile, pattern2) > 0); + assert_se(system(cmd2) == 0); + + log_debug("/* test faulty decompression */"); + + assert_se(lseek(dst, 1, SEEK_SET) == 1); + r = decompress_stream(dst, dst2, st.st_size); + assert(r == -EBADMSG); + + assert_se(lseek(dst, 0, SEEK_SET) == 0); + assert_se(lseek(dst2, 0, SEEK_SET) == 0); + r = decompress_stream(dst, dst2, st.st_size - 1); + assert(r == -E2BIG); + + assert_se(unlink(pattern) == 0); + assert_se(unlink(pattern2) == 0); +} + int main(int argc, char *argv[]) { + + log_set_max_level(LOG_DEBUG); + test_compress_uncompress(); test_uncompress_startswith(); + test_compress_stream(argv[0]); return 0; }