[gmime] Added unit test for GMimeFilterGZip



commit 4453407a91b623a5177b9fa82c4f3abef9c738e6
Author: Jeffrey Stedfast <jestedfa microsoft com>
Date:   Wed Dec 13 23:02:36 2017 -0500

    Added unit test for GMimeFilterGZip

 gmime/gmime-filter-gzip.c             |    4 +-
 tests/.gitignore                      |    1 +
 tests/Makefile.am                     |    8 +-
 tests/data/filters/lorem-ipsum.txt    |    9 ++
 tests/data/filters/lorem-ipsum.txt.gz |  Bin 0 -> 1197 bytes
 tests/test-filters.c                  |  223 +++++++++++++++++++++++++++++++++
 6 files changed, 242 insertions(+), 3 deletions(-)
---
diff --git a/gmime/gmime-filter-gzip.c b/gmime/gmime-filter-gzip.c
index a0546aa..39d810b 100644
--- a/gmime/gmime-filter-gzip.c
+++ b/gmime/gmime-filter-gzip.c
@@ -455,9 +455,9 @@ filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace,
        GMimeFilterGZip *gzip = (GMimeFilterGZip *) filter;
        
        if (gzip->mode == GMIME_FILTER_GZIP_MODE_ZIP)
-               gzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_SYNC_FLUSH);
+               gzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_NO_FLUSH);
        else
-               gunzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_SYNC_FLUSH);
+               gunzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_NO_FLUSH);
 }
 
 static void
diff --git a/tests/.gitignore b/tests/.gitignore
index 9004812..c039823 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -7,6 +7,7 @@ Makefile
 test-autocrypt
 test-best
 test-cat
+test-filters
 test-headers
 test-html
 test-iconv
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ec62325..fba5e05 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -13,6 +13,7 @@ AUTOMATED_TESTS =     \
        test-iconv      \
        test-streams    \
        test-cat        \
+       test-filters    \
        test-headers    \
        test-partial    \
        test-mbox       \
@@ -71,6 +72,11 @@ test_mbox_LDFLAGS =
 test_mbox_DEPENDENCIES = $(DEPS)
 test_mbox_LDADD = $(LDADDS)
 
+test_filters_SOURCES = test-filters.c testsuite.c testsuite.h
+test_filters_LDFLAGS = 
+test_filters_DEPENDENCIES = $(DEPS)
+test_filters_LDADD = $(LDADDS)
+
 test_streams_SOURCES = test-streams.c testsuite.c testsuite.h
 test_streams_LDFLAGS = 
 test_streams_DEPENDENCIES = $(DEPS)
