@@ -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