summaryrefslogtreecommitdiffstats
path: root/common/elapi/elapi_test
diff options
context:
space:
mode:
Diffstat (limited to 'common/elapi/elapi_test')
-rw-r--r--common/elapi/elapi_test/Makefile.am38
-rw-r--r--common/elapi/elapi_test/configure.ac26
-rw-r--r--common/elapi/elapi_test/elapi_ut.c341
-rw-r--r--common/elapi/elapi_test/elapi_ut.conf97
-rw-r--r--common/elapi/elapi_test/m4/.dir0
5 files changed, 502 insertions, 0 deletions
diff --git a/common/elapi/elapi_test/Makefile.am b/common/elapi/elapi_test/Makefile.am
new file mode 100644
index 000000000..b16102c83
--- /dev/null
+++ b/common/elapi/elapi_test/Makefile.am
@@ -0,0 +1,38 @@
+TRACE_LEVEL=@TRACE_VAR@
+
+topdir=$(srcdir)/../..
+
+AM_CFLAGS = -DELAPI_DEFAULT_CONFIG_DIR=\"$(srcdir)\" \
+ -DELAPI_DEFAULT_CONFIG_APP_DIR=\"$(srcdir)\" \
+ -DELAPI_DEFAULT_APP_NAME=\"elapi_ut\" \
+ -DELAPI_DEFAULT_APP_NAME_SIZE=127
+
+if HAVE_GCC
+ AM_CFLAGS += \
+ -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual \
+ -Wcast-align -Wwrite-strings
+endif
+
+AM_CPPFLAGS = -I$(topdir) -I$(topdir)/ini -I$(topdir)/trace -I$(topdir)/collection -I$(topdir)/elapi $(TRACE_LEVEL)
+
+ACLOCAL_AMFLAGS = -I m4
+
+# Build library
+noinst_LTLIBRARIES = libelapi_test.la
+libelapi_test_la_SOURCES = \
+ ../elapi_event.c \
+ ../elapi_log.c \
+ ../elapi_internal.c \
+ ../elapi_event.h \
+ ../elapi_priv.h \
+ ../elapi_sink.h \
+ ../elapi_log.h \
+ ../elapi_async.h \
+ ../elapi.h
+
+# Build unit test
+check_PROGRAMS = elapi_ut
+elapi_ut_SOURCES = elapi_ut.c
+elapi_ut_LDADD = libelapi_test.la ../../ini/libini_config.la ../../collection/libcollection.la
+
+TESTS = elapi_ut
diff --git a/common/elapi/elapi_test/configure.ac b/common/elapi/elapi_test/configure.ac
new file mode 100644
index 000000000..f2431bd38
--- /dev/null
+++ b/common/elapi/elapi_test/configure.ac
@@ -0,0 +1,26 @@
+AC_INIT([elapi],[0.0.1],[freeipa-devel@redhat.com])
+AC_CONFIG_SRCDIR([elapi_ut.c])
+AC_CONFIG_AUX_DIR([build])
+AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+AC_PROG_CC
+AC_PROG_LIBTOOL
+AC_CONFIG_MACRO_DIR([m4])
+AC_PROG_INSTALL
+
+AM_CONDITIONAL([HAVE_GCC], [test "$ac_cv_prog_gcc" = yes])
+
+m4_pattern_allow([AM_SILENT_RULES])
+AM_SILENT_RULES
+
+AC_CONFIG_HEADERS([config.h])
+
+# Enable trace build
+AC_ARG_ENABLE([trace],
+ [AS_HELP_STRING([--enable-trace[=LEVEL]],[build with low level tracing enabled])],
+ [trace_level="$enableval"],
+ [trace_level="0"])
+AS_IF([test ["$trace_level" -gt "0"] -a ["$trace_level" -lt "8"] ],[AC_SUBST([TRACE_VAR],["-DTRACE_LEVEL=$trace_level"])])
+
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff --git a/common/elapi/elapi_test/elapi_ut.c b/common/elapi/elapi_test/elapi_ut.c
new file mode 100644
index 000000000..ed4342212
--- /dev/null
+++ b/common/elapi/elapi_test/elapi_ut.c
@@ -0,0 +1,341 @@
+/*
+ ELAPI
+
+ Unit test for the ELAPI event interface.
+
+ Copyright (C) Dmitri Pal <dpal@redhat.com> 2009
+
+ This program 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.
+ This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <stdarg.h>
+#define TRACE_HOME
+#include "trace.h"
+#include "elapi.h"
+#include "collection_tools.h"
+
+/* THIS IS A PRIVATE HEADER - included for debugging purposes only! */
+#include "elapi_priv.h"
+
+int simple_event_test(void)
+{
+ int error = 0;
+ struct collection_item *event;
+ char bin[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+
+ printf("Simple test START:\n");
+
+ error = elapi_set_default_template(
+ E_BASE_DEFV1 | E_BASE_HOSTEXT,
+ "%n( bin )", bin, 8,
+ " %sb( logical1 )", "false",
+ "%sb( logical2 )", "YES",
+ " %db(logical3)", 1,
+ "%d(int_number),", -200,
+ "%u(unsigned_number)", 300,
+ "%ld(long_number)", -1234567,
+ "%lu(long_unsigned_number)", 123456789,
+ "%s(just_string)", "string",
+ "%*s(sub_string)", "truncated string", 10, /* Expect word truncated */
+ "%e(double_number)", 3.141592 * 3,
+ "simple", "value",
+ "-" E_UTCTIME, /* Remove UTCTIME from the list */
+ E_MESSAGE,
+ "%(stamp), %s(sub_string), %(int_number), %(unsigned_number), %(long_unsigned_number), %(bin), %e(double_number)",
+ E_EOARG);
+
+ if (error) {
+ printf("Failed to set default template! %d\n", error);
+ return error;
+ }
+
+ error = elapi_create_simple_event(
+ &event,
+ " %db(foo_logical)", 0,
+ "%d(foo_int_number),", -2000,
+ "%u(foo_unsigned_number)", 3000,
+ "%ld(foo_long_number)", -7654321,
+ E_EOARG);
+
+ if (error) {
+ printf("Failed to create simple event! %d\n", error);
+ return error;
+ }
+
+ error = ELAPI_EVT_DEBUG(event);
+ if (error) {
+ printf("Failed to log event to debug ! %d\n", error);
+ elapi_destroy_event(event);
+ return error;
+ }
+
+ error = ELAPI_EVT_LOG(event);
+ if (error) {
+ printf("Failed to log event to log ! %d\n", error);
+ elapi_destroy_event(event);
+ return error;
+ }
+
+ error = ELAPI_EVT_AUDIT(event);
+
+ if (error) {
+ printf("Failed to log event to audit ! %d\n", error);
+ elapi_destroy_event(event);
+ return error;
+ }
+
+ elapi_destroy_event(event);
+
+ error = elapi_msg(E_TARGET_DEBUG, NULL, "a", "b", "c", "d", E_EOARG);
+ if (error) {
+ printf("Failed to log \"debug\" event! %d\n", error);
+ return error;
+ }
+
+ error = elapi_msg(E_TARGET_LOG, NULL, "a", "b", "c", "d", E_EOARG);
+ if (error) {
+ printf("Failed to log \"log\" event! %d\n", error);
+ return error;
+ }
+
+ error = elapi_msg(E_TARGET_AUDIT, NULL, "a", "b", "c", "d", E_EOARG);
+ if (error) {
+ printf("Failed to log \"audit\" event! %d\n", error);
+ return error;
+ }
+
+ /* Internal function to print dispatcher guts */
+ elapi_internal_print_dispatcher(elapi_get_dispatcher());
+
+ printf("Simple test success!\n");
+
+ return error;
+}
+
+int complex_event_test(void)
+{
+ int error = 0;
+ struct collection_item *template = NULL;
+ struct collection_item *event = NULL, *event_copy = NULL;
+ char bin[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+ struct collection_item *col = NULL;
+ struct elapi_dispatcher *dispatcher = NULL;
+
+ printf("Complex test START:\n");
+
+ error = elapi_create_event_template(
+ &template,
+ E_BASE_DEFV1 | E_BASE_HOSTEXT,
+ "%lu(long_unsigned_number)", 123456789,
+ "%s(just_string)", "string",
+ "%*s(sub_string)", "truncated string", 10, /* Expect word truncated */
+ "%e(double_number)", 3.141592 * 3,
+ "simple", "value",
+ "-" E_UTCTIME, /* Remove UTCTIME from the list */
+ E_MESSAGE,
+ "%(stamp), %s(sub_string), %(int_number), %(unsigned_number), %(long_unsigned_number), %(bin), %e(double_number)",
+ E_EOARG);
+
+ if (error) {
+ printf("Failed to set create template %d\n", error);
+ return error;
+ }
+
+ error = elapi_create_event(
+ &event,
+ template,
+ NULL,
+ 0,
+ " %db(evt_logical)", 0,
+ "%d(evt_int_number),", -2000,
+ "%u(evt_unsigned_number)", 3000,
+ "%ld(evt_long_number)", -7654321,
+ E_EOARG);
+
+ if (error) {
+ printf("Failed to set create template %d\n", error);
+ elapi_destroy_event_template(template);
+ return error;
+ }
+
+ col_debug_collection(template, COL_TRAVERSE_FLAT);
+ col_debug_collection(event, COL_TRAVERSE_FLAT);
+
+ error = elapi_log(E_TARGET_DEBUG, event);
+
+ elapi_destroy_event(event);
+
+ if (error) {
+ printf("Failed to log event! %d\n", error);
+ return error;
+ }
+
+
+ elapi_destroy_event_template(template);
+
+ error = elapi_create_event_template(
+ &template,
+ E_BASE_DEFV1 | E_BASE_HOSTEXT,
+ "%n( bin )", bin, 8,
+ " %sb( logical1 )", "false",
+ "%sb( logical2 )", "YES",
+ " %db(logical3)", 1,
+ "%d(int_number),", -200,
+ "%u(unsigned_number)", 300,
+ "%ld(long_number)", -1234567,
+ E_MESSAGE,
+ "%(stamp), %s(sub_string), %(int_number), %(unsigned_number), %(long_unsigned_number), %(bin), %e(double_number)",
+ E_EOARG);
+
+ if (error) {
+ printf("Failed to set create template %d\n", error);
+ return error;
+ }
+
+ if ((error = col_create_collection(&col, "test", 0)) ||
+ /* We are forcing overwrite with different type */
+ (error = col_add_int_property(col, NULL, "unsigned_number", 1)) ||
+ (error = col_add_long_property(col, NULL, "bin", 100000000L))) {
+ elapi_destroy_event_template(template);
+ printf("Failed to add property. Error %d\n", error);
+ return error;
+ }
+
+ error = elapi_create_event(
+ &event,
+ template,
+ col,
+ COL_ADD_MODE_FLAT,
+ E_MESSAGE,
+ "%(stamp) a good message",
+ "-int_number",
+ E_EOARG);
+
+ if (error) {
+ printf("Failed to set create template %d\n", error);
+ elapi_destroy_event_template(template);
+ col_destroy_collection(col);
+ return error;
+ }
+
+ col_destroy_collection(col);
+
+ col_debug_collection(template, COL_TRAVERSE_FLAT);
+ col_debug_collection(event, COL_TRAVERSE_FLAT);
+
+
+ if ((error = col_create_collection(&col, "test", 0)) ||
+ /* We are forsing overwrite with different type */
+ (error = col_add_int_property(col, NULL, "zzz", 1)) ||
+ (error = col_add_long_property(col, NULL, "zzz2", 100000000L))) {
+ elapi_destroy_event_template(template);
+ printf("Failed to add property. Error %d\n", error);
+ elapi_destroy_event(event);
+ return error;
+ }
+
+ error = elapi_modify_event(
+ event,
+ col,
+ COL_ADD_MODE_REFERENCE,
+ "-"E_MESSAGE,
+ "bin", "bin-string",
+ E_EOARG);
+
+ if (error) {
+ printf("Failed to set create template %d\n", error);
+ elapi_destroy_event(event);
+ elapi_destroy_event_template(template);
+ col_destroy_collection(col);
+ return error;
+ }
+
+ col_destroy_collection(col);
+
+ error = elapi_copy_event(&event_copy, event);
+ if (error) {
+ printf("Failed to set create template %d\n", error);
+ elapi_destroy_event(event);
+ elapi_destroy_event_template(template);
+ return error;
+ }
+
+ error = elapi_create_dispatcher(&dispatcher, "elapi_ut", "./sdfdsdf");
+ if (error) {
+ elapi_destroy_event(event);
+ elapi_destroy_event(event_copy);
+ elapi_destroy_event_template(template);
+ printf("Failed to create dispatcher %d\n", error);
+ return error;
+ }
+
+ error = elapi_dsp_log(E_TARGET_DEBUG, dispatcher, event);
+
+ elapi_destroy_event(event);
+
+ if (error) {
+ elapi_destroy_event(event_copy);
+ elapi_destroy_event_template(template);
+ printf("Failed to log event! %d\n", error);
+ return error;
+ }
+
+ error = elapi_dsp_log(E_TARGET_DEBUG, dispatcher, event_copy);
+
+ elapi_destroy_event(event_copy);
+
+ if (error) {
+ elapi_destroy_event_template(template);
+ printf("Failed to log event! %d\n", error);
+ return error;
+ }
+
+ error = elapi_dsp_msg(E_TARGET_DEBUG, dispatcher, template, "a", "b", "c", "d", E_EOARG);
+ if (error) {
+ elapi_destroy_event_template(template);
+ printf("Failed to log event! %d\n", error);
+ return error;
+ }
+
+ error = elapi_dsp_msg(E_TARGET_DEBUG, dispatcher, NULL, "a", "b", "c", "d", E_EOARG);
+ if (error) {
+ elapi_destroy_event_template(template);
+ printf("Failed to log event! %d\n", error);
+ return error;
+ }
+
+ elapi_destroy_event_template(template);
+
+ elapi_internal_print_dispatcher(dispatcher);
+
+ elapi_destroy_dispatcher(dispatcher);
+
+ return error;
+}
+
+
+/* Main function of the unit test */
+
+int main(int argc, char *argv[])
+{
+ int error = 0;
+
+ printf("Start\n");
+ if ((error = simple_event_test()) ||
+ (error = complex_event_test())) {
+ printf("Failed!\n");
+ }
+ else printf("Success!\n");
+ /* Add other tests here ... */
+ return error;
+}
diff --git a/common/elapi/elapi_test/elapi_ut.conf b/common/elapi/elapi_test/elapi_ut.conf
new file mode 100644
index 000000000..d15a4550d
--- /dev/null
+++ b/common/elapi/elapi_test/elapi_ut.conf
@@ -0,0 +1,97 @@
+; This is a sample configuration file for ELAPI
+
+; The dispatcher section defines general configuration
+; for the ELAPI. It has following configuration parameters:
+;
+; targets - (required)
+; Defines possible logical destinations where message can be sent.
+; It is one of the arguments of the calling interface. It is numeric.
+; It is done this way for performance reasons so it is faster to compare.
+; But in the configuration it is easier to deal with targets as strings.
+; To overcome this issue each target is assigned a number in the INI file.
+; The ELAPI convention is to have three default targets:
+; "debug", "audit" and "log" but application developers can add others as needed.
+; The default value for debug target is 1, for audit 2 and log is 4.
+; Changing the value defined for debug to be 7 ( logical OR of 1, 2 and 4)
+; will result in all messages sent into debug log.
+; This might be convenient during troubleshooting and would allow seeing all
+; events emitted by the application in one place.
+; If you want the event to be sent into two targets at the same time
+; add a target with different name but same value.
+; For example if the log events need to go to local and remote files
+; in parallel you would create another target: logremote
+; and give it same value as log (which by convention is 4)
+
+
+
+[dispatcher]
+targets=debug, audit, log
+
+; Inside section for each target the following parameters can be defined:
+;
+; value - (optional)
+; Stores the value associated with this target.
+; If the bit-wise AND of this value and the value provided by caller
+; of the interface is greater than 0 the event is logged into the
+; target destination. If omitted all events are sent to this target.
+; sinks - (required)
+; Defines the list of the sink names that need to be loaded
+; each will have its own section.
+; Only one of the sinks is active - first in the list.
+; The list contains sinks in the fail over order.
+;
+
+[debug]
+value = 1
+sinks = debugfile, stderr
+
+[audit]
+value = 2
+sinks = auditfile, syslog
+
+[log]
+value = 4
+sinks = logfile, syslog
+
+; Each sink needs to have it's own section.
+;
+; COMMON FOR EVERY SINK
+;
+; provider - (required)
+; Defines the name of the sink or the special reserved word to
+; indecate that it is a sink provided natively by ELAPI library.
+;
+; Special sinks provided natively by ELAPI are:
+; file
+; stderr
+; syslog
+;
+; Example:
+; provider=file
+;
+; this would mean the destination for this sink is a file.
+;
+; If the sink is provided as an external plugin
+; the syntax should be the following:
+;
+; provider=custom_audit
+;
+; In this case the ELAPI will try to load shared library with the name
+; constructed using specified value. In the given example
+; ELAPI will try to load libelapi_sink_custom_audit.so library.
+; The general pattern is: libelapi_sink_<source>.so
+
+[debugfile]
+provider=file
+
+[logfile]
+provider=file
+
+[auditfile]
+provider=file
+
+[stderr]
+provider=stderr
+
+[syslog]
+provider=syslog
diff --git a/common/elapi/elapi_test/m4/.dir b/common/elapi/elapi_test/m4/.dir
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/common/elapi/elapi_test/m4/.dir