gmime r1209 - trunk/tests



Author: fejj
Date: Sat Feb  2 15:20:35 2008
New Revision: 1209
URL: http://svn.gnome.org/viewvc/gmime?rev=1209&view=rev

Log:
added functionality to mbox test

Modified:
   trunk/tests/test-mbox.c

Modified: trunk/tests/test-mbox.c
==============================================================================
--- trunk/tests/test-mbox.c	(original)
+++ trunk/tests/test-mbox.c	Sat Feb  2 15:20:35 2008
@@ -42,6 +42,9 @@
 #define v(x) if (verbose > 3) x
 
 
+//#define ENABLE_MBOX_MATCH
+
+
 #define INDENT "   "
 
 static void
@@ -90,7 +93,7 @@
 }
 
 static void
-test_parser (GMimeParser *parser, GMimeStream *stream)
+test_parser (GMimeParser *parser, GMimeStream *mbox, GMimeStream *summary)
 {
 	GMimeMessage *message;
 	off_t start, end;
@@ -104,15 +107,20 @@
 		
 		end = g_mime_parser_tell (parser);
 		
-		g_mime_stream_printf (stream, "message offsets: " OFF_T ", " OFF_T "\n", start, end);
+		g_mime_stream_printf (summary, "message offsets: " OFF_T ", " OFF_T "\n", start, end);
 		
 		from = g_mime_parser_get_from (parser);
-		g_mime_stream_printf (stream, "%s\n", from);
-		g_free (from);
+		g_mime_stream_printf (summary, "%s\n", from);
+		print_mime_struct (summary, message->mime_part, 0);
+		g_mime_stream_write (summary, "\n", 1);
+		
+		if (mbox) {
+			g_mime_stream_printf (mbox, "%s%s\n", nmsg > 0 ? "\n" : "", from);
+			g_mime_object_write_to_stream ((GMimeObject *) message, mbox);
+		}
 		
-		print_mime_struct (stream, message->mime_part, 0);
-		g_mime_stream_write (stream, "\n", 1);
 		g_object_unref (message);
+		g_free (from);
 		nmsg++;
 	}
 }
@@ -120,9 +128,10 @@
 static gboolean
 streams_match (GMimeStream *istream, GMimeStream *ostream)
 {
-	char buf[4096], dbuf[4096], errstr[1024];
+	char buf[4096], dbuf[4096], errstr[1024], *bufptr, *bufend, *dbufptr;
 	size_t totalsize, totalread = 0;
 	size_t nread, size;
+	off_t offset = 0;
 	ssize_t n;
 	
 	v(fprintf (stdout, "Checking if streams match... "));
@@ -164,12 +173,29 @@
 			goto fail;
 		}
 		
