Index: xz/tests/test_stream_flags.c |
=================================================================== |
--- xz/tests/test_stream_flags.c (revision 0) |
+++ xz/tests/test_stream_flags.c (revision 0) |
@@ -0,0 +1,180 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \file test_stream_flags.c |
+/// \brief Tests Stream Header and Stream Footer 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 lzma_stream_flags known_flags; |
+static lzma_stream_flags decoded_flags; |
+static uint8_t buffer[LZMA_STREAM_HEADER_SIZE]; |
+ |
+ |
+static bool |
+validate(void) |
+{ |
+ // TODO: This could require the specific error type as an argument. |
+ // We could also test that lzma_stream_flags_compare() gives |
+ // the correct return values in different situations. |
+ return lzma_stream_flags_compare(&known_flags, &decoded_flags) |
+ != LZMA_OK; |
+} |
+ |
+ |
+static bool |
+test_header_decoder(lzma_ret expected_ret) |
+{ |
+ memcrap(&decoded_flags, sizeof(decoded_flags)); |
+ |
+ if (lzma_stream_header_decode(&decoded_flags, buffer) != expected_ret) |
+ return true; |
+ |
+ if (expected_ret != LZMA_OK) |
+ return false; |
+ |
+ // Header doesn't have Backward Size, so make |
+ // lzma_stream_flags_compare() ignore it. |
+ decoded_flags.backward_size = LZMA_VLI_UNKNOWN; |
+ return validate(); |
+} |
+ |
+ |
+static void |
+test_header(void) |
+{ |
+ memcrap(buffer, sizeof(buffer)); |
+ expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK); |
+ succeed(test_header_decoder(LZMA_OK)); |
+} |
+ |
+ |
+static bool |
+test_footer_decoder(lzma_ret expected_ret) |
+{ |
+ memcrap(&decoded_flags, sizeof(decoded_flags)); |
+ |
+ if (lzma_stream_footer_decode(&decoded_flags, buffer) != expected_ret) |
+ return true; |
+ |
+ if (expected_ret != LZMA_OK) |
+ return false; |
+ |
+ return validate(); |
+} |
+ |
+ |
+static void |
+test_footer(void) |
+{ |
+ memcrap(buffer, sizeof(buffer)); |
+ expect(lzma_stream_footer_encode(&known_flags, buffer) == LZMA_OK); |
+ succeed(test_footer_decoder(LZMA_OK)); |
+} |
+ |
+ |
+static void |
+test_encode_invalid(void) |
+{ |
+ known_flags.check = LZMA_CHECK_ID_MAX + 1; |
+ known_flags.backward_size = 1024; |
+ |
+ expect(lzma_stream_header_encode(&known_flags, buffer) |
+ == LZMA_PROG_ERROR); |
+ |
+ expect(lzma_stream_footer_encode(&known_flags, buffer) |
+ == LZMA_PROG_ERROR); |
+ |
+ known_flags.check = (lzma_check)(-1); |
+ |
+ expect(lzma_stream_header_encode(&known_flags, buffer) |
+ == LZMA_PROG_ERROR); |
+ |
+ expect(lzma_stream_footer_encode(&known_flags, buffer) |
+ == LZMA_PROG_ERROR); |
+ |
+ known_flags.check = LZMA_CHECK_NONE; |
+ known_flags.backward_size = 0; |
+ |
+ // Header encoder ignores backward_size. |
+ expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK); |
+ |
+ expect(lzma_stream_footer_encode(&known_flags, buffer) |
+ == LZMA_PROG_ERROR); |
+ |
+ known_flags.backward_size = LZMA_VLI_MAX; |
+ |
+ expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK); |
+ |
+ expect(lzma_stream_footer_encode(&known_flags, buffer) |
+ == LZMA_PROG_ERROR); |
+} |
+ |
+ |
+static void |
+test_decode_invalid(void) |
+{ |
+ known_flags.check = LZMA_CHECK_NONE; |
+ known_flags.backward_size = 1024; |
+ |
+ expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK); |
+ |
+ // Test 1 (invalid Magic Bytes) |
+ buffer[5] ^= 1; |
+ succeed(test_header_decoder(LZMA_FORMAT_ERROR)); |
+ buffer[5] ^= 1; |
+ |
+ // Test 2a (valid CRC32) |
+ uint32_t crc = lzma_crc32(buffer + 6, 2, 0); |
+ unaligned_write32le(buffer + 8, crc); |
+ succeed(test_header_decoder(LZMA_OK)); |
+ |
+ // Test 2b (invalid Stream Flags with valid CRC32) |
+ buffer[6] ^= 0x20; |
+ crc = lzma_crc32(buffer + 6, 2, 0); |
+ unaligned_write32le(buffer + 8, crc); |
+ succeed(test_header_decoder(LZMA_OPTIONS_ERROR)); |
+ |
+ // Test 3 (invalid CRC32) |
+ expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK); |
+ buffer[9] ^= 1; |
+ succeed(test_header_decoder(LZMA_DATA_ERROR)); |
+ |
+ // Test 4 (invalid Stream Flags with valid CRC32) |
+ expect(lzma_stream_footer_encode(&known_flags, buffer) == LZMA_OK); |
+ buffer[9] ^= 0x40; |
+ crc = lzma_crc32(buffer + 4, 6, 0); |
+ unaligned_write32le(buffer, crc); |
+ succeed(test_footer_decoder(LZMA_OPTIONS_ERROR)); |
+ |
+ // Test 5 (invalid Magic Bytes) |
+ expect(lzma_stream_footer_encode(&known_flags, buffer) == LZMA_OK); |
+ buffer[11] ^= 1; |
+ succeed(test_footer_decoder(LZMA_FORMAT_ERROR)); |
+} |
+ |
+ |
+int |
+main(void) |
+{ |
+ // Valid headers |
+ known_flags.backward_size = 1024; |
+ for (lzma_check check = LZMA_CHECK_NONE; |
+ check <= LZMA_CHECK_ID_MAX; ++check) { |
+ test_header(); |
+ test_footer(); |
+ } |
+ |
+ // Invalid headers |
+ test_encode_invalid(); |
+ test_decode_invalid(); |
+ |
+ return 0; |
+} |
Property changes on: xz/tests/test_stream_flags.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |