Index: xz/tests/test_block_header.c |
=================================================================== |
--- xz/tests/test_block_header.c (revision 0) |
+++ xz/tests/test_block_header.c (revision 0) |
@@ -0,0 +1,240 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \file test_block_header.c |
+/// \brief Tests Block Header coders |
+// |
+// Author: Lasse Collin |
+// |
+// This file has been put into the public domain. |
+// You can do whatever you want with this file. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+#include "tests.h" |
+ |
+ |
+static uint8_t buf[LZMA_BLOCK_HEADER_SIZE_MAX]; |
+static lzma_block known_options; |
+static lzma_block decoded_options; |
+ |
+static lzma_options_lzma opt_lzma; |
+ |
+static lzma_filter filters_none[1] = { |
+ { |
+ .id = LZMA_VLI_UNKNOWN, |
+ }, |
+}; |
+ |
+ |
+static lzma_filter filters_one[2] = { |
+ { |
+ .id = LZMA_FILTER_LZMA2, |
+ .options = &opt_lzma, |
+ }, { |
+ .id = LZMA_VLI_UNKNOWN, |
+ } |
+}; |
+ |
+ |
+static lzma_filter filters_four[5] = { |
+ { |
+ .id = LZMA_FILTER_X86, |
+ .options = NULL, |
+ }, { |
+ .id = LZMA_FILTER_X86, |
+ .options = NULL, |
+ }, { |
+ .id = LZMA_FILTER_X86, |
+ .options = NULL, |
+ }, { |
+ .id = LZMA_FILTER_LZMA2, |
+ .options = &opt_lzma, |
+ }, { |
+ .id = LZMA_VLI_UNKNOWN, |
+ } |
+}; |
+ |
+ |
+static lzma_filter filters_five[6] = { |
+ { |
+ .id = LZMA_FILTER_X86, |
+ .options = NULL, |
+ }, { |
+ .id = LZMA_FILTER_X86, |
+ .options = NULL, |
+ }, { |
+ .id = LZMA_FILTER_X86, |
+ .options = NULL, |
+ }, { |
+ .id = LZMA_FILTER_X86, |
+ .options = NULL, |
+ }, { |
+ .id = LZMA_FILTER_LZMA2, |
+ .options = &opt_lzma, |
+ }, { |
+ .id = LZMA_VLI_UNKNOWN, |
+ } |
+}; |
+ |
+ |
+static void |
+code(void) |
+{ |
+ expect(lzma_block_header_encode(&known_options, buf) == LZMA_OK); |
+ |
+ lzma_filter filters[LZMA_FILTERS_MAX + 1]; |
+ memcrap(filters, sizeof(filters)); |
+ memcrap(&decoded_options, sizeof(decoded_options)); |
+ |
+ decoded_options.header_size = known_options.header_size; |
+ decoded_options.check = known_options.check; |
+ decoded_options.filters = filters; |
+ expect(lzma_block_header_decode(&decoded_options, NULL, buf) |
+ == LZMA_OK); |
+ |
+ expect(known_options.compressed_size |
+ == decoded_options.compressed_size); |
+ expect(known_options.uncompressed_size |
+ == decoded_options.uncompressed_size); |
+ |
+ for (size_t i = 0; known_options.filters[i].id |
+ != LZMA_VLI_UNKNOWN; ++i) |
+ expect(known_options.filters[i].id == filters[i].id); |
+ |
+ for (size_t i = 0; i < LZMA_FILTERS_MAX; ++i) |
+ free(decoded_options.filters[i].options); |
+} |
+ |
+ |
+static void |
+test1(void) |
+{ |
+ known_options = (lzma_block){ |
+ .check = LZMA_CHECK_NONE, |
+ .compressed_size = LZMA_VLI_UNKNOWN, |
+ .uncompressed_size = LZMA_VLI_UNKNOWN, |
+ .filters = NULL, |
+ }; |
+ |
+ expect(lzma_block_header_size(&known_options) == LZMA_PROG_ERROR); |
+ |
+ known_options.filters = filters_none; |
+ expect(lzma_block_header_size(&known_options) == LZMA_PROG_ERROR); |
+ |
+ known_options.filters = filters_five; |
+ expect(lzma_block_header_size(&known_options) == LZMA_PROG_ERROR); |
+ |
+ known_options.filters = filters_one; |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ |
+ known_options.check = 999; // Some invalid value, which gets ignored. |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ |
+ known_options.compressed_size = 5; |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ |
+ known_options.compressed_size = 0; // Cannot be zero. |
+ expect(lzma_block_header_size(&known_options) == LZMA_PROG_ERROR); |
+ |
+ // LZMA_VLI_MAX is too big to keep the total size of the Block |
+ // a valid VLI, but lzma_block_header_size() is not meant |
+ // to validate it. (lzma_block_header_encode() must validate it.) |
+ known_options.compressed_size = LZMA_VLI_MAX; |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ |
+ known_options.compressed_size = LZMA_VLI_UNKNOWN; |
+ known_options.uncompressed_size = 0; |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ |
+ known_options.uncompressed_size = LZMA_VLI_MAX + 1; |
+ expect(lzma_block_header_size(&known_options) == LZMA_PROG_ERROR); |
+} |
+ |
+ |
+static void |
+test2(void) |
+{ |
+ known_options = (lzma_block){ |
+ .check = LZMA_CHECK_CRC32, |
+ .compressed_size = LZMA_VLI_UNKNOWN, |
+ .uncompressed_size = LZMA_VLI_UNKNOWN, |
+ .filters = filters_four, |
+ }; |
+ |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ code(); |
+ |
+ known_options.compressed_size = 123456; |
+ known_options.uncompressed_size = 234567; |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ code(); |
+ |
+ // We can make the sizes smaller while keeping the header size |
+ // the same. |
+ known_options.compressed_size = 12; |
+ known_options.uncompressed_size = 23; |
+ code(); |
+} |
+ |
+ |
+static void |
+test3(void) |
+{ |
+ known_options = (lzma_block){ |
+ .check = LZMA_CHECK_CRC32, |
+ .compressed_size = LZMA_VLI_UNKNOWN, |
+ .uncompressed_size = LZMA_VLI_UNKNOWN, |
+ .filters = filters_one, |
+ }; |
+ |
+ expect(lzma_block_header_size(&known_options) == LZMA_OK); |
+ known_options.header_size += 4; |
+ expect(lzma_block_header_encode(&known_options, buf) == LZMA_OK); |
+ |
+ lzma_filter filters[LZMA_FILTERS_MAX + 1]; |
+ decoded_options.header_size = known_options.header_size; |
+ decoded_options.check = known_options.check; |
+ decoded_options.filters = filters; |
+ |
+ // Wrong size |
+ ++buf[0]; |
+ expect(lzma_block_header_decode(&decoded_options, NULL, buf) |
+ == LZMA_PROG_ERROR); |
+ --buf[0]; |
+ |
+ // Wrong CRC32 |
+ buf[known_options.header_size - 1] ^= 1; |
+ expect(lzma_block_header_decode(&decoded_options, NULL, buf) |
+ == LZMA_DATA_ERROR); |
+ buf[known_options.header_size - 1] ^= 1; |
+ |
+ // Unsupported filter |
+ // NOTE: This may need updating when new IDs become supported. |
+ buf[2] ^= 0x1F; |
+ unaligned_write32le(buf + known_options.header_size - 4, |
+ lzma_crc32(buf, known_options.header_size - 4, 0)); |
+ expect(lzma_block_header_decode(&decoded_options, NULL, buf) |
+ == LZMA_OPTIONS_ERROR); |
+ buf[2] ^= 0x1F; |
+ |
+ // Non-nul Padding |
+ buf[known_options.header_size - 4 - 1] ^= 1; |
+ unaligned_write32le(buf + known_options.header_size - 4, |
+ lzma_crc32(buf, known_options.header_size - 4, 0)); |
+ expect(lzma_block_header_decode(&decoded_options, NULL, buf) |
+ == LZMA_OPTIONS_ERROR); |
+ buf[known_options.header_size - 4 - 1] ^= 1; |
+} |
+ |
+ |
+int |
+main(void) |
+{ |
+ succeed(lzma_lzma_preset(&opt_lzma, 1)); |
+ |
+ test1(); |
+ test2(); |
+ test3(); |
+ |
+ return 0; |
+} |
Property changes on: xz/tests/test_block_header.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |