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