annotate src/libsndfile-1.0.25/tests/misc_test.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 ** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 3 **
Chris@0 4 ** This program is free software ; you can redistribute it and/or modify
Chris@0 5 ** it under the terms of the GNU General Public License as published by
Chris@0 6 ** the Free Software Foundation ; either version 2 of the License, or
Chris@0 7 ** (at your option) any later version.
Chris@0 8 **
Chris@0 9 ** This program is distributed in the hope that it will be useful,
Chris@0 10 ** but WITHOUT ANY WARRANTY ; without even the implied warranty of
Chris@0 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 ** GNU General Public License for more details.
Chris@0 13 **
Chris@0 14 ** You should have received a copy of the GNU General Public License
Chris@0 15 ** along with this program ; if not, write to the Free Software
Chris@0 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@0 17 */
Chris@0 18
Chris@0 19 #include "sfconfig.h"
Chris@0 20
Chris@0 21 #include <stdio.h>
Chris@0 22 #include <stdlib.h>
Chris@0 23 #include <string.h>
Chris@0 24 #include <errno.h>
Chris@0 25
Chris@0 26 #include <sys/stat.h>
Chris@0 27 #include <math.h>
Chris@0 28
Chris@0 29 #if HAVE_UNISTD_H
Chris@0 30 #include <unistd.h>
Chris@0 31 #endif
Chris@0 32
Chris@0 33 #if (HAVE_DECL_S_IRGRP == 0)
Chris@0 34 #include <sf_unistd.h>
Chris@0 35 #endif
Chris@0 36
Chris@0 37 #if (defined (WIN32) || defined (_WIN32))
Chris@0 38 #include <io.h>
Chris@0 39 #include <direct.h>
Chris@0 40 #endif
Chris@0 41
Chris@0 42 #include <sndfile.h>
Chris@0 43
Chris@0 44 #include "utils.h"
Chris@0 45
Chris@0 46 #define BUFFER_LEN (1<<10)
Chris@0 47 #define LOG_BUFFER_SIZE 1024
Chris@0 48
Chris@0 49 static void zero_data_test (const char *filename, int format) ;
Chris@0 50 static void filesystem_full_test (int format) ;
Chris@0 51 static void permission_test (const char *filename, int typemajor) ;
Chris@0 52 static void wavex_amb_test (const char *filename) ;
Chris@0 53
Chris@0 54 int
Chris@0 55 main (int argc, char *argv [])
Chris@0 56 { int do_all = 0 ;
Chris@0 57 int test_count = 0 ;
Chris@0 58
Chris@0 59 if (argc != 2)
Chris@0 60 { printf ("Usage : %s <test>\n", argv [0]) ;
Chris@0 61 printf (" Where <test> is one of the following:\n") ;
Chris@0 62 printf (" wav - test WAV file peak chunk\n") ;
Chris@0 63 printf (" aiff - test AIFF file PEAK chunk\n") ;
Chris@0 64 printf (" all - perform all tests\n") ;
Chris@0 65 exit (1) ;
Chris@0 66 } ;
Chris@0 67
Chris@0 68 do_all=!strcmp (argv [1], "all") ;
Chris@0 69
Chris@0 70 if (do_all || ! strcmp (argv [1], "wav"))
Chris@0 71 { zero_data_test ("zerolen.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@0 72 filesystem_full_test (SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@0 73 permission_test ("readonly.wav", SF_FORMAT_WAV) ;
Chris@0 74 wavex_amb_test ("ambisonic.wav") ;
Chris@0 75 test_count++ ;
Chris@0 76 } ;
Chris@0 77
Chris@0 78 if (do_all || ! strcmp (argv [1], "aiff"))
Chris@0 79 { zero_data_test ("zerolen.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
Chris@0 80 filesystem_full_test (SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
Chris@0 81 permission_test ("readonly.aiff", SF_FORMAT_AIFF) ;
Chris@0 82 test_count++ ;
Chris@0 83 } ;
Chris@0 84
Chris@0 85 if (do_all || ! strcmp (argv [1], "au"))
Chris@0 86 { zero_data_test ("zerolen.au", SF_FORMAT_AU | SF_FORMAT_PCM_16) ;
Chris@0 87 filesystem_full_test (SF_FORMAT_AU | SF_FORMAT_PCM_16) ;
Chris@0 88 permission_test ("readonly.au", SF_FORMAT_AU) ;
Chris@0 89 test_count++ ;
Chris@0 90 } ;
Chris@0 91
Chris@0 92 if (do_all || ! strcmp (argv [1], "caf"))
Chris@0 93 { zero_data_test ("zerolen.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ;
Chris@0 94 filesystem_full_test (SF_FORMAT_CAF | SF_FORMAT_PCM_16) ;
Chris@0 95 permission_test ("readonly.caf", SF_FORMAT_CAF) ;
Chris@0 96 test_count++ ;
Chris@0 97 } ;
Chris@0 98
Chris@0 99 if (do_all || ! strcmp (argv [1], "svx"))
Chris@0 100 { zero_data_test ("zerolen.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ;
Chris@0 101 filesystem_full_test (SF_FORMAT_SVX | SF_FORMAT_PCM_16) ;
Chris@0 102 permission_test ("readonly.svx", SF_FORMAT_SVX) ;
Chris@0 103 test_count++ ;
Chris@0 104 } ;
Chris@0 105
Chris@0 106 if (do_all || ! strcmp (argv [1], "nist"))
Chris@0 107 { zero_data_test ("zerolen.nist", SF_FORMAT_NIST | SF_FORMAT_PCM_16) ;
Chris@0 108 filesystem_full_test (SF_FORMAT_NIST | SF_FORMAT_PCM_16) ;
Chris@0 109 permission_test ("readonly.nist", SF_FORMAT_NIST) ;
Chris@0 110 test_count++ ;
Chris@0 111 } ;
Chris@0 112
Chris@0 113 if (do_all || ! strcmp (argv [1], "paf"))
Chris@0 114 { zero_data_test ("zerolen.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_16) ;
Chris@0 115 filesystem_full_test (SF_FORMAT_PAF | SF_FORMAT_PCM_16) ;
Chris@0 116 permission_test ("readonly.paf", SF_FORMAT_PAF) ;
Chris@0 117 test_count++ ;
Chris@0 118 } ;
Chris@0 119
Chris@0 120 if (do_all || ! strcmp (argv [1], "ircam"))
Chris@0 121 { zero_data_test ("zerolen.ircam", SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ;
Chris@0 122 filesystem_full_test (SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ;
Chris@0 123 permission_test ("readonly.ircam", SF_FORMAT_IRCAM) ;
Chris@0 124 test_count++ ;
Chris@0 125 } ;
Chris@0 126
Chris@0 127 if (do_all || ! strcmp (argv [1], "voc"))
Chris@0 128 { zero_data_test ("zerolen.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16) ;
Chris@0 129 filesystem_full_test (SF_FORMAT_VOC | SF_FORMAT_PCM_16) ;
Chris@0 130 permission_test ("readonly.voc", SF_FORMAT_VOC) ;
Chris@0 131 test_count++ ;
Chris@0 132 } ;
Chris@0 133
Chris@0 134 if (do_all || ! strcmp (argv [1], "w64"))
Chris@0 135 { zero_data_test ("zerolen.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
Chris@0 136 filesystem_full_test (SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
Chris@0 137 permission_test ("readonly.w64", SF_FORMAT_W64) ;
Chris@0 138 test_count++ ;
Chris@0 139 } ;
Chris@0 140
Chris@0 141 if (do_all || ! strcmp (argv [1], "rf64"))
Chris@0 142 { zero_data_test ("zerolen.rf64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
Chris@0 143 filesystem_full_test (SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
Chris@0 144 permission_test ("readonly.rf64", SF_FORMAT_W64) ;
Chris@0 145 test_count++ ;
Chris@0 146 } ;
Chris@0 147
Chris@0 148 if (do_all || ! strcmp (argv [1], "mat4"))
Chris@0 149 { zero_data_test ("zerolen.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ;
Chris@0 150 filesystem_full_test (SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ;
Chris@0 151 permission_test ("readonly.mat4", SF_FORMAT_MAT4) ;
Chris@0 152 test_count++ ;
Chris@0 153 } ;
Chris@0 154
Chris@0 155 if (do_all || ! strcmp (argv [1], "mat5"))
Chris@0 156 { zero_data_test ("zerolen.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ;
Chris@0 157 filesystem_full_test (SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ;
Chris@0 158 permission_test ("readonly.mat5", SF_FORMAT_MAT5) ;
Chris@0 159 test_count++ ;
Chris@0 160 } ;
Chris@0 161
Chris@0 162 if (do_all || ! strcmp (argv [1], "pvf"))
Chris@0 163 { zero_data_test ("zerolen.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16) ;
Chris@0 164 filesystem_full_test (SF_FORMAT_PVF | SF_FORMAT_PCM_16) ;
Chris@0 165 permission_test ("readonly.pvf", SF_FORMAT_PVF) ;
Chris@0 166 test_count++ ;
Chris@0 167 } ;
Chris@0 168
Chris@0 169 if (do_all || ! strcmp (argv [1], "htk"))
Chris@0 170 { zero_data_test ("zerolen.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16) ;
Chris@0 171 filesystem_full_test (SF_FORMAT_HTK | SF_FORMAT_PCM_16) ;
Chris@0 172 permission_test ("readonly.htk", SF_FORMAT_HTK) ;
Chris@0 173 test_count++ ;
Chris@0 174 } ;
Chris@0 175
Chris@0 176 if (do_all || ! strcmp (argv [1], "avr"))
Chris@0 177 { zero_data_test ("zerolen.avr", SF_FORMAT_AVR | SF_FORMAT_PCM_16) ;
Chris@0 178 filesystem_full_test (SF_FORMAT_AVR | SF_FORMAT_PCM_16) ;
Chris@0 179 permission_test ("readonly.avr", SF_FORMAT_AVR) ;
Chris@0 180 test_count++ ;
Chris@0 181 } ;
Chris@0 182
Chris@0 183 if (do_all || ! strcmp (argv [1], "sds"))
Chris@0 184 { zero_data_test ("zerolen.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ;
Chris@0 185 filesystem_full_test (SF_FORMAT_SDS | SF_FORMAT_PCM_16) ;
Chris@0 186 permission_test ("readonly.sds", SF_FORMAT_SDS) ;
Chris@0 187 test_count++ ;
Chris@0 188 } ;
Chris@0 189
Chris@0 190 if (do_all || ! strcmp (argv [1], "mpc2k"))
Chris@0 191 { zero_data_test ("zerolen.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ;
Chris@0 192 filesystem_full_test (SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ;
Chris@0 193 permission_test ("readonly.mpc", SF_FORMAT_MPC2K) ;
Chris@0 194 test_count++ ;
Chris@0 195 } ;
Chris@0 196
Chris@0 197 if (do_all || ! strcmp (argv [1], "ogg"))
Chris@0 198 { zero_data_test ("zerolen.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS) ;
Chris@0 199 /*-filesystem_full_test (SF_FORMAT_OGG | SF_FORMAT_VORBIS) ;-*/
Chris@0 200 permission_test ("readonly.oga", SF_FORMAT_OGG) ;
Chris@0 201 test_count++ ;
Chris@0 202 } ;
Chris@0 203
Chris@0 204 if (test_count == 0)
Chris@0 205 { printf ("Mono : ************************************\n") ;
Chris@0 206 printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
Chris@0 207 printf ("Mono : ************************************\n") ;
Chris@0 208 return 1 ;
Chris@0 209 } ;
Chris@0 210
Chris@0 211 return 0 ;
Chris@0 212 } /* main */
Chris@0 213
Chris@0 214
Chris@0 215 /*============================================================================================
Chris@0 216 ** Here are the test functions.
Chris@0 217 */
Chris@0 218
Chris@0 219 static void
Chris@0 220 zero_data_test (const char *filename, int format)
Chris@0 221 { SNDFILE *file ;
Chris@0 222 SF_INFO sfinfo ;
Chris@0 223
Chris@0 224 switch (format & SF_FORMAT_TYPEMASK)
Chris@0 225 { case SF_FORMAT_OGG :
Chris@0 226 if (HAVE_EXTERNAL_LIBS == 0)
Chris@0 227 return ;
Chris@0 228 break ;
Chris@0 229 default :
Chris@0 230 break ;
Chris@0 231 } ;
Chris@0 232
Chris@0 233 print_test_name ("zero_data_test", filename) ;
Chris@0 234
Chris@0 235 sfinfo.samplerate = 44100 ;
Chris@0 236 sfinfo.format = format ;
Chris@0 237 sfinfo.channels = 1 ;
Chris@0 238 sfinfo.frames = 0 ;
Chris@0 239
Chris@0 240 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 241
Chris@0 242 sf_close (file) ;
Chris@0 243
Chris@0 244 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 245
Chris@0 246 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 247
Chris@0 248 sf_close (file) ;
Chris@0 249
Chris@0 250 unlink (filename) ;
Chris@0 251 puts ("ok") ;
Chris@0 252 } /* zero_data_test */
Chris@0 253
Chris@0 254 static void
Chris@0 255 filesystem_full_test (int format)
Chris@0 256 { SNDFILE *file ;
Chris@0 257 SF_INFO sfinfo ;
Chris@0 258 struct stat buf ;
Chris@0 259
Chris@0 260 const char *filename = "/dev/full", *errorstr ;
Chris@0 261
Chris@0 262 #if (defined (WIN32) || defined (_WIN32))
Chris@0 263 /* Can't run this test on Win32 so return. */
Chris@0 264 return ;
Chris@0 265 #endif
Chris@0 266
Chris@0 267 /* Make sure errno is zero before doing anything else. */
Chris@0 268 errno = 0 ;
Chris@0 269
Chris@0 270 print_test_name ("filesystem_full_test", filename) ;
Chris@0 271
Chris@0 272 if (stat (filename, &buf) != 0)
Chris@0 273 { puts ("/dev/full missing") ;
Chris@0 274 return ;
Chris@0 275 } ;
Chris@0 276
Chris@0 277 if (S_ISCHR (buf.st_mode) == 0 && S_ISBLK (buf.st_mode) == 0)
Chris@0 278 { puts ("/dev/full is not a device file") ;
Chris@0 279 return ;
Chris@0 280 } ;
Chris@0 281
Chris@0 282 sfinfo.samplerate = 44100 ;
Chris@0 283 sfinfo.format = format ;
Chris@0 284 sfinfo.channels = 1 ;
Chris@0 285 sfinfo.frames = 0 ;
Chris@0 286
Chris@0 287 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL)
Chris@0 288 { printf ("\n\nLine %d : Error, file should not have openned.\n", __LINE__ - 1) ;
Chris@0 289 exit (1) ;
Chris@0 290 } ;
Chris@0 291
Chris@0 292 errorstr = sf_strerror (file) ;
Chris@0 293
Chris@0 294 if (strstr (errorstr, " space ") == NULL || strstr (errorstr, "device") == NULL)
Chris@0 295 { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ;
Chris@0 296 exit (1) ;
Chris@0 297 } ;
Chris@0 298
Chris@0 299 puts ("ok") ;
Chris@0 300 } /* filesystem_full_test */
Chris@0 301
Chris@0 302 static void
Chris@0 303 permission_test (const char *filename, int typemajor)
Chris@0 304 {
Chris@0 305 #if (OS_IS_WIN32)
Chris@0 306 /* Avoid compiler warnings. */
Chris@0 307 filename = filename ;
Chris@0 308 typemajor = typemajor ;
Chris@0 309
Chris@0 310 /* Can't run this test on Win32 so return. */
Chris@0 311 return ;
Chris@0 312 #else
Chris@0 313
Chris@0 314 FILE *textfile ;
Chris@0 315 SNDFILE *file ;
Chris@0 316 SF_INFO sfinfo ;
Chris@0 317 const char *errorstr ;
Chris@0 318
Chris@0 319 /* Make sure errno is zero before doing anything else. */
Chris@0 320 errno = 0 ;
Chris@0 321
Chris@0 322 if (getuid () == 0)
Chris@0 323 { /* If running as root bypass this test.
Chris@0 324 ** Root is allowed to open a readonly file for write.
Chris@0 325 */
Chris@0 326 return ;
Chris@0 327 } ;
Chris@0 328
Chris@0 329 print_test_name ("permission_test", filename) ;
Chris@0 330
Chris@0 331 if (access (filename, F_OK) == 0)
Chris@0 332 { chmod (filename, S_IWUSR) ;
Chris@0 333 unlink (filename) ;
Chris@0 334 } ;
Chris@0 335
Chris@0 336 if ((textfile = fopen (filename, "w")) == NULL)
Chris@0 337 { printf ("\n\nLine %d : not able to open text file for write.\n", __LINE__) ;
Chris@0 338 exit (1) ;
Chris@0 339 } ;
Chris@0 340
Chris@0 341 fprintf (textfile, "This is a read only file.\n") ;
Chris@0 342 fclose (textfile) ;
Chris@0 343
Chris@0 344 if (chmod (filename, S_IRUSR | S_IRGRP))
Chris@0 345 { printf ("\n\nLine %d : chmod failed", __LINE__) ;
Chris@0 346 fflush (stdout) ;
Chris@0 347 perror ("") ;
Chris@0 348 exit (1) ;
Chris@0 349 } ;
Chris@0 350
Chris@0 351 sfinfo.samplerate = 44100 ;
Chris@0 352 sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ;
Chris@0 353 sfinfo.channels = 1 ;
Chris@0 354 sfinfo.frames = 0 ;
Chris@0 355
Chris@0 356 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL)
Chris@0 357 { printf ("\n\nLine %d : Error, file should not have opened.\n", __LINE__ - 1) ;
Chris@0 358 exit (1) ;
Chris@0 359 } ;
Chris@0 360
Chris@0 361 errorstr = sf_strerror (file) ;
Chris@0 362
Chris@0 363 if (strstr (errorstr, "ermission denied") == NULL)
Chris@0 364 { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ;
Chris@0 365 exit (1) ;
Chris@0 366 } ;
Chris@0 367
Chris@0 368 if (chmod (filename, S_IWUSR | S_IWGRP))
Chris@0 369 { printf ("\n\nLine %d : chmod failed", __LINE__) ;
Chris@0 370 fflush (stdout) ;
Chris@0 371 perror ("") ;
Chris@0 372 exit (1) ;
Chris@0 373 } ;
Chris@0 374
Chris@0 375 unlink (filename) ;
Chris@0 376
Chris@0 377 puts ("ok") ;
Chris@0 378
Chris@0 379 #endif
Chris@0 380 } /* permission_test */
Chris@0 381
Chris@0 382 static void
Chris@0 383 wavex_amb_test (const char *filename)
Chris@0 384 { static short buffer [800] ;
Chris@0 385 SNDFILE *file ;
Chris@0 386 SF_INFO sfinfo ;
Chris@0 387 sf_count_t frames ;
Chris@0 388
Chris@0 389 print_test_name (__func__, filename) ;
Chris@0 390
Chris@0 391 sfinfo.samplerate = 44100 ;
Chris@0 392 sfinfo.format = SF_FORMAT_WAVEX | SF_FORMAT_PCM_16 ;
Chris@0 393 sfinfo.channels = 4 ;
Chris@0 394
Chris@0 395 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 396
Chris@0 397 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 398 sf_command (file, SFC_WAVEX_SET_AMBISONIC, NULL, SF_AMBISONIC_B_FORMAT) ;
Chris@0 399 test_writef_short_or_die (file, 0, buffer, frames, __LINE__) ;
Chris@0 400 sf_close (file) ;
Chris@0 401
Chris@0 402 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 403
Chris@0 404 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 405
Chris@0 406 exit_if_true (
Chris@0 407 sf_command (file, SFC_WAVEX_GET_AMBISONIC, NULL, 0) != SF_AMBISONIC_B_FORMAT,
Chris@0 408 "\n\nLine %d : Error, this file should be in Ambisonic B format.\n", __LINE__
Chris@0 409 ) ;
Chris@0 410
Chris@0 411 sf_close (file) ;
Chris@0 412
Chris@0 413 unlink (filename) ;
Chris@0 414 puts ("ok") ;
Chris@0 415 } /* wavex_amb_test */