chiark / gitweb /
coredump: don't expose the compression level as configuration option
[elogind.git] / src / journal / test-compress.c
index 15b3f9aa00b2f4b76be210e408f21272fff0890f..0806145d4bdc352dd2a44c8b618ea44b7f023ffc 100644 (file)
@@ -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;
 }