MimeParser Rewrite: add test to revalidate the results of the rewrite to the stable...
authorWilfried Goesgens <dothebart@citadel.org>
Tue, 14 Dec 2010 00:48:14 +0000 (01:48 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Tue, 14 Dec 2010 00:48:14 +0000 (01:48 +0100)
libcitadel/tests/.gitignore
libcitadel/tests/Makefile.in
libcitadel/tests/mimeparser_test.c [new file with mode: 0644]

index c710c42bd1bda706d1335686cf3ab81746aaa569..04f444e727c51992bb6907527e9ff05b05cfccfb 100644 (file)
@@ -3,3 +3,4 @@ hashlist_test
 stringbuf_IO_test
 stringbuf_conversion_test
 stringbuf_test
+mimeparser_test
index db30bcad58d12c047dad3c53a853188357b69257..1c602c090a356f892f88ec42b7670b35a39d872e 100644 (file)
@@ -1,5 +1,3 @@
-# $Id: Makefile.in 7752 2009-08-29 10:37:43Z dothebart $
-
 AUTOCONF=@AUTOCONF@
 CC=@CC@
 CFLAGS=@CFLAGS@
@@ -16,7 +14,7 @@ top_builddir=`pwd`
 
 # End of configuration section
 
-TARGETS=stringbuf_test stringbuf_IO_test stringbuf_conversion_test hashlist_test
+TARGETS=stringbuf_test stringbuf_IO_test stringbuf_conversion_test hashlist_test mimeparser_test
 all: $(TARGETS)
 
 
@@ -54,6 +52,12 @@ hashlist_test:       $(LIBOBJS) hashlist_test.o
        ../.libs/libcitadel.a \
        -o hashlist_test 
 
+mimeparser_test:       $(LIBOBJS) mimeparser_test.o 
+       $(CC) $(LDFLAGS) $(LIBOBJS) $(LIBS) \
+       mimeparser_test.o \
+       ../.libs/libcitadel.a \
+       -o mimeparser_test 
+
 .c.o:
        $(CC) $(CFLAGS) $(DEFS) -c  $<
 
diff --git a/libcitadel/tests/mimeparser_test.c b/libcitadel/tests/mimeparser_test.c
new file mode 100644 (file)
index 0000000..0e9c110
--- /dev/null
@@ -0,0 +1,256 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <errno.h>
+
+#include <fcntl.h>
+
+#include <unistd.h>
+#include <stddef.h>
+
+
+#include "../lib/libcitadel.h"
+
+/* shamelesly copied from msgbase.h */
+struct ma_info {
+       int is_ma;              /* Set to 1 if we are using this stuff */
+       int freeze;             /* Freeze the replacement chain because we're
+                                * digging through a subsection */
+       int did_print;          /* One alternative has been displayed */
+       char chosen_part[128];  /* Which part of a m/a did we choose? */
+       const char *printme;
+       int chosen_pref;        /* Chosen part preference level (lower is better) */
+       int use_fo_hooks;       /* Use fixed output hooks */
+       int dont_decode;        /* should we call the decoder or not? */
+};
+
+
+/*
+ * Callback function for mime parser that simply lists the part
+ */
+static void list_this_part(char *name, 
+                          char *filename, 
+                          char *partnum, 
+                          char *disp,
+                          void *content, 
+                          char *cbtype, 
+                          char *cbcharset, 
+                          size_t length, 
+                          char *encoding,
+                          char *cbid, 
+                          void *cbuserdata)
+{
+       struct ma_info *ma;
+       
+       ma = (struct ma_info *)cbuserdata;
+       if (ma->is_ma == 0) {
+               printf("part=%s|%s|%s|%s|%s|%ld|%s|%s\n",
+                       name, 
+                       filename, 
+                       partnum, 
+                       disp, 
+                       cbtype, 
+                       (long)length, 
+                       cbid, 
+                       cbcharset);
+       }
+}
+
+/* 
+ * Callback function for multipart prefix
+ */
+static void list_this_pref(char *name, 
+                          char *filename, 
+                          char *partnum, 
+                          char *disp,
+                          void *content, 
+                          char *cbtype, 
+                          char *cbcharset, 
+                          size_t length, 
+                          char *encoding,
+                          char *cbid, 
+                          void *cbuserdata)
+{
+       struct ma_info *ma;
+       
+       ma = (struct ma_info *)cbuserdata;
+       if (!strcasecmp(cbtype, "multipart/alternative")) {
+               ++ma->is_ma;
+       }
+
+       if (ma->is_ma == 0) {
+               printf("pref=%s|%s\n", partnum, cbtype);
+       }
+}
+
+/* 
+ * Callback function for multipart sufffix
+ */
+static void list_this_suff(char *name, 
+                          char *filename, 
+                          char *partnum, 
+                          char *disp,
+                          void *content, 
+                          char *cbtype, 
+                          char *cbcharset, 
+                          size_t length, 
+                          char *encoding,
+                          char *cbid, 
+                          void *cbuserdata)
+{
+       struct ma_info *ma;
+       
+       ma = (struct ma_info *)cbuserdata;
+       if (ma->is_ma == 0) {
+               printf("suff=%s|%s\n", partnum, cbtype);
+       }
+       if (!strcasecmp(cbtype, "multipart/alternative")) {
+               --ma->is_ma;
+       }
+}
+
+
+/*
+ * Callback function for mime parser that opens a section for downloading
+ */
+static void mime_download(char *name, 
+                         char *filename, 
+                         char *partnum, 
+                         char *disp,
+                         void *content, 
+                         char *cbtype, 
+                         char *cbcharset, 
+                         size_t length,
+                         char *encoding, 
+                         char *cbid, 
+                         void *cbuserdata)
+{
+       int rc = 0;
+
+       /* Silently go away if there's already a download open. */
+
+       struct ma_info *ma;
+       
+       ma = (struct ma_info *)cbuserdata;
+
+       if ((!IsEmptyStr(partnum) && (!strcasecmp(ma->printme, partnum)))) {
+                       rc = write(STDOUT_FILENO, content, length);
+       }
+}
+
+
+
+/*
+ * Callback function for mime parser that outputs a section all at once.
+ * We can specify the desired section by part number *or* content-id.
+ * /
+void mime_spew_section(char *name, 
+                      char *filename, 
+                      char *partnum, 
+                      char *disp,
+                      void *content, 
+                      char *cbtype, 
+                      char *cbcharset, 
+                      size_t length,
+                      char *encoding, 
+                      char *cbid, 
+                      void *cbuserdata)
+{
+       int *found_it = (int *)cbuserdata;
+
+       if (
+               (!IsEmptyStr(partnum) && (!strcasecmp(CC->download_desired_section, partnum)))
+       ||      (!IsEmptyStr(cbid) && (!strcasecmp(CC->download_desired_section, cbid)))
+       ) {
+               *found_it = 1;
+               printf("%d %d|-1|%s|%s|%s\n",
+                       BINARY_FOLLOWS,
+                       (int)length,
+                       filename,
+                       cbtype,
+                       cbcharset
+               );
+               fwrite(STDOUT, content, length);
+       }
+}
+
+*/
+
+
+
+
+int main(int argc, char* argv[])
+{
+       char a;
+       int fd;
+       char *filename = NULL;
+       struct stat statbuf;
+       const char *Err;
+
+       StrBuf *MimeBuf;
+       long MimeLen;
+       char *MimeStr;
+       struct ma_info ma;
+       int do_proto = 0;
+       int dont_decode = 1;
+
+       setvbuf(stdout, NULL, _IONBF, 0);
+       memset(&ma, 0, sizeof(struct ma_info));
+
+       while ((a = getopt(argc, argv, "dpf:P:")) != EOF)
+       {
+               switch (a) {
+               case 'f':
+                       filename = optarg;
+                       break;
+               case 'p':
+                       do_proto = 1;
+                       break;
+               case 'd':
+                       dont_decode = 0;
+                       break;
+               case 'P':
+                       ma.printme = optarg;
+               }
+       }
+       StartLibCitadel(8);
+
+       if (filename == NULL) {
+               printf("Filename requried! -f\n");
+               return 1;
+       }
+       fd = open(filename, 0);
+       if (fd < 0) {
+               printf("Error opening file [%s] %d [%s]\n", filename, errno, strerror(errno));
+               return 1;
+       }
+       if (fstat(fd, &statbuf) == -1) {
+               printf("Error stating file [%s] %d [%s]\n", filename, errno, strerror(errno));
+               return 1;
+       }
+       MimeBuf = NewStrBufPlain(NULL, statbuf.st_size + 1);
+       if (StrBufReadBLOB(MimeBuf, &fd, 1, statbuf.st_size, &Err) < 0) {
+               printf("Error reading file [%s] %d [%s] [%s]\n", filename, errno, strerror(errno), Err);
+               FreeStrBuf(&MimeBuf);
+               return 1;
+       }
+       MimeLen = StrLength(MimeBuf);
+       MimeStr = SmashStrBuf(&MimeBuf);
+
+       if (ma.printme == NULL)
+               mime_parser(MimeStr, MimeStr + MimeLen,
+                           (do_proto ? *list_this_part : NULL),
+                           (do_proto ? *list_this_pref : NULL),
+                           (do_proto ? *list_this_suff : NULL),
+                           (void *)&ma, dont_decode);
+       else 
+               mime_parser(MimeStr, MimeStr + MimeLen,
+                           *mime_download, NULL, NULL, (void *)&ma, dont_decode);
+
+       free(MimeStr);
+       return 0;
+}