Update grabbag tests to work out-of-tree.

This commit is contained in:
Erik de Castro Lopo 2015-02-15 14:31:30 +11:00
parent bb2abeaf10
commit 7c3cd3d908
4 changed files with 161 additions and 65 deletions

View File

@ -40,6 +40,13 @@ extern "C" {
*/
FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, const char **error_message);
typedef struct PictureResolution
{ uint32_t width, height, depth, colors ;
} PictureResolution ;
FLAC__StreamMetadata *grabbag__picture_from_specification(int type, const char *mime_type, const char * description,
const PictureResolution * res, const char * filepath, const char **error_message);
#ifdef __cplusplus
}
#endif

View File

@ -261,10 +261,6 @@ static FLAC__bool local__extract_resolution_color_info_(FLAC__StreamMetadata_Pic
return false;
}
FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, const char **error_message)
{
FLAC__StreamMetadata *obj;
int state = 0;
static const char *error_messages[] = {
"memory allocation error",
"invalid picture specification",
@ -275,9 +271,52 @@ FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, con
"error reading picture file",
"invalid picture type",
"unable to guess MIME type from file, user must set explicitly",
"type 1 icon must be a 32x32 pixel PNG"
"type 1 icon must be a 32x32 pixel PNG",
"file not found"
};
static const char * read_file (const char * filepath, FLAC__StreamMetadata * obj)
{
const FLAC__off_t size = grabbag__file_get_filesize(filepath);
FLAC__byte *buffer;
FILE *file;
const char *error_message=NULL;
if (size < 0)
return error_messages[5];
if ((buffer = safe_malloc_(size)) == NULL)
return error_messages[0];
if ((file = flac_fopen(filepath, "rb")) == NULL) {
free(buffer);
return error_messages[5];
}
if (fread(buffer, 1, size, file) != (size_t) size) {
fclose(file);
free(buffer);
return error_messages[6];
}
fclose(file);
if (!FLAC__metadata_object_picture_set_data(obj, buffer, size, /*copy=*/false))
error_message = error_messages[6];
/* try to extract MIME type if user left it blank */
else if (*obj->data.picture.mime_type == '\0' && !local__extract_mime_type_(obj))
error_message = error_messages[8];
/* try to extract resolution/color info if user left it blank */
else if ((obj->data.picture.width == 0 || obj->data.picture.height == 0 || obj->data.picture.depth == 0) && !local__extract_resolution_color_info_(&obj->data.picture))
error_message = error_messages[4];
return error_message;
}
FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, const char **error_message)
{
FLAC__StreamMetadata *obj;
int state = 0;
FLAC__ASSERT(0 != spec);
FLAC__ASSERT(0 != error_message);
@ -358,39 +397,7 @@ FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, con
*error_message = error_messages[3];
}
else { /* regular picture file */
const FLAC__off_t size = grabbag__file_get_filesize(spec);
if(size < 0)
*error_message = error_messages[5];
else {
FLAC__byte *buffer = safe_malloc_(size);
if(0 == buffer)
*error_message = error_messages[0];
else {
FILE *f = flac_fopen(spec, "rb");
if(0 == f) {
*error_message = error_messages[5];
free(buffer);
}
else {
if(fread(buffer, 1, size, f) != (size_t)size)
*error_message = error_messages[6];
fclose(f);
if(0 == *error_message) {
if(!FLAC__metadata_object_picture_set_data(obj, buffer, size, /*copy=*/false))
*error_message = error_messages[6];
/* try to extract MIME type if user left it blank */
else if(*obj->data.picture.mime_type == '\0' && !local__extract_mime_type_(obj))
*error_message = error_messages[8];
/* try to extract resolution/color info if user left it blank */
else if((obj->data.picture.width == 0 || obj->data.picture.height == 0 || obj->data.picture.depth == 0) && !local__extract_resolution_color_info_(&obj->data.picture))
*error_message = error_messages[4];
}
else {
free(buffer);
}
}
}
}
*error_message = read_file (spec, obj);
}
}
}
@ -414,3 +421,80 @@ FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, con
return obj;
}
FLAC__StreamMetadata *grabbag__picture_from_specification(int type, const char *mime_type_in, const char * description,
const PictureResolution * res, const char * filepath, const char **error_message)
{
FLAC__StreamMetadata *obj;
char mime_type [64] ;
if (error_message == 0)
return 0;
strncpy (mime_type, mime_type_in, sizeof (mime_type));
*error_message = 0;
if ((obj = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PICTURE)) == 0) {
*error_message = error_messages[0];
return obj;
}
/* Picture type if known. */
obj->data.picture.type = type >= 0 ? type : FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER;
/* Mime type if known. */
if (mime_type_in && ! FLAC__metadata_object_picture_set_mime_type(obj, mime_type, /*copy=*/true)) {
*error_message = error_messages[0];
return obj;
}
/* Description if present. */
if (description && ! FLAC__metadata_object_picture_set_description(obj, (FLAC__byte*) description, /*copy=*/true)) {
*error_message = error_messages[0];
return obj;
}
if (res == NULL) {
obj->data.picture.width = 0;
obj->data.picture.height = 0;
obj->data.picture.depth = 0;
obj->data.picture.colors = 0;
}
else {
obj->data.picture.width = res->width;
obj->data.picture.height = res->height;
obj->data.picture.depth = res->depth;
obj->data.picture.colors = res->colors;
}
if (strcmp(obj->data.picture.mime_type, "-->") == 0) { /* magic MIME type means URL */
if (!FLAC__metadata_object_picture_set_data(obj, (FLAC__byte*)filepath, strlen(filepath), /*copy=*/true))
*error_message = error_messages[0];
else if (obj->data.picture.width == 0 || obj->data.picture.height == 0 || obj->data.picture.depth == 0)
*error_message = error_messages[3];
}
else {
*error_message = read_file (filepath, obj);
}
if (*error_message == NULL) {
if (
obj->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD &&
(
(strcmp(obj->data.picture.mime_type, "image/png") && strcmp(obj->data.picture.mime_type, "-->")) ||
obj->data.picture.width != 32 ||
obj->data.picture.height != 32
)
)
*error_message = error_messages[9];
}
if (*error_message && obj) {
FLAC__metadata_object_delete(obj);
obj = 0;
}
return obj;
}

