Browse code

add some unit tests for the new clamd protocol

git-svn: trunk@4757

Török Edvin authored on 2009/02/13 02:25:50
Showing 5 changed files
... ...
@@ -1,3 +1,9 @@
1
+Thu Feb 12 19:49:06 EET 2009 (edwin)
2
+------------------------------------
3
+ * unit_tests/Makefile.am, unit_tests/Makefile.in,
4
+ unit_tests/check_clamd.sh, unit_tests/checks.h: add some unit tests
5
+ for the new clamd protocol
6
+
1 7
 Thu Feb 12 18:30:29 CET 2009 (acab)
2 8
 -----------------------------------
3 9
  * shared, clamdscan, clamscan, doc, build system:
... ...
@@ -15,21 +15,25 @@ else
15 15
 TESTS_ENVIRONMENT += export unrar_disabled=1;
16 16
 endif
17 17
 TESTS = $(programs) $(scripts)
18
-check_PROGRAMS = $(programs)
18
+check_PROGRAMS = $(programs) check_clamd
19 19
 check_SCRIPTS = $(scripts)
20 20
 
21 21
 if HAVE_LIBCHECK
22
-check_clamav_SOURCES = check_clamav.c checks.h $(top_builddir)/libclamav/clamav.h\
22
+check_clamav_SOURCES = check_clamav.c checks.h checks_common.h $(top_builddir)/libclamav/clamav.h\
23 23
 		       check_jsnorm.c check_str.c check_regex.c\
24 24
 		       check_disasm.c check_uniq.c check_matchers.c\
25 25
 		       check_htmlnorm.c
26 26
 check_clamav_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\"
27 27
 check_clamav_LDADD = $(top_builddir)/libclamav/libclamav.la @THREAD_LIBS@ @CHECK_LIBS@
28
+check_clamd_SOURCES = check_clamd.c checks_common.h
29
+check_clamd_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\" -DBUILDDIR=\"$(abs_builddir)\"
30
+check_clamd_LDADD = @CHECK_LIBS@ @CLAMD_LIBS@
28 31
 else
32
+check_clamd_SOURCES = check_clamav_skip.c
29 33
 check_clamav_SOURCES = check_clamav_skip.c
30 34
 endif
31 35
 
32
-check_clamd.sh: $(top_builddir)/test/clam.exe
36
+check_clamd.sh: $(top_builddir)/test/clam.exe check_clamd
33 37
 check_clamscan.sh: $(top_builddir)/test/clam.exe
34 38
 
35 39
 $(top_builddir)/test/clam.exe:
... ...
@@ -34,7 +34,7 @@ host_triplet = @host@
34 34
 target_triplet = @target@
35 35
 @ENABLE_UNRAR_FALSE@am__append_1 = export unrar_disabled=1;
36 36
 TESTS = $(am__EXEEXT_1) $(scripts)
37
-check_PROGRAMS = $(am__EXEEXT_1)
37
+check_PROGRAMS = $(am__EXEEXT_1) check_clamd$(EXEEXT)
38 38
 subdir = unit_tests
39 39
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
40 40
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
... ...
@@ -53,9 +53,9 @@ CONFIG_HEADER = $(top_builddir)/clamav-config.h
53 53
 CONFIG_CLEAN_FILES =
54 54
 am__EXEEXT_1 = check_clamav$(EXEEXT)
55 55
 am__check_clamav_SOURCES_DIST = check_clamav_skip.c check_clamav.c \
56
-	checks.h $(top_builddir)/libclamav/clamav.h check_jsnorm.c \
57
-	check_str.c check_regex.c check_disasm.c check_uniq.c \
58
-	check_matchers.c check_htmlnorm.c
56
+	checks.h checks_common.h $(top_builddir)/libclamav/clamav.h \
57
+	check_jsnorm.c check_str.c check_regex.c check_disasm.c \
58
+	check_uniq.c check_matchers.c check_htmlnorm.c
59 59
 @HAVE_LIBCHECK_FALSE@am_check_clamav_OBJECTS =  \
