Skip to content

Commit a2915b3

Browse files
committed
test: add tar.gz test to tar unit test
1 parent 0747702 commit a2915b3

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

test/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,10 @@ set(OS_SOURCES
168168

169169
set(MOD_OBJECTS
170170
${INCLUDEOS_ROOT}/mod/http-parser/http_parser.c
171+
${INCLUDEOS_ROOT}/mod/uzlib/src/adler32.c
172+
${INCLUDEOS_ROOT}/mod/uzlib/src/crc32.c
173+
${INCLUDEOS_ROOT}/mod/uzlib/src/tinflate.c
174+
${INCLUDEOS_ROOT}/mod/uzlib/src/tinfgzip.c
171175
)
172176

173177
if(COVERAGE)
@@ -221,6 +225,8 @@ add_custom_command(
221225
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-single.tar ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
222226
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-multiple.tar ${CMAKE_CURRENT_SOURCE_DIR}/*.py
223227
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURRENT_BINARY_DIR}/test-invalid.tar
228+
COMMAND ${CMAKE_COMMAND} -E tar czf ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
229+
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-tar-gz-inside.tar ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz
224230
)
225231

226232
add_custom_target(

test/util/unit/tar_test.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,23 @@ CASE("Reading single entry tar file")
3333
EXPECT_NOT(fd == -1);
3434
const uint8_t *mem = (const uint8_t *)mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0);
3535
tar::Tar tar = r.read_uncompressed(mem, size);
36+
EXPECT(tar.num_elements() == 1);
3637
auto names = tar.element_names();
3738
EXPECT(names.size() == 1);
3839
const auto& elements = tar.elements();
3940
EXPECT(elements.size() == 1);
4041
const auto& e = elements.at(0);
4142
EXPECT_NOT(e.is_dir());
4243
EXPECT(e.typeflag_is_set());
44+
EXPECT(e.typeflag() == REGTYPE); // regular file
4345
EXPECT_NOT(e.is_empty());
4446
EXPECT(e.is_ustar());
4547
EXPECT_NOT(e.is_tar_gz());
4648
EXPECT(e.num_content_blocks() > 0);
4749
EXPECT(e.size() > 0);
4850
const auto& name = e.name();
4951
EXPECT(name.find("CMakeLists.txt") != std::string::npos);
52+
EXPECT_NO_THROW(auto& only_element = tar.element("../CMakeLists.txt"));
5053
EXPECT_THROWS_AS(auto& missing_element = tar.element("not_there.txt"), tar::Tar_exception);
5154
close(fd);
5255
}
@@ -84,3 +87,25 @@ CASE("Reading invalid tar file")
8487
EXPECT_THROWS_AS(tar::Tar tar = r.read_uncompressed(mem, size), tar::Tar_exception);
8588
close(fd);
8689
}
90+
91+
CASE("Reading tar.gz inside tar file")
92+
{
93+
tar::Reader r;
94+
struct stat st;
95+
int res = stat("test-tar-gz-inside.tar", &st);
96+
EXPECT(res != -1);
97+
size_t size = st.st_size;
98+
int fd = open("test-tar-gz-inside.tar", O_RDONLY);
99+
EXPECT_NOT(fd == -1);
100+
const uint8_t *mem = (const uint8_t *)mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0);
101+
tar::Tar tar = r.read_uncompressed(mem, size);
102+
EXPECT(tar.num_elements() == 1);
103+
const auto& e = tar.elements().at(0);
104+
EXPECT(e.is_tar_gz());
105+
EXPECT(e.name().find(".tar.gz") != std::string::npos);
106+
tar::Tar inner_tar = r.decompress(e);
107+
EXPECT(inner_tar.num_elements() == 1);
108+
const auto& inner_e = inner_tar.elements().at(0);
109+
EXPECT(inner_e.name().find(".tar.gz") == std::string::npos);
110+
close(fd);
111+
}

0 commit comments

Comments
 (0)