[tracker/tracker-0.10] tests/libtracker-extract: unit tests for tracker-iptc



commit fb1416ce17a53ba31786d73cd1bfc039f93a7003
Author: Ivan Frade <ivan frade gmail com>
Date:   Thu Oct 20 16:07:11 2011 +0300

    tests/libtracker-extract: unit tests for tracker-iptc

 src/libtracker-extract/tracker-iptc.c        |    4 +
 tests/libtracker-extract/Makefile.am         |   12 ++-
 tests/libtracker-extract/iptc-img.jpg        |  Bin 0 -> 3782 bytes
 tests/libtracker-extract/tracker-iptc-test.c |  163 ++++++++++++++++++++++++++
 4 files changed, 178 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-extract/tracker-iptc.c b/src/libtracker-extract/tracker-iptc.c
index c539090..68edda7 100644
--- a/src/libtracker-extract/tracker-iptc.c
+++ b/src/libtracker-extract/tracker-iptc.c
@@ -230,6 +230,8 @@ parse_iptc (const unsigned char *buffer,
 
 #ifndef TRACKER_DISABLE_DEPRECATED
 
+// LCOV_EXCL_START
+
 /**
  * tracker_iptc_read:
  * @buffer: a chunk of data with iptc data in it.
@@ -262,6 +264,8 @@ tracker_iptc_read (const unsigned char *buffer,
 	return parse_iptc (buffer, len, uri, data);
 }
 
+// LCOV_EXCL_STOP
+
 #endif /* TRACKER_DISABLE_DEPRECATED */
 
 /**
diff --git a/tests/libtracker-extract/Makefile.am b/tests/libtracker-extract/Makefile.am
index a7e8cc0..af6853e 100644
--- a/tests/libtracker-extract/Makefile.am
+++ b/tests/libtracker-extract/Makefile.am
@@ -8,6 +8,11 @@ TEST_PROGS +=                                          \
 	tracker-exif-test			       \
 	tracker-guarantee-test
 
+if HAVE_IPTC
+# This test also requires libjpeg...
+TEST_PROGS += tracker-iptc-test
+endif
+
 if HAVE_ENCA
 TEST_PROGS += tracker-encoding
 else
@@ -43,6 +48,10 @@ tracker_exif_test_SOURCES = tracker-exif-test.c
 
 tracker_guarantee_test_SOURCES = tracker-guarantee-test.c
 
+tracker_iptc_test_SOURCES = tracker-iptc-test.c
+tracker_iptc_test_LDADD = $(LDADD) $(LIBJPEG_LIBS)
+tracker_iptc_test_CFLAGS = $(LIBJPEG_CFLAGS)
+
 EXTRA_DIST = encoding-detect.bin 	\
 	areas.xmp 			\
 	areas-with-contacts.xmp 	\
@@ -52,4 +61,5 @@ EXTRA_DIST = encoding-detect.bin 	\
 	exif-img.jpg			\
 	exif-free-img.jpg		\
 	guarantee-mtime-test.txt	\
-	getline-test.txt
+	getline-test.txt		\
+	iptc-img.jpg
diff --git a/tests/libtracker-extract/iptc-img.jpg b/tests/libtracker-extract/iptc-img.jpg
new file mode 100644
index 0000000..d400010
Binary files /dev/null and b/tests/libtracker-extract/iptc-img.jpg differ
diff --git a/tests/libtracker-extract/tracker-iptc-test.c b/tests/libtracker-extract/tracker-iptc-test.c
new file mode 100644
index 0000000..b016b30
--- /dev/null
+++ b/tests/libtracker-extract/tracker-iptc-test.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2011, Nokia <ivan frade nokia com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <setjmp.h>
+
+#include <jpeglib.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <libtracker-extract/tracker-iptc.h>
+
+#define PS3_NAMESPACE           "Photoshop 3.0\0"
+#define PS3_NAMESPACE_LENGTH    14
+#include <libiptcdata/iptc-jpeg.h>
+
+struct tej_error_mgr {
+	struct jpeg_error_mgr jpeg;
+	jmp_buf setjmp_buffer;
+};
+
+
+static void
+extract_jpeg_error_exit (j_common_ptr cinfo)
+{
+	struct tej_error_mgr *h = (struct tej_error_mgr *) cinfo->err;
+	(*cinfo->err->output_message)(cinfo);
+	longjmp (h->setjmp_buffer, 1);
+}
+
+/*
+ * libiptcdata doesn't scan the file until find the IPTC blob.
+ * We need to find the blob ourselves. This code comes from tracker-extract-jpeg
+ */
+TrackerIptcData *
+load_iptc_blob (const gchar *filename)
+{
+	struct jpeg_decompress_struct cinfo;
+	struct tej_error_mgr tejerr;
+	struct jpeg_marker_struct *marker;
+	TrackerIptcData *id = NULL;
+        FILE *f;
+        gchar *uri;
+        GFile *file;
+
+        file = g_file_new_for_path (filename);
+        uri = g_file_get_uri (file);
+        g_object_unref (file);
+
+        f = fopen (filename, "r");
+
+	cinfo.err = jpeg_std_error (&tejerr.jpeg);
+	tejerr.jpeg.error_exit = extract_jpeg_error_exit;
+	if (setjmp (tejerr.setjmp_buffer)) {
+                fclose (f);
+                g_free (uri);
+                return NULL;
+	}
+
+	jpeg_create_decompress (&cinfo);
+
+	jpeg_save_markers (&cinfo, JPEG_COM, 0xFFFF);
+	jpeg_save_markers (&cinfo, JPEG_APP0 + 1, 0xFFFF);
+	jpeg_save_markers (&cinfo, JPEG_APP0 + 13, 0xFFFF);
+
+	jpeg_stdio_src (&cinfo, f);
+
+	jpeg_read_header (&cinfo, TRUE);
+
+	marker = (struct jpeg_marker_struct *) &cinfo.marker_list;
+
+	while (marker) {
+		gchar *str;
+		gsize len;
+		gint offset;
+		guint sublen;
+
+		switch (marker->marker) {
+		case JPEG_COM:
+			break;
+
+		case JPEG_APP0 + 1:
+			break;
+
+		case JPEG_APP0 + 13:
+			str = (gchar*) marker->data;
+			len = marker->data_length;
+			if (len > 0 && strncmp (PS3_NAMESPACE, str, PS3_NAMESPACE_LENGTH) == 0) {
+				offset = iptc_jpeg_ps3_find_iptc ((guchar *)str, len, &sublen);
+				if (offset > 0 && sublen > 0) {
+					id = tracker_iptc_new ((const guchar *)str + offset, sublen, uri);
+				}
+			}
+			break;
+
+		default:
+			marker = marker->next;
+			continue;
+		}
+
+		marker = marker->next;
+	}
+
+        g_free (uri);
+        fclose (f);
+
+        return id;
+}
+
+
+void
+test_iptc_extraction ()
+{
+        TrackerIptcData *data;
+
+        data = load_iptc_blob ("./iptc-img.jpg");
+        g_assert (data);
+
+        g_assert_cmpstr (data->keywords, ==, "Coverage, test");
+        g_assert (g_str_has_prefix (data->date_created, "2011-10-22"));
+        g_assert_cmpstr (data->byline, ==, "BylineValue");
+        g_assert_cmpstr (data->byline_title, ==, "BylineTitleValue");
+        g_assert_cmpstr (data->credit, ==, "CreditValue");
+        g_assert_cmpstr (data->copyright_notice, ==, "IptcToolAuthors");
+        g_assert_cmpstr (data->image_orientation, ==, "nfo:orientation-left");
+        g_assert_cmpstr (data->city, ==, "Helsinki");
+        g_assert_cmpstr (data->state, ==, "N/A");
+        g_assert_cmpstr (data->sublocation, ==, "Ruoholahti");
+        g_assert_cmpstr (data->country_name, ==, "Finland");
+        g_assert_cmpstr (data->contact, ==, "Dilbert");
+
+        tracker_iptc_free (data);
+}
+
+int
+main (int argc, char **argv)
+{
+        g_type_init ();
+        g_test_init (&argc, &argv, NULL);
+
+        g_test_add_func ("/libtracker-extract/iptc/extraction",
+                         test_iptc_extraction);
+        return g_test_run ();
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]