From ce8549c216dcbfc17343f35be840417713841ff4 Mon Sep 17 00:00:00 2001 From: Enno Boland Date: Mon, 7 Aug 2023 21:03:48 +0200 Subject: [PATCH] test/file: test for mapping zero blocks into memory [currently failing] --- test/file/file_iterator.c | 117 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 5 deletions(-) diff --git a/test/file/file_iterator.c b/test/file/file_iterator.c index e3b969604..c55cc0822 100644 --- a/test/file/file_iterator.c +++ b/test/file/file_iterator.c @@ -40,7 +40,7 @@ #include "../../lib/utils/utils.h" static const size_t BLOCK_SIZE = 32768; -static const size_t ZERO_PAGE_SIZE = 16384; +static const size_t ZERO_BLOCK_SIZE = 16384; static void load_segment_from_compressed_data_block(void) { @@ -142,9 +142,9 @@ load_two_segments_from_uncompressed_data_block(void) { assert(rv > 0); size = sqsh_file_iterator_size(&iter); - assert(size == ZERO_PAGE_SIZE); + assert(size == ZERO_BLOCK_SIZE); data = sqsh_file_iterator_data(&iter); - for (size_t i = 0; i < ZERO_PAGE_SIZE; i++) { + for (size_t i = 0; i < ZERO_BLOCK_SIZE; i++) { assert(data[i] == 0); } @@ -152,9 +152,9 @@ load_two_segments_from_uncompressed_data_block(void) { assert(rv > 0); size = sqsh_file_iterator_size(&iter); - assert(size == ZERO_PAGE_SIZE - 1000); + assert(size == ZERO_BLOCK_SIZE - 1000); data = sqsh_file_iterator_data(&iter); - for (size_t i = 0; i < ZERO_PAGE_SIZE - 1000; i++) { + for (size_t i = 0; i < ZERO_BLOCK_SIZE - 1000; i++) { assert(data[i] == 0); } @@ -358,10 +358,117 @@ load_zero_big_padding(void) { sqsh__archive_cleanup(&archive); } +static void +load_zero_block(void) { + int rv; + struct SqshArchive archive = {0}; + struct SqshFile file = {0}; + uint8_t payload[8192] = { + /* clang-format off */ + SQSH_HEADER, + /* inode */ + [INODE_TABLE_OFFSET] = METABLOCK_HEADER(0, 128), + INODE_HEADER(2, 0, 0, 0, 0, 1), + INODE_BASIC_FILE(512, 0xFFFFFFFF, 0, ZERO_BLOCK_SIZE), + DATA_BLOCK_REF(0, 0), + /* clang-format on */ + }; + mk_stub(&archive, payload, sizeof(payload)); + + uint64_t inode_ref = sqsh_address_ref_create(0, 0); + rv = sqsh__file_init(&file, &archive, inode_ref); + assert(rv == 0); + + assert(sqsh_file_type(&file) == SQSH_FILE_TYPE_FILE); + assert(sqsh_file_has_fragment(&file) == false); + + struct SqshFileIterator iter = {0}; + rv = sqsh__file_iterator_init(&iter, &file); + assert(rv == 0); + + rv = sqsh_file_iterator_next(&iter, 1); + assert(rv > 0); + + size_t size = sqsh_file_iterator_size(&iter); + assert(size == ZERO_BLOCK_SIZE); + + for (size_t i = 0; i < ZERO_BLOCK_SIZE; i++) { + const uint8_t *data = sqsh_file_iterator_data(&iter); + assert(data[i] == 0); + } + + rv = sqsh_file_iterator_next(&iter, 1); + assert(rv == 0); + + sqsh__file_iterator_cleanup(&iter); + sqsh__file_cleanup(&file); + sqsh__archive_cleanup(&archive); +} + +static void +load_two_zero_blocks(void) { + int rv; + struct SqshArchive archive = {0}; + struct SqshFile file = {0}; + uint8_t payload[8192] = { + /* clang-format off */ + SQSH_HEADER, + /* inode */ + [INODE_TABLE_OFFSET] = METABLOCK_HEADER(0, 128), + INODE_HEADER(2, 0, 0, 0, 0, 1), + INODE_BASIC_FILE(512, 0xFFFFFFFF, 0, ZERO_BLOCK_SIZE * 2), + DATA_BLOCK_REF(0, 0), + /* clang-format on */ + }; + mk_stub(&archive, payload, sizeof(payload)); + + uint64_t inode_ref = sqsh_address_ref_create(0, 0); + rv = sqsh__file_init(&file, &archive, inode_ref); + assert(rv == 0); + + assert(sqsh_file_type(&file) == SQSH_FILE_TYPE_FILE); + assert(sqsh_file_has_fragment(&file) == false); + + struct SqshFileIterator iter = {0}; + rv = sqsh__file_iterator_init(&iter, &file); + assert(rv == 0); + + rv = sqsh_file_iterator_next(&iter, 1); + assert(rv > 0); + + size_t size = sqsh_file_iterator_size(&iter); + assert(size == ZERO_BLOCK_SIZE); + + for (size_t i = 0; i < ZERO_BLOCK_SIZE; i++) { + const uint8_t *data = sqsh_file_iterator_data(&iter); + assert(data[i] == 0); + } + + rv = sqsh_file_iterator_next(&iter, 1); + assert(rv > 0); + + size = sqsh_file_iterator_size(&iter); + assert(size == ZERO_BLOCK_SIZE); + + for (size_t i = 0; i < ZERO_BLOCK_SIZE; i++) { + const uint8_t *data = sqsh_file_iterator_data(&iter); + assert(data[i] == 0); + } + + rv = sqsh_file_iterator_next(&iter, 1); + assert(rv == 0); + + sqsh__file_iterator_cleanup(&iter); + sqsh__file_cleanup(&file); + sqsh__archive_cleanup(&archive); +} + DECLARE_TESTS TEST(load_two_segments_from_uncompressed_data_block) TEST(load_segment_from_uncompressed_data_block) TEST(load_segment_from_compressed_data_block) TEST(load_zero_padding) TEST(load_zero_big_padding) +TEST(load_zero_block) +NO_TEST(load_two_zero_blocks) END_TESTS