xref: /aosp_15_r20/external/flac/src/test_libFLAC/format.c (revision 600f14f40d737144c998e2ec7a483122d3776fbc)
1*600f14f4SXin Li /* test_libFLAC - Unit tester for libFLAC
2*600f14f4SXin Li  * Copyright (C) 2004-2009  Josh Coalson
3*600f14f4SXin Li  * Copyright (C) 2011-2023  Xiph.Org Foundation
4*600f14f4SXin Li  *
5*600f14f4SXin Li  * This program is free software; you can redistribute it and/or
6*600f14f4SXin Li  * modify it under the terms of the GNU General Public License
7*600f14f4SXin Li  * as published by the Free Software Foundation; either version 2
8*600f14f4SXin Li  * of the License, or (at your option) any later version.
9*600f14f4SXin Li  *
10*600f14f4SXin Li  * This program is distributed in the hope that it will be useful,
11*600f14f4SXin Li  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*600f14f4SXin Li  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*600f14f4SXin Li  * GNU General Public License for more details.
14*600f14f4SXin Li  *
15*600f14f4SXin Li  * You should have received a copy of the GNU General Public License along
16*600f14f4SXin Li  * with this program; if not, write to the Free Software Foundation, Inc.,
17*600f14f4SXin Li  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*600f14f4SXin Li  */
19*600f14f4SXin Li 
20*600f14f4SXin Li #ifdef HAVE_CONFIG_H
21*600f14f4SXin Li #  include <config.h>
22*600f14f4SXin Li #endif
23*600f14f4SXin Li 
24*600f14f4SXin Li #include "FLAC/assert.h"
25*600f14f4SXin Li #include "FLAC/format.h"
26*600f14f4SXin Li #include "format.h"
27*600f14f4SXin Li #include <stdio.h>
28*600f14f4SXin Li 
29*600f14f4SXin Li static const char *true_false_string_[2] = { "false", "true" };
30*600f14f4SXin Li 
31*600f14f4SXin Li static struct {
32*600f14f4SXin Li 	uint32_t rate;
33*600f14f4SXin Li 	FLAC__bool valid;
34*600f14f4SXin Li 	FLAC__bool subset;
35*600f14f4SXin Li } SAMPLE_RATES[] = {
36*600f14f4SXin Li 	{ 0      , true , true  },
37*600f14f4SXin Li 	{ 1      , true , true  },
38*600f14f4SXin Li 	{ 9      , true , true  },
39*600f14f4SXin Li 	{ 10     , true , true  },
40*600f14f4SXin Li 	{ 4000   , true , true  },
41*600f14f4SXin Li 	{ 8000   , true , true  },
42*600f14f4SXin Li 	{ 11025  , true , true  },
43*600f14f4SXin Li 	{ 12000  , true , true  },
44*600f14f4SXin Li 	{ 16000  , true , true  },
45*600f14f4SXin Li 	{ 22050  , true , true  },
46*600f14f4SXin Li 	{ 24000  , true , true  },
47*600f14f4SXin Li 	{ 32000  , true , true  },
48*600f14f4SXin Li 	{ 32768  , true , true  },
49*600f14f4SXin Li 	{ 44100  , true , true  },
50*600f14f4SXin Li 	{ 48000  , true , true  },
51*600f14f4SXin Li 	{ 65000  , true , true  },
52*600f14f4SXin Li 	{ 65535  , true , true  },
53*600f14f4SXin Li 	{ 65536  , true , false },
54*600f14f4SXin Li 	{ 65540  , true , true  },
55*600f14f4SXin Li 	{ 65550  , true , true  },
56*600f14f4SXin Li 	{ 65555  , true , false },
57*600f14f4SXin Li 	{ 66000  , true , true  },
58*600f14f4SXin Li 	{ 66001  , true , false },
59*600f14f4SXin Li 	{ 96000  , true , true  },
60*600f14f4SXin Li 	{ 100000 , true , true  },
61*600f14f4SXin Li 	{ 100001 , true , false },
62*600f14f4SXin Li 	{ 192000 , true , true  },
63*600f14f4SXin Li 	{ 500000 , true , true  },
64*600f14f4SXin Li 	{ 500001 , true , false },
65*600f14f4SXin Li 	{ 500010 , true , true  },
66*600f14f4SXin Li 	{ 655349 , true , false },
67*600f14f4SXin Li 	{ 655350 , true , true  },
68*600f14f4SXin Li 	{ 655351 , true , false },
69*600f14f4SXin Li 	{ 655360 , true , false },
70*600f14f4SXin Li 	{ 700000 , true , false },
71*600f14f4SXin Li 	{ 700010 , true , false },
72*600f14f4SXin Li 	{ 705600 , true , false },
73*600f14f4SXin Li 	{ 768000 , true , false },
74*600f14f4SXin Li 	{ 1000000, true , false },
75*600f14f4SXin Li 	{ 1048575, true , false },
76*600f14f4SXin Li 	{ 1100000, false, false }
77*600f14f4SXin Li };
78*600f14f4SXin Li 
79*600f14f4SXin Li static struct {
80*600f14f4SXin Li 	const char *string;
81*600f14f4SXin Li 	FLAC__bool valid;
82*600f14f4SXin Li } VCENTRY_NAMES[] = {
83*600f14f4SXin Li 	{ ""    , true  },
84*600f14f4SXin Li 	{ "a"   , true  },
85*600f14f4SXin Li 	{ "="   , false },
86*600f14f4SXin Li 	{ "a="  , false },
87*600f14f4SXin Li 	{ "\x01", false },
88*600f14f4SXin Li 	{ "\x1f", false },
89*600f14f4SXin Li 	{ "\x7d", true  },
90*600f14f4SXin Li 	{ "\x7e", false },
91*600f14f4SXin Li 	{ "\xff", false }
92*600f14f4SXin Li };
93*600f14f4SXin Li 
94*600f14f4SXin Li static struct {
95*600f14f4SXin Li 	uint32_t length;
96*600f14f4SXin Li 	const FLAC__byte *string;
97*600f14f4SXin Li 	FLAC__bool valid;
98*600f14f4SXin Li } VCENTRY_VALUES[] = {
99*600f14f4SXin Li 	{ 0, (const FLAC__byte*)""            , true  },
100*600f14f4SXin Li 	{ 1, (const FLAC__byte*)""            , true  },
101*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"\x01"        , true  },
102*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"\x7f"        , true  },
103*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"\x80"        , false },
104*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"\x81"        , false },
105*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"\xc0"        , false },
106*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"\xe0"        , false },
107*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"\xf0"        , false },
108*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xc0\x41"    , false },
109*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xc1\x41"    , false },
110*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xc0\x85"    , false }, /* non-shortest form */
111*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xc1\x85"    , false }, /* non-shortest form */
112*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xc2\x85"    , true  },
113*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xe0\x41"    , false },
114*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xe1\x41"    , false },
115*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xe0\x85"    , false },
116*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xe1\x85"    , false },
117*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe0\x85\x41", false },
118*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe1\x85\x41", false },
119*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe0\x85\x80", false }, /* non-shortest form */
120*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe0\x95\x80", false }, /* non-shortest form */
121*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe0\xa5\x80", true  },
122*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe1\x85\x80", true  },
123*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe1\x95\x80", true  },
124*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"\xe1\xa5\x80", true  }
125*600f14f4SXin Li };
126*600f14f4SXin Li 
127*600f14f4SXin Li static struct {
128*600f14f4SXin Li 	const FLAC__byte *string;
129*600f14f4SXin Li 	FLAC__bool valid;
130*600f14f4SXin Li } VCENTRY_VALUES_NT[] = {
131*600f14f4SXin Li 	{ (const FLAC__byte*)""            , true  },
132*600f14f4SXin Li 	{ (const FLAC__byte*)"\x01"        , true  },
133*600f14f4SXin Li 	{ (const FLAC__byte*)"\x7f"        , true  },
134*600f14f4SXin Li 	{ (const FLAC__byte*)"\x80"        , false },
135*600f14f4SXin Li 	{ (const FLAC__byte*)"\x81"        , false },
136*600f14f4SXin Li 	{ (const FLAC__byte*)"\xc0"        , false },
137*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe0"        , false },
138*600f14f4SXin Li 	{ (const FLAC__byte*)"\xf0"        , false },
139*600f14f4SXin Li 	{ (const FLAC__byte*)"\xc0\x41"    , false },
140*600f14f4SXin Li 	{ (const FLAC__byte*)"\xc1\x41"    , false },
141*600f14f4SXin Li 	{ (const FLAC__byte*)"\xc0\x85"    , false }, /* non-shortest form */
142*600f14f4SXin Li 	{ (const FLAC__byte*)"\xc1\x85"    , false }, /* non-shortest form */
143*600f14f4SXin Li 	{ (const FLAC__byte*)"\xc2\x85"    , true  },
144*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe0\x41"    , false },
145*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe1\x41"    , false },
146*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe0\x85"    , false },
147*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe1\x85"    , false },
148*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe0\x85\x41", false },
149*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe1\x85\x41", false },
150*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe0\x85\x80", false }, /* non-shortest form */
151*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe0\x95\x80", false }, /* non-shortest form */
152*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe0\xa5\x80", true  },
153*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe1\x85\x80", true  },
154*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe1\x95\x80", true  },
155*600f14f4SXin Li 	{ (const FLAC__byte*)"\xe1\xa5\x80", true  }
156*600f14f4SXin Li };
157*600f14f4SXin Li 
158*600f14f4SXin Li static struct {
159*600f14f4SXin Li 	uint32_t length;
160*600f14f4SXin Li 	const FLAC__byte *string;
161*600f14f4SXin Li 	FLAC__bool valid;
162*600f14f4SXin Li } VCENTRIES[] = {
163*600f14f4SXin Li 	{ 0, (const FLAC__byte*)""              , false },
164*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"a"             , false },
165*600f14f4SXin Li 	{ 1, (const FLAC__byte*)"="             , true  },
166*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"a="            , true  },
167*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\x01="         , false },
168*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\x1f="         , false },
169*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\x7d="         , true  },
170*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\x7e="         , false },
171*600f14f4SXin Li 	{ 2, (const FLAC__byte*)"\xff="         , false },
172*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"a=\x01"        , true  },
173*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"a=\x7f"        , true  },
174*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"a=\x80"        , false },
175*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"a=\x81"        , false },
176*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"a=\xc0"        , false },
177*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"a=\xe0"        , false },
178*600f14f4SXin Li 	{ 3, (const FLAC__byte*)"a=\xf0"        , false },
179*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xc0\x41"    , false },
180*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xc1\x41"    , false },
181*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xc0\x85"    , false }, /* non-shortest form */
182*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xc1\x85"    , false }, /* non-shortest form */
183*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xc2\x85"    , true  },
184*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xe0\x41"    , false },
185*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xe1\x41"    , false },
186*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xe0\x85"    , false },
187*600f14f4SXin Li 	{ 4, (const FLAC__byte*)"a=\xe1\x85"    , false },
188*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe0\x85\x41", false },
189*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe1\x85\x41", false },
190*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe0\x85\x80", false }, /* non-shortest form */
191*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe0\x95\x80", false }, /* non-shortest form */
192*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe0\xa5\x80", true  },
193*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe1\x85\x80", true  },
194*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe1\x95\x80", true  },
195*600f14f4SXin Li 	{ 5, (const FLAC__byte*)"a=\xe1\xa5\x80", true  }
196*600f14f4SXin Li };
197*600f14f4SXin Li 
test_format(void)198*600f14f4SXin Li FLAC__bool test_format(void)
199*600f14f4SXin Li {
200*600f14f4SXin Li 	uint32_t i;
201*600f14f4SXin Li 
202*600f14f4SXin Li 	printf("\n+++ libFLAC unit test: format\n\n");
203*600f14f4SXin Li 
204*600f14f4SXin Li 	for(i = 0; i < sizeof(SAMPLE_RATES)/sizeof(SAMPLE_RATES[0]); i++) {
205*600f14f4SXin Li 		printf("testing FLAC__format_sample_rate_is_valid(%u)... ", SAMPLE_RATES[i].rate);
206*600f14f4SXin Li 		if(FLAC__format_sample_rate_is_valid(SAMPLE_RATES[i].rate) != SAMPLE_RATES[i].valid) {
207*600f14f4SXin Li 			printf("FAILED, expected %s, got %s\n", true_false_string_[SAMPLE_RATES[i].valid], true_false_string_[!SAMPLE_RATES[i].valid]);
208*600f14f4SXin Li 			return false;
209*600f14f4SXin Li 		}
210*600f14f4SXin Li 		printf("OK\n");
211*600f14f4SXin Li 	}
212*600f14f4SXin Li 
213*600f14f4SXin Li 	for(i = 0; i < sizeof(SAMPLE_RATES)/sizeof(SAMPLE_RATES[0]); i++) {
214*600f14f4SXin Li 		printf("testing FLAC__format_sample_rate_is_subset(%u)... ", SAMPLE_RATES[i].rate);
215*600f14f4SXin Li 		if(FLAC__format_sample_rate_is_subset(SAMPLE_RATES[i].rate) != SAMPLE_RATES[i].subset) {
216*600f14f4SXin Li 			printf("FAILED, expected %s, got %s\n", true_false_string_[SAMPLE_RATES[i].subset], true_false_string_[!SAMPLE_RATES[i].subset]);
217*600f14f4SXin Li 			return false;
218*600f14f4SXin Li 		}
219*600f14f4SXin Li 		printf("OK\n");
220*600f14f4SXin Li 	}
221*600f14f4SXin Li 
222*600f14f4SXin Li 	for(i = 0; i < sizeof(VCENTRY_NAMES)/sizeof(VCENTRY_NAMES[0]); i++) {
223*600f14f4SXin Li 		printf("testing FLAC__format_vorbiscomment_entry_name_is_legal(\"%s\")... ", VCENTRY_NAMES[i].string);
224*600f14f4SXin Li 		if(FLAC__format_vorbiscomment_entry_name_is_legal(VCENTRY_NAMES[i].string) != VCENTRY_NAMES[i].valid) {
225*600f14f4SXin Li 			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRY_NAMES[i].valid], true_false_string_[!VCENTRY_NAMES[i].valid]);
226*600f14f4SXin Li 			return false;
227*600f14f4SXin Li 		}
228*600f14f4SXin Li 		printf("OK\n");
229*600f14f4SXin Li 	}
230*600f14f4SXin Li 
231*600f14f4SXin Li 	for(i = 0; i < sizeof(VCENTRY_VALUES)/sizeof(VCENTRY_VALUES[0]); i++) {
232*600f14f4SXin Li 		printf("testing FLAC__format_vorbiscomment_entry_value_is_legal(\"%s\", %u)... ", VCENTRY_VALUES[i].string, VCENTRY_VALUES[i].length);
233*600f14f4SXin Li 		if(FLAC__format_vorbiscomment_entry_value_is_legal(VCENTRY_VALUES[i].string, VCENTRY_VALUES[i].length) != VCENTRY_VALUES[i].valid) {
234*600f14f4SXin Li 			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRY_VALUES[i].valid], true_false_string_[!VCENTRY_VALUES[i].valid]);
235*600f14f4SXin Li 			return false;
236*600f14f4SXin Li 		}
237*600f14f4SXin Li 		printf("OK\n");
238*600f14f4SXin Li 	}
239*600f14f4SXin Li 
240*600f14f4SXin Li 	for(i = 0; i < sizeof(VCENTRY_VALUES_NT)/sizeof(VCENTRY_VALUES_NT[0]); i++) {
241*600f14f4SXin Li 		printf("testing FLAC__format_vorbiscomment_entry_value_is_legal(\"%s\", -1)... ", VCENTRY_VALUES_NT[i].string);
242*600f14f4SXin Li 		if(FLAC__format_vorbiscomment_entry_value_is_legal(VCENTRY_VALUES_NT[i].string, (uint32_t)(-1)) != VCENTRY_VALUES_NT[i].valid) {
243*600f14f4SXin Li 			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRY_VALUES_NT[i].valid], true_false_string_[!VCENTRY_VALUES_NT[i].valid]);
244*600f14f4SXin Li 			return false;
245*600f14f4SXin Li 		}
246*600f14f4SXin Li 		printf("OK\n");
247*600f14f4SXin Li 	}
248*600f14f4SXin Li 
249*600f14f4SXin Li 	for(i = 0; i < sizeof(VCENTRIES)/sizeof(VCENTRIES[0]); i++) {
250*600f14f4SXin Li 		printf("testing FLAC__format_vorbiscomment_entry_is_legal(\"%s\", %u)... ", VCENTRIES[i].string, VCENTRIES[i].length);
251*600f14f4SXin Li 		if(FLAC__format_vorbiscomment_entry_is_legal(VCENTRIES[i].string, VCENTRIES[i].length) != VCENTRIES[i].valid) {
252*600f14f4SXin Li 			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRIES[i].valid], true_false_string_[!VCENTRIES[i].valid]);
253*600f14f4SXin Li 			return false;
254*600f14f4SXin Li 		}
255*600f14f4SXin Li 		printf("OK\n");
256*600f14f4SXin Li 	}
257*600f14f4SXin Li 
258*600f14f4SXin Li 	printf("\nPASSED!\n");
259*600f14f4SXin Li 	return true;
260*600f14f4SXin Li }
261