@@ -120,7 +126,7 @@ endif
 
 EXTRA_DIST = $(wildcard empty*.msg rfc2060.msg data/pgp*/* data/smime/* \
        data/partial/input/photo-discuss/*.eml data/partial/output/* \
-       data/mbox/*put/substring.mbox)
+       data/mbox/*put/substring.mbox data/filters/*)
 
 VERBOSITY=-v
 
diff --git a/tests/data/filters/lorem-ipsum.txt b/tests/data/filters/lorem-ipsum.txt
new file mode 100644
index 0000000..874adad
--- /dev/null
+++ b/tests/data/filters/lorem-ipsum.txt
@@ -0,0 +1,9 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut arcu blandit, sollicitudin arcu non, 
vulputate lacus. In ut magna ac tellus venenatis aliquam lacinia at leo. In blandit augue libero, a auctor 
elit luctus id. Nulla malesuada erat commodo sem bibendum, eget rhoncus justo porttitor. Duis convallis 
libero leo, a feugiat lacus maximus ultrices. Nulla ac sem urna. Praesent sit amet pellentesque erat, quis 
vulputate lacus. In ligula eros, dapibus vulputate felis vel, elementum aliquet turpis. Donec gravida nibh 
nec neque convallis, ut accumsan odio consectetur. Suspendisse congue auctor consectetur. Morbi eu nisl eget 
nisl condimentum porta quis eget mauris.
+
+Donec laoreet dapibus nunc ut rutrum. Morbi gravida interdum lectus, non laoreet quam tempor ac. Nam tempus 
enim ac ligula porttitor, nec vestibulum velit ullamcorper. Cras congue et tortor vel consectetur. In 
hendrerit lacus a molestie tincidunt. Sed vehicula tempus urna sed suscipit. Aenean nec purus consectetur, 
volutpat lectus et, convallis neque. Duis dapibus laoreet nibh, suscipit aliquet turpis auctor et. Donec id 
sagittis orci.
+
+Proin in enim ut ante porttitor auctor. Cras et dui arcu. Nullam non mauris bibendum, auctor leo nec, 
sodales nibh. Quisque sagittis commodo quam, at consequat sapien venenatis sed. Phasellus vitae felis nec 
mauris auctor egestas. Nullam sed massa at erat auctor malesuada. Vestibulum ultrices lectus magna, vel 
dictum risus imperdiet eget. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac 
turpis egestas. Maecenas quis pharetra libero, in tempor arcu. Aenean est enim, faucibus vitae sapien at, 
finibus consequat lectus. Suspendisse fermentum dui nec mauris faucibus, ac congue risus varius.
+
+Suspendisse feugiat dignissim orci, in malesuada nunc laoreet ac. Maecenas dapibus velit a leo cursus 
sodales. Ut vel maximus purus, non rutrum purus. Interdum et malesuada fames ac ante ipsum primis in 
faucibus. Donec ullamcorper interdum ligula, id vehicula elit lobortis et. Proin nisi odio, blandit nec arcu 
nec, tempus egestas libero. Nam auctor cursus finibus. Praesent rutrum nibh sit amet rhoncus mollis.
+
+Maecenas ultrices vel eros quis faucibus. Nam vitae odio ullamcorper, malesuada ex quis, aliquam urna. Nulla 
facilisi. Vivamus magna ipsum, scelerisque malesuada metus ut, venenatis faucibus neque. Sed blandit felis 
tellus, id ullamcorper ex egestas ac. Morbi feugiat nibh ac mi interdum feugiat. Nullam risus felis, 
porttitor facilisis commodo nec, luctus sed quam. Sed in orci quis nibh luctus laoreet. Pellentesque nulla 
sem, molestie vel arcu quis, finibus tempus turpis. Curabitur maximus, neque vel mollis tempor, sapien massa 
fermentum neque, quis ornare orci lorem a tellus. Donec porta vitae ipsum vel interdum. Phasellus dignissim 
ligula ligula, nec sodales mi tincidunt in.
diff --git a/tests/data/filters/lorem-ipsum.txt.gz b/tests/data/filters/lorem-ipsum.txt.gz
new file mode 100644
index 0000000..dcd24c3
Binary files /dev/null and b/tests/data/filters/lorem-ipsum.txt.gz differ
diff --git a/tests/test-filters.c b/tests/test-filters.c
new file mode 100644
index 0000000..3d27458
--- /dev/null
+++ b/tests/test-filters.c
@@ -0,0 +1,223 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*  GMime
+ *  Copyright (C) 2000-2017 Jeffrey Stedfast
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <gmime/gmime.h>
+
+#include "testsuite.h"
+
+extern int verbose;
+
+#define d(x) 
+#define v(x) if (verbose > 3) x;
+
+
+static GByteArray *
+read_all_bytes (const char *path, gboolean is_text)
+{
+       GMimeStream *filtered, *stream, *mem;
+       GMimeFilter *filter;
+       GByteArray *buffer;
+       
+       buffer = g_byte_array_new ();
+       stream = g_mime_stream_fs_open (path, O_RDONLY, 0644, NULL);
+       mem = g_mime_stream_mem_new_with_byte_array (buffer);
+       g_mime_stream_mem_set_owner ((GMimeStreamMem *) mem, FALSE);
+       
+       if (is_text) {
+               filtered = g_mime_stream_filter_new (mem);
+               filter = g_mime_filter_dos2unix_new (FALSE);
+               g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter);
+               g_object_unref (filter);
+               g_object_unref (mem);
+       } else {
+               filtered = mem;
+       }
+       
+       g_mime_stream_write_to_stream (stream, filtered);
+       g_mime_stream_flush (filtered);
+       g_object_unref (filtered);
+       g_object_unref (stream);
+       
+       return buffer;
+}
+
+static void
+pump_data_through_filter (GMimeFilter *filter, const char *path, GMimeStream *ostream, gboolean is_text, 
gboolean inc)
+{
+       GMimeStream *onebyte, *filtered, *stream;
+       GMimeFilter *dos2unix;
+       
+       filtered = g_mime_stream_filter_new (ostream);
+       
+       if (is_text) {
+               /* canonicalize text input */
+               dos2unix = g_mime_filter_dos2unix_new (FALSE);
+               g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, dos2unix);
+               g_object_unref (dos2unix);
+       }
+       
+       g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter);
+       
+       if (inc) {
+               onebyte = test_stream_onebyte_new (filtered);
+               g_object_unref (filtered);
+       } else {
+               onebyte = filtered;
+       }
+       
+       stream = g_mime_stream_fs_open (path, O_RDONLY, 0644, NULL);
+       g_mime_stream_write_to_stream (stream, onebyte);
+       g_mime_stream_flush (onebyte);
+       g_object_unref (onebyte);
+       g_object_unref (stream);
+}
+
+static void
+test_gzip (const char *datadir, const char *filename)
+{
+       char *name = g_strdup_printf ("%s.gz", filename);
+       char *path = g_build_filename (datadir, filename, NULL);
+       const char *what = "GMimeFilterGzip::zip";
+       GByteArray *actual, *expected;
+       GMimeStream *stream;
+       GMimeFilter *filter;
+       
+       testsuite_check ("%s", what);
+       
+       actual = g_byte_array_new ();
+       stream = g_mime_stream_mem_new_with_byte_array (actual);
+       g_mime_stream_mem_set_owner ((GMimeStreamMem *) stream, FALSE);
+       
+       filter = g_mime_filter_gzip_new (GMIME_FILTER_GZIP_MODE_ZIP, 9);
+       
+       pump_data_through_filter (filter, path, stream, TRUE, FALSE);
+       g_mime_filter_reset (filter);
+       g_object_unref (stream);
+       g_object_unref (filter);
+       g_free (path);
+       
+       path = g_build_filename (datadir, name, NULL);
+       expected = read_all_bytes (path, FALSE);
+       g_free (name);
+       g_free (path);
+       
+       if (actual->len != expected->len || memcmp (actual->data, expected->data, actual->len) != 0) {
+               testsuite_check_failed ("%s failed: %s", what, "streams do not match");
+               
+               name = g_strdup_printf ("%s.1.gz", filename);
+               path = g_build_filename (datadir, name, NULL);
+               g_free (name);
+               
+               stream = g_mime_stream_fs_open (path, O_WRONLY | O_CREAT | O_TRUNC, 0644, NULL);
+               g_free (path);
+               
+               g_mime_stream_write (stream, (const char *) actual->data, actual->len);
+               g_mime_stream_flush (stream);
+               g_object_unref (stream);
+       } else {
+               testsuite_check_passed ();
+       }
+       
+       g_byte_array_free (expected, TRUE);
+       g_byte_array_free (actual, TRUE);
+}
+
+static void
+test_gunzip (const char *datadir, const char *filename)
+{
+       char *name = g_strdup_printf ("%s.gz", filename);
+       char *path = g_build_filename (datadir, name, NULL);
+       const char *what = "GMimeFilterGzip::unzip";
+       GByteArray *actual, *expected;
+       GMimeStream *stream;
+       GMimeFilter *filter;
+       
+       testsuite_check ("%s", what);
+       
+       actual = g_byte_array_new ();
+       stream = g_mime_stream_mem_new_with_byte_array (actual);
+       g_mime_stream_mem_set_owner ((GMimeStreamMem *) stream, FALSE);
+       
+       filter = g_mime_filter_gzip_new (GMIME_FILTER_GZIP_MODE_UNZIP, 9);
+       
+       pump_data_through_filter (filter, path, stream, FALSE, FALSE);
+       g_mime_filter_reset (filter);
+       g_object_unref (stream);
+       g_object_unref (filter);
+       g_free (path);
+       g_free (name);
+       
+       path = g_build_filename (datadir, filename, NULL);
+       expected = read_all_bytes (path, TRUE);
+       g_free (path);
+       
+       if (actual->len != expected->len || memcmp (actual->data, expected->data, actual->len) != 0)
+               testsuite_check_failed ("%s failed: %s", what, "streams do not match");
+       else
+               testsuite_check_passed ();
+       
+       g_byte_array_free (expected, TRUE);
+       g_byte_array_free (actual, TRUE);
+}
+
+int main (int argc, char **argv)
+{
+       const char *datadir = "data/filters";
+       struct stat st;
+       int i;
+       
+       g_mime_init ();
+       
+       testsuite_init (argc, argv);
+       
+       for (i = 1; i < argc; i++) {
+               if (argv[i][0] != '-') {
+                       datadir = argv[i];
+                       break;
+               }
+       }
+       
+       if (i < argc && (stat (datadir, &st) == -1 || !S_ISDIR (st.st_mode)))
+               return 0;
+       
+       testsuite_start ("Filter tests");
+       
+       test_gzip (datadir, "lorem-ipsum.txt");
+       test_gunzip (datadir, "lorem-ipsum.txt");
+       
+       testsuite_end ();
+       
+       g_mime_shutdown ();
+       
+       return testsuite_exit ();
+}


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