mirror of https://git.tukaani.org/xz.git
718 lines
23 KiB
C
718 lines
23 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
/// \file test_info.c
|
|
/// \brief Tests functions handling the lzma_info structure
|
|
//
|
|
// Copyright (C) 2007 Lasse Collin
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "tests.h"
|
|
|
|
|
|
static lzma_info *info = NULL;
|
|
static lzma_info_iter iter;
|
|
|
|
static lzma_vli stream_start = 0;
|
|
static lzma_vli header_metadata_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
static lzma_vli total_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
static lzma_vli uncompressed_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
static lzma_vli footer_metadata_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
|
|
static lzma_index my_index[3] = {
|
|
{ 22, 33, my_index + 1 },
|
|
{ 44, 55, my_index + 2 },
|
|
{ 66, 77, NULL },
|
|
};
|
|
|
|
static lzma_metadata my_metadata = {
|
|
.header_metadata_size = 11,
|
|
.total_size = 22 + 44 + 66,
|
|
.uncompressed_size = 33 + 55 + 77,
|
|
.index = my_index,
|
|
.extra = NULL,
|
|
};
|
|
|
|
|
|
static void
|
|
reset(void)
|
|
{
|
|
expect(lzma_info_init(info, NULL) == info);
|
|
stream_start = 0;
|
|
header_metadata_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
total_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
uncompressed_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
footer_metadata_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
}
|
|
|
|
|
|
static void
|
|
validate(void)
|
|
{
|
|
expect(lzma_info_size_get(info, LZMA_INFO_STREAM_START)
|
|
== stream_start);
|
|
expect(lzma_info_size_get(info, LZMA_INFO_HEADER_METADATA)
|
|
== header_metadata_size);
|
|
expect(lzma_info_size_get(info, LZMA_INFO_TOTAL) == total_size);
|
|
expect(lzma_info_size_get(info, LZMA_INFO_UNCOMPRESSED)
|
|
== uncompressed_size);
|
|
expect(lzma_info_size_get(info, LZMA_INFO_FOOTER_METADATA)
|
|
== footer_metadata_size);
|
|
}
|
|
|
|
|
|
static void
|
|
test1(void)
|
|
{
|
|
// Basics
|
|
expect(lzma_info_size_set(info, LZMA_INFO_STREAM_START,
|
|
stream_start = 1234) == LZMA_OK);
|
|
validate();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA,
|
|
header_metadata_size = 2345) == LZMA_OK);
|
|
validate();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, total_size = 3456)
|
|
== LZMA_OK);
|
|
validate();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED,
|
|
uncompressed_size = 4567) == LZMA_OK);
|
|
validate();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_FOOTER_METADATA,
|
|
footer_metadata_size = 5432) == LZMA_OK);
|
|
validate();
|
|
|
|
// Not everything allow zero size
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_STREAM_START,
|
|
stream_start = 0) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA,
|
|
header_metadata_size = 0) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED,
|
|
uncompressed_size = 0) == LZMA_OK);
|
|
validate();
|
|
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, 0)
|
|
== LZMA_PROG_ERROR);
|
|
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_FOOTER_METADATA, 0)
|
|
== LZMA_PROG_ERROR);
|
|
|
|
// Invalid sizes
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_STREAM_START,
|
|
LZMA_VLI_VALUE_MAX + 1) == LZMA_PROG_ERROR);
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA,
|
|
LZMA_VLI_VALUE_MAX + 1) == LZMA_PROG_ERROR);
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL,
|
|
LZMA_VLI_VALUE_MAX + 1) == LZMA_PROG_ERROR);
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED,
|
|
LZMA_VLI_VALUE_MAX + 1) == LZMA_PROG_ERROR);
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_FOOTER_METADATA,
|
|
LZMA_VLI_VALUE_MAX + 1) == LZMA_PROG_ERROR);
|
|
|
|
reset();
|
|
}
|
|
|
|
|
|
static bool
|
|
test2_helper(lzma_vli *num, lzma_info_size type)
|
|
{
|
|
expect(lzma_info_size_set(info, type, *num = 1234) == LZMA_OK);
|
|
validate();
|
|
const bool ret = lzma_info_size_set(info, type, 4321) != LZMA_OK;
|
|
reset();
|
|
return ret;
|
|
}
|
|
|
|
|
|
static void
|
|
test2(void)
|
|
{
|
|
// Excluding start offset of Stream, once a size has been set,
|
|
// trying to set some other known value fails.
|
|
expect(!test2_helper(&stream_start, LZMA_INFO_STREAM_START));
|
|
expect(test2_helper(&header_metadata_size, LZMA_INFO_HEADER_METADATA));
|
|
expect(test2_helper(&total_size, LZMA_INFO_TOTAL));
|
|
expect(test2_helper(&uncompressed_size, LZMA_INFO_UNCOMPRESSED));
|
|
expect(test2_helper(&footer_metadata_size, LZMA_INFO_FOOTER_METADATA));
|
|
}
|
|
|
|
|
|
static void
|
|
test3_init(void)
|
|
{
|
|
reset();
|
|
lzma_info_iter_begin(info, &iter);
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
}
|
|
|
|
|
|
static void
|
|
test3(void)
|
|
{
|
|
// Setting the same sizes multiple times for the same Index Record
|
|
// is OK, but the values must always be the same.
|
|
test3_init();
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
expect(lzma_info_iter_set(&iter, 1234, 2345) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
expect(lzma_info_iter_set(&iter, 1234, 2345) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
expect(lzma_info_iter_set(&iter, 1111, 2345) == LZMA_DATA_ERROR);
|
|
|
|
// Cannot finish an empty Index.
|
|
test3_init();
|
|
expect(lzma_info_index_finish(info) == LZMA_DATA_ERROR);
|
|
|
|
test3_init();
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
expect(lzma_info_iter_set(&iter, 1234, 2345) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
expect(lzma_info_index_finish(info) == LZMA_DATA_ERROR);
|
|
|
|
test3_init();
|
|
expect(lzma_info_iter_set(&iter, 1234, 2345) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
expect(lzma_info_index_finish(info) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, 1234) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED, 2345)
|
|
== LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, 1111)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
test3_init();
|
|
expect(lzma_info_iter_set(&iter, 1234, 2345) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
expect(lzma_info_iter_set(&iter, 4321, 5432) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
expect(lzma_info_index_finish(info) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, 1234 + 4321)
|
|
== LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED, 2345 + 5432)
|
|
== LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED, 1111)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
test3_init();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, 1234 + 4321)
|
|
== LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED, 2345 + 5432)
|
|
== LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED, 1111)
|
|
== LZMA_DATA_ERROR);
|
|
expect(lzma_info_iter_set(&iter, 1234, 2345) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
expect(lzma_info_iter_set(&iter, 4321, 5432) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
expect(lzma_info_index_finish(info) == LZMA_OK);
|
|
|
|
test3_init();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, 1000) == LZMA_OK);
|
|
expect(lzma_info_iter_set(&iter, 1001, 2001) == LZMA_DATA_ERROR);
|
|
|
|
test3_init();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED, 2000)
|
|
== LZMA_OK);
|
|
expect(lzma_info_iter_set(&iter, 1001, 2001) == LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
}
|
|
|
|
|
|
static void
|
|
test4(void)
|
|
{
|
|
// 4a
|
|
lzma_info_iter_begin(info, &iter);
|
|
expect(lzma_info_index_count_get(info) == 0);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_offset == 0);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
|
|
expect(lzma_info_iter_set(&iter, 22, 33) == LZMA_OK);
|
|
expect(iter.total_size == 22);
|
|
expect(iter.uncompressed_size == 33);
|
|
expect(iter.stream_offset == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_offset == 0);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_offset == 33);
|
|
|
|
// 4b
|
|
reset();
|
|
lzma_info_iter_begin(info, &iter);
|
|
expect(lzma_info_index_count_get(info) == 0);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_STREAM_START, 5) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA, 11)
|
|
== LZMA_OK);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11);
|
|
expect(iter.uncompressed_offset == 0);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
|
|
expect(lzma_info_iter_set(&iter, 22, 33) == LZMA_OK);
|
|
expect(iter.total_size == 22);
|
|
expect(iter.uncompressed_size == 33);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11);
|
|
expect(iter.uncompressed_offset == 0);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11 + 22);
|
|
expect(iter.uncompressed_offset == 33);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
|
|
expect(lzma_info_iter_set(&iter, 44, 55) == LZMA_OK);
|
|
expect(iter.total_size == 44);
|
|
expect(iter.uncompressed_size == 55);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11 + 22);
|
|
expect(iter.uncompressed_offset == 33);
|
|
expect(lzma_info_index_count_get(info) == 2);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44);
|
|
expect(iter.uncompressed_offset == 33 + 55);
|
|
expect(lzma_info_index_count_get(info) == 3);
|
|
|
|
expect(lzma_info_iter_set(&iter, 66, 77) == LZMA_OK);
|
|
expect(iter.total_size == 66);
|
|
expect(iter.uncompressed_size == 77);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44);
|
|
expect(iter.uncompressed_offset == 33 + 55);
|
|
expect(lzma_info_index_count_get(info) == 3);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44 + 66);
|
|
expect(iter.uncompressed_offset == 33 + 55 + 77);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_set(&iter, 88, 99) == LZMA_OK);
|
|
expect(iter.total_size == 88);
|
|
expect(iter.uncompressed_size == 99);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44 + 66);
|
|
expect(iter.uncompressed_offset == 33 + 55 + 77);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
// 4c (continues from 4b)
|
|
lzma_info_iter_begin(info, &iter);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == 22);
|
|
expect(iter.uncompressed_size == 33);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11);
|
|
expect(iter.uncompressed_offset == 0);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_set(&iter, 22, LZMA_VLI_VALUE_UNKNOWN)
|
|
== LZMA_OK);
|
|
expect(iter.total_size == 22);
|
|
expect(iter.uncompressed_size == 33);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11);
|
|
expect(iter.uncompressed_offset == 0);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == 44);
|
|
expect(iter.uncompressed_size == 55);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11 + 22);
|
|
expect(iter.uncompressed_offset == 33);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_set(&iter, LZMA_VLI_VALUE_UNKNOWN, 55)
|
|
== LZMA_OK);
|
|
expect(iter.total_size == 44);
|
|
expect(iter.uncompressed_size == 55);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11 + 22);
|
|
expect(iter.uncompressed_offset == 33);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == 66);
|
|
expect(iter.uncompressed_size == 77);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44);
|
|
expect(iter.uncompressed_offset == 33 + 55);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_set(&iter, LZMA_VLI_VALUE_UNKNOWN,
|
|
LZMA_VLI_VALUE_UNKNOWN) == LZMA_OK);
|
|
expect(iter.total_size == 66);
|
|
expect(iter.uncompressed_size == 77);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44);
|
|
expect(iter.uncompressed_offset == 33 + 55);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == 88);
|
|
expect(iter.uncompressed_size == 99);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44 + 66);
|
|
expect(iter.uncompressed_offset == 33 + 55 + 77);
|
|
expect(lzma_info_index_count_get(info) == 4);
|
|
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44 + 66 + 88);
|
|
expect(iter.uncompressed_offset == 33 + 55 + 77 + 99);
|
|
expect(lzma_info_index_count_get(info) == 5);
|
|
|
|
expect(lzma_info_iter_set(&iter, 1234, LZMA_VLI_VALUE_UNKNOWN)
|
|
== LZMA_OK);
|
|
expect(iter.total_size == 1234);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44 + 66 + 88);
|
|
expect(iter.uncompressed_offset == 33 + 55 + 77 + 99);
|
|
expect(lzma_info_index_count_get(info) == 5);
|
|
|
|
// Test 4d (continues from 4c)
|
|
lzma_info_iter_begin(info, &iter);
|
|
for (size_t i = 0; i < 4; ++i)
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(lzma_info_iter_set(&iter, 88, 99) == LZMA_OK);
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.total_size == 1234);
|
|
expect(iter.uncompressed_size == LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44 + 66 + 88);
|
|
expect(iter.uncompressed_offset == 33 + 55 + 77 + 99);
|
|
expect(lzma_info_index_count_get(info) == 5);
|
|
|
|
expect(lzma_info_iter_set(&iter, LZMA_VLI_VALUE_UNKNOWN, 4321)
|
|
== LZMA_OK);
|
|
expect(iter.total_size == 1234);
|
|
expect(iter.uncompressed_size == 4321);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE
|
|
+ 11 + 22 + 44 + 66 + 88);
|
|
expect(iter.uncompressed_offset == 33 + 55 + 77 + 99);
|
|
expect(lzma_info_index_count_get(info) == 5);
|
|
|
|
expect(lzma_info_index_finish(info) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 5);
|
|
|
|
// Test 4e (continues from 4d)
|
|
lzma_info_iter_begin(info, &iter);
|
|
for (size_t i = 0; i < 5; ++i)
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(lzma_info_iter_set(&iter, 1234, 4321) == LZMA_OK);
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
}
|
|
|
|
|
|
static void
|
|
test5(void)
|
|
{
|
|
lzma_index *i;
|
|
|
|
expect(lzma_info_index_set(info, NULL, NULL, true)
|
|
== LZMA_PROG_ERROR);
|
|
|
|
reset();
|
|
expect(lzma_info_index_set(info, NULL, my_index, false) == LZMA_OK);
|
|
i = lzma_index_dup(my_index, NULL);
|
|
expect(i != NULL);
|
|
i->next->uncompressed_size = 99;
|
|
expect(lzma_info_index_set(info, NULL, i, true) == LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
expect(lzma_info_index_set(info, NULL, my_index, false) == LZMA_OK);
|
|
i = lzma_index_dup(my_index, NULL);
|
|
expect(i != NULL);
|
|
lzma_index_free(i->next->next, NULL);
|
|
i->next->next = NULL;
|
|
expect(lzma_info_index_set(info, NULL, i, true) == LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
expect(lzma_info_index_set(info, NULL, my_index, false) == LZMA_OK);
|
|
i = lzma_index_dup(my_index, NULL);
|
|
expect(i != NULL);
|
|
lzma_index_free(i->next->next, NULL);
|
|
i->next->next = lzma_index_dup(my_index, NULL);
|
|
expect(i->next->next != NULL);
|
|
expect(lzma_info_index_set(info, NULL, i, true) == LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL,
|
|
total_size = 22 + 44 + 66) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED,
|
|
uncompressed_size = 33 + 55 + 77) == LZMA_OK);
|
|
validate();
|
|
expect(lzma_info_index_set(info, NULL, my_index, false) == LZMA_OK);
|
|
validate();
|
|
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL, total_size = 77)
|
|
== LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED,
|
|
uncompressed_size = 33 + 55 + 77) == LZMA_OK);
|
|
validate();
|
|
expect(lzma_info_index_set(info, NULL, my_index, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_TOTAL,
|
|
total_size = 22 + 44 + 66) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_UNCOMPRESSED,
|
|
uncompressed_size = 777777) == LZMA_OK);
|
|
validate();
|
|
expect(lzma_info_index_set(info, NULL, my_index, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
}
|
|
|
|
|
|
static void
|
|
test6(void)
|
|
{
|
|
lzma_metadata metadata;
|
|
|
|
// Same complete Metadata in both Header and Footer
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA,
|
|
my_metadata.header_metadata_size) == LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &my_metadata, true, false)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &my_metadata, false, false)
|
|
== LZMA_OK);
|
|
|
|
// Header Metadata is not present but Size of Header Metadata is
|
|
// still present in Footer.
|
|
reset();
|
|
metadata = my_metadata;
|
|
metadata.header_metadata_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA, 0)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, true, false)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &my_metadata, false, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
// Header Metadata is present but Size of Header Metadata is missing
|
|
// from Footer.
|
|
reset();
|
|
metadata = my_metadata;
|
|
metadata.header_metadata_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
expect(lzma_info_metadata_set(info, NULL, &my_metadata, true, false)
|
|
== LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA,
|
|
my_metadata.header_metadata_size) == LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, false, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
// Index missing
|
|
reset();
|
|
metadata = my_metadata;
|
|
metadata.index = NULL;
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, true, false)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, false, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
// Index in Header Metadata but not in Footer Metadata
|
|
reset();
|
|
expect(lzma_info_metadata_set(info, NULL, &my_metadata, true, false)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, false, false)
|
|
== LZMA_OK);
|
|
|
|
// Index in Header Metadata but not in Footer Metadata but
|
|
// Total Size is missing from Footer.
|
|
reset();
|
|
metadata.total_size = LZMA_VLI_VALUE_UNKNOWN;
|
|
expect(lzma_info_metadata_set(info, NULL, &my_metadata, true, false)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, false, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
// Total Size doesn't match the Index
|
|
reset();
|
|
metadata = my_metadata;
|
|
metadata.total_size = 9999;
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, true, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
// Uncompressed Size doesn't match the Index
|
|
reset();
|
|
metadata = my_metadata;
|
|
metadata.uncompressed_size = 9999;
|
|
expect(lzma_info_metadata_set(info, NULL, &metadata, true, false)
|
|
== LZMA_DATA_ERROR);
|
|
|
|
reset();
|
|
}
|
|
|
|
|
|
static void
|
|
test7(void)
|
|
{
|
|
// No info yet, so we cannot locate anything.
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
|
|
// Setting the Stream start offset doesn't change this situation.
|
|
expect(lzma_info_size_set(info, LZMA_INFO_STREAM_START, 5) == LZMA_OK);
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
|
|
// Setting the Size of Header Metadata known allows us to locate
|
|
// the Header Metadata Block.
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA, 11)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== 5 + LZMA_STREAM_HEADER_SIZE);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
|
|
// Adding a Data Block. As long as Index is not Finished, we cannot
|
|
// locate Footer Metadata Block.
|
|
lzma_info_iter_begin(info, &iter);
|
|
expect(lzma_info_iter_next(&iter, NULL) == LZMA_OK);
|
|
expect(iter.stream_offset == 5 + LZMA_STREAM_HEADER_SIZE + 11);
|
|
expect(iter.uncompressed_offset == 0);
|
|
expect(lzma_info_iter_set(&iter, 22, 33) == LZMA_OK);
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== 5 + LZMA_STREAM_HEADER_SIZE);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
|
|
// Once the Index is finished, we can locate Footer Metadata Block too.
|
|
expect(lzma_info_index_finish(info) == LZMA_OK);
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== 5 + LZMA_STREAM_HEADER_SIZE);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== 5 + LZMA_STREAM_HEADER_SIZE + 11 + 22);
|
|
|
|
// A retry of most of the above but now with unknown Size of Header
|
|
// Metadata Block, which makes locating Footer Metadata Block
|
|
// impossible.
|
|
reset();
|
|
expect(lzma_info_size_set(info, LZMA_INFO_STREAM_START, 5) == LZMA_OK);
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
|
|
expect(lzma_info_index_set(info, NULL, my_index, false) == LZMA_OK);
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== LZMA_VLI_VALUE_UNKNOWN);
|
|
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA, 11)
|
|
== LZMA_OK);
|
|
expect(lzma_info_metadata_locate(info, true)
|
|
== 5 + LZMA_STREAM_HEADER_SIZE);
|
|
expect(lzma_info_metadata_locate(info, false)
|
|
== LZMA_STREAM_HEADER_SIZE + 5 + 11 + 22 + 44 + 66);
|
|
|
|
reset();
|
|
}
|
|
|
|
|
|
static void
|
|
test8(void)
|
|
{
|
|
expect(lzma_info_size_set(info, LZMA_INFO_STREAM_START, 5) == LZMA_OK);
|
|
expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA, 11)
|
|
== LZMA_OK);
|
|
|
|
lzma_info_iter_begin(info, &iter);
|
|
expect(lzma_info_iter_locate(&iter, NULL, 0, false)
|
|
== LZMA_DATA_ERROR);
|
|
expect(lzma_info_index_count_get(info) == 0);
|
|
|
|
lzma_info_iter_begin(info, &iter);
|
|
expect(lzma_info_iter_locate(&iter, NULL, 0, true) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
expect(lzma_info_iter_locate(&iter, NULL, 0, false) == LZMA_OK);
|
|
expect(lzma_info_index_count_get(info) == 1);
|
|
|
|
// TODO
|
|
}
|
|
|
|
|
|
/*
|
|
static void
|
|
test9(void)
|
|
{
|
|
// TODO Various integer overflow checks
|
|
}
|
|
*/
|
|
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
lzma_init();
|
|
|
|
info = lzma_info_init(NULL, NULL);
|
|
if (info == NULL)
|
|
return 1;
|
|
|
|
validate();
|
|
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
test5();
|
|
test6();
|
|
test7();
|
|
test8();
|
|
|
|
lzma_info_free(info, NULL);
|
|
return 0;
|
|
}
|