annotate src/libsndfile-1.0.27/tests/chunk_test.c @ 168:ceec0dd9ec9c

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 <cannam@all-day-breakfast.com>
date Fri, 07 Feb 2020 11:51:13 +0000
parents cd6cdf86811e
children
rev   line source
cannam@125 1 /*
cannam@125 2 ** Copyright (C) 2003-2016 Erik de Castro Lopo <erikd@mega-nerd.com>
cannam@125 3 **
cannam@125 4 ** This program is free software; you can redistribute it and/or modify
cannam@125 5 ** it under the terms of the GNU General Public License as published by
cannam@125 6 ** the Free Software Foundation; either version 2 of the License, or
cannam@125 7 ** (at your option) any later version.
cannam@125 8 **
cannam@125 9 ** This program is distributed in the hope that it will be useful,
cannam@125 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@125 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@125 12 ** GNU General Public License for more details.
cannam@125 13 **
cannam@125 14 ** You should have received a copy of the GNU General Public License
cannam@125 15 ** along with this program; if not, write to the Free Software
cannam@125 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cannam@125 17 */
cannam@125 18
cannam@125 19 #include "sfconfig.h"
cannam@125 20
cannam@125 21 #include <stdio.h>
cannam@125 22 #include <stdlib.h>
cannam@125 23 #include <string.h>
cannam@125 24 #include <math.h>
cannam@125 25
cannam@125 26 #if HAVE_UNISTD_H
cannam@125 27 #include <unistd.h>
cannam@125 28 #endif
cannam@125 29
cannam@125 30 #include <sndfile.h>
cannam@125 31
cannam@125 32 #include "utils.h"
cannam@125 33
cannam@125 34 #define BUFFER_LEN (1 << 10)
cannam@125 35 #define LOG_BUFFER_SIZE 1024
cannam@125 36
cannam@125 37 static void chunk_test (const char *filename, int format) ;
cannam@125 38
cannam@125 39 static void
cannam@125 40 chunk_test_helper (const char *filename, int format, const char * testdata) ;
cannam@125 41
cannam@125 42 int
cannam@125 43 main (int argc, char *argv [])
cannam@125 44 { int do_all = 0 ;
cannam@125 45 int test_count = 0 ;
cannam@125 46
cannam@125 47 if (argc != 2)
cannam@125 48 { printf ("Usage : %s <test>\n", argv [0]) ;
cannam@125 49 printf (" Where <test> is one of the following:\n") ;
cannam@125 50 printf (" wav - test adding chunks to WAV files\n") ;
cannam@125 51 printf (" aiff - test adding chunks to AIFF files\n") ;
cannam@125 52 printf (" caf - test adding chunks to CAF files\n") ;
cannam@125 53 printf (" rf64 - test adding chunks to RF64 files\n") ;
cannam@125 54 printf (" all - perform all tests\n") ;
cannam@125 55 exit (1) ;
cannam@125 56 } ;
cannam@125 57
cannam@125 58 do_all = ! strcmp (argv [1], "all") ;
cannam@125 59
cannam@125 60 if (do_all || ! strcmp (argv [1], "wav"))
cannam@125 61 { chunk_test ("chunks_pcm16.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
cannam@125 62 chunk_test ("chunks_pcm16.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
cannam@125 63 chunk_test ("chunks_pcm16.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ;
cannam@125 64 test_count++ ;
cannam@125 65 } ;
cannam@125 66
cannam@125 67 if (do_all || ! strcmp (argv [1], "aiff"))
cannam@125 68 { chunk_test ("chunks_pcm16.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
cannam@125 69 test_count++ ;
cannam@125 70 } ;
cannam@125 71
cannam@125 72 if (do_all || ! strcmp (argv [1], "caf"))
cannam@125 73 { chunk_test ("chunks_pcm16.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ;
cannam@125 74 chunk_test ("chunks_alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_16) ;
cannam@125 75 test_count++ ;
cannam@125 76 } ;
cannam@125 77
cannam@125 78 if (do_all || ! strcmp (argv [1], "rf64"))
cannam@125 79 { chunk_test ("chunks_pcm16.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
cannam@125 80 test_count++ ;
cannam@125 81 } ;
cannam@125 82
cannam@125 83 if (test_count == 0)
cannam@125 84 { printf ("Mono : ************************************\n") ;
cannam@125 85 printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
cannam@125 86 printf ("Mono : ************************************\n") ;
cannam@125 87 return 1 ;
cannam@125 88 } ;
cannam@125 89
cannam@125 90 return 0 ;
cannam@125 91 } /* main */
cannam@125 92
cannam@125 93
cannam@125 94 /*============================================================================================
cannam@125 95 ** Here are the test functions.
cannam@125 96 */
cannam@125 97
cannam@125 98 static void
cannam@125 99 chunk_test_helper (const char *filename, int format, const char * testdata)
cannam@125 100 { SNDFILE *file ;
cannam@125 101 SF_INFO sfinfo ;
cannam@125 102 SF_CHUNK_INFO chunk_info ;
cannam@125 103 SF_CHUNK_ITERATOR * iterator ;
cannam@125 104 uint32_t length_before ;
cannam@125 105 int err, allow_fd ;
cannam@125 106
cannam@125 107 switch (format & SF_FORMAT_SUBMASK)
cannam@125 108 { case SF_FORMAT_ALAC_16 :
cannam@125 109 allow_fd = SF_FALSE ;
cannam@125 110 break ;
cannam@125 111 default :
cannam@125 112 allow_fd = SF_TRUE ;
cannam@125 113 break ;
cannam@125 114 } ;
cannam@125 115
cannam@125 116 sfinfo.samplerate = 44100 ;
cannam@125 117 sfinfo.channels = 1 ;
cannam@125 118 sfinfo.frames = 0 ;
cannam@125 119 sfinfo.format = format ;
cannam@125 120
cannam@125 121 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
cannam@125 122
cannam@125 123 /* Set up the chunk to write. */
cannam@125 124 memset (&chunk_info, 0, sizeof (chunk_info)) ;
cannam@125 125 snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
cannam@125 126 chunk_info.id_size = 4 ;
cannam@125 127 chunk_info.data = strdup (testdata) ;
cannam@125 128 chunk_info.datalen = strlen (chunk_info.data) ;
cannam@125 129
cannam@125 130 length_before = chunk_info.datalen ;
cannam@125 131
cannam@125 132 err = sf_set_chunk (file, &chunk_info) ;
cannam@125 133 exit_if_true (
cannam@125 134 err != SF_ERR_NO_ERROR,
cannam@125 135 "\n\nLine %d : sf_set_chunk returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err)
cannam@125 136 ) ;
cannam@125 137
cannam@125 138 memset (chunk_info.data, 0, chunk_info.datalen) ;
cannam@125 139 free (chunk_info.data) ;
cannam@125 140
cannam@125 141 sf_close (file) ;
cannam@125 142
cannam@125 143 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
cannam@125 144
cannam@125 145 memset (&chunk_info, 0, sizeof (chunk_info)) ;
cannam@125 146 snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
cannam@125 147 chunk_info.id_size = 4 ;
cannam@125 148
cannam@125 149 iterator = sf_get_chunk_iterator (file, &chunk_info) ;
cannam@125 150 err = sf_get_chunk_size (iterator, &chunk_info) ;
cannam@125 151 exit_if_true (
cannam@125 152 err != SF_ERR_NO_ERROR,
cannam@125 153 "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err)
cannam@125 154 ) ;
cannam@125 155
cannam@125 156 exit_if_true (
cannam@125 157 length_before > chunk_info.datalen || chunk_info.datalen - length_before > 4,
cannam@125 158 "\n\nLine %d : testdata '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, testdata, chunk_info.datalen, length_before
cannam@125 159 ) ;
cannam@125 160
cannam@125 161 chunk_info.data = malloc (chunk_info.datalen) ;
cannam@125 162 err = sf_get_chunk_data (iterator, &chunk_info) ;
cannam@125 163 exit_if_true (
cannam@125 164 err != SF_ERR_NO_ERROR,
cannam@125 165 "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err)
cannam@125 166 ) ;
cannam@125 167
cannam@125 168 exit_if_true (
cannam@125 169 memcmp (testdata, chunk_info.data, length_before),
cannam@125 170 "\n\nLine %d : Data compare failed.\n %s\n %s\n\n", __LINE__, testdata, (char*) chunk_info.data
cannam@125 171 ) ;
cannam@125 172
cannam@125 173 free (chunk_info.data) ;
cannam@125 174
cannam@125 175 sf_close (file) ;
cannam@125 176 unlink (filename) ;
cannam@125 177 } /* chunk_test_helper */
cannam@125 178
cannam@125 179 static void
cannam@125 180 multichunk_test_helper (const char *filename, int format, const char * testdata [], size_t testdata_len)
cannam@125 181 { SNDFILE *file ;
cannam@125 182 SF_INFO sfinfo ;
cannam@125 183 SF_CHUNK_INFO chunk_info ;
cannam@125 184 SF_CHUNK_ITERATOR * iterator ;
cannam@125 185 uint32_t length_before [testdata_len] ;
cannam@125 186 int err, allow_fd ;
cannam@125 187 size_t i ;
cannam@125 188
cannam@125 189 sfinfo.samplerate = 44100 ;
cannam@125 190 sfinfo.channels = 1 ;
cannam@125 191 sfinfo.frames = 0 ;
cannam@125 192 sfinfo.format = format ;
cannam@125 193
cannam@125 194 switch (format & SF_FORMAT_SUBMASK)
cannam@125 195 { case SF_FORMAT_ALAC_16 :
cannam@125 196 allow_fd = SF_FALSE ;
cannam@125 197 break ;
cannam@125 198 default :
cannam@125 199 allow_fd = SF_TRUE ;
cannam@125 200 break ;
cannam@125 201 } ;
cannam@125 202
cannam@125 203 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
cannam@125 204
cannam@125 205 /* Set up the chunk to write. */
cannam@125 206 for (i = 0 ; i < testdata_len ; i++)
cannam@125 207 { memset (&chunk_info, 0, sizeof (chunk_info)) ;
cannam@125 208 snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
cannam@125 209 chunk_info.id_size = 4 ;
cannam@125 210
cannam@125 211 chunk_info.data = strdup (testdata [i]) ;
cannam@125 212 chunk_info.datalen = strlen (chunk_info.data) ;
cannam@125 213
cannam@125 214 length_before [i] = chunk_info.datalen ;
cannam@125 215
cannam@125 216 err = sf_set_chunk (file, &chunk_info) ;
cannam@125 217 exit_if_true (
cannam@125 218 err != SF_ERR_NO_ERROR,
cannam@125 219 "\n\nLine %d : sf_set_chunk returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err)
cannam@125 220 ) ;
cannam@125 221
cannam@125 222 memset (chunk_info.data, 0, chunk_info.datalen) ;
cannam@125 223 free (chunk_info.data) ;
cannam@125 224 }
cannam@125 225
cannam@125 226 sf_close (file) ;
cannam@125 227
cannam@125 228 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
cannam@125 229
cannam@125 230 memset (&chunk_info, 0, sizeof (chunk_info)) ;
cannam@125 231 snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
cannam@125 232 chunk_info.id_size = 4 ;
cannam@125 233
cannam@125 234 iterator = sf_get_chunk_iterator (file, &chunk_info) ;
cannam@125 235
cannam@125 236 i = 0 ;
cannam@125 237 while (iterator)
cannam@125 238 { memset (&chunk_info, 0, sizeof (chunk_info)) ;
cannam@125 239 err = sf_get_chunk_size (iterator, &chunk_info) ;
cannam@125 240 exit_if_true (
cannam@125 241 i > testdata_len,
cannam@125 242 "\n\nLine %d : iterated to chunk #%d, but only %d chunks have been written\n\n", __LINE__, (int) i, (int) testdata_len
cannam@125 243 ) ;
cannam@125 244
cannam@125 245 exit_if_true (
cannam@125 246 err != SF_ERR_NO_ERROR,
cannam@125 247 "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err)
cannam@125 248 ) ;
cannam@125 249
cannam@125 250 exit_if_true (
cannam@125 251 length_before [i] > chunk_info.datalen || chunk_info.datalen - length_before [i] > 4,
cannam@125 252 "\n\nLine %d : testdata[%d] '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, (int) i, testdata [i], chunk_info.datalen, length_before [i]
cannam@125 253 ) ;
cannam@125 254
cannam@125 255 chunk_info.data = malloc (chunk_info.datalen) ;
cannam@125 256 err = sf_get_chunk_data (iterator, &chunk_info) ;
cannam@125 257 exit_if_true (
cannam@125 258 err != SF_ERR_NO_ERROR,
cannam@125 259 "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err)
cannam@125 260 ) ;
cannam@125 261
cannam@125 262 exit_if_true (
cannam@125 263 4 != chunk_info.id_size,
cannam@125 264 "\n\nLine %d : testdata[%d] : Bad ID length %u (previous length %u)\n\n", __LINE__, (int) i, chunk_info.id_size, 4
cannam@125 265 ) ;
cannam@125 266 exit_if_true (
cannam@125 267 memcmp ("Test", chunk_info.id, 4),
cannam@125 268 "\n\nLine %d : ID compare failed at %d.\n %s\n %s\n\n", __LINE__, (int) i, "Test", (char*) chunk_info.id
cannam@125 269 ) ;
cannam@125 270
cannam@125 271 exit_if_true (
cannam@125 272 memcmp (testdata [i], chunk_info.data, length_before [i]),
cannam@125 273 "\n\nLine %d : Data compare failed at %d.\n %s\n %s\n\n", __LINE__, (int) i, testdata [i], (char*) chunk_info.data
cannam@125 274 ) ;
cannam@125 275
cannam@125 276 free (chunk_info.data) ;
cannam@125 277 iterator = sf_next_chunk_iterator (iterator) ;
cannam@125 278 i++ ;
cannam@125 279 }
cannam@125 280
cannam@125 281 sf_close (file) ;
cannam@125 282 unlink (filename) ;
cannam@125 283 } /* multichunk_test_helper */
cannam@125 284
cannam@125 285
cannam@125 286 static void
cannam@125 287 chunk_test (const char *filename, int format)
cannam@125 288 { const char* testdata [] =
cannam@125 289 { "There can be only one.", "", "A", "AB", "ABC", "ABCD", "ABCDE" } ;
cannam@125 290 uint32_t k ;
cannam@125 291
cannam@125 292 print_test_name (__func__, filename) ;
cannam@125 293
cannam@125 294 for (k = 0 ; k < ARRAY_LEN (testdata) ; k++)
cannam@125 295 chunk_test_helper (filename, format, testdata [k]) ;
cannam@125 296
cannam@125 297 multichunk_test_helper (filename, format, testdata, ARRAY_LEN (testdata)) ;
cannam@125 298
cannam@125 299 puts ("ok") ;
cannam@125 300 } /* chunk_test */