60 60
 @HAVE_LIBCHECK_FALSE@	check_clamav-check_clamav_skip.$(OBJEXT)
61 61
 @HAVE_LIBCHECK_TRUE@am_check_clamav_OBJECTS =  \
... ...
@@ -70,6 +70,14 @@ am__check_clamav_SOURCES_DIST = check_clamav_skip.c check_clamav.c \
70 70
 check_clamav_OBJECTS = $(am_check_clamav_OBJECTS)
71 71
 @HAVE_LIBCHECK_TRUE@check_clamav_DEPENDENCIES =  \
72 72
 @HAVE_LIBCHECK_TRUE@	$(top_builddir)/libclamav/libclamav.la
73
+am__check_clamd_SOURCES_DIST = check_clamav_skip.c check_clamd.c \
74
+	checks_common.h
75
+@HAVE_LIBCHECK_FALSE@am_check_clamd_OBJECTS =  \
76
+@HAVE_LIBCHECK_FALSE@	check_clamd-check_clamav_skip.$(OBJEXT)
77
+@HAVE_LIBCHECK_TRUE@am_check_clamd_OBJECTS =  \
78
+@HAVE_LIBCHECK_TRUE@	check_clamd-check_clamd.$(OBJEXT)
79
+check_clamd_OBJECTS = $(am_check_clamd_OBJECTS)
80
+check_clamd_DEPENDENCIES =
73 81
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
74 82
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
75 83
 am__depfiles_maybe = depfiles
... ...
@@ -82,8 +90,9 @@ CCLD = $(CC)
82 82
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
83 83
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
84 84
 	$(LDFLAGS) -o $@
85
-SOURCES = $(check_clamav_SOURCES)
86
-DIST_SOURCES = $(am__check_clamav_SOURCES_DIST)
85
+SOURCES = $(check_clamav_SOURCES) $(check_clamd_SOURCES)
86
+DIST_SOURCES = $(am__check_clamav_SOURCES_DIST) \
87
+	$(am__check_clamd_SOURCES_DIST)
87 88
 ETAGS = etags
88 89
 CTAGS = ctags
89 90
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
... ...
@@ -249,13 +258,17 @@ TESTS_ENVIRONMENT = export abs_srcdir=$(abs_srcdir) AWK=$(AWK); \
249 249
 	$(am__append_1)
250 250
 check_SCRIPTS = $(scripts)
251 251
 @HAVE_LIBCHECK_FALSE@check_clamav_SOURCES = check_clamav_skip.c
252
-@HAVE_LIBCHECK_TRUE@check_clamav_SOURCES = check_clamav.c checks.h $(top_builddir)/libclamav/clamav.h\
252
+@HAVE_LIBCHECK_TRUE@check_clamav_SOURCES = check_clamav.c checks.h checks_common.h $(top_builddir)/libclamav/clamav.h\
253 253
 @HAVE_LIBCHECK_TRUE@		       check_jsnorm.c check_str.c check_regex.c\
254 254
 @HAVE_LIBCHECK_TRUE@		       check_disasm.c check_uniq.c check_matchers.c\
255 255
 @HAVE_LIBCHECK_TRUE@		       check_htmlnorm.c
256 256
 
257 257
 @HAVE_LIBCHECK_TRUE@check_clamav_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\"
258 258
 @HAVE_LIBCHECK_TRUE@check_clamav_LDADD = $(top_builddir)/libclamav/libclamav.la @THREAD_LIBS@ @CHECK_LIBS@
259
+@HAVE_LIBCHECK_FALSE@check_clamd_SOURCES = check_clamav_skip.c
260
+@HAVE_LIBCHECK_TRUE@check_clamd_SOURCES = check_clamd.c checks_common.h
261
+@HAVE_LIBCHECK_TRUE@check_clamd_CPPFLAGS = -I$(top_srcdir) @CHECK_CPPFLAGS@ -DSRCDIR=\"$(abs_srcdir)\" -DBUILDDIR=\"$(abs_builddir)\"
262
+@HAVE_LIBCHECK_TRUE@check_clamd_LDADD = @CHECK_LIBS@ @CLAMD_LIBS@
259 263
 CLEANFILES = lcov.out *.gcno *.gcda *.log $(FILES) test-stderr.log clamscan.log valgrind-*.log duma.log duma2.log clamscan2.log
