libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 8ac48d575a488bb8e20494b285b611656dc97787
parent 5c77572e83847f332128e63fedeeb935d1e1b825
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun,  5 Aug 2012 14:33:32 +0000

expanding IPC test to cover running with multiple plugins

Diffstat:
Msrc/main/Makefile.am | 11++++++++++-
Asrc/main/test2_extractor.c | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/main/test_ipc.c | 5+++++
3 files changed, 160 insertions(+), 1 deletion(-)

diff --git a/src/main/Makefile.am b/src/main/Makefile.am @@ -74,7 +74,8 @@ TESTS_ENVIRONMENT = testdatadir=$(top_srcdir)/test TESTS_ENVIRONMENT += bindir=${bindir} tmp_LTLIBRARIES = \ - libextractor_test.la + libextractor_test.la \ + libextractor_test2.la libextractor_test_la_SOURCES = \ test_extractor.c @@ -83,6 +84,14 @@ libextractor_test_la_LDFLAGS = \ libextractor_test_la_LIBADD = \ $(LE_LIBINTL) +libextractor_test2_la_SOURCES = \ + test2_extractor.c +libextractor_test2_la_LDFLAGS = \ + $(PLUGINFLAGS) +libextractor_test2_la_LIBADD = \ + $(LE_LIBINTL) + + check_PROGRAMS = \ test_trivial \ test_plugin_loading \ diff --git a/src/main/test2_extractor.c b/src/main/test2_extractor.c @@ -0,0 +1,145 @@ +/* + This file is part of libextractor. + (C) 2012 Vidyut Samanta and Christian Grothoff + + libextractor 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 3, or (at your + option) any later version. + + libextractor 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 libextractor; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + */ +/** + * @file main/test2_extractor.c + * @brief plugin for testing GNU libextractor + * Data file (or buffer) for this test must be 150 * 1024 bytes long, + * first 4 bytes must be "test", all other bytes should be equal to + * <FILE_OFFSET> % 256. The test client must return 0 after seeing + * "Hello World!" metadata, and return 1 after seeing "Goodbye!" + * metadata. + * @author Christian Grothoff + */ +#include "platform.h" +#include "extractor.h" +#include <string.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdlib.h> + + + +/** + * Signature of the extract method that each plugin + * must provide. + * + * @param ec extraction context provided to the plugin + */ +void +EXTRACTOR_test2_extract_method (struct EXTRACTOR_ExtractContext *ec) +{ + void *dp; + + if ((NULL == ec->config) || (0 != strcmp (ec->config, "test2"))) + return; /* only run in test mode */ + if (4 != ec->read (ec->cls, &dp, 4)) + { + fprintf (stderr, "Reading at offset 0 failed\n"); + ABORT (); + } + if (0 != strncmp ("test", dp, 4)) + { + fprintf (stderr, "Unexpected data at offset 0\n"); + ABORT (); + } + if ( (1024 * 150 != ec->get_size (ec->cls)) && + (UINT64_MAX != ec->get_size (ec->cls)) ) + { + fprintf (stderr, "Unexpected file size returned (expected 150k)\n"); + ABORT (); + } + if (1024 * 100 + 4 != ec->seek (ec->cls, 1024 * 100 + 4, SEEK_SET)) + { + fprintf (stderr, "Failure to seek (SEEK_SET)\n"); + ABORT (); + } + if (1 != ec->read (ec->cls, &dp, 1)) + { + fprintf (stderr, "Failure to read at 100k + 4\n"); + ABORT (); + } + if ((1024 * 100 + 4) % 256 != * (unsigned char *) dp) + { + fprintf (stderr, "Unexpected data at offset 100k + 4\n"); + ABORT (); + } + if (((1024 * 100 + 4) + 1 - (1024 * 50 + 7)) != + ec->seek (ec->cls, - (1024 * 50 + 7), SEEK_CUR)) + { + fprintf (stderr, "Failure to seek (SEEK_SET)\n"); + ABORT (); + } + if (1 != ec->read (ec->cls, &dp, 1)) + { + fprintf (stderr, "Failure to read at 50k - 3\n"); + ABORT (); + } + if (((1024 * 100 + 4) + 1 - (1024 * 50 + 7)) % 256 != * (unsigned char *) dp) + { + fprintf (stderr, "Unexpected data at offset 100k - 3\n"); + ABORT (); + } + if (1024 * 150 != ec->seek (ec->cls, 0, SEEK_END)) + { + fprintf (stderr, "Failure to seek (SEEK_END)\n"); + ABORT (); + } + if (0 != ec->read (ec->cls, &dp, 1)) + { + fprintf (stderr, "Failed to receive EOF at 150k\n"); + ABORT (); + } + if (1024 * 150 - 2 != ec->seek (ec->cls, -2, SEEK_END)) + { + fprintf (stderr, "Failure to seek (SEEK_END - 2)\n"); + ABORT (); + } + if (1 != ec->read (ec->cls, &dp, 1)) + { + fprintf (stderr, "Failure to read at 150k - 3\n"); + ABORT (); + } + if ((1024 * 150 - 2) % 256 != * (unsigned char *) dp) + { + fprintf (stderr, "Unexpected data at offset 150k - 3\n"); + ABORT (); + } + if (0 != ec->proc (ec->cls, "test2", EXTRACTOR_METATYPE_COMMENT, + EXTRACTOR_METAFORMAT_UTF8, "<no mime>", "Hello world!", + strlen ("Hello world!") + 1)) + { + fprintf (stderr, "Unexpected return value from 'proc'\n"); + ABORT (); + } + /* The test assumes that client orders us to stop extraction + * after seeing "Goodbye!". + */ + if (1 != ec->proc (ec->cls, "test2", EXTRACTOR_METATYPE_COMMENT, + EXTRACTOR_METAFORMAT_UTF8, "<no mime>", "Goodbye!", + strlen ("Goodbye!") + 1)) + { + fprintf (stderr, "Unexpected return value from 'proc'\n"); + ABORT (); + } +} + +/* end of test2_extractor.c */ diff --git a/src/main/test_ipc.c b/src/main/test_ipc.c @@ -63,6 +63,9 @@ process_replies (void *cls, ret = 3; return 1; } + if (0 == strcmp (plugin_name, + "test2")) + return 0; /* ignore 'test2' plugins */ if (0 != strcmp (plugin_name, "test")) { @@ -148,6 +151,8 @@ main (int argc, char *argv[]) strerror (errno)); pl = EXTRACTOR_plugin_add_config (NULL, "test(test)", EXTRACTOR_OPTION_DEFAULT_POLICY); + pl = EXTRACTOR_plugin_add_config (pl, "test2(test2)", + EXTRACTOR_OPTION_DEFAULT_POLICY); if (NULL == pl) { fprintf (stderr, "failed to load test plugin\n");