summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2008-06-13 17:21:03 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2008-06-13 17:21:03 +0200
commit4f32b629906f078ea81637829dde136a27b214e5 (patch)
treec6a4c2830c99575edf7b272a4517d89094bb66b0
parentfa3451aaa466ba7da28de6b324b4f90bab3ad4ef (diff)
downloadrsyslog-4f32b629906f078ea81637829dde136a27b214e5.tar.gz
rsyslog-4f32b629906f078ea81637829dde136a27b214e5.tar.xz
rsyslog-4f32b629906f078ea81637829dde136a27b214e5.zip
begun building a testbench
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac1
-rw-r--r--runtime/Makefile.am20
-rw-r--r--runtime/conf.c (renamed from conf.c)7
-rw-r--r--runtime/conf.h (renamed from conf.h)0
-rw-r--r--runtime/ctok.c5
-rw-r--r--runtime/module-template.h4
-rw-r--r--tests/Makefile.am14
-rw-r--r--tests/README9
-rw-r--r--tests/rscript-parse.c90
-rw-r--r--tests/rt-init.c44
-rw-r--r--tests/runtime-dummy.c41
-rw-r--r--tests/testbench.h102
-rw-r--r--tools/Makefile.am17
14 files changed, 336 insertions, 20 deletions
diff --git a/Makefile.am b/Makefile.am
index e4c4bea5..0ca38b2e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -50,7 +50,7 @@ EXTRA_DIST = \
contrib/gnutls/cert.pem \
contrib/gnutls/key.pem
-SUBDIRS = doc runtime .
+SUBDIRS = doc tests runtime .
SUBDIRS += plugins/immark plugins/imuxsock plugins/imtcp plugins/imudp plugins/omtesting
diff --git a/configure.ac b/configure.ac
index af39fa23..e3b5a67b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -623,6 +623,7 @@ AM_CONDITIONAL(ENABLE_IMTEMPLATE, test x$enable_imtemplate = xyes)
AC_CONFIG_FILES([Makefile \
runtime/Makefile \
tools/Makefile \
+ tests/Makefile \
doc/Makefile \
plugins/imudp/Makefile \
plugins/imtcp/Makefile \
diff --git a/runtime/Makefile.am b/runtime/Makefile.am
index 79783bd6..81a9d5bd 100644
--- a/runtime/Makefile.am
+++ b/runtime/Makefile.am
@@ -14,6 +14,8 @@ librsyslog_la_SOURCES = \
nsd.h \
glbl.h \
glbl.c \
+ conf.c \
+ conf.h \
msg.c \
msg.h \
linkedlist.c \
@@ -63,7 +65,23 @@ librsyslog_la_SOURCES = \
queue.c \
queue.h \
cfsysline.c \
- cfsysline.h
+ cfsysline.h \
+ \
+ \
+ ../action.h \
+ ../action.c \
+ ../threads.c \
+ ../threads.h \
+ \
+ ../parse.c \
+ ../parse.h \
+ \
+ ../outchannel.c \
+ ../outchannel.h \
+ ../template.c \
+ ../template.h
+# the files with ../ we need to work on - so that they either become part of the
+# runtime or will no longer be needed. -- rgerhards, 2008-06-13
librsyslog_la_CPPFLAGS = -D_PATH_MODDIR=\"$(pkglibdir)/\" -I$(top_srcdir) $(pthreads_cflags)
#librsyslog_la_LDFLAGS = -module -avoid-version
diff --git a/conf.c b/runtime/conf.c
index 78895272..b24083d3 100644
--- a/conf.c
+++ b/runtime/conf.c
@@ -7,6 +7,11 @@
* kept in memory only as long as the config file is actually being
* processed. Thereafter, it shall be unloaded. -- rgerhards
*
+ * TODO: the license MUST be changed to LGPL. However, we can not
+ * currently do that, because we use some sysklogd code to crunch
+ * the selector lines (e.g. *.info). That code is scheduled for removal
+ * as part of RainerScript. After this is done, we can change licenses.
+ *
* Copyright 2008 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
@@ -45,7 +50,7 @@
#endif
#include "rsyslog.h"
-#include "syslogd.h" /* this actually *is* part of the syslogd! */
+#include "../tools/syslogd.h" /* TODO: this must be removed! */
#include "dirty.h"
#include "parse.h"
#include "action.h"
diff --git a/conf.h b/runtime/conf.h
index 31ca27b3..31ca27b3 100644
--- a/conf.h
+++ b/runtime/conf.h
diff --git a/runtime/ctok.c b/runtime/ctok.c
index c938a292..927e6a47 100644
--- a/runtime/ctok.c
+++ b/runtime/ctok.c
@@ -130,7 +130,7 @@ ctokSkipWhitespaceFromStream(ctok_t *pThis)
/* we must unget the one non-whitespace we found */
CHKiRet(ctokUngetCharFromStream(pThis, c));
-dbgprintf("skipped whitepsace, stream now '%s'\n", pThis->pp);
+dbgprintf("skipped whitespace, stream now '%s'\n", pThis->pp);
finalize_it:
RETiRet;
}
@@ -390,6 +390,7 @@ ctokGetToken(ctok_t *pThis, ctok_token_t **ppToken)
uchar szWord[128];
int bRetry = 0; /* retry parse? Only needed for inline comments... */
+dbgprintf("ctokGetToken\n");
ISOBJ_TYPE_assert(pThis, ctok);
ASSERT(ppToken != NULL);
@@ -408,6 +409,7 @@ ctokGetToken(ctok_t *pThis, ctok_token_t **ppToken)
/* find the next token. We may loop when we have inline comments */
do {
+dbgprintf("we search for a new token\n");
bRetry = 0;
CHKiRet(ctokSkipWhitespaceFromStream(pThis));
CHKiRet(ctokGetCharFromStream(pThis, &c)); /* read a charater */
@@ -514,6 +516,7 @@ ctokGetToken(ctok_t *pThis, ctok_token_t **ppToken)
pToken->tok = ctok_FUNCTION;
// TODO: fill function name
} else { /* give up... */
+ dbgprintf("parser has an invalid word (token) '%s'\n", szWord);
pToken->tok = ctok_INVALID;
}
}
diff --git a/runtime/module-template.h b/runtime/module-template.h
index 5db73d33..a200c4f2 100644
--- a/runtime/module-template.h
+++ b/runtime/module-template.h
@@ -51,6 +51,9 @@
* a module provides multiple types, several separate modules must be created which
* then should share a single library containing the majority of code. This macro
* must be present in each module. -- rgerhards, 2007-12-14
+* Note that MODULE_TYPE_TESTBENCH is reserved for testbenches, but
+ * declared in their own header files (because the rest does not need these
+ * defines). -- rgerhards, 2008-06-13
*/
#define MODULE_TYPE(x)\
static rsRetVal modGetType(eModType_t *modType) \
@@ -65,6 +68,7 @@ static rsRetVal modGetType(eModType_t *modType) \
DEF_LMOD_STATIC_DATA \
MODULE_TYPE(eMOD_LIB)
+
/* macro to define a unique module id. This must be able to fit in a void*. The
* module id must be unique inside a running rsyslogd application. It is used to
* track ownership of several objects. Most importantly, when the module is
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 00000000..d85a56f8
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,14 @@
+check_PROGRAMS = rt_init rscript_parse
+TESTS = $(check_PROGRAMS)
+
+test_files = testbench.h runtime-dummy.c
+
+rt_init_SOURCES = rt-init.c $(test_files)
+rt_init_CPPFLAGS = -I$(top_srcdir) $(pthreads_cflags) $(rsrt_cflags)
+rt_init_LDADD = $(rsrt_libs) $(zlib_libs) $(pthreads_libs)
+rt_init_LDFLAGS = -export-dynamic
+
+rscript_parse_SOURCES = rscript-parse.c $(test_files)
+rscript_parse_CPPFLAGS = -I$(top_srcdir) $(pthreads_cflags) $(rsrt_cflags)
+rscript_parse_LDADD = $(rsrt_libs) $(zlib_libs) $(pthreads_libs)
+rscript_parse_LDFLAGS = -export-dynamic
diff --git a/tests/README b/tests/README
new file mode 100644
index 00000000..0ce79f63
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,9 @@
+This directory contains the rsyslog testbench. It is slowly
+evolving. New tests are always welcome. So far, most tests check
+out the functionality of a single module. More complex tests are
+welcome.
+
+For a simple sample, see rtinit.c, which does a simple
+init/deinit check of the runtime system.
+
+rgerhards, 2008-06-13
diff --git a/tests/rscript-parse.c b/tests/rscript-parse.c
new file mode 100644
index 00000000..e9c11a47
--- /dev/null
+++ b/tests/rscript-parse.c
@@ -0,0 +1,90 @@
+/* This test checks runtime initialization and exit. Other than that, it
+ * also serves as the most simplistic sample of how a test can be coded.
+ *
+ * Part of the testbench for rsyslog.
+ * Copyright 2008 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of rsyslog.
+ *
+ * Rsyslog 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 of the License, or
+ * (at your option) any later version.
+ *
+ * Rsyslog 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 Rsyslog. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ */
+#include <stdio.h>
+
+#include "rsyslog.h"
+#include "testbench.h"
+#include "ctok.h"
+#include "expr.h"
+
+MODULE_TYPE_TESTBENCH
+/* define addtional objects we need for our tests */
+DEFobjCurrIf(expr)
+DEFobjCurrIf(ctok)
+DEFobjCurrIf(ctok_token)
+
+BEGINInit
+CODESTARTInit
+ pErrObj = "expr"; CHKiRet(objUse(expr, CORE_COMPONENT));
+ pErrObj = "ctok"; CHKiRet(objUse(ctok, CORE_COMPONENT));
+ pErrObj = "ctok_token"; CHKiRet(objUse(ctok_token, CORE_COMPONENT));
+ENDInit
+
+BEGINExit
+CODESTARTExit
+ENDExit
+
+BEGINTest
+ ctok_t *tok;
+ ctok_token_t *pToken;
+ expr_t *pExpr;
+ /* the string below is an expression as defined up to 3.19.x - note that the
+ * then and the space after it MUST be present!
+ */
+ uchar szExpr[] = "$msg contains 'test' then ";
+ /*uchar szSynErr[] = "$msg == 1 and syntaxerror ";*/
+CODESTARTTest
+ /* we first need a tokenizer... */
+ CHKiRet(ctok.Construct(&tok));
+ CHKiRet(ctok.Setpp(tok, szExpr));
+ CHKiRet(ctok.ConstructFinalize(tok));
+
+ /* now construct our expression */
+ CHKiRet(expr.Construct(&pExpr));
+ CHKiRet(expr.ConstructFinalize(pExpr));
+
+ /* ready to go... */
+ CHKiRet(expr.Parse(pExpr, tok));
+
+ /* we now need to parse off the "then" - and note an error if it is
+ * missing...
+ */
+ CHKiRet(ctok.GetToken(tok, &pToken));
+ if(pToken->tok != ctok_THEN) {
+ ctok_token.Destruct(&pToken);
+ ABORT_FINALIZE(RS_RET_SYNTAX_ERROR);
+ }
+
+ ctok_token.Destruct(&pToken); /* no longer needed */
+
+ /* we are done, so we now need to restore things */
+ CHKiRet(ctok.Destruct(&tok));
+finalize_it:
+ /* here we may do custom error reporting */
+ if(iRet != RS_RET_OK) {
+ uchar *pp;
+ ctok.Getpp(tok, &pp);
+ printf("error on or before '%s'\n", pp);
+ }
+ENDTest
diff --git a/tests/rt-init.c b/tests/rt-init.c
new file mode 100644
index 00000000..aaac7ed1
--- /dev/null
+++ b/tests/rt-init.c
@@ -0,0 +1,44 @@
+/* This test checks runtime initialization and exit. Other than that, it
+ * also serves as the most simplistic sample of how a test can be coded.
+ *
+ * Part of the testbench for rsyslog.
+ * Copyright 2008 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of rsyslog.
+ *
+ * Rsyslog 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 of the License, or
+ * (at your option) any later version.
+ *
+ * Rsyslog 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 Rsyslog. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ */
+#include <stdio.h>
+
+#include "rsyslog.h"
+#include "testbench.h"
+
+MODULE_TYPE_TESTBENCH
+
+
+BEGINInit
+CODESTARTInit
+ENDInit
+
+BEGINExit
+CODESTARTExit
+ENDExit
+
+BEGINTest
+CODESTARTTest
+finalize_it:
+ /* room for custom error reporter, leave blank if not needed */
+ENDTest
diff --git a/tests/runtime-dummy.c b/tests/runtime-dummy.c
new file mode 100644
index 00000000..9cddd913
--- /dev/null
+++ b/tests/runtime-dummy.c
@@ -0,0 +1,41 @@
+/* Testbench for rsyslog
+ *
+ * This are dummy calls for "runtime" routines which are not yet properly
+ * abstracted and part of the actual runtime libraries. This module tries
+ * to make the linker happy. Please note that it does NOT provide anything
+ * more but the symbols. If a test requires these functions (or functions
+ * that depend on them), this dummy can not be used.
+ *
+ * Copyright 2008 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of rsyslog.
+ *
+ * Rsyslog 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 of the License, or
+ * (at your option) any later version.
+ *
+ * Rsyslog 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 Rsyslog. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ */
+#include <stdlib.h>
+
+int bReduceRepeatMsgs = 0;
+int repeatinterval = 30;
+int bActExecWhenPrevSusp = 0;
+int iActExecOnceInterval = 1;
+int MarkInterval = 30;
+
+void cflineClassic(void) {};
+void selectorAddList(void) {};
+void selectorConstruct(void) {};
+void selectorDestruct(void) {};
+
+/* these are required by some dynamically loaded modules */
diff --git a/tests/testbench.h b/tests/testbench.h
new file mode 100644
index 00000000..6f26724a
--- /dev/null
+++ b/tests/testbench.h
@@ -0,0 +1,102 @@
+/* Defines for a rsyslog standard testbench application.
+ *
+ * Work begun 2008-06-13 by Rainer Gerhards (written from scratch)
+ *
+ * Copyright 2008 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of rsyslog.
+ *
+ * Rsyslog 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 of the License, or
+ * (at your option) any later version.
+ *
+ * Rsyslog 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 Rsyslog. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ */
+#include <stdlib.h>
+
+/* everything we need to begin a testbench */
+#define MODULE_TYPE_TESTBENCH \
+/* definitions for objects we access */ \
+DEFobjCurrIf(obj) \
+\
+static rsRetVal doInit(void); \
+static rsRetVal doTest(void); \
+static rsRetVal doExit(void); \
+\
+/* Below is the driver, which is always the same */ \
+int main(int __attribute__((unused)) argc, char __attribute__((unused)) *argv[]) \
+{ \
+ DEFiRet; \
+ CHKiRet(doInit()); \
+ CHKiRet(doTest()); \
+ CHKiRet(doExit()); \
+finalize_it: \
+ printf("test returns iRet %d\n", iRet); \
+ RETiRet; \
+}
+
+
+/* Initialize everything (most importantly the runtime objects) for the test. The framework
+ * initializes the global runtime, user must add those objects that it needs additionally.
+ */
+#define BEGINInit \
+static rsRetVal doInit(void) \
+{ \
+ DEFiRet; \
+ char *pErrObj; /* tells us which object failed if that happens */ \
+ putenv("RSYSLOG_MODDIR=../runtime/.libs/"); /* this is a bit hackish... */ \
+ \
+ dbgClassInit(); \
+ /* Intialize the runtime system */ \
+ pErrObj = "rsyslog runtime"; /* set in case the runtime errors before setting an object */ \
+ CHKiRet(rsrtInit(&pErrObj, &obj)); \
+
+#define CODESTARTInit
+
+#define ENDInit \
+finalize_it: \
+ if(iRet != RS_RET_OK) { \
+ printf("failure occured during init of object '%s'\n", pErrObj); \
+ } \
+ \
+ RETiRet; \
+}
+
+
+
+/* Carry out the actual test...
+ */
+#define BEGINTest \
+rsRetVal doTest(void) \
+{ \
+ DEFiRet;
+
+#define CODESTARTTest
+
+#define ENDTest \
+ RETiRet; \
+}
+
+
+/* De-init everything (most importantly the runtime objects) for the test. */
+#define BEGINExit \
+rsRetVal doExit(void) \
+{ \
+ DEFiRet; \
+ CHKiRet(rsrtExit());
+
+#define CODESTARTExit
+
+#define ENDExit \
+finalize_it: \
+ RETiRet; \
+}
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 1eb017d4..b2b7a8ca 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -20,22 +20,7 @@ rsyslogd_SOURCES = \
pidfile.c \
pidfile.h \
\
- ../dirty.h \
- \
- ../action.h \
- ../action.c \
- ../threads.c \
- ../threads.h \
- \
- ../parse.c \
- ../parse.h \
- \
- ../outchannel.c \
- ../outchannel.h \
- ../template.c \
- ../template.h \
- ../conf.c \
- ../conf.h
+ ../dirty.h
rsyslogd_CPPFLAGS = $(pthreads_cflags) $(rsrt_cflags)
rsyslogd_LDADD = $(zlib_libs) $(pthreads_libs) $(rsrt_libs)