[gmime] Added more tests for OpenPGP detection filtering



commit 1f873de512256c724969781d8d9007940e7d366c
Author: Jeffrey Stedfast <jestedfa microsoft com>
Date:   Wed Dec 13 13:28:09 2017 -0500

    Added more tests for OpenPGP detection filtering

 tests/data/pgp/encrypted-message.txt               |   26 +++
 tests/data/pgp/encrypted-message.txt.openpgp-block |   17 ++
 tests/test-pgp.c                                   |   25 ++-
 tests/testsuite.c                                  |  197 ++++++++++++++++++++
 tests/testsuite.h                                  |   26 +++
 5 files changed, 287 insertions(+), 4 deletions(-)
---
diff --git a/tests/data/pgp/encrypted-message.txt b/tests/data/pgp/encrypted-message.txt
new file mode 100644
index 0000000..5cce8b9
--- /dev/null
+++ b/tests/data/pgp/encrypted-message.txt
@@ -0,0 +1,26 @@
+From: GMime Unit Tests <no.user@no.domain>
+To: GMime Unit Tests <no.user@no.domain>
+Subject: PGP encrypted message
+MIME-Version: 1.0
+Content-Type: text/plain
+
+-----BEGIN PGP MESSAGE-----
+
+hQIOAwTJ0obO8knpEAgAiSHHrzUzh9J4QwDZp4ztLgjkscQPVpr4Ktuw5PoVhRqz
+TbHFEVT/yBRzkQ23hTV3aArufEbizN9LSwQ6wTS/QNx85yH+oGX1qznYXe2zmtxV
+cmJjcS+pUeVg/CbYQcdN4C/9CFije7lDfc9+A2heUhIoHgRku04Jh+ZgzXY38zTW
+p/wdfEBOEz6JtCcmYDsh+pt+7YkiJVboY+qOIxsOOkS1VfjQTz179mtCZhiCbYlV
+CcQJAsXyQOdIdK0V+VqxgtZ07NuXX1vzpxq4RBBo0gkMynEKeE00ID9Q6hepS0Kd
+fYK8D1/qiCQxpqpWkeOXYFdNB/kRrHMR9c5+pZNKBwf8DigshxX9Akx0JWH4/b9B
+1wOB7IYsPKDFuUgovUuJc9WYmp+TPFNiPTwk5cMkw0usibhSfouA2GRp1Fr9brRW
+k+TYNK8VCtj7BJZzoC79adgNYr8u2Z5eZvKCH4IdaoPAzlJC8TURHWJPa1mXQkxI
+dwDBClgy/fddNfdYHxfOhmI/Q3VtZanE8NFL0Z6bB3vjEB7vtv/wY5W/ldwAtHMb
+6V9+NDmxmwb3gGUcFkA+ooovWEuiO1XmUgAcZlyJ9AqUFOD0+5pQ624aHIxLSORe
+sXmK8wDXFwhod/4c6XSGVs9L5P6v2WlfXMAyWcgQ7O1oULNOpxBgAV4AXO0sUFv+
+ZNJYAUQIVHaAzfjswsUUpR0ncnxfjYzxZN7sG1Ed2Ag+al4vdZwv9tCw1Txyi7Bc
+n+jUgxtw81LAO6zWobIAeKZeZrlrGmoIVwg/0O222KUflM4nynl5ISIaAg==
+=0NQ6
+-----END PGP MESSAGE-----
+
+--
+And this is the email signature...
diff --git a/tests/data/pgp/encrypted-message.txt.openpgp-block 
b/tests/data/pgp/encrypted-message.txt.openpgp-block
new file mode 100644
index 0000000..fe61c0e
--- /dev/null
+++ b/tests/data/pgp/encrypted-message.txt.openpgp-block
@@ -0,0 +1,17 @@
+-----BEGIN PGP MESSAGE-----
+
+hQIOAwTJ0obO8knpEAgAiSHHrzUzh9J4QwDZp4ztLgjkscQPVpr4Ktuw5PoVhRqz
+TbHFEVT/yBRzkQ23hTV3aArufEbizN9LSwQ6wTS/QNx85yH+oGX1qznYXe2zmtxV
+cmJjcS+pUeVg/CbYQcdN4C/9CFije7lDfc9+A2heUhIoHgRku04Jh+ZgzXY38zTW
+p/wdfEBOEz6JtCcmYDsh+pt+7YkiJVboY+qOIxsOOkS1VfjQTz179mtCZhiCbYlV
+CcQJAsXyQOdIdK0V+VqxgtZ07NuXX1vzpxq4RBBo0gkMynEKeE00ID9Q6hepS0Kd
+fYK8D1/qiCQxpqpWkeOXYFdNB/kRrHMR9c5+pZNKBwf8DigshxX9Akx0JWH4/b9B
+1wOB7IYsPKDFuUgovUuJc9WYmp+TPFNiPTwk5cMkw0usibhSfouA2GRp1Fr9brRW
+k+TYNK8VCtj7BJZzoC79adgNYr8u2Z5eZvKCH4IdaoPAzlJC8TURHWJPa1mXQkxI
+dwDBClgy/fddNfdYHxfOhmI/Q3VtZanE8NFL0Z6bB3vjEB7vtv/wY5W/ldwAtHMb
+6V9+NDmxmwb3gGUcFkA+ooovWEuiO1XmUgAcZlyJ9AqUFOD0+5pQ624aHIxLSORe
+sXmK8wDXFwhod/4c6XSGVs9L5P6v2WlfXMAyWcgQ7O1oULNOpxBgAV4AXO0sUFv+
+ZNJYAUQIVHaAzfjswsUUpR0ncnxfjYzxZN7sG1Ed2Ag+al4vdZwv9tCw1Txyi7Bc
+n+jUgxtw81LAO6zWobIAeKZeZrlrGmoIVwg/0O222KUflM4nynl5ISIaAg==
+=0NQ6
+-----END PGP MESSAGE-----
diff --git a/tests/test-pgp.c b/tests/test-pgp.c
index bc22f28..47e8d29 100644
--- a/tests/test-pgp.c
+++ b/tests/test-pgp.c
@@ -332,8 +332,8 @@ import_key (GMimeCryptoContext *ctx, const char *path)
 static void
 pump_data_through_filter (GMimeFilter *filter, const char *path, GMimeStream *ostream)
 {
+       GMimeStream *onebyte, *filtered, *stream;
        GMimeFilter *unix2dos, *dos2unix;
-       GMimeStream *filtered, *stream;
        
        filtered = g_mime_stream_filter_new (ostream);
        
@@ -349,10 +349,13 @@ pump_data_through_filter (GMimeFilter *filter, const char *path, GMimeStream *os
        g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, dos2unix);
        g_object_unref (dos2unix);
        
-       stream = g_mime_stream_fs_open (path, O_RDONLY, 0644, NULL);
-       g_mime_stream_write_to_stream (stream, filtered);
-       g_mime_stream_flush (filtered);
+       onebyte = test_stream_onebyte_new (filtered);
        g_object_unref (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);
 }
 
