diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-06-28 11:44:07 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-06-28 11:44:07 +0200 |
commit | 62c596a761d9a511bbf908de36e51dc76b5e3340 (patch) | |
tree | 674a704f35047b5bdc2646457ec8dd9fe6f766a5 /tests/tar_ustar.c | |
parent | 3d8415151b67ac1df1ecb370ad0ab9c808d004f0 (diff) |
Regroup tar format tests
Instead of having test cases per feature with multiple vendors, pack the
tests into test case per vendor with miltiple features.
This should make errors easier to find, since the code many vendor
extensions is closely related for all features.
E.g. breaking pax header parser is will now trigger the pax test case and
the others still work, vs all tests breaking because each feature test also
tries to read the pax version.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'tests/tar_ustar.c')
-rw-r--r-- | tests/tar_ustar.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/tests/tar_ustar.c b/tests/tar_ustar.c new file mode 100644 index 0000000..acd7097 --- /dev/null +++ b/tests/tar_ustar.c @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +#include "util.h" +#include "tar.h" + +#include <unistd.h> +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <stdio.h> + +#define STR(x) #x +#define STRVALUE(x) STR(x) + +#define TEST_PATH STRVALUE(TESTPATH) + +static int open_read(const char *path) +{ + int fd = open(path, O_RDONLY); + + if (fd < 0) { + perror(path); + exit(EXIT_FAILURE); + } + + return fd; +} + +static const char *filename = +"012345678901234567890123456789/012345678901234567890123456789/" +"012345678901234567890123456789/012345678901234567890123456789/" +"012345678901234567890123456789/input.txt"; + +int main(void) +{ + tar_header_decoded_t hdr; + char buffer[6]; + int fd; + + assert(chdir(TEST_PATH) == 0); + + fd = open_read("format-acceptance/ustar.tar"); + assert(read_header(fd, &hdr) == 0); + assert(hdr.sb.st_mode == (S_IFREG | 0644)); + assert(hdr.sb.st_uid == 01750); + assert(hdr.sb.st_gid == 01750); + assert(hdr.sb.st_size == 5); + assert(hdr.sb.st_mtime == 1542905892); + assert(hdr.sb.st_atime == 1542905892); + assert(hdr.sb.st_ctime == 1542905892); + assert(strcmp(hdr.name, "input.txt") == 0); + assert(!hdr.unknown_record); + assert(read_retry(fd, buffer, 5) == 5); + buffer[5] = '\0'; + assert(strcmp(buffer, "test\n") == 0); + clear_header(&hdr); + close(fd); + + fd = open_read("format-acceptance/ustar-pre-posix.tar"); + assert(read_header(fd, &hdr) == 0); + assert(hdr.sb.st_mode == (S_IFREG | 0644)); + assert(hdr.sb.st_uid == 01750); + assert(hdr.sb.st_gid == 01750); + assert(hdr.sb.st_size == 5); + assert(hdr.sb.st_mtime == 1542905892); + assert(hdr.sb.st_atime == 1542905892); + assert(hdr.sb.st_ctime == 1542905892); + assert(strcmp(hdr.name, "input.txt") == 0); + assert(!hdr.unknown_record); + assert(read_retry(fd, buffer, 5) == 5); + buffer[5] = '\0'; + assert(strcmp(buffer, "test\n") == 0); + clear_header(&hdr); + close(fd); + + fd = open_read("format-acceptance/v7.tar"); + assert(read_header(fd, &hdr) == 0); + assert(hdr.sb.st_mode == (S_IFREG | 0644)); + assert(hdr.sb.st_uid == 01750); + assert(hdr.sb.st_gid == 01750); + assert(hdr.sb.st_size == 5); + assert(hdr.sb.st_mtime == 1542905892); + assert(hdr.sb.st_atime == 1542905892); + assert(hdr.sb.st_ctime == 1542905892); + assert(strcmp(hdr.name, "input.txt") == 0); + assert(!hdr.unknown_record); + assert(read_retry(fd, buffer, 5) == 5); + buffer[5] = '\0'; + assert(strcmp(buffer, "test\n") == 0); + clear_header(&hdr); + close(fd); + + fd = open_read("file-size/12-digit.tar"); + assert(read_header(fd, &hdr) == 0); + assert(hdr.sb.st_mode == (S_IFREG | 0644)); + assert(hdr.sb.st_uid == 01750); + assert(hdr.sb.st_gid == 01750); + assert(hdr.sb.st_size == 8589934592); + assert(hdr.sb.st_mtime == 013375730126); + assert(hdr.sb.st_atime == 013375730126); + assert(hdr.sb.st_ctime == 013375730126); + assert(strcmp(hdr.name, "big-file.bin") == 0); + assert(!hdr.unknown_record); + clear_header(&hdr); + close(fd); + + fd = open_read("user-group-largenum/8-digit.tar"); + assert(read_header(fd, &hdr) == 0); + assert(hdr.sb.st_mode == (S_IFREG | 0644)); + assert(hdr.sb.st_uid == 8388608); + assert(hdr.sb.st_gid == 8388608); + assert(hdr.sb.st_size == 5); + assert(hdr.sb.st_mtime == 013376036700); + assert(hdr.sb.st_atime == 013376036700); + assert(hdr.sb.st_ctime == 013376036700); + assert(strcmp(hdr.name, "input.txt") == 0); + assert(!hdr.unknown_record); + assert(read_retry(fd, buffer, 5) == 5); + buffer[5] = '\0'; + assert(strcmp(buffer, "test\n") == 0); + clear_header(&hdr); + close(fd); + + fd = open_read("large-mtime/12-digit.tar"); + assert(read_header(fd, &hdr) == 0); + assert(hdr.sb.st_mode == (S_IFREG | 0644)); + assert(hdr.sb.st_uid == 01750); + assert(hdr.sb.st_gid == 01750); + assert(hdr.sb.st_size == 5); + assert(hdr.sb.st_mtime == 8589934592); + assert(hdr.sb.st_atime == 8589934592); + assert(hdr.sb.st_ctime == 8589934592); + assert(strcmp(hdr.name, "input.txt") == 0); + assert(!hdr.unknown_record); + assert(read_retry(fd, buffer, 5) == 5); + buffer[5] = '\0'; + assert(strcmp(buffer, "test\n") == 0); + clear_header(&hdr); + close(fd); + + fd = open_read("long-paths/ustar.tar"); + assert(read_header(fd, &hdr) == 0); + assert(hdr.sb.st_mode == (S_IFREG | 0644)); + assert(hdr.sb.st_uid == 01750); + assert(hdr.sb.st_gid == 01750); + assert(hdr.sb.st_size == 5); + assert(hdr.sb.st_mtime == 1542909670); + assert(hdr.sb.st_atime == 1542909670); + assert(hdr.sb.st_ctime == 1542909670); + assert(strcmp(hdr.name, filename) == 0); + assert(!hdr.unknown_record); + assert(read_retry(fd, buffer, 5) == 5); + buffer[5] = '\0'; + assert(strcmp(buffer, "test\n") == 0); + clear_header(&hdr); + close(fd); + + return EXIT_SUCCESS; +} |