-		if (memcmp (buf, dbuf, size) != 0) {
-			strcpy (errstr, "Error: content does not match\n");
+		bufend = buf + size;
+		dbufptr = dbuf;
+		bufptr = buf;
+		
+		while (bufptr < bufend) {
+			if (*bufptr != *dbufptr)
+				break;
+			
+			dbufptr++;
+			bufptr++;
+		}
+		
+		if (bufptr < bufend) {
+			sprintf (errstr, "Error: content does not match at offset " OFF_T "\n",
+				 offset + (bufptr - buf));
+			/*fprintf (stderr, "-->'%.*s'<--\nvs\n-->'%.*s'<--\n",
+			  bufend - bufptr, bufptr, bufend - bufptr, dbufptr);*/
 			goto fail;
 		} else {
 			d(fprintf (stderr, SIZE_T " bytes identical\n", size));
 		}
+		
+		offset += size;
 	}
 	
 	if (totalread < totalsize) {
@@ -197,8 +223,8 @@
 int main (int argc, char **argv)
 {
 	const char *datadir = "data/mbox";
-	char input[256], output[256], *p, *q;
-	GMimeStream *istream, *ostream;
+	char input[256], output[256], *tmp, *p, *q;
+	GMimeStream *istream, *ostream, *mstream, *pstream;
 	GMimeParser *parser;
 	struct dirent *dent;
 	const char *path;
@@ -210,6 +236,9 @@
 	
 	testsuite_init (argc, argv);
 	
+	system ("/bin/rm -rf ./tmp");
+	system ("/bin/mkdir -p ./tmp");
+	
 	path = datadir;
 	for (i = 1; i < argc; i++) {
 		if (argv[i][0] != '-') {
@@ -248,9 +277,12 @@
 			strcpy (p, dent->d_name);
 			strcpy (q, dent->d_name);
 			
+			tmp = NULL;
 			parser = NULL;
 			istream = NULL;
 			ostream = NULL;
+			mstream = NULL;
+			pstream = NULL;
 			
 			testsuite_check ("%s", dent->d_name);
 			try {
@@ -268,23 +300,44 @@
 				
 				ostream = g_mime_stream_fs_new (fd);
 				
+#ifdef ENABLE_MBOX_MATCH
+				tmp = g_strdup_printf ("./tmp/%s.XXXXXX", dent->d_name);
+				if ((fd = g_mkstemp (tmp)) == -1) {
+					throw (exception_new ("could not open `%s': %s",
+							      tmp, strerror (errno)));
+				}
+				
+				mstream = g_mime_stream_fs_new (fd);
+#endif
+				
 				parser = g_mime_parser_new_with_stream (istream);
 				g_mime_parser_set_persist_stream (parser, TRUE);
 				g_mime_parser_set_scan_from (parser, TRUE);
-				g_object_unref (istream);
 				
 				if (strstr (dent->d_name, "content-length") != NULL)
 					g_mime_parser_set_respect_content_length (parser, TRUE);
 				
-				istream = g_mime_stream_mem_new ();
-				g_mime_parser_set_header_regex (parser, "^Subject$", header_cb, istream);
-				test_parser (parser, istream);
+				pstream = g_mime_stream_mem_new ();
+				g_mime_parser_set_header_regex (parser, "^Subject$", header_cb, pstream);
+				test_parser (parser, mstream, pstream);
 				
+#ifdef ENABLE_MBOX_MATCH
 				g_mime_stream_reset (istream);
-				if (!streams_match (istream, ostream))
-					throw (exception_new ("streams do not match for `%s'", dent->d_name));
+				g_mime_stream_reset (mstream);
+				if (!streams_match (istream, mstream))
+					throw (exception_new ("mboxes do not match for `%s'", dent->d_name));
+#endif
+				
+				g_mime_stream_reset (ostream);
+				g_mime_stream_reset (pstream);
+				if (!streams_match (ostream, pstream))
+					throw (exception_new ("summaries do not match for `%s'", dent->d_name));
 				
 				testsuite_check_passed ();
+				
+#ifdef ENABLE_MBOX_MATCH
+				unlink (tmp);
+#endif
 			} catch (ex) {
 				if (parser != NULL)
 					testsuite_check_failed ("%s: %s", dent->d_name, ex->message);
@@ -292,6 +345,12 @@
 					testsuite_check_warn ("%s: %s", dent->d_name, ex->message);
 			} finally;
 			
+			if (mstream != NULL)
+				g_object_unref (mstream);
+			
+			if (pstream != NULL)
+				g_object_unref (pstream);
+			
 			if (istream != NULL)
 				g_object_unref (istream);
 			
@@ -300,6 +359,8 @@
 			
 			if (parser != NULL)
 				g_object_unref (parser);
+			
+			g_free (tmp);
 		}
 		
 		closedir (dir);
@@ -311,20 +372,49 @@
 		istream = g_mime_stream_fs_new (fd);
 		parser = g_mime_parser_new_with_stream (istream);
 		g_mime_parser_set_scan_from (parser, TRUE);
-		g_object_unref (istream);
+		
+#ifdef ENABLE_MBOX_MATCH
+		tmp = g_strdup ("./tmp/mbox-test.XXXXXX");
+		if ((fd = g_mkstemp (tmp)) == -1) {
+			g_object_unref (istream);
+			g_object_unref (parser);
+			g_free (tmp);
+			goto exit;
+		}
+		
+		mstream = g_mime_stream_fs_new (fd);
+#else
+		mstream = NULL;
+#endif
 		
 		ostream = g_mime_stream_fs_new (dup (1));
 		g_mime_parser_set_header_regex (parser, "^Subject$", header_cb, ostream);
 		
 		testsuite_check ("user-input mbox: `%s'", path);
 		try {
-			test_parser (parser, ostream);
+			test_parser (parser, mstream, ostream);
+			
+#ifdef ENABLE_MBOX_MATCH
+			g_mime_stream_reset (istream);
+			g_mime_stream_reset (mstream);
+			if (!streams_match (istream, mstream))
+				throw (exception_new ("`%s' does not match `%s'", tmp, path));
+			
+			unlink (tmp);
+#endif
+			
 			testsuite_check_passed ();
 		} catch (ex) {
 			testsuite_check_failed ("user-input mbox `%s': %s", path, ex->message);
 		} finally;
 		
+		g_object_unref (istream);
 		g_object_unref (ostream);
+		
+#ifdef ENABLE_MBOX_MATCH
+		g_object_unref (mstream);
+		g_free (tmp);
+#endif
 	} else {
 		goto exit;
 	}



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