diff options
Diffstat (limited to 'Build/source/extra/xz-4.999.9beta/tests/test_index.c')
-rw-r--r-- | Build/source/extra/xz-4.999.9beta/tests/test_index.c | 532 |
1 files changed, 0 insertions, 532 deletions
diff --git a/Build/source/extra/xz-4.999.9beta/tests/test_index.c b/Build/source/extra/xz-4.999.9beta/tests/test_index.c deleted file mode 100644 index 5ce2c524735..00000000000 --- a/Build/source/extra/xz-4.999.9beta/tests/test_index.c +++ /dev/null @@ -1,532 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file test_index.c -/// \brief Tests functions handling the lzma_index structure -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tests.h" - -#define MEMLIMIT (LZMA_VLI_C(1) << 20) - - -static lzma_index * -create_empty(void) -{ - lzma_index *i = lzma_index_init(NULL, NULL); - expect(i != NULL); - return i; -} - - -static lzma_index * -create_small(void) -{ - lzma_index *i = lzma_index_init(NULL, NULL); - expect(i != NULL); - expect(lzma_index_append(i, NULL, 101, 555) == LZMA_OK); - expect(lzma_index_append(i, NULL, 602, 777) == LZMA_OK); - expect(lzma_index_append(i, NULL, 804, 999) == LZMA_OK); - return i; -} - - -static lzma_index * -create_big(void) -{ - lzma_index *i = lzma_index_init(NULL, NULL); - expect(i != NULL); - - lzma_vli total_size = 0; - lzma_vli uncompressed_size = 0; - - // Add pseudo-random sizes (but always the same size values). - const size_t count = 5555; - uint32_t n = 11; - for (size_t j = 0; j < count; ++j) { - n = 7019 * n + 7607; - const uint32_t t = n * 3011; - expect(lzma_index_append(i, NULL, t, n) == LZMA_OK); - total_size += (t + 3) & ~LZMA_VLI_C(3); - uncompressed_size += n; - } - - expect(lzma_index_count(i) == count); - expect(lzma_index_total_size(i) == total_size); - expect(lzma_index_uncompressed_size(i) == uncompressed_size); - expect(lzma_index_total_size(i) + lzma_index_size(i) - + 2 * LZMA_STREAM_HEADER_SIZE - == lzma_index_stream_size(i)); - - return i; -} - - -static void -test_equal(void) -{ - lzma_index *a = create_empty(); - lzma_index *b = create_small(); - lzma_index *c = create_big(); - expect(a && b && c); - - expect(lzma_index_equal(a, a)); - expect(lzma_index_equal(b, b)); - expect(lzma_index_equal(c, c)); - - expect(!lzma_index_equal(a, b)); - expect(!lzma_index_equal(a, c)); - expect(!lzma_index_equal(b, c)); - - lzma_index_end(a, NULL); - lzma_index_end(b, NULL); - lzma_index_end(c, NULL); -} - - -static void -test_overflow(void) -{ - // Integer overflow tests - lzma_index *i = create_empty(); - - expect(lzma_index_append(i, NULL, LZMA_VLI_MAX - 5, 1234) - == LZMA_DATA_ERROR); - - // TODO - - lzma_index_end(i, NULL); -} - - -static void -test_copy(const lzma_index *i) -{ - lzma_index *d = lzma_index_dup(i, NULL); - expect(d != NULL); - lzma_index_end(d, NULL); -} - - -static void -test_read(lzma_index *i) -{ - lzma_index_record record; - - // Try twice so we see that rewinding works. - for (size_t j = 0; j < 2; ++j) { - lzma_vli total_size = 0; - lzma_vli uncompressed_size = 0; - lzma_vli stream_offset = LZMA_STREAM_HEADER_SIZE; - lzma_vli uncompressed_offset = 0; - uint32_t count = 0; - - while (!lzma_index_read(i, &record)) { - ++count; - - total_size += record.total_size; - uncompressed_size += record.uncompressed_size; - - expect(record.stream_offset == stream_offset); - expect(record.uncompressed_offset - == uncompressed_offset); - - stream_offset += record.total_size; - uncompressed_offset += record.uncompressed_size; - } - - expect(lzma_index_total_size(i) == total_size); - expect(lzma_index_uncompressed_size(i) == uncompressed_size); - expect(lzma_index_count(i) == count); - - lzma_index_rewind(i); - } -} - - -static void -test_code(lzma_index *i) -{ - const size_t alloc_size = 128 * 1024; - uint8_t *buf = malloc(alloc_size); - expect(buf != NULL); - - // Encode - lzma_stream strm = LZMA_STREAM_INIT; - expect(lzma_index_encoder(&strm, i) == LZMA_OK); - const lzma_vli index_size = lzma_index_size(i); - succeed(coder_loop(&strm, NULL, 0, buf, index_size, - LZMA_STREAM_END, LZMA_RUN)); - - // Decode - lzma_index *d; - expect(lzma_index_decoder(&strm, &d, MEMLIMIT) == LZMA_OK); - succeed(decoder_loop(&strm, buf, index_size)); - - expect(lzma_index_equal(i, d)); - - lzma_index_end(d, NULL); - lzma_end(&strm); - - // Decode with hashing - lzma_index_hash *h = lzma_index_hash_init(NULL, NULL); - expect(h != NULL); - lzma_index_rewind(i); - lzma_index_record r; - while (!lzma_index_read(i, &r)) - expect(lzma_index_hash_append(h, r.unpadded_size, - r.uncompressed_size) == LZMA_OK); - size_t pos = 0; - while (pos < index_size - 1) - expect(lzma_index_hash_decode(h, buf, &pos, pos + 1) - == LZMA_OK); - expect(lzma_index_hash_decode(h, buf, &pos, pos + 1) - == LZMA_STREAM_END); - - lzma_index_hash_end(h, NULL); - - // Encode buffer - size_t buf_pos = 1; - expect(lzma_index_buffer_encode(i, buf, &buf_pos, index_size) - == LZMA_BUF_ERROR); - expect(buf_pos == 1); - - succeed(lzma_index_buffer_encode(i, buf, &buf_pos, index_size + 1)); - expect(buf_pos == index_size + 1); - - // Decode buffer - buf_pos = 1; - uint64_t memlimit = MEMLIMIT; - expect(lzma_index_buffer_decode(&d, &memlimit, NULL, buf, &buf_pos, - index_size) == LZMA_DATA_ERROR); - expect(buf_pos == 1); - expect(d == NULL); - - succeed(lzma_index_buffer_decode(&d, &memlimit, NULL, buf, &buf_pos, - index_size + 1)); - expect(buf_pos == index_size + 1); - expect(lzma_index_equal(i, d)); - - lzma_index_end(d, NULL); - - free(buf); -} - - -static void -test_many(lzma_index *i) -{ - test_copy(i); - test_read(i); - test_code(i); -} - - -static void -test_cat(void) -{ - lzma_index *a, *b, *c; - - // Empty Indexes - a = create_empty(); - b = create_empty(); - expect(lzma_index_cat(a, b, NULL, 0) == LZMA_OK); - expect(lzma_index_count(a) == 0); - expect(lzma_index_stream_size(a) == 2 * LZMA_STREAM_HEADER_SIZE + 8); - expect(lzma_index_file_size(a) - == 2 * (2 * LZMA_STREAM_HEADER_SIZE + 8)); - - b = create_empty(); - expect(lzma_index_cat(a, b, NULL, 0) == LZMA_OK); - expect(lzma_index_count(a) == 0); - expect(lzma_index_stream_size(a) == 2 * LZMA_STREAM_HEADER_SIZE + 8); - expect(lzma_index_file_size(a) - == 3 * (2 * LZMA_STREAM_HEADER_SIZE + 8)); - - b = create_empty(); - c = create_empty(); - expect(lzma_index_cat(b, c, NULL, 4) == LZMA_OK); - expect(lzma_index_count(b) == 0); - expect(lzma_index_stream_size(b) == 2 * LZMA_STREAM_HEADER_SIZE + 8); - expect(lzma_index_file_size(b) - == 2 * (2 * LZMA_STREAM_HEADER_SIZE + 8) + 4); - - expect(lzma_index_cat(a, b, NULL, 8) == LZMA_OK); - expect(lzma_index_count(a) == 0); - expect(lzma_index_stream_size(a) == 2 * LZMA_STREAM_HEADER_SIZE + 8); - expect(lzma_index_file_size(a) - == 5 * (2 * LZMA_STREAM_HEADER_SIZE + 8) + 4 + 8); - - lzma_index_end(a, NULL); - - // Small Indexes - a = create_small(); - lzma_vli stream_size = lzma_index_stream_size(a); - b = create_small(); - expect(lzma_index_cat(a, b, NULL, 4) == LZMA_OK); - expect(lzma_index_file_size(a) == stream_size * 2 + 4); - expect(lzma_index_stream_size(a) > stream_size); - expect(lzma_index_stream_size(a) < stream_size * 2); - - b = create_small(); - c = create_small(); - expect(lzma_index_cat(b, c, NULL, 8) == LZMA_OK); - expect(lzma_index_cat(a, b, NULL, 12) == LZMA_OK); - expect(lzma_index_file_size(a) == stream_size * 4 + 4 + 8 + 12); - - lzma_index_end(a, NULL); - - // Big Indexes - a = create_big(); - stream_size = lzma_index_stream_size(a); - b = create_big(); - expect(lzma_index_cat(a, b, NULL, 4) == LZMA_OK); - expect(lzma_index_file_size(a) == stream_size * 2 + 4); - expect(lzma_index_stream_size(a) > stream_size); - expect(lzma_index_stream_size(a) < stream_size * 2); - - b = create_big(); - c = create_big(); - expect(lzma_index_cat(b, c, NULL, 8) == LZMA_OK); - expect(lzma_index_cat(a, b, NULL, 12) == LZMA_OK); - expect(lzma_index_file_size(a) == stream_size * 4 + 4 + 8 + 12); - - lzma_index_end(a, NULL); -} - - -static void -test_locate(void) -{ - lzma_index_record r; - lzma_index *i = lzma_index_init(NULL, NULL); - expect(i != NULL); - - // Cannot locate anything from an empty Index. - expect(lzma_index_locate(i, &r, 0)); - expect(lzma_index_locate(i, &r, 555)); - - // One empty Record: nothing is found since there's no uncompressed - // data. - expect(lzma_index_append(i, NULL, 16, 0) == LZMA_OK); - expect(lzma_index_locate(i, &r, 0)); - - // Non-empty Record and we can find something. - expect(lzma_index_append(i, NULL, 32, 5) == LZMA_OK); - expect(!lzma_index_locate(i, &r, 0)); - expect(r.total_size == 32); - expect(r.uncompressed_size == 5); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE + 16); - expect(r.uncompressed_offset == 0); - - // Still cannot find anything past the end. - expect(lzma_index_locate(i, &r, 5)); - - // Add the third Record. - expect(lzma_index_append(i, NULL, 40, 11) == LZMA_OK); - - expect(!lzma_index_locate(i, &r, 0)); - expect(r.total_size == 32); - expect(r.uncompressed_size == 5); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE + 16); - expect(r.uncompressed_offset == 0); - - expect(!lzma_index_read(i, &r)); - expect(r.total_size == 40); - expect(r.uncompressed_size == 11); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE + 16 + 32); - expect(r.uncompressed_offset == 5); - - expect(!lzma_index_locate(i, &r, 2)); - expect(r.total_size == 32); - expect(r.uncompressed_size == 5); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE + 16); - expect(r.uncompressed_offset == 0); - - expect(!lzma_index_locate(i, &r, 5)); - expect(r.total_size == 40); - expect(r.uncompressed_size == 11); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE + 16 + 32); - expect(r.uncompressed_offset == 5); - - expect(!lzma_index_locate(i, &r, 5 + 11 - 1)); - expect(r.total_size == 40); - expect(r.uncompressed_size == 11); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE + 16 + 32); - expect(r.uncompressed_offset == 5); - - expect(lzma_index_locate(i, &r, 5 + 11)); - expect(lzma_index_locate(i, &r, 5 + 15)); - - // Large Index - i = lzma_index_init(i, NULL); - expect(i != NULL); - - for (size_t n = 4; n <= 4 * 5555; n += 4) - expect(lzma_index_append(i, NULL, n + 8, n) == LZMA_OK); - - expect(lzma_index_count(i) == 5555); - - // First Record - expect(!lzma_index_locate(i, &r, 0)); - expect(r.total_size == 4 + 8); - expect(r.uncompressed_size == 4); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE); - expect(r.uncompressed_offset == 0); - - expect(!lzma_index_locate(i, &r, 3)); - expect(r.total_size == 4 + 8); - expect(r.uncompressed_size == 4); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE); - expect(r.uncompressed_offset == 0); - - // Second Record - expect(!lzma_index_locate(i, &r, 4)); - expect(r.total_size == 2 * 4 + 8); - expect(r.uncompressed_size == 2 * 4); - expect(r.stream_offset == LZMA_STREAM_HEADER_SIZE + 4 + 8); - expect(r.uncompressed_offset == 4); - - // Last Record - expect(!lzma_index_locate(i, &r, lzma_index_uncompressed_size(i) - 1)); - expect(r.total_size == 4 * 5555 + 8); - expect(r.uncompressed_size == 4 * 5555); - expect(r.stream_offset == lzma_index_total_size(i) - + LZMA_STREAM_HEADER_SIZE - 4 * 5555 - 8); - expect(r.uncompressed_offset - == lzma_index_uncompressed_size(i) - 4 * 5555); - - // Allocation chunk boundaries. See INDEX_GROUP_SIZE in - // liblzma/common/index.c. - const size_t group_multiple = 256 * 4; - const size_t radius = 8; - const size_t start = group_multiple - radius; - lzma_vli ubase = 0; - lzma_vli tbase = 0; - size_t n; - for (n = 1; n < start; ++n) { - ubase += n * 4; - tbase += n * 4 + 8; - } - - while (n < start + 2 * radius) { - expect(!lzma_index_locate(i, &r, ubase + n * 4)); - - expect(r.stream_offset == tbase + n * 4 + 8 - + LZMA_STREAM_HEADER_SIZE); - expect(r.uncompressed_offset == ubase + n * 4); - - tbase += n * 4 + 8; - ubase += n * 4; - ++n; - - expect(r.total_size == n * 4 + 8); - expect(r.uncompressed_size == n * 4); - } - - // Do it also backwards since lzma_index_locate() uses relative search. - while (n > start) { - expect(!lzma_index_locate(i, &r, ubase + (n - 1) * 4)); - - expect(r.total_size == n * 4 + 8); - expect(r.uncompressed_size == n * 4); - - --n; - tbase -= n * 4 + 8; - ubase -= n * 4; - - expect(r.stream_offset == tbase + n * 4 + 8 - + LZMA_STREAM_HEADER_SIZE); - expect(r.uncompressed_offset == ubase + n * 4); - } - - // Test locating in concatend Index. - i = lzma_index_init(i, NULL); - expect(i != NULL); - for (n = 0; n < group_multiple; ++n) - expect(lzma_index_append(i, NULL, 8, 0) == LZMA_OK); - expect(lzma_index_append(i, NULL, 16, 1) == LZMA_OK); - expect(!lzma_index_locate(i, &r, 0)); - expect(r.total_size == 16); - expect(r.uncompressed_size == 1); - expect(r.stream_offset - == LZMA_STREAM_HEADER_SIZE + group_multiple * 8); - expect(r.uncompressed_offset == 0); - - lzma_index_end(i, NULL); -} - - -static void -test_corrupt(void) -{ - const size_t alloc_size = 128 * 1024; - uint8_t *buf = malloc(alloc_size); - expect(buf != NULL); - lzma_stream strm = LZMA_STREAM_INIT; - - lzma_index *i = create_empty(); - expect(lzma_index_append(i, NULL, 0, 1) == LZMA_PROG_ERROR); - lzma_index_end(i, NULL); - - // Create a valid Index and corrupt it in different ways. - i = create_small(); - expect(lzma_index_encoder(&strm, i) == LZMA_OK); - succeed(coder_loop(&strm, NULL, 0, buf, 20, - LZMA_STREAM_END, LZMA_RUN)); - lzma_index_end(i, NULL); - - // Wrong Index Indicator - buf[0] ^= 1; - expect(lzma_index_decoder(&strm, &i, MEMLIMIT) == LZMA_OK); - succeed(decoder_loop_ret(&strm, buf, 1, LZMA_DATA_ERROR)); - buf[0] ^= 1; - - // Wrong Number of Records and thus CRC32 fails. - --buf[1]; - expect(lzma_index_decoder(&strm, &i, MEMLIMIT) == LZMA_OK); - succeed(decoder_loop_ret(&strm, buf, 10, LZMA_DATA_ERROR)); - ++buf[1]; - - // Padding not NULs - buf[15] ^= 1; - expect(lzma_index_decoder(&strm, &i, MEMLIMIT) == LZMA_OK); - succeed(decoder_loop_ret(&strm, buf, 16, LZMA_DATA_ERROR)); - - lzma_end(&strm); - free(buf); -} - - -int -main(void) -{ - test_equal(); - - test_overflow(); - - lzma_index *i = create_empty(); - test_many(i); - lzma_index_end(i, NULL); - - i = create_small(); - test_many(i); - lzma_index_end(i, NULL); - - i = create_big(); - test_many(i); - lzma_index_end(i, NULL); - - test_cat(); - - test_locate(); - - test_corrupt(); - - return 0; -} |