View File

@ -65,18 +65,22 @@ static FLAC__bool failed_(const char *msg)
return false;
}
static FLAC__bool test_one_picture(const char *prefix, const PictureFile *pf, const char *res, FLAC__bool fn_only)
static FLAC__bool test_one_picture(const char *prefix, const PictureFile *pf, const PictureResolution * res, FLAC__bool fn_only)
{
FLAC__StreamMetadata *obj;
const char *error;
char s[4096];
if(fn_only)
flac_snprintf(s, sizeof(s), "%s/%s", prefix, pf->path);
flac_snprintf(s, sizeof(s), "pictures/%s", pf->path);
else if (res == NULL)
flac_snprintf(s, sizeof(s), "%u|%s|%s||pictures/%s", (unsigned)pf->type, pf->mime_type, pf->description, pf->path);
else
flac_snprintf(s, sizeof(s), "%u|%s|%s|%s|%s/%s", (unsigned)pf->type, pf->mime_type, pf->description, res, prefix, pf->path);
flac_snprintf(s, sizeof(s), "%u|%s|%s|%dx%dx%d/%d|pictures/%s", (unsigned)pf->type, pf->mime_type, pf->description, res->width, res->height, res->depth, res->colors, pf->path);
printf("testing grabbag__picture_parse_specification(\"%s\")... ", s);
if(0 == (obj = grabbag__picture_parse_specification(s, &error)))
flac_snprintf(s, sizeof(s), "%s/%s", prefix, pf->path);
if((obj = grabbag__picture_from_specification(fn_only? FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER : pf->type, pf->mime_type, pf->description, res, s, &error)) == 0)
return failed_(error);
if(debug_) {
printf("\ntype=%u (%s)\nmime_type=%s\ndescription=%s\nwidth=%u\nheight=%u\ndepth=%u\ncolors=%u\ndata_length=%u\n",
@ -114,6 +118,7 @@ static FLAC__bool test_one_picture(const char *prefix, const PictureFile *pf, co
static FLAC__bool do_picture(const char *prefix)
{
FLAC__StreamMetadata *obj;
PictureResolution res;
const char *error;
size_t i;
@ -181,19 +186,19 @@ static FLAC__bool do_picture(const char *prefix)
/* test automatic parsing of picture files from only the file name */
for(i = 0; i < sizeof(picturefiles)/sizeof(picturefiles[0]); i++)
if(!test_one_picture(prefix, picturefiles+i, "", /*fn_only=*/true))
if(!test_one_picture(prefix, picturefiles+i, NULL, /*fn_only=*/true))
return false;
/* test automatic parsing of picture files to get resolution/color info */
for(i = 0; i < sizeof(picturefiles)/sizeof(picturefiles[0]); i++)
if(!test_one_picture(prefix, picturefiles+i, "", /*fn_only=*/false))
if(!test_one_picture(prefix, picturefiles+i, NULL, /*fn_only=*/false))
return false;
picturefiles[0].width = 320;
picturefiles[0].height = 240;
picturefiles[0].depth = 3;
picturefiles[0].colors = 2;
if(!test_one_picture(prefix, picturefiles+0, "320x240x3/2", /*fn_only=*/false))
res.width = picturefiles[0].width = 320;
res.height = picturefiles[0].height = 240;
res.depth = picturefiles[0].depth = 3;
res.colors = picturefiles[0].colors = 2;
if(!test_one_picture(prefix, picturefiles+0, &res, /*fn_only=*/false))
return false;
return true;

View File

@ -60,7 +60,7 @@ fi
########################################################################
log=picture.log
picture_dir=pictures
picture_dir=${top_srcdir}/test/pictures
echo "Running test_picture..."
@ -69,9 +69,9 @@ rm -f $log
run_test_picture $picture_dir >> $log 2>&1
if [ $is_win = yes ] ; then
diff -w picture.ok $log > picture.diff || die "Error: .log file does not match .ok file, see picture.diff"
diff -w ${top_srcdir}/test/picture.ok $log > picture.diff || die "Error: .log file does not match .ok file, see picture.diff"
else
diff picture.ok $log > picture.diff || die "Error: .log file does not match .ok file, see picture.diff"
diff ${top_srcdir}/test/picture.ok $log > picture.diff || die "Error: .log file does not match .ok file, see picture.diff"
fi
echo "PASSED (results are in $log)"
@ -83,8 +83,8 @@ echo "PASSED (results are in $log)"
########################################################################
log=cuesheet.log
bad_cuesheets=cuesheets/bad.*.cue
good_cuesheets=cuesheets/good.*.cue
bad_cuesheets=${top_srcdir}/test/cuesheets/bad.*.cue
good_cuesheets=${top_srcdir}/test/cuesheets/good.*.cue
good_leadout=`expr 80 \* 60 \* 44100`
bad_leadout=`expr $good_leadout + 1`
@ -96,7 +96,7 @@ rm -f $log
# negative tests
#
for cuesheet in $bad_cuesheets ; do
echo "NEGATIVE $cuesheet" >> $log 2>&1
echo "NEGATIVE $cuesheet" | sed "s|${top_srcdir}/test/||" >> $log 2>&1
run_test_cuesheet $cuesheet $good_leadout 44100 cdda >> $log 2>&1 || exit_code=$?
if [ "$exit_code" = 255 ] ; then
die "Error: test script is broken"
@ -110,7 +110,7 @@ done
# positve tests
#
for cuesheet in $good_cuesheets ; do
echo "POSITIVE $cuesheet" >> $log 2>&1
echo "POSITIVE $cuesheet" | sed "s|${top_srcdir}/test/||" >> $log 2>&1
run_test_cuesheet $cuesheet $good_leadout 44100 cdda >> $log 2>&1
exit_code=$?
if [ "$exit_code" = 255 ] ; then
@ -125,9 +125,9 @@ for cuesheet in $good_cuesheets ; do
done
if [ $is_win = yes ] ; then
diff -w cuesheet.ok $log > cuesheet.diff || die "Error: .log file does not match .ok file, see cuesheet.diff"
diff -w ${top_srcdir}/test/cuesheet.ok $log > cuesheet.diff || die "Error: .log file does not match .ok file, see cuesheet.diff"
else
diff cuesheet.ok $log > cuesheet.diff || die "Error: .log file does not match .ok file, see cuesheet.diff"
diff ${top_srcdir}/test/cuesheet.ok $log > cuesheet.diff || die "Error: .log file does not match .ok file, see cuesheet.diff"
fi
echo "PASSED (results are in $log)"