X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Ftest_libFLAC%2B%2B%2Fmetadata_manip.cpp;h=ff024162c6bd75d0a9b3ab296984acf4664f877d;hb=f25b2602dce3c09098e3092bfad983e3ec7fdb4f;hp=52a0bc50cc59b6bfd25ce73f817061d7b8d11331;hpb=74ed294764174ab4abe2bb5d4081c63d87747b97;p=platform%2Fupstream%2Fflac.git diff --git a/src/test_libFLAC++/metadata_manip.cpp b/src/test_libFLAC++/metadata_manip.cpp index 52a0bc5..ff02416 100644 --- a/src/test_libFLAC++/metadata_manip.cpp +++ b/src/test_libFLAC++/metadata_manip.cpp @@ -1,5 +1,5 @@ /* test_libFLAC++ - Unit tester for libFLAC++ - * Copyright (C) 2002,2003,2004,2005,2006 Josh Coalson + * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -11,23 +11,25 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#if HAVE_CONFIG_H +# include +#endif + #include #include /* for malloc() */ #include /* for memcpy()/memset() */ -#if defined _MSC_VER || defined __MINGW32__ -#include /* for utime() */ -#include /* for chmod() */ -//@@@ [2G limit] hacks for MSVC6 -#define fseeko fseek -#define ftello ftell -#else #include /* some flavors of BSD (like OS X) require this to get time_t */ +#ifdef _MSC_VER +#include +#else #include /* for utime() */ +#endif +#if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ #include /* for chown(), unlink() */ #endif #include /* for stat(), maybe chmod() */ @@ -35,6 +37,8 @@ #include "FLAC++/decoder.h" #include "FLAC++/metadata.h" #include "share/grabbag.h" +#include "share/compat.h" +#include "share/macros.h" extern "C" { #include "test_libs_common/file_utils_flac.h" } @@ -67,14 +71,17 @@ struct OurMetadata { unsigned num_blocks; }; -static const char *flacfile_ = "metadata.flac"; - -/* our copy of the metadata in flacfile_ */ +/* our copy of the metadata in flacfilename() */ static OurMetadata our_metadata_; /* the current block number that corresponds to the position of the iterator we are testing */ static unsigned mc_our_block_number_ = 0; +static const char *flacfilename(bool is_ogg) +{ + return is_ogg? "metadata.oga" : "metadata.flac"; +} + static bool die_(const char *msg) { printf("ERROR: %s\n", msg); @@ -270,8 +277,8 @@ void set_file_stats_(const char *filename, struct stat *stats) (void)chmod(filename, stats->st_mode); (void)utime(filename, &srctime); #if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ - (void)chown(filename, stats->st_uid, (gid_t)(-1)); - (void)chown(filename, (uid_t)(-1), stats->st_gid); + FLAC_CHECK_RETURN(chown(filename, stats->st_uid, (gid_t)(-1))); + FLAC_CHECK_RETURN(chown(filename, (uid_t)(-1), stats->st_gid)); #endif } @@ -288,7 +295,7 @@ static size_t chain_write_cb_(const void *ptr, size_t size, size_t nmemb, ::FLAC static int chain_seek_cb_(::FLAC__IOHandle handle, FLAC__int64 offset, int whence) { - off_t o = (off_t)offset; + FLAC__off_t o = (FLAC__off_t)offset; FLAC__ASSERT(offset == o); return fseeko((FILE*)handle, o, whence); } @@ -329,11 +336,11 @@ static bool write_chain_(FLAC::Metadata::Chain &chain, bool use_padding, bool pr return false; } if(0 == (file = fopen(filename, "rb"))) - return false; /*@@@ chain status still says OK though */ + return false; /*@@@@ chain status still says OK though */ if(!open_tempfile_(filename, &tempfile, &tempfilename)) { fclose(file); cleanup_tempfile_(&tempfile, &tempfilename); - return false; /*@@@ chain status still says OK though */ + return false; /*@@@@ chain status still says OK though */ } if(!chain.write(use_padding, (::FLAC__IOHandle)file, callbacks, (::FLAC__IOHandle)tempfile, callbacks)) { fclose(file); @@ -351,9 +358,11 @@ static bool write_chain_(FLAC::Metadata::Chain &chain, bool use_padding, bool pr else { FILE *file = fopen(filename, "r+b"); if(0 == file) - return false; /*@@@ chain status still says OK though */ - if(!chain.write(use_padding, (::FLAC__IOHandle)file, callbacks)) + return false; /*@@@@ chain status still says OK though */ + if(!chain.write(use_padding, (::FLAC__IOHandle)file, callbacks)) { + fclose(file); return false; + } fclose(file); } } @@ -361,10 +370,10 @@ static bool write_chain_(FLAC::Metadata::Chain &chain, bool use_padding, bool pr return true; } -static bool read_chain_(FLAC::Metadata::Chain &chain, const char *filename, bool filename_based) +static bool read_chain_(FLAC::Metadata::Chain &chain, const char *filename, bool filename_based, bool is_ogg) { if(filename_based) - return chain.read(filename); + return chain.read(filename, is_ogg); else { ::FLAC__IOCallbacks callbacks; @@ -377,8 +386,8 @@ static bool read_chain_(FLAC::Metadata::Chain &chain, const char *filename, bool bool ret; FILE *file = fopen(filename, "rb"); if(0 == file) - return false; /*@@@ chain status still says OK though */ - ret = chain.read((::FLAC__IOHandle)file, callbacks); + return false; /*@@@@ chain status still says OK though */ + ret = chain.read((::FLAC__IOHandle)file, callbacks, is_ogg); fclose(file); return ret; } @@ -484,13 +493,13 @@ void OurFileDecoder::error_callback(::FLAC__StreamDecoderErrorStatus status) printf("ERROR: got error callback, status = %s (%u)\n", FLAC__StreamDecoderErrorStatusString[status], (unsigned)status); } -static bool generate_file_(FLAC__bool include_extras) +static bool generate_file_(bool include_extras, bool is_ogg) { ::FLAC__StreamMetadata streaminfo, vorbiscomment, *cuesheet, picture, padding; ::FLAC__StreamMetadata *metadata[4]; unsigned i = 0, n = 0; - printf("generating FLAC file for test\n"); + printf("generating %sFLAC file for test\n", is_ogg? "Ogg " : ""); while(our_metadata_.num_blocks > 0) delete_from_our_metadata_(0); @@ -588,20 +597,22 @@ static bool generate_file_(FLAC__bool include_extras) ) return die_("priming our metadata"); - if(!file_utils__generate_flacfile(flacfile_, 0, 512 * 1024, &streaminfo, metadata, n)) + if(!file_utils__generate_flacfile(is_ogg, flacfilename(is_ogg), 0, 512 * 1024, &streaminfo, metadata, n)) return die_("creating the encoded file"); free(vorbiscomment.data.vorbis_comment.vendor_string.entry); + free(picture.data.picture.mime_type); + free(picture.data.picture.description); + free(picture.data.picture.data); return true; } -static bool test_file_(const char *filename, bool ignore_metadata) +static bool test_file_(bool is_ogg, bool ignore_metadata) { + const char *filename = flacfilename(is_ogg); OurFileDecoder decoder(ignore_metadata); - FLAC__ASSERT(0 != filename); - mc_our_block_number_ = 0; decoder.error_occurred_ = false; @@ -613,16 +624,16 @@ static bool test_file_(const char *filename, bool ignore_metadata) decoder.set_md5_checking(true); decoder.set_metadata_respond_all(); - if(decoder.init(filename) != ::FLAC__STREAM_DECODER_INIT_STATUS_OK) { - decoder.finish(); + if((is_ogg? decoder.init_ogg(filename) : decoder.init(filename)) != ::FLAC__STREAM_DECODER_INIT_STATUS_OK) { + (void)decoder.finish(); return die_("initializing decoder\n"); } if(!decoder.process_until_end_of_stream()) { - decoder.finish(); + (void)decoder.finish(); return die_("decoding file\n"); } - decoder.finish(); + (void)decoder.finish(); if(decoder.error_occurred_) return false; @@ -659,15 +670,15 @@ static bool test_level_0_() printf("\n\n++++++ testing level 0 interface\n"); - if(!generate_file_(/*include_extras=*/true)) + if(!generate_file_(/*include_extras=*/true, /*is_ogg=*/false)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/true)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/true)) return false; printf("testing FLAC::Metadata::get_streaminfo()... "); - if(!FLAC::Metadata::get_streaminfo(flacfile_, streaminfo)) + if(!FLAC::Metadata::get_streaminfo(flacfilename(/*is_ogg=*/false), streaminfo)) return die_("during FLAC::Metadata::get_streaminfo()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -689,7 +700,7 @@ static bool test_level_0_() FLAC::Metadata::VorbisComment *tags = 0; - if(!FLAC::Metadata::get_tags(flacfile_, tags)) + if(!FLAC::Metadata::get_tags(flacfilename(/*is_ogg=*/false), tags)) return die_("during FLAC::Metadata::get_tags()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -706,7 +717,7 @@ static bool test_level_0_() FLAC::Metadata::VorbisComment tags; - if(!FLAC::Metadata::get_tags(flacfile_, tags)) + if(!FLAC::Metadata::get_tags(flacfilename(/*is_ogg=*/false), tags)) return die_("during FLAC::Metadata::get_tags()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -721,7 +732,7 @@ static bool test_level_0_() FLAC::Metadata::CueSheet *cuesheet = 0; - if(!FLAC::Metadata::get_cuesheet(flacfile_, cuesheet)) + if(!FLAC::Metadata::get_cuesheet(flacfilename(/*is_ogg=*/false), cuesheet)) return die_("during FLAC::Metadata::get_cuesheet()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -738,7 +749,7 @@ static bool test_level_0_() FLAC::Metadata::CueSheet cuesheet; - if(!FLAC::Metadata::get_cuesheet(flacfile_, cuesheet)) + if(!FLAC::Metadata::get_cuesheet(flacfilename(/*is_ogg=*/false), cuesheet)) return die_("during FLAC::Metadata::get_cuesheet()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -753,7 +764,7 @@ static bool test_level_0_() FLAC::Metadata::Picture *picture = 0; - if(!FLAC::Metadata::get_picture(flacfile_, picture, /*type=*/(::FLAC__StreamMetadata_Picture_Type)(-1), /*mime_type=*/0, /*description=*/0, /*max_width=*/(unsigned)(-1), /*max_height=*/(unsigned)(-1), /*max_depth=*/(unsigned)(-1), /*max_colors=*/(unsigned)(-1))) + if(!FLAC::Metadata::get_picture(flacfilename(/*is_ogg=*/false), picture, /*type=*/(::FLAC__StreamMetadata_Picture_Type)(-1), /*mime_type=*/0, /*description=*/0, /*max_width=*/(unsigned)(-1), /*max_height=*/(unsigned)(-1), /*max_depth=*/(unsigned)(-1), /*max_colors=*/(unsigned)(-1))) return die_("during FLAC::Metadata::get_picture()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -770,7 +781,7 @@ static bool test_level_0_() FLAC::Metadata::Picture picture; - if(!FLAC::Metadata::get_picture(flacfile_, picture, /*type=*/(::FLAC__StreamMetadata_Picture_Type)(-1), /*mime_type=*/0, /*description=*/0, /*max_width=*/(unsigned)(-1), /*max_height=*/(unsigned)(-1), /*max_depth=*/(unsigned)(-1), /*max_colors=*/(unsigned)(-1))) + if(!FLAC::Metadata::get_picture(flacfilename(/*is_ogg=*/false), picture, /*type=*/(::FLAC__StreamMetadata_Picture_Type)(-1), /*mime_type=*/0, /*description=*/0, /*max_width=*/(unsigned)(-1), /*max_height=*/(unsigned)(-1), /*max_depth=*/(unsigned)(-1), /*max_colors=*/(unsigned)(-1))) return die_("during FLAC::Metadata::get_picture()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -780,7 +791,7 @@ static bool test_level_0_() printf("OK\n"); } - if(!remove_file_(flacfile_)) + if(!remove_file_(flacfilename(/*is_ogg=*/false))) return false; return true; @@ -804,13 +815,13 @@ static bool test_level_1_() { printf("simple iterator on read-only file\n"); - if(!generate_file_(/*include_extras=*/false)) + if(!generate_file_(/*include_extras=*/false, /*is_ogg=*/false)) return false; - if(!change_stats_(flacfile_, /*read_only=*/true)) + if(!change_stats_(flacfilename(/*is_ogg=*/false), /*read_only=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/true)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/true)) return false; FLAC::Metadata::SimpleIterator iterator; @@ -818,7 +829,7 @@ static bool test_level_1_() if(!iterator.is_valid()) return die_("iterator.is_valid() returned false"); - if(!iterator.init(flacfile_, /*read_only=*/false, /*preserve_file_stats=*/false)) + if(!iterator.init(flacfilename(/*is_ogg=*/false), /*read_only=*/false, /*preserve_file_stats=*/false)) return die_("iterator.init() returned false"); printf("is writable = %u\n", (unsigned)iterator.is_writable()); @@ -897,7 +908,7 @@ static bool test_level_1_() { printf("simple iterator on writable file\n"); - if(!change_stats_(flacfile_, /*read-only=*/false)) + if(!change_stats_(flacfilename(/*is_ogg=*/false), /*read-only=*/false)) return false; printf("creating APPLICATION block\n"); @@ -917,7 +928,7 @@ static bool test_level_1_() if(!iterator.is_valid()) return die_("iterator.is_valid() returned false"); - if(!iterator.init(flacfile_, /*read_only=*/false, /*preserve_file_stats=*/false)) + if(!iterator.init(flacfilename(/*is_ogg=*/false), /*read_only=*/false, /*preserve_file_stats=*/false)) return die_("iterator.init() returned false"); our_current_position = 0; @@ -963,7 +974,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]PP\tprev\n"); @@ -980,7 +991,7 @@ static bool test_level_1_() if(iterator.delete_block(false)) return die_ss_("iterator.delete_block(false) should have returned false", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("[S]VPPP\tnext\n"); @@ -1008,7 +1019,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PP\tnext\n"); @@ -1026,7 +1037,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); our_current_position--; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]P\tnext\n"); @@ -1039,7 +1050,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]\tprev\n"); @@ -1064,7 +1075,7 @@ static bool test_level_1_() return die_ss_("iterator.set_block(block, false)", iterator); delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("[S]VP\tnext\n"); @@ -1080,7 +1091,7 @@ static bool test_level_1_() return false; add_to_padding_length_(our_current_position+1, -((int)(FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + (int)app->get_length())); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tnext\n"); @@ -1096,7 +1107,7 @@ static bool test_level_1_() return false; add_to_padding_length_(our_current_position+1, -((int)(FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + (int)app->get_length())); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (grow), don't expand into padding\n"); @@ -1108,7 +1119,7 @@ static bool test_level_1_() if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (shrink), don't fill in with padding\n"); @@ -1120,7 +1131,7 @@ static bool test_level_1_() if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (grow), expand into padding of exceeding size\n"); @@ -1133,7 +1144,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (shrink), fill in with padding\n"); @@ -1148,7 +1159,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]PP\tnext\n"); @@ -1168,7 +1179,7 @@ static bool test_level_1_() if(!iterator.set_block(padding, false)) return die_ss_("iterator.set_block(padding, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAAP[P]\tset APPLICATION (grow)\n"); @@ -1178,7 +1189,7 @@ static bool test_level_1_() if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAAP[A]\tset PADDING (equal)\n"); @@ -1188,7 +1199,7 @@ static bool test_level_1_() if(!iterator.set_block(padding, false)) return die_ss_("iterator.set_block(padding, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAAP[P]\tprev\n"); @@ -1201,7 +1212,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tdelete (middle block), don't replace with padding\n"); @@ -1209,7 +1220,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tnext\n"); @@ -1224,7 +1235,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAP[P]\tprev\n"); @@ -1245,7 +1256,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), try to expand into padding which is 'close' but still too small\n"); @@ -1256,7 +1267,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), expand into padding which will leave 0-length pad\n"); @@ -1268,7 +1279,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), expand into padding which is exactly consumed\n"); @@ -1280,7 +1291,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tset APPLICATION (grow), expand into padding which is exactly consumed\n"); @@ -1293,7 +1304,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]\tset PADDING (equal size)\n"); @@ -1303,7 +1314,7 @@ static bool test_level_1_() if(!iterator.set_block(padding, true)) return die_ss_("iterator.set_block(padding, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]\tinsert PADDING after\n"); @@ -1312,7 +1323,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVP[P]\tinsert PADDING after\n"); @@ -1322,7 +1333,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVPP[P]\tprev\n"); @@ -1348,7 +1359,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PPP\tdelete (middle block), don't replace with padding\n"); @@ -1356,7 +1367,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PPP\tinsert APPLICATION after, try to expand into padding which is 'close' but still too small\n"); @@ -1367,7 +1378,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PPP\tdelete (middle block), don't replace with padding\n"); @@ -1375,7 +1386,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PPP\tinsert APPLICATION after, expand into padding which is exactly consumed\n"); @@ -1387,7 +1398,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tdelete (middle block), don't replace with padding\n"); @@ -1395,7 +1406,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PP\tinsert APPLICATION after, expand into padding which will leave 0-length pad\n"); @@ -1407,7 +1418,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tdelete (middle block), don't replace with padding\n"); @@ -1415,7 +1426,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PP\tnext\n"); @@ -1428,7 +1439,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]P\tinsert APPLICATION after, expand into padding which is exactly consumed\n"); @@ -1440,20 +1451,20 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; } delete app; delete padding; - if(!remove_file_(flacfile_)) + if(!remove_file_(flacfilename(/*is_ogg=*/false))) return false; return true; } -static bool test_level_2_(bool filename_based) +static bool test_level_2_(bool filename_based, bool is_ogg) { FLAC::Metadata::Prototype *block; FLAC::Metadata::StreamInfo *streaminfo; @@ -1465,14 +1476,14 @@ static bool test_level_2_(bool filename_based) // initialize 'data' to avoid Valgrind errors memset(data, 0, sizeof(data)); - printf("\n\n++++++ testing level 2 interface (%s-based)\n", filename_based? "filename":"callback"); + printf("\n\n++++++ testing level 2 interface (%s-based, %s FLAC)\n", filename_based? "filename":"callback", is_ogg? "Ogg":"native"); printf("generate read-only file\n"); - if(!generate_file_(/*include_extras=*/false)) + if(!generate_file_(/*include_extras=*/false, is_ogg)) return false; - if(!change_stats_(flacfile_, /*read_only=*/true)) + if(!change_stats_(flacfilename(is_ogg), /*read_only=*/true)) return false; printf("create chain\n"); @@ -1482,19 +1493,22 @@ static bool test_level_2_(bool filename_based) printf("read chain\n"); - if(!read_chain_(chain, flacfile_, filename_based)) + if(!read_chain_(chain, flacfilename(is_ogg), filename_based, is_ogg)) return die_c_("reading chain", chain.status()); printf("[S]VP\ttest initial metadata\n"); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; + if(is_ogg) + goto end; + printf("switch file to read-write\n"); - if(!change_stats_(flacfile_, /*read-only=*/false)) + if(!change_stats_(flacfilename(is_ogg), /*read-only=*/false)) return false; printf("create iterator\n"); @@ -1521,13 +1535,13 @@ static bool test_level_2_(bool filename_based) return die_("copying object"); delete block; - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/true, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/true, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, true)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("[S]VP\tnext\n"); @@ -1554,13 +1568,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tshrink APPLICATION, don't use padding\n"); @@ -1573,13 +1587,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tgrow APPLICATION, don't use padding\n"); @@ -1592,13 +1606,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tgrow APPLICATION, use padding, but last block is not padding\n"); @@ -1611,13 +1625,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tshrink APPLICATION, use padding, last block is not padding, but delta is too small for new PADDING block\n"); @@ -1630,13 +1644,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tshrink APPLICATION, use padding, last block is not padding, delta is enough for new PADDING block\n"); @@ -1654,13 +1668,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tshrink APPLICATION, use padding, last block is padding\n"); @@ -1674,13 +1688,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding, but delta is too small\n"); @@ -1693,13 +1707,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding of exceeding size\n"); @@ -1713,13 +1727,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding of exact size\n"); @@ -1733,13 +1747,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tprev\n"); @@ -1860,11 +1874,11 @@ static bool test_level_2_(bool filename_based) delete_from_our_metadata_(4); delete_from_our_metadata_(3); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SVPAP\tsort padding\n"); @@ -1872,11 +1886,11 @@ static bool test_level_2_(bool filename_based) add_to_padding_length_(4, FLAC__STREAM_METADATA_HEADER_LENGTH + our_metadata_.blocks[2]->get_length()); delete_from_our_metadata_(2); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("create iterator\n"); @@ -1982,30 +1996,31 @@ static bool test_level_2_(bool filename_based) printf("SV\tmerge padding\n"); chain.merge_padding(); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV\tsort padding\n"); chain.sort_padding(); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; - if(!remove_file_(flacfile_)) +end: + if(!remove_file_(flacfilename(is_ogg))) return false; return true; } -static bool test_level_2_misc_() +static bool test_level_2_misc_(bool is_ogg) { ::FLAC__IOCallbacks callbacks; @@ -2024,7 +2039,7 @@ static bool test_level_2_misc_() printf("generate file\n"); - if(!generate_file_(/*include_extras=*/false)) + if(!generate_file_(/*include_extras=*/false, is_ogg)) return false; printf("create chain\n"); @@ -2034,7 +2049,7 @@ static bool test_level_2_misc_() printf("read chain (filename-based)\n"); - if(!chain.read(flacfile_)) + if(!chain.read(flacfilename(is_ogg))) return die_c_("reading chain", chain.status()); printf("write chain with wrong method Chain::write(with callbacks)\n"); @@ -2048,7 +2063,7 @@ static bool test_level_2_misc_() printf("read chain (filename-based)\n"); - if(!chain.read(flacfile_)) + if(!chain.read(flacfilename(is_ogg))) return die_c_("reading chain", chain.status()); printf("write chain with wrong method Chain::write(with callbacks and tempfile)\n"); @@ -2062,7 +2077,7 @@ static bool test_level_2_misc_() printf("read chain (callback-based)\n"); { - FILE *file = fopen(flacfile_, "rb"); + FILE *file = fopen(flacfilename(is_ogg), "rb"); if(0 == file) return die_("opening file"); if(!chain.read((::FLAC__IOHandle)file, callbacks)) { @@ -2083,7 +2098,7 @@ static bool test_level_2_misc_() printf("read chain (callback-based)\n"); { - FILE *file = fopen(flacfile_, "rb"); + FILE *file = fopen(flacfilename(is_ogg), "rb"); if(0 == file) return die_("opening file"); if(!chain.read((::FLAC__IOHandle)file, callbacks)) { @@ -2111,7 +2126,7 @@ static bool test_level_2_misc_() printf("read chain (callback-based)\n"); { - FILE *file = fopen(flacfile_, "rb"); + FILE *file = fopen(flacfilename(is_ogg), "rb"); if(0 == file) return die_("opening file"); if(!chain.read((::FLAC__IOHandle)file, callbacks)) { @@ -2155,7 +2170,7 @@ static bool test_level_2_misc_() } // delete iterator - if(!remove_file_(flacfile_)) + if(!remove_file_(flacfilename(is_ogg))) return false; return true; @@ -2173,12 +2188,24 @@ bool test_metadata_file_manipulation() if(!test_level_1_()) return false; - if(!test_level_2_(/*filename_based=*/true)) /* filename-based */ + if(!test_level_2_(/*filename_based=*/true, /*is_ogg=*/false)) /* filename-based */ return false; - if(!test_level_2_(/*filename_based=*/false)) /* callback-based */ + if(!test_level_2_(/*filename_based=*/false, /*is_ogg=*/false)) /* callback-based */ return false; - if(!test_level_2_misc_()) + if(!test_level_2_misc_(/*is_ogg=*/false)) return false; + if(FLAC_API_SUPPORTS_OGG_FLAC) { + if(!test_level_2_(/*filename_based=*/true, /*is_ogg=*/true)) /* filename-based */ + return false; + if(!test_level_2_(/*filename_based=*/false, /*is_ogg=*/true)) /* callback-based */ + return false; +#if 0 + /* when ogg flac write is supported, will have to add this: */ + if(!test_level_2_misc_(/*is_ogg=*/true)) + return false; +#endif + } + return true; }