From d5f7afdded91f0e36f4870a395bf6a74052eef6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=B6r=C3=B6k=20Edvin?= Date: Wed, 15 Jun 2011 12:21:50 +0300 Subject: [PATCH] testcase for cl_scan APIs (partially ported from fmapify branch) --- unit_tests/Makefile.am | 6 +- unit_tests/Makefile.in | 6 +- unit_tests/check_clamav.c | 170 +++++++++++++++++++++++++++++++++++- unit_tests/input/clamav.hdb | 1 + 4 files changed, 179 insertions(+), 4 deletions(-) create mode 100644 unit_tests/input/clamav.hdb diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index 6ff402461..6d5fd513d 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -33,7 +33,7 @@ check_clamav_SOURCES = check_clamav.c checks.h checks_common.h $(top_builddir)/l check_jsnorm.c check_str.c check_regex.c\ check_disasm.c check_uniq.c check_matchers.c\ check_htmlnorm.c check_bytecode.c -check_clamav_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\" +check_clamav_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\" -DOBJDIR=\"$(abs_builddir)\" check_clamav_LDADD = $(top_builddir)/libclamav/libclamav.la @THREAD_LIBS@ @CHECK_LIBS@ check_clamd_SOURCES = check_clamd.c checks_common.h check_clamd_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\" -DBUILDDIR=\"$(abs_builddir)\" @@ -43,9 +43,13 @@ check_clamd_SOURCES = check_clamav_skip.c check_clamav_SOURCES = check_clamav_skip.c endif +check_clamav.c: $(top_builddir)/test/clam.exe clamav.hdb check_clamd.sh: $(top_builddir)/test/clam.exe check_clamd check_clamscan.sh: $(top_builddir)/test/clam.exe +clamav.hdb: input/clamav.hdb + cp $< $@ + $(top_builddir)/test/clam.exe: (cd $(top_builddir)/test && $(MAKE)) diff --git a/unit_tests/Makefile.in b/unit_tests/Makefile.in index c6defec47..8aecd5777 100644 --- a/unit_tests/Makefile.in +++ b/unit_tests/Makefile.in @@ -387,7 +387,7 @@ AM_CFLAGS = @WERR_CFLAGS@ @HAVE_LIBCHECK_TRUE@ check_disasm.c check_uniq.c check_matchers.c\ @HAVE_LIBCHECK_TRUE@ check_htmlnorm.c check_bytecode.c -@HAVE_LIBCHECK_TRUE@check_clamav_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\" +@HAVE_LIBCHECK_TRUE@check_clamav_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\" -DOBJDIR=\"$(abs_builddir)\" @HAVE_LIBCHECK_TRUE@check_clamav_LDADD = $(top_builddir)/libclamav/libclamav.la @THREAD_LIBS@ @CHECK_LIBS@ @HAVE_LIBCHECK_FALSE@check_clamd_SOURCES = check_clamav_skip.c @HAVE_LIBCHECK_TRUE@check_clamd_SOURCES = check_clamd.c checks_common.h @@ -1097,9 +1097,13 @@ check10_clamd_hg.sh: $(FILES) $(FILES) : cat $(SPLIT_DIR)/split.$@aa $(SPLIT_DIR)/split.$@ab > $@ +check_clamav.c: $(top_builddir)/test/clam.exe clamav.hdb check_clamd.sh: $(top_builddir)/test/clam.exe check_clamd check_clamscan.sh: $(top_builddir)/test/clam.exe +clamav.hdb: input/clamav.hdb + cp $< $@ + $(top_builddir)/test/clam.exe: (cd $(top_builddir)/test && $(MAKE)) diff --git a/unit_tests/check_clamav.c b/unit_tests/check_clamav.c index 55e9341f8..1f31b8f99 100644 --- a/unit_tests/check_clamav.c +++ b/unit_tests/check_clamav.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include "../libclamav/clamav.h" #include "../libclamav/others.h" #include "../libclamav/matcher.h" @@ -143,12 +145,90 @@ END_TEST START_TEST (test_cl_cvdparse) END_TEST +static int get_test_file(int i, char *file, unsigned fsize, unsigned long *size); +static struct cl_engine *g_engine; + /* int cl_scandesc(int desc, const char **virname, unsigned long int *scanned, const struct cl_engine *engine, const struct cl_limits *limits, unsigned int options) */ START_TEST (test_cl_scandesc) +{ + const char *virname = NULL; + char file[256]; + unsigned long size; + unsigned long int scanned = 0; + int ret; + + int fd = get_test_file(_i, file, sizeof(file), &size); + cli_dbgmsg("scanning (scandesc) %s\n", file); + ret = cl_scandesc(fd, &virname, &scanned, g_engine, CL_SCAN_STDOPT); + cli_dbgmsg("scan end (scandesc) %s\n", file); + + fail_unless_fmt(ret == CL_VIRUS, "cl_scandesc failed for %s: %s", file, cl_strerror(ret)); + fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname); + close(fd); +} END_TEST /* int cl_scanfile(const char *filename, const char **virname, unsigned long int *scanned, const struct cl_engine *engine, const struct cl_limits *limits, unsigned int options) */ START_TEST (test_cl_scanfile) +{ + const char *virname = NULL; + char file[256]; + unsigned long size; + unsigned long int scanned = 0; + int ret; + + int fd = get_test_file(_i, file, sizeof(file), &size); + close(fd); + + cli_dbgmsg("scanning (scanfile) %s\n", file); + ret = cl_scanfile(file, &virname, &scanned, g_engine, CL_SCAN_STDOPT); + cli_dbgmsg("scan end (scanfile) %s\n", file); + + fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile failed for %s: %s", file, cl_strerror(ret)); + fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname); +} +END_TEST + +START_TEST (test_cl_scanfile_callback) +{ + const char *virname = NULL; + char file[256]; + unsigned long size; + unsigned long int scanned = 0; + int ret; + + int fd = get_test_file(_i, file, sizeof(file), &size); + close(fd); + + cli_dbgmsg("scanning (scanfile_cb) %s\n", file); + /* TODO: test callbacks */ + ret = cl_scanfile_callback(file, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL); + cli_dbgmsg("scan end (scanfile_cb) %s\n", file); + + fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile failed for %s: %s", file, cl_strerror(ret)); + fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname); +} +END_TEST + +START_TEST (test_cl_scandesc_callback) +{ + const char *virname = NULL; + char file[256]; + unsigned long size; + unsigned long int scanned = 0; + int ret; + + int fd = get_test_file(_i, file, sizeof(file), &size); + + cli_dbgmsg("scanning (scandesc_cb) %s\n", file); + /* TODO: test callbacks */ + ret = cl_scandesc_callback(fd, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL); + cli_dbgmsg("scan end (scandesc_cb) %s\n", file); + + fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile failed for %s: %s", file, cl_strerror(ret)); + fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname); + close(fd); +} END_TEST /* int cl_load(const char *path, struct cl_engine **engine, unsigned int *signo, unsigned int options) */ @@ -175,10 +255,90 @@ END_TEST START_TEST (test_cl_strerror) END_TEST +static char **testfiles = NULL; +static unsigned testfiles_n = 0; +static const expected_testfiles = 46; + +static void init_testfiles(void) +{ + struct dirent *dirent; + unsigned i = 0; + + DIR *d = opendir(OBJDIR"/../test"); + fail_unless(!!d, "opendir"); + if (!d) + return; + testfiles = NULL; + testfiles_n = 0; + while ((dirent = readdir(d))) { + if (strncmp(dirent->d_name, "clam", 4)) + continue; + i++; + testfiles = cli_realloc(testfiles, i*sizeof(*testfiles)); + fail_unless(!!testfiles, "cli_realloc"); + testfiles[i-1] = strdup(dirent->d_name); + } + testfiles_n = i; + fail_unless_fmt(testfiles_n == expected_testfiles, "testfiles: %d != %d", testfiles_n, expected_testfiles); + + closedir(d); +} + +static void free_testfiles(void) +{ + unsigned i; + for (i=0;i 0, "open"); + fail_unless(fstat(fd, &st) == 0, "fstat"); + *size = st.st_size; + return fd; +} + static Suite *test_cl_suite(void) { Suite *s = suite_create("cl_api"); TCase *tc_cl = tcase_create("cl_dup"); + TCase *tc_cl_scan = tcase_create("cl_scan"); suite_add_tcase (s, tc_cl); tcase_add_test(tc_cl, test_cl_free); @@ -192,8 +352,6 @@ static Suite *test_cl_suite(void) tcase_add_test(tc_cl, test_cl_retflevel); tcase_add_test(tc_cl, test_cl_cvdhead); tcase_add_test(tc_cl, test_cl_cvdparse); - tcase_add_test(tc_cl, test_cl_scandesc); - tcase_add_test(tc_cl, test_cl_scanfile); tcase_add_test(tc_cl, test_cl_load); tcase_add_test(tc_cl, test_cl_cvdverify); tcase_add_test(tc_cl, test_cl_statinidir); @@ -201,6 +359,13 @@ static Suite *test_cl_suite(void) tcase_add_test(tc_cl, test_cl_settempdir); tcase_add_test(tc_cl, test_cl_strerror); + suite_add_tcase(s, tc_cl_scan); + tcase_add_checked_fixture (tc_cl_scan, engine_setup, engine_teardown); + tcase_add_loop_test(tc_cl_scan, test_cl_scandesc, 0, expected_testfiles); + tcase_add_loop_test(tc_cl_scan, test_cl_scanfile, 0, expected_testfiles); + tcase_add_loop_test(tc_cl_scan, test_cl_scandesc_callback, 0, expected_testfiles); + tcase_add_loop_test(tc_cl_scan, test_cl_scanfile_callback, 0, expected_testfiles); + return s; } @@ -544,6 +709,7 @@ int main(void) srunner_add_suite(sr, test_htmlnorm_suite()); srunner_add_suite(sr, test_bytecode_suite()); + srunner_set_log(sr, "test.log"); if(freopen("test-stderr.log","w+",stderr) == NULL) { fputs("Unable to redirect stderr!\n",stderr); diff --git a/unit_tests/input/clamav.hdb b/unit_tests/input/clamav.hdb new file mode 100644 index 000000000..6336ec695 --- /dev/null +++ b/unit_tests/input/clamav.hdb @@ -0,0 +1 @@ +aa15bcf478d165efd2065190eb473bcb:544:ClamAV-Test-File