@@ -627,6 +630,20 @@ int main (int argc, char **argv)
                testsuite_check_failed ("%s failed: %s", what, ex->message);
        } finally;
        
+       g_mime_filter_reset ((GMimeFilter *) filter);
+       
+       what = "GMimeFilterOpenPGP::encrypted message block";
+       testsuite_check ("%s", what);
+       try {
+               key = g_build_filename (datadir, "encrypted-message.txt", NULL);
+               test_openpgp_filter (filter, key, GMIME_OPENPGP_DATA_ENCRYPTED, 165, 1084);
+               g_free (key);
+               
+               testsuite_check_passed ();
+       } catch (ex) {
+               testsuite_check_failed ("%s failed: %s", what, ex->message);
+       } finally;
+       
        g_object_unref (filter);
        
        testsuite_end ();
diff --git a/tests/testsuite.c b/tests/testsuite.c
index 41e0aa6..cfdfae1 100644
--- a/tests/testsuite.c
+++ b/tests/testsuite.c
@@ -502,6 +502,203 @@ testsuite_destroy_gpghome (void)
 }
 
 
+static void test_stream_onebyte_class_init (TestStreamOneByteClass *klass);
+static void test_stream_onebyte_init (TestStreamOneByte *stream, TestStreamOneByteClass *klass);
+static void test_stream_onebyte_finalize (GObject *object);
+
+static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len);
+static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len);
+static int stream_flush (GMimeStream *stream);
+static int stream_close (GMimeStream *stream);
+static gboolean stream_eos (GMimeStream *stream);
+static int stream_reset (GMimeStream *stream);
+static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence);
+static gint64 stream_tell (GMimeStream *stream);
+static gint64 stream_length (GMimeStream *stream);
+static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end);
+
+static GMimeStreamClass *parent_class = NULL;
+
+GType
+test_stream_onebyte_get_type (void)
+{
+       static GType type = 0;
+       
+       if (!type) {
+               static const GTypeInfo info = {
+                       sizeof (TestStreamOneByteClass),
+                       NULL, /* base_class_init */
+                       NULL, /* base_class_finalize */
+                       (GClassInitFunc) test_stream_onebyte_class_init,
+                       NULL, /* class_finalize */
+                       NULL, /* class_data */
+                       sizeof (TestStreamOneByte),
+                       0,    /* n_preallocs */
+                       (GInstanceInitFunc) test_stream_onebyte_init,
+               };
+               
+               type = g_type_register_static (GMIME_TYPE_STREAM, "TestStreamOneByte", &info, 0);
+       }
+       
+       return type;
+}
+
+
+static void
+test_stream_onebyte_class_init (TestStreamOneByteClass *klass)
+{
+       GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass);
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       
+       parent_class = g_type_class_ref (GMIME_TYPE_STREAM);
+       
+       object_class->finalize = test_stream_onebyte_finalize;
+       
+       stream_class->read = stream_read;
+       stream_class->write = stream_write;
+       stream_class->flush = stream_flush;
+       stream_class->close = stream_close;
+       stream_class->eos = stream_eos;
+       stream_class->reset = stream_reset;
+       stream_class->seek = stream_seek;
+       stream_class->tell = stream_tell;
+       stream_class->length = stream_length;
+       stream_class->substream = stream_substream;
+}
+
+static void
+test_stream_onebyte_init (TestStreamOneByte *stream, TestStreamOneByteClass *klass)
+{
+       stream->source = NULL;
+}
+
+static void
+test_stream_onebyte_finalize (GObject *object)
+{
+       TestStreamOneByte *stream = (TestStreamOneByte *) object;
+       
+       if (stream->source)
+               g_object_unref (stream->source);
+       
+       G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+static ssize_t
+stream_read (GMimeStream *stream, char *buf, size_t len)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_read (test->source, buf, MIN (len, 1));
+}
+
+static ssize_t
+stream_write (GMimeStream *stream, const char *buf, size_t len)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       size_t nwritten = 0;
+       
+       while (nwritten < len) {
+               if (g_mime_stream_write (test->source, buf + nwritten, 1) > 0)
+                       nwritten++;
+       }
+       
+       return (ssize_t) nwritten;
+}
+
+static int
+stream_flush (GMimeStream *stream)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_flush (test->source);
+}
+
+static int
+stream_close (GMimeStream *stream)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_close (test->source);
+}
+
+static gboolean
+stream_eos (GMimeStream *stream)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_eos (test->source);
+}
+
+static int
+stream_reset (GMimeStream *stream)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_reset (test->source);
+}
+
+static gint64
+stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_seek (test->source, offset, whence);
+}
+
+static gint64
+stream_tell (GMimeStream *stream)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_tell (test->source);
+}
+
+static gint64
+stream_length (GMimeStream *stream)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_length (test->source);
+}
+
+static GMimeStream *
+stream_substream (GMimeStream *stream, gint64 start, gint64 end)
+{
+       TestStreamOneByte *test = (TestStreamOneByte *) stream;
+       
+       return g_mime_stream_substream (test->source, start, end);
+}
+
+
+/**
+ * test_stream_onebyte_new:
+ * @source: source stream
+ *
+ * Creates a new TestStreamOneByte object.
+ *
+ * Returns: a new test stream with source @source.
+ **/
+GMimeStream *
+test_stream_onebyte_new (GMimeStream *source)
+{
+       TestStreamOneByte *test;
+       
+       g_return_val_if_fail (GMIME_IS_STREAM (source), NULL);
+       
+       test = g_object_new (TEST_TYPE_STREAM_ONEBYTE, NULL);
+       
+       test->source = source;
+       g_object_ref (source);
+       
+       g_mime_stream_construct ((GMimeStream *) test,
+                                source->bound_start,
+                                source->bound_end);
+       
+       return (GMimeStream *) test;
+}
+
+
 #ifdef BUILD
 int main (int argc, char **argv)
 {
diff --git a/tests/testsuite.h b/tests/testsuite.h
index dad8420..157824f 100644
--- a/tests/testsuite.h
+++ b/tests/testsuite.h
@@ -26,6 +26,8 @@
 #include <stdarg.h>
 #include <setjmp.h>
 
+#include <gmime/gmime.h>
+
 G_BEGIN_DECLS
 
 void testsuite_init (int argc, char **argv);
@@ -78,6 +80,30 @@ void g_throw (Exception *ex) G_GNUC_NORETURN;
 #define throw(e) g_throw (e)
 #define finally } if (__env.ex != NULL) exception_free (__env.ex); }
 
+
+/* A test stream that reads/writes 1 byte at a time */
+#define TEST_TYPE_STREAM_ONEBYTE            (test_stream_onebyte_get_type ())
+#define TEST_STREAM_ONEBYTE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_STREAM_ONEBYTE, 
TestStreamOneByte))
+#define TEST_STREAM_ONEBYTE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_STREAM_ONEBYTE, 
TestStreamOneByteClass))
+#define TEST_IS_STREAM_ONEBYTE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_STREAM_ONEBYTE))
+#define TEST_IS_STREAM_ONEBYTE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_STREAM_ONEBYTE))
+#define TEST_STREAM_ONEBYTE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_STREAM_ONEBYTE, 
TestStreamOneByteClass))
+
+typedef struct _TestStreamOneByte TestStreamOneByte;
+typedef struct _TestStreamOneByteClass TestStreamOneByteClass;
+
+struct _TestStreamOneByte {
+       GMimeStream parent_object;
+       GMimeStream *source;
+};
+
+struct _TestStreamOneByteClass {
+       GMimeStreamClass parent_class;
+};
+
+GType test_stream_onebyte_get_type (void);
+GMimeStream *test_stream_onebyte_new (GMimeStream *source);
+
 G_END_DECLS
 
 #endif /* __TEST_SUITE_H__ */


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