# -*- Autotest -*- AT_BANNER([compress]) m4_define([AT_TESTFUN_DECOMPRESS], [AT_TESTFUN([$1-decompression], [[#include "testsuite.h" #include #define BASE64 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #define PLAIN_CHUNKS (2*1024+3*64) TS_MAIN { int pipes[2]; pipe(pipes); char *compressedfilename = NULL; int r = asprintf(&compressedfilename, "/tmp/libreport-attest-compress.%d.$1", getpid()); if (r < 0) err(EXIT_FAILURE, "compressed file name"); pid_t child = fork(); if (child < 0) err(EXIT_FAILURE, "fork"); if (child == 0) { close(pipes[1]); close(STDIN_FILENO); if (dup2(pipes[0], STDIN_FILENO) < 0) err(EXIT_FAILURE, "dup2(pipes[0], STDIN_FILENO)"); unlink(compressedfilename); int compressedfd = open(compressedfilename, O_WRONLY | O_CREAT | O_EXCL, 0440); if (compressedfd < 0) err(EXIT_FAILURE, "open(%s, O_WRONLY, O_CREAT | O_EXCL)", compressedfilename); close(STDOUT_FILENO); if (dup2(compressedfd, STDOUT_FILENO) < 0) err(EXIT_FAILURE, "dup2(compressedfd, STDOUT_FILENO)"); execlp("$1", "$1", "-z", "-", NULL); err(EXIT_FAILURE, "execlp('$1 - %s')", compressedfilename); } close(pipes[0]); for (size_t i = 0; i < PLAIN_CHUNKS; ++i) { const int wrote = safe_write(pipes[1], BASE64, sizeof(BASE64) - 1); if (wrote != sizeof(BASE64) - 1) err(EXIT_FAILURE, "Failed to write to temp file"); } close(pipes[1]); int status = 0; r = waitpid(child, &status, 0); if (r < 0) err(EXIT_FAILURE, "waitpid($1) failed"); if (WIFSIGNALED(status)) errx(EXIT_FAILURE, "$1 signaled with %d", WTERMSIG(r)); if (!WIFEXITED(status)) errx(EXIT_FAILURE, "Unhandled child status"); if (WEXITSTATUS(status) != 0) errx(EXIT_FAILURE, "$1 exited with %d", WEXITSTATUS(r)); char plainfilename[] = "/tmp/libreport-attest-compress-plain.XXXXXX"; int fdo = mkstemp(plainfilename); if (fdo < 0) err(EXIT_FAILURE, "Failed to create temporary file"); int fdi = open(compressedfilename, O_RDONLY | O_NOFOLLOW); if (fdi < 0) err(EXIT_FAILURE, "Failed to open compressed file %s", compressedfilename); TS_ASSERT_FUNCTION(decompress_fd(fdi, fdo)); close(fdi); if (0 > lseek(fdo, 0L, SEEK_SET)) err(EXIT_FAILURE, "failed to seek decompressed %s", plainfilename); int c = 0; size_t sz = 0; char buf[sizeof(BASE64)]; while ((r = safe_read(fdo, buf, sizeof(BASE64) - 1)) != EOF && r != 0) { c++; sz += r; buf[r] = '\0'; long old_failures = g_testsuite_fails; TS_ASSERT_STRING_EQ(buf, BASE64, "Base64 decompressed chunk"); if (old_failures != g_testsuite_fails) break; } close(fdo); TS_ASSERT_SIGNED_EQ(c, PLAIN_CHUNKS); TS_ASSERT_SIGNED_EQ(sz, PLAIN_CHUNKS * (sizeof(BASE64)-1)); if (g_testsuite_fails == 0) { unlink(compressedfilename); unlink(plainfilename); } else { fprintf(stderr, "Compressed : %s\n", compressedfilename); fprintf(stderr, "Decompressed : %s\n", plainfilename); } free(compressedfilename); } TS_RETURN_MAIN ]]) ]) ## --- ## ## LZ4 ## ## --- ## AT_TESTFUN_DECOMPRESS([lz4]) ## -- ## ## XZ ## ## -- ## AT_TESTFUN_DECOMPRESS([xz])