260 264
 EXTRA_DIST = .split $(srcdir)/*.ref input test-clamd.conf test-freshclam.conf valgrind.supp virusaction-test.sh $(scripts) preload_run.sh
261 265
 @ENABLE_COVERAGE_TRUE@LCOV_OUTPUT = lcov.out
... ...
@@ -307,6 +320,9 @@ clean-checkPROGRAMS:
307 307
 check_clamav$(EXEEXT): $(check_clamav_OBJECTS) $(check_clamav_DEPENDENCIES) 
308 308
 	@rm -f check_clamav$(EXEEXT)
309 309
 	$(LINK) $(check_clamav_OBJECTS) $(check_clamav_LDADD) $(LIBS)
310
+check_clamd$(EXEEXT): $(check_clamd_OBJECTS) $(check_clamd_DEPENDENCIES) 
311
+	@rm -f check_clamd$(EXEEXT)
312
+	$(LINK) $(check_clamd_OBJECTS) $(check_clamd_LDADD) $(LIBS)
310 313
 
311 314
 mostlyclean-compile:
312 315
 	-rm -f *.$(OBJEXT)
... ...
@@ -323,6 +339,8 @@ distclean-compile:
323 323
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_clamav-check_regex.Po@am__quote@
324 324
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_clamav-check_str.Po@am__quote@
325 325
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_clamav-check_uniq.Po@am__quote@
326
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_clamd-check_clamav_skip.Po@am__quote@
327
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_clamd-check_clamd.Po@am__quote@
326 328
 
327 329
 .c.o:
328 330
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
... ...
@@ -471,6 +489,34 @@ check_clamav-check_htmlnorm.obj: check_htmlnorm.c
471 471
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
472 472
 @am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamav_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o check_clamav-check_htmlnorm.obj `if test -f 'check_htmlnorm.c'; then $(CYGPATH_W) 'check_htmlnorm.c'; else $(CYGPATH_W) '$(srcdir)/check_htmlnorm.c'; fi`
473 473
 
474
+check_clamd-check_clamav_skip.o: check_clamav_skip.c
475
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT check_clamd-check_clamav_skip.o -MD -MP -MF $(DEPDIR)/check_clamd-check_clamav_skip.Tpo -c -o check_clamd-check_clamav_skip.o `test -f 'check_clamav_skip.c' || echo '$(srcdir)/'`check_clamav_skip.c
476
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/check_clamd-check_clamav_skip.Tpo $(DEPDIR)/check_clamd-check_clamav_skip.Po
477
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='check_clamav_skip.c' object='check_clamd-check_clamav_skip.o' libtool=no @AMDEPBACKSLASH@
478
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
479
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o check_clamd-check_clamav_skip.o `test -f 'check_clamav_skip.c' || echo '$(srcdir)/'`check_clamav_skip.c
480
+
481
+check_clamd-check_clamav_skip.obj: check_clamav_skip.c
482
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT check_clamd-check_clamav_skip.obj -MD -MP -MF $(DEPDIR)/check_clamd-check_clamav_skip.Tpo -c -o check_clamd-check_clamav_skip.obj `if test -f 'check_clamav_skip.c'; then $(CYGPATH_W) 'check_clamav_skip.c'; else $(CYGPATH_W) '$(srcdir)/check_clamav_skip.c'; fi`
483
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/check_clamd-check_clamav_skip.Tpo $(DEPDIR)/check_clamd-check_clamav_skip.Po
484
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='check_clamav_skip.c' object='check_clamd-check_clamav_skip.obj' libtool=no @AMDEPBACKSLASH@
485
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
486
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o check_clamd-check_clamav_skip.obj `if test -f 'check_clamav_skip.c'; then $(CYGPATH_W) 'check_clamav_skip.c'; else $(CYGPATH_W) '$(srcdir)/check_clamav_skip.c'; fi`
487
+
488
+check_clamd-check_clamd.o: check_clamd.c
489
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT check_clamd-check_clamd.o -MD -MP -MF $(DEPDIR)/check_clamd-check_clamd.Tpo -c -o check_clamd-check_clamd.o `test -f 'check_clamd.c' || echo '$(srcdir)/'`check_clamd.c
490
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/check_clamd-check_clamd.Tpo $(DEPDIR)/check_clamd-check_clamd.Po
491
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='check_clamd.c' object='check_clamd-check_clamd.o' libtool=no @AMDEPBACKSLASH@
492
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
493
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o check_clamd-check_clamd.o `test -f 'check_clamd.c' || echo '$(srcdir)/'`check_clamd.c
494
+
495
+check_clamd-check_clamd.obj: check_clamd.c
496
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT check_clamd-check_clamd.obj -MD -MP -MF $(DEPDIR)/check_clamd-check_clamd.Tpo -c -o check_clamd-check_clamd.obj `if test -f 'check_clamd.c'; then $(CYGPATH_W) 'check_clamd.c'; else $(CYGPATH_W) '$(srcdir)/check_clamd.c'; fi`
497
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/check_clamd-check_clamd.Tpo $(DEPDIR)/check_clamd-check_clamd.Po
498
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='check_clamd.c' object='check_clamd-check_clamd.obj' libtool=no @AMDEPBACKSLASH@
499
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
500
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(check_clamd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o check_clamd-check_clamd.obj `if test -f 'check_clamd.c'; then $(CYGPATH_W) 'check_clamd.c'; else $(CYGPATH_W) '$(srcdir)/check_clamd.c'; fi`
501
+
474 502
 mostlyclean-libtool:
475 503
 	-rm -f *.lo
476 504
 
... ...
@@ -736,7 +782,7 @@ check_clamd.sh: $(FILES)
736 736
 $(FILES) :
737 737
 	cat $(SPLIT_DIR)/split.$@aa $(SPLIT_DIR)/split.$@ab > $@
738 738
 
739
-check_clamd.sh: $(top_builddir)/test/clam.exe
739
+check_clamd.sh: $(top_builddir)/test/clam.exe check_clamd
740 740
 check_clamscan.sh: $(top_builddir)/test/clam.exe
741 741
 
742 742
 $(top_builddir)/test/clam.exe:
... ...
@@ -56,7 +56,7 @@ start_clamd()
56 56
 		{ error "Failed to start clamd!"; die 1; }
57 57
 }
58 58
 
59
-run_clamdscan() {
59
+run_clamdscan_fileonly() {
60 60
 	rm -f clamdscan.log clamdscan-multiscan.log
61 61
 	$TOP/clamdscan/clamdscan --version --config-file=test-clamd.conf 2>&1|grep "^ClamAV" >/dev/null || 
62 62
 		{ error "clamdscan can't get version of clamd!"; die 1;}
... ...
@@ -74,6 +74,23 @@ run_clamdscan() {
74 74
 	fi
75 75
 }
76 76
 
77
+run_clamdscan() {
78
+	run_clamdscan_fileonly $*
79
+	rm -f clamdscan-fdpass.log clamdscan-multiscan-fdpass.log
80
+	$TOP/clamdscan/clamdscan --quiet --config-file=test-clamd.conf $* --fdpass --log=clamdscan-fdpass.log
81
+	if test $? = 2; then 
82
+		error "Failed to run clamdscan (fdpass)!"
83
+		cat clamdscan-multiscan.log
84
+		die 1
85
+	fi
86
+	$TOP/clamdscan/clamdscan --quiet --config-file=test-clamd.conf $* -m --fdpass --log=clamdscan-multiscan-fdpass.log
87
+	if test $? = 2; then 
88
+		error "Failed to run clamdscan (fdpass + multiscan)!"
89
+		cat clamdscan-multiscan.log
90
+		die 1
91
+	fi
92
+}
93
+
77 94
 run_reload_test()
78 95
 {
79 96
 	rm -f reload-testfile
... ...
@@ -160,6 +177,8 @@ run_clamdscan $FILES
160 160
 NFILES=`ls -1 $FILES | wc -l`
161 161
 NINFECTED=`grep "Infected files" clamdscan.log | cut -f2 -d:|sed -e 's/ //g'`
162 162
 NINFECTED_MULTI=`grep "Infected files" clamdscan-multiscan.log | cut -f2 -d:|sed -e 's/ //g'`
163
+NINFECTED_FDPASS=`grep "Infected files" clamdscan-fdpass.log | cut -f2 -d:|sed -e 's/ //g'`
164
+NINFECTED_MULTI_FDPASS=`grep "Infected files" clamdscan-multiscan-fdpass.log | cut -f2 -d:|sed -e 's/ //g'`
163 165
 if test "$NFILES" -ne "0$NINFECTED"; then
164 166
 	grep OK clamdscan.log
165 167
 	scan_failed clamdscan.log "clamd did not detect all testfiles correctly!"
... ...
@@ -168,7 +187,21 @@ if test "$NFILES" -ne "0$NINFECTED_MULTI"; then
168 168
 	grep OK clamdscan-multiscan.log
169 169
 	scan_failed clamdscan-multiscan.log "clamd did not detect all testfiles correctly in multiscan mode!"
170 170
 fi
171
+if test "$NFILES" -ne "0$NINFECTED_FDPASS"; then
172
+	grep OK clamdscan-fdpass.log
173
+	scan_failed clamdscan-multiscan.log "clamd did not detect all testfiles correctly in fdpass mode!"
174
+fi
175
+if test "$NFILES" -ne "0$NINFECTED_MULTI_FDPASS"; then
176
+	grep OK clamdscan-multiscan-fdpass.log
177
+	scan_failed clamdscan-multiscan.log "clamd did not detect all testfiles correctly in fdpass+multiscan mode!"
178
+fi
171 179
 
180
+$TOP/unit_tests/check_clamd
181
+ecode=$?
182
+if test $ecode -ne 77 && test $ecode -ne 0; then
183
+    error "Failed clamd protocol test!"
184
+    die 1
185
+fi
172 186
 # Test HeuristicScanPrecedence off feature
173 187
 run_clamdscan ../clam-phish-exe
174 188
 grep "ClamAV-Test-File" clamdscan.log >/dev/null 2>/dev/null;
... ...
@@ -186,7 +219,7 @@ pid1=$!
186 186
 start_clamd test-clamd.conf
187 187
 
188 188
 # Test VirusEvent feature
189
-run_clamdscan $TOP/test/clam.exe
189
+run_clamdscan_fileonly $TOP/test/clam.exe
190 190
 grep "Virus found: ClamAV-Test-File.UNOFFICIAL" test-clamd.log >/dev/null 2>/dev/null; 
191 191
 if test $? -ne 0; then
192 192
 	error "Virusaction test failed!" 
... ...
@@ -1,18 +1,7 @@
1 1
 #ifndef CHECKS_H
2 2
 #define CHECKS_H
3 3
 
4
-#if CHECK_MAJOR_VERSION > 0 || ( CHECK_MINOR_VERSION > 9 || ( CHECK_MINOR_VERSION == 9 && CHECK_MICRO_VERSION > 3))
5
-#define CHECK_HAVE_LOOPS
6
-#endif
7
-
8
-#if CHECK_MAJOR_VERSION > 0 || ( CHECK_MINOR_VERSION > 9 || ( CHECK_MINOR_VERSION == 9 && CHECK_MICRO_VERSION > 0))
9
-#define fail_unless_fmt fail_unless
10
-#define fail_fmt fail
11
-#else
12
-#define fail_unless_fmt(cond, msg, ...) fail_unless(cond, msg)
13
-#define fail_fmt(msg, ...) fail(msg)
14
-#endif
15
-
4
+#include "checks_common.h"
16 5
 Suite *test_jsnorm_suite(void);
17 6
 Suite *test_str_suite(void);
18 7
 Suite *test_regex_suite(void);