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