xref: /netbsd-src/external/public-domain/xz/dist/tests/test_stream_flags.c (revision 4d1abfb29e19727d8dfeef21d710fb741c73ec34)
1*4d1abfb2Sjoerg ///////////////////////////////////////////////////////////////////////////////
2*4d1abfb2Sjoerg //
3*4d1abfb2Sjoerg /// \file       test_stream_flags.c
4*4d1abfb2Sjoerg /// \brief      Tests Stream Header and Stream Footer coders
5*4d1abfb2Sjoerg //
6*4d1abfb2Sjoerg //  Author:     Lasse Collin
7*4d1abfb2Sjoerg //
8*4d1abfb2Sjoerg //  This file has been put into the public domain.
9*4d1abfb2Sjoerg //  You can do whatever you want with this file.
10*4d1abfb2Sjoerg //
11*4d1abfb2Sjoerg ///////////////////////////////////////////////////////////////////////////////
12*4d1abfb2Sjoerg 
13*4d1abfb2Sjoerg #include "tests.h"
14*4d1abfb2Sjoerg 
15*4d1abfb2Sjoerg 
16*4d1abfb2Sjoerg static lzma_stream_flags known_flags;
17*4d1abfb2Sjoerg static lzma_stream_flags decoded_flags;
18*4d1abfb2Sjoerg static uint8_t buffer[LZMA_STREAM_HEADER_SIZE];
19*4d1abfb2Sjoerg 
20*4d1abfb2Sjoerg 
21*4d1abfb2Sjoerg static bool
validate(void)22*4d1abfb2Sjoerg validate(void)
23*4d1abfb2Sjoerg {
24*4d1abfb2Sjoerg 	// TODO: This could require the specific error type as an argument.
25*4d1abfb2Sjoerg 	// We could also test that lzma_stream_flags_compare() gives
26*4d1abfb2Sjoerg 	// the correct return values in different situations.
27*4d1abfb2Sjoerg 	return lzma_stream_flags_compare(&known_flags, &decoded_flags)
28*4d1abfb2Sjoerg 			!= LZMA_OK;
29*4d1abfb2Sjoerg }
30*4d1abfb2Sjoerg 
31*4d1abfb2Sjoerg 
32*4d1abfb2Sjoerg static bool
test_header_decoder(lzma_ret expected_ret)33*4d1abfb2Sjoerg test_header_decoder(lzma_ret expected_ret)
34*4d1abfb2Sjoerg {
35*4d1abfb2Sjoerg 	memcrap(&decoded_flags, sizeof(decoded_flags));
36*4d1abfb2Sjoerg 
37*4d1abfb2Sjoerg 	if (lzma_stream_header_decode(&decoded_flags, buffer) != expected_ret)
38*4d1abfb2Sjoerg 		return true;
39*4d1abfb2Sjoerg 
40*4d1abfb2Sjoerg 	if (expected_ret != LZMA_OK)
41*4d1abfb2Sjoerg 		return false;
42*4d1abfb2Sjoerg 
43*4d1abfb2Sjoerg 	// Header doesn't have Backward Size, so make
44*4d1abfb2Sjoerg 	// lzma_stream_flags_compare() ignore it.
45*4d1abfb2Sjoerg 	decoded_flags.backward_size = LZMA_VLI_UNKNOWN;
46*4d1abfb2Sjoerg 	return validate();
47*4d1abfb2Sjoerg }
48*4d1abfb2Sjoerg 
49*4d1abfb2Sjoerg 
50*4d1abfb2Sjoerg static void
test_header(void)51*4d1abfb2Sjoerg test_header(void)
52*4d1abfb2Sjoerg {
53*4d1abfb2Sjoerg 	memcrap(buffer, sizeof(buffer));
54*4d1abfb2Sjoerg 	expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK);
55*4d1abfb2Sjoerg 	succeed(test_header_decoder(LZMA_OK));
56*4d1abfb2Sjoerg }
57*4d1abfb2Sjoerg 
58*4d1abfb2Sjoerg 
59*4d1abfb2Sjoerg static bool
test_footer_decoder(lzma_ret expected_ret)60*4d1abfb2Sjoerg test_footer_decoder(lzma_ret expected_ret)
61*4d1abfb2Sjoerg {
62*4d1abfb2Sjoerg 	memcrap(&decoded_flags, sizeof(decoded_flags));
63*4d1abfb2Sjoerg 
64*4d1abfb2Sjoerg 	if (lzma_stream_footer_decode(&decoded_flags, buffer) != expected_ret)
65*4d1abfb2Sjoerg 		return true;
66*4d1abfb2Sjoerg 
67*4d1abfb2Sjoerg 	if (expected_ret != LZMA_OK)
68*4d1abfb2Sjoerg 		return false;
69*4d1abfb2Sjoerg 
70*4d1abfb2Sjoerg 	return validate();
71*4d1abfb2Sjoerg }
72*4d1abfb2Sjoerg 
73*4d1abfb2Sjoerg 
74*4d1abfb2Sjoerg static void
test_footer(void)75*4d1abfb2Sjoerg test_footer(void)
76*4d1abfb2Sjoerg {
77*4d1abfb2Sjoerg 	memcrap(buffer, sizeof(buffer));
78*4d1abfb2Sjoerg 	expect(lzma_stream_footer_encode(&known_flags, buffer) == LZMA_OK);
79*4d1abfb2Sjoerg 	succeed(test_footer_decoder(LZMA_OK));
80*4d1abfb2Sjoerg }
81*4d1abfb2Sjoerg 
82*4d1abfb2Sjoerg 
83*4d1abfb2Sjoerg static void
test_encode_invalid(void)84*4d1abfb2Sjoerg test_encode_invalid(void)
85*4d1abfb2Sjoerg {
86*4d1abfb2Sjoerg 	known_flags.check = LZMA_CHECK_ID_MAX + 1;
87*4d1abfb2Sjoerg 	known_flags.backward_size = 1024;
88*4d1abfb2Sjoerg 
89*4d1abfb2Sjoerg 	expect(lzma_stream_header_encode(&known_flags, buffer)
90*4d1abfb2Sjoerg 			== LZMA_PROG_ERROR);
91*4d1abfb2Sjoerg 
92*4d1abfb2Sjoerg 	expect(lzma_stream_footer_encode(&known_flags, buffer)
93*4d1abfb2Sjoerg 			== LZMA_PROG_ERROR);
94*4d1abfb2Sjoerg 
95*4d1abfb2Sjoerg 	known_flags.check = (lzma_check)(-1);
96*4d1abfb2Sjoerg 
97*4d1abfb2Sjoerg 	expect(lzma_stream_header_encode(&known_flags, buffer)
98*4d1abfb2Sjoerg 			== LZMA_PROG_ERROR);
99*4d1abfb2Sjoerg 
100*4d1abfb2Sjoerg 	expect(lzma_stream_footer_encode(&known_flags, buffer)
101*4d1abfb2Sjoerg 			== LZMA_PROG_ERROR);
102*4d1abfb2Sjoerg 
103*4d1abfb2Sjoerg 	known_flags.check = LZMA_CHECK_NONE;
104*4d1abfb2Sjoerg 	known_flags.backward_size = 0;
105*4d1abfb2Sjoerg 
106*4d1abfb2Sjoerg 	// Header encoder ignores backward_size.
107*4d1abfb2Sjoerg 	expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK);
108*4d1abfb2Sjoerg 
109*4d1abfb2Sjoerg 	expect(lzma_stream_footer_encode(&known_flags, buffer)
110*4d1abfb2Sjoerg 			== LZMA_PROG_ERROR);
111*4d1abfb2Sjoerg 
112*4d1abfb2Sjoerg 	known_flags.backward_size = LZMA_VLI_MAX;
113*4d1abfb2Sjoerg 
114*4d1abfb2Sjoerg 	expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK);
115*4d1abfb2Sjoerg 
116*4d1abfb2Sjoerg 	expect(lzma_stream_footer_encode(&known_flags, buffer)
117*4d1abfb2Sjoerg 			== LZMA_PROG_ERROR);
118*4d1abfb2Sjoerg }
119*4d1abfb2Sjoerg 
120*4d1abfb2Sjoerg 
121*4d1abfb2Sjoerg static void
test_decode_invalid(void)122*4d1abfb2Sjoerg test_decode_invalid(void)
123*4d1abfb2Sjoerg {
124*4d1abfb2Sjoerg 	known_flags.check = LZMA_CHECK_NONE;
125*4d1abfb2Sjoerg 	known_flags.backward_size = 1024;
126*4d1abfb2Sjoerg 
127*4d1abfb2Sjoerg 	expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK);
128*4d1abfb2Sjoerg 
129*4d1abfb2Sjoerg 	// Test 1 (invalid Magic Bytes)
130*4d1abfb2Sjoerg 	buffer[5] ^= 1;
131*4d1abfb2Sjoerg 	succeed(test_header_decoder(LZMA_FORMAT_ERROR));
132*4d1abfb2Sjoerg 	buffer[5] ^= 1;
133*4d1abfb2Sjoerg 
134*4d1abfb2Sjoerg 	// Test 2a (valid CRC32)
135*4d1abfb2Sjoerg 	uint32_t crc = lzma_crc32(buffer + 6, 2, 0);
136*4d1abfb2Sjoerg 	unaligned_write32le(buffer + 8, crc);
137*4d1abfb2Sjoerg 	succeed(test_header_decoder(LZMA_OK));
138*4d1abfb2Sjoerg 
139*4d1abfb2Sjoerg 	// Test 2b (invalid Stream Flags with valid CRC32)
140*4d1abfb2Sjoerg 	buffer[6] ^= 0x20;
141*4d1abfb2Sjoerg 	crc = lzma_crc32(buffer + 6, 2, 0);
142*4d1abfb2Sjoerg 	unaligned_write32le(buffer + 8, crc);
143*4d1abfb2Sjoerg 	succeed(test_header_decoder(LZMA_OPTIONS_ERROR));
144*4d1abfb2Sjoerg 
145*4d1abfb2Sjoerg 	// Test 3 (invalid CRC32)
146*4d1abfb2Sjoerg 	expect(lzma_stream_header_encode(&known_flags, buffer) == LZMA_OK);
147*4d1abfb2Sjoerg 	buffer[9] ^= 1;
148*4d1abfb2Sjoerg 	succeed(test_header_decoder(LZMA_DATA_ERROR));
149*4d1abfb2Sjoerg 
150*4d1abfb2Sjoerg 	// Test 4 (invalid Stream Flags with valid CRC32)
151*4d1abfb2Sjoerg 	expect(lzma_stream_footer_encode(&known_flags, buffer) == LZMA_OK);
152*4d1abfb2Sjoerg 	buffer[9] ^= 0x40;
153*4d1abfb2Sjoerg 	crc = lzma_crc32(buffer + 4, 6, 0);
154*4d1abfb2Sjoerg 	unaligned_write32le(buffer, crc);
155*4d1abfb2Sjoerg 	succeed(test_footer_decoder(LZMA_OPTIONS_ERROR));
156*4d1abfb2Sjoerg 
157*4d1abfb2Sjoerg 	// Test 5 (invalid Magic Bytes)
158*4d1abfb2Sjoerg 	expect(lzma_stream_footer_encode(&known_flags, buffer) == LZMA_OK);
159*4d1abfb2Sjoerg 	buffer[11] ^= 1;
160*4d1abfb2Sjoerg 	succeed(test_footer_decoder(LZMA_FORMAT_ERROR));
161*4d1abfb2Sjoerg }
162*4d1abfb2Sjoerg 
163*4d1abfb2Sjoerg 
164*4d1abfb2Sjoerg int
main(void)165*4d1abfb2Sjoerg main(void)
166*4d1abfb2Sjoerg {
167*4d1abfb2Sjoerg 	// Valid headers
168*4d1abfb2Sjoerg 	known_flags.backward_size = 1024;
169*4d1abfb2Sjoerg 	for (lzma_check check = LZMA_CHECK_NONE;
170*4d1abfb2Sjoerg 			check <= LZMA_CHECK_ID_MAX; ++check) {
171*4d1abfb2Sjoerg 		test_header();
172*4d1abfb2Sjoerg 		test_footer();
173*4d1abfb2Sjoerg 	}
174*4d1abfb2Sjoerg 
175*4d1abfb2Sjoerg 	// Invalid headers
176*4d1abfb2Sjoerg 	test_encode_invalid();
177*4d1abfb2Sjoerg 	test_decode_invalid();
178*4d1abfb2Sjoerg 
179*4d1abfb2Sjoerg 	return 0;
180*4d1abfb2Sjoerg }
181