summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2018-03-20 13:09:08 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2018-04-05 15:46:33 +0200
commitee2e866b416dc295d37a1f283feac64d7e809119 (patch)
tree171dc658a8d4225ef4f75f0b80a3a5268d8ee9c8
parentcb782b99ff51fe55f397d7cdcb9a442ea1485e4c (diff)
implement basic summary logger (in separate subdir)
-rw-r--r--Common.cfg3
-rw-r--r--libsummarylogger/Makefile100
-rw-r--r--libsummarylogger/Makefile.cfg406
-rw-r--r--libsummarylogger/Makefile.genrules174
-rw-r--r--libsummarylogger/SummaryLogger.cc226
-rw-r--r--libsummarylogger/SummaryLogger.hh96
-rwxr-xr-xmsc/gen_links.sh2
7 files changed, 1006 insertions, 1 deletions
diff --git a/Common.cfg b/Common.cfg
index bf0a7527..d6decbb8 100644
--- a/Common.cfg
+++ b/Common.cfg
@@ -10,7 +10,8 @@ LogFile := "%e-%c-%h-%r.%s"
AppendFile := Yes;
SourceInfoFormat := Single;
LogSourceInfo := Yes;
-LoggerPlugins := { JUnitLogger := "libjunitlogger2" }
+LoggerPlugins := { JUnitLogger := "libjunitlogger2",
+ SummaryLogger := "libsummarylogger" }
FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING | DEBUG_ENCDEC;
ConsoleMask := ERROR | WARNING | TESTCASE | USER;
diff --git a/libsummarylogger/Makefile b/libsummarylogger/Makefile
new file mode 100644
index 00000000..ef64c5dc
--- /dev/null
+++ b/libsummarylogger/Makefile
@@ -0,0 +1,100 @@
+##############################################################################
+# Copyright (c) 2018 sysmocom - s.f.m.c. GmbH
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Neels Hofmeyr
+#
+##############################################################################
+# Makefile for the SummaryLogger plugin. Unfortunately, we'll need four different
+# libraries for each plugin... Plugin version information must be
+# synchronized with the code.
+
+TOP := .
+include Makefile.cfg
+
+LIB_DIR := /usr/lib/titan
+INCLUDE_DIR := /usr/include/titan
+
+MAJOR := 0
+MINOR := 0
+
+SOURCES := SummaryLogger.cc
+STATIC_SOURCES := ${SOURCES}
+HEADERS := $(SOURCES:.cc=.hh)
+OBJECTS := $(SOURCES:.cc=.o)
+OBJECTS_RT2 := $(addprefix FT/,$(OBJECTS))
+
+SHARED_LIB := libsummarylogger.so
+SHARED_LIB_RT2 := libsummarylogger-rt2.so
+SHARED_LIB_PARALLEL := libsummarylogger-parallel.so
+SHARED_LIB_PARALLEL_RT2 := libsummarylogger-parallel-rt2.so
+
+CPPFLAGS += -I$(INCLUDE_DIR)
+
+CXXFLAGS += -I$(INCLUDE_DIR) -DLINUX
+
+LDFLAGS_ORIG := $(LDFLAGS)
+LDFLAGS += -g -L/usr/lib/titan -Wl,-soname,$(SHARED_LIB).$(MAJOR) -o $(SHARED_LIB).$(MAJOR).$(MINOR)
+LDFLAGS_RT2 += $(LDFLAGS_ORIG) -g -L$(LIB_DIR) -Wl,-soname,$(SHARED_LIB_RT2).$(MAJOR) -o $(SHARED_LIB_RT2).$(MAJOR).$(MINOR)
+LDFLAGS_PARALLEL += $(LDFLAGS_ORIG) -g -L$(LIB_DIR) -Wl,-soname,$(SHARED_LIB_PARALLEL).$(MAJOR) -o $(SHARED_LIB_PARALLEL).$(MAJOR).$(MINOR)
+LDFLAGS_PARALLEL_RT2 += $(LDFLAGS_ORIG) -g -L$(LIB_DIR) -Wl,-soname,$(SHARED_LIB_PARALLEL_RT2).$(MAJOR) -o $(SHARED_LIB_PARALLEL_RT2).$(MAJOR).$(MINOR)
+
+LIBS := -lttcn3-dynamic
+LIBS_RT2 := -lttcn3-rt2-dynamic
+LIBS_PARALLEL := -lttcn3-parallel-dynamic
+LIBS_PARALLEL_RT2 := -lttcn3-rt2-parallel-dynamic
+
+TARGETS := $(SHARED_LIB) $(SHARED_LIB_PARALLEL) $(SHARED_LIB_RT2) $(SHARED_LIB_PARALLEL_RT2)
+# .so with .major appended:
+TARGETS_MAJOR := $(addsuffix .$(MAJOR), $(TARGETS))
+# .so with .major.minor appended:
+TARGETS_MAJOR_MINOR := $(addsuffix .$(MINOR), $(TARGETS_MAJOR))
+
+# OBJECTS_RT2, TARGETS_MAJOR and TARGETS_MAJOR_MINOR are non-standard make variables,
+# not taken into account by "clean" in Makefile.genrules
+# Delete them as "miscellaneous" files.
+TOBECLEANED := $(OBJECTS_RT2) $(TARGETS_MAJOR) $(TARGETS_MAJOR_MINOR)
+
+all run: $(TARGETS)
+
+$(SHARED_LIB): $(OBJECTS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) $? $(LIBS) -shared
+ ln -sf $@.$(MAJOR).$(MINOR) $@.$(MAJOR)
+ ln -sf $@.$(MAJOR) $@
+
+$(SHARED_LIB_RT2): $(OBJECTS_RT2)
+ $(CXX) $(CPPFLAGS_RT2) $(CXXFLAGS) $(LDFLAGS_RT2) $? $(LIBS_RT2) -shared
+ ln -sf $@.$(MAJOR).$(MINOR) $@.$(MAJOR)
+ ln -sf $@.$(MAJOR) $@
+
+$(SHARED_LIB_PARALLEL): $(OBJECTS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS_PARALLEL) $? $(LIBS_PARALLEL) -shared
+ ln -sf $@.$(MAJOR).$(MINOR) $@.$(MAJOR)
+ ln -sf $@.$(MAJOR) $@
+
+$(SHARED_LIB_PARALLEL_RT2): $(OBJECTS_RT2)
+ $(CXX) $(CPPFLAGS_RT2) $(CXXFLAGS) $(LDFLAGS_PARALLEL_RT2) $? $(LIBS_PARALLEL_RT2) -shared
+ ln -sf $@.$(MAJOR).$(MINOR) $@.$(MAJOR)
+ ln -sf $@.$(MAJOR) $@
+
+$(OBJECTS): $(SOURCES) $(HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $?
+
+# The `-o $@' stuff is necessary, otherwise the result will be put into the
+# current directory.
+$(OBJECTS_RT2): $(SOURCES)
+ mkdir -p FT
+ $(CXX) $(CPPFLAGS_RT2) $(CXXFLAGS) -c $? -o $@
+
+dep:
+ @echo Doing nothing...
+
+install: $(SHARED_LIB) $(SHARED_LIB_RT2) $(SHARED_LIB_PARALLEL) $(SHARED_LIB_PARALLEL_RT2)
+ mkdir -p $(LIB_DIR)
+ cp $(SHARED_LIB)* $(SHARED_LIB_RT2)* $(SHARED_LIB_PARALLEL)* $(SHARED_LIB_PARALLEL_RT2)* $(LIB_DIR)
+
+include Makefile.genrules
diff --git a/libsummarylogger/Makefile.cfg b/libsummarylogger/Makefile.cfg
new file mode 100644
index 00000000..4b5d15fa
--- /dev/null
+++ b/libsummarylogger/Makefile.cfg
@@ -0,0 +1,406 @@
+###############################################################################
+# Copyright (c) 2000-2017 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Baji, Laszlo
+# Balasko, Jeno
+# Baranyi, Botond
+# Beres, Szabolcs
+# Delic, Adam
+# Feher, Csaba
+# Forstner, Matyas
+# Kovacs, Ferenc
+# Kremer, Peter
+# Lovassy, Arpad
+# Ormandi, Matyas
+# Pandi, Krisztian
+# Raduly, Csaba
+# Szabados, Kristof
+# Szabo, Janos Zoltan – initial implementation
+# Szalai, Endre
+# Zalanyi, Balazs Andor
+#
+###############################################################################
+ifndef TOP
+$(error please define TOP)
+endif
+
+# Configurations for the Free Open Source Software version, if available
+ifneq ($(wildcard $(TOP)/MakefileFOSS.cfg), )
+ include $(TOP)/MakefileFOSS.cfg
+else
+ # Set whether licensing is enabled: (yes or no)
+ LICENSING := yes
+
+ # Set whether to send usage statistics: (yes or no)
+ USAGE_STATS := yes
+endif
+
+# Define SRCDIR to the root of Titan sources to enable out-of-tree build
+#SRCDIR := ${HOME}/workspace/TTCNv3
+
+# Set these variables to fit your system:
+
+# The target directory where the Test Executor will be installed to:
+TTCN3_DIR := /usr/lib/titan
+
+# New installed files are run from make install, so they are added to the PATH
+PATH := ${PATH}:${TTCN3_DIR}/bin
+
+# Set it to 'yes' for developing or 'no' for release.
+DEBUG := no
+
+# Set it to 'yes' to generate coverage data (requires DEBUG=yes)
+COVERAGE := no
+
+# Set it to 'yes' to enable extra features for the debugger UI in single mode
+# (this requires an extra library when linking the generated code).
+# Set it to 'no' to use a simplified debugger UI.
+ADVANCED_DEBUGGER_UI := no
+
+# Your platform. Allowed values: SOLARIS, SOLARIS8, LINUX, FREEBSD,
+# WIN32. Decided automagically if not defined (recommended).
+# PLATFORM :=
+
+# Uncomment the following for "native" Win32
+#MINGW := -DMINGW -mno-cygwin
+
+# Utility for building lexical analyzers (tokenizers):
+FLEX := flex
+
+# Utility for building parsers:
+BISON := bison
+
+# The C compiler used for building:
+CC := gcc
+
+# The C++ compiler used for building:
+CXX := g++
+
+# generate userguide at install ('make release' always generates it)
+GEN_PDF := no
+
+# Set whether to build the CLI for MC: (yes or no)
+CLI := yes
+
+# set whether to build the JNI native library: (yes or no)
+JNI := yes
+
+# Build the LTTng-UST logger plugin
+LTTNGUSTLOGGER := no
+
+# Path of the Java Developement Kit installation
+# (must be at least version 1.5.0_10)
+JDKDIR := /usr/lib/jvm/default-java
+
+# Path of OpenSSL installation: (always required)
+OPENSSL_DIR := default
+
+# Location of libxml2
+XMLDIR := default
+
+# Flags for the C(++) preprocessor:
+# Prevent a warning about yyinput being defined but not used
+CPPFLAGS += -DYY_NO_INPUT
+
+# Flags shared between C and C++
+COMPILERFLAGS := -Wall
+
+# 'Hardcore' settings
+# Unlikely to work for GCC below 4.x
+#COMPILERFLAGS += -Werror -pedantic -W -Wno-unused-parameter -O1
+
+# Flags for the C compiler.
+# std=gnu9x shuts up warnings about long long and variadic macros
+CCFLAGS += $(COMPILERFLAGS) -std=gnu9x
+
+# Flags for the C++ compiler:
+CXXFLAGS += $(COMPILERFLAGS) -Wno-long-long
+
+# The command for maintaining static libraries:
+AR := ar
+
+# The command for building the shared libraries:
+# It shall be set to either "$(CXX) -G" or "$(CXX) -shared" depending
+# on the linker you use.
+LD = $(CXX) -shared
+
+# Flags for linking binary executables (e.g. for profiling):
+LDFLAGS += $(MINGW)
+
+# The command for removing symbol table from the executables:
+STRIP := strip
+
+# Flags for flex:
+FLEXFLAGS := -B -s -Cr
+
+# Flags for bison:
+BISONFLAGS := -d
+
+# Override common settings with personal preferences if needed
+-include $(TOP)/Makefile.personal
+
+## ## ## ## ## Variables below are automatically set ## ## ## ## ##
+
+ifeq ($(DEBUG), yes)
+ CPPFLAGS += -DMEMORY_DEBUG -DFATAL_DEBUG
+else
+ CPPFLAGS += -DNDEBUG
+endif
+
+# MingW flags need to be passed to the preprocessor during ctags configure
+CPPFLAGS += $(MINGW)
+
+ifeq ($(DEBUG), yes)
+ CCFLAGS += -g
+ CCFLAGS += -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align \
+ -Wstrict-prototypes
+else
+ifeq ($(COVERAGE), yes)
+ CCFLAGS += -O0
+else
+ CCFLAGS += -O2
+endif
+endif
+
+# Only the default Cygwin compiler can be used for Mingw.
+# Its version is 3.4.4, too low.
+ifndef MINGW
+# Only GCC 4.x understands -Wno-variadic-macros, comment out for lower versions
+#CXXFLAGS += -Wno-variadic-macros
+endif
+
+ifeq ($(DEBUG), yes)
+ CXXFLAGS += -g
+ CXXFLAGS += -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align
+else
+ifeq ($(COVERAGE), yes)
+ CXXFLAGS += -O0
+else
+ CXXFLAGS += -O2
+endif
+endif
+
+# Flags for the C/C++ compilers to generate dependency list (-M or -MM
+# for gcc or clang, -xM or -xM1 for Sun C compiler).
+
+ifneq ($(filter gcc% clang%, $(notdir $(CC))),)
+CCDEPFLAG := -MM
+CXXDEPFLAG := -MM
+else
+# Let's hope it's the Sun compiler
+CCDEPFLAG := -xM1
+CXXDEPFLAG := -xM1
+endif
+
+ifeq ($(DEBUG), yes)
+ LDFLAGS += -g
+endif
+
+
+ifeq ($(DEBUG), yes)
+ FLEXFLAGS += -b -p
+# FLEXFLAGS += -d
+else
+# Comment out the line below if flex version 2.5.4[a] is used.
+# This version does not support optimized tables together with yylineno.
+ FLEXFLAGS += -Cfe
+endif
+
+
+ifeq ($(DEBUG), yes)
+ BISONFLAGS += -t -v
+endif
+
+ifeq ($(COVERAGE), yes)
+ CPPFLAGS += -DCOVERAGE_BUILD
+ COMPILERFLAGS += -fprofile-arcs -ftest-coverage
+ LDFLAGS += -fprofile-arcs -ftest-coverage -lgcov
+endif
+
+ifeq ($(ADVANCED_DEBUGGER_UI), yes)
+ CPPFLAGS += -DADVANCED_DEBUGGER_UI
+endif
+
+# Directory which contains the code for POSIX regular expression handling.
+# It is needed on platforms where the system's libc does not support POSIX
+# regexps. This is the case for Mingw.
+ifdef MINGW
+# If your platform isn't Mingw but lacks POSIX regular expressions,
+# comment out the ifdef/endif
+REGEX_DIR := /mnt/TTCN/Tools/CPP/regex-glibc-2.5.1
+endif
+
+# Warning! Never set the above directories to /usr.
+# If your OpenSSL, Qt is installed under /usr you'd better set
+# these variables to a fake (non-existent) directory. If this is the case,
+# gcc will find the required headers and libs anyway, but -I/usr/include
+# might confuse it.
+
+# This is especially true on Windows with Mingw installed as a Cygwin package.
+# -mno-cygwin alters the include serach path to find the Mingw headers.
+# Passing -I/usr/include would cause the Mingw compiler to read the Cygwin
+# headers, and the compilation will fail.
+
+# The path name where the LaTeX binaries can be found. (optional)
+# If this variable is not defined the User Documentation will not be built
+# or installed.
+TEXPATH := /usr/local/teTeX2.0.2/bin/sparc-sun-solaris2.8
+
+
+###########################################################################
+# You don't have to alter anything below this line.
+
+# Setting PLATFORM automagically if it is not defined.
+ifndef PLATFORM
+PLATFORM1 := $(shell uname -s)
+PLATFORM2 := $(shell uname -r)
+PLATFORM3 := $(shell uname -m)
+ifeq ($(PLATFORM1), SunOS)
+ ifneq ($(PLATFORM2), 5.6)
+ PLATFORM := SOLARIS8
+ PLATSUFFIX = -sol8
+ else
+ PLATFORM := SOLARIS
+ PLATSUFFIX = -sol6
+ endif # 5.8
+endif # SunOS
+ifeq ($(PLATFORM1), Linux)
+ PLATFORM := LINUX
+ PLATSUFFIX = -linux
+endif # Linux
+ifeq ($(PLATFORM1), FreeBSD)
+ PLATFORM := FREEBSD
+endif # FreeBSD
+ifeq ($(findstring CYGWIN, $(PLATFORM1)), CYGWIN)
+ PLATFORM := WIN32
+ PLATSUFFIX = -cygwin
+endif # CYGWIN
+endif # ifndef PLATFORM
+ifndef PLATFORM
+ PLATFORM := $(error PLEASE CHECK THE PLATFORM SETTINGS)
+endif # ifndef PLATFORM
+
+# Derived variables, which you should never change.
+
+ifdef MINGW
+
+# Target directory for binaries:
+BINDIR := $(TTCN3_DIR)/programs
+# Target directory for manual pages:
+MANDIR := $(TTCN3_DIR)/manuals
+# Target directory for other files (nedit/xemacs additions, etc.)
+ETCDIR := $(TTCN3_DIR)
+
+else
+
+# Target directory for binaries:
+BINDIR := $(TTCN3_DIR)/bin
+# Target directory for manual pages:
+MANDIR := $(TTCN3_DIR)/man
+# Target directory for other files (nedit/xemacs additions, etc.)
+ETCDIR := $(TTCN3_DIR)/etc
+
+endif
+
+# Target directory for header files:
+INCDIR := $(TTCN3_DIR)/include
+# Target directory for libraries:
+LIBDIR := $(TTCN3_DIR)/lib
+# Target directory for html help pages:
+HELPDIR := $(TTCN3_DIR)/help
+# Target directory for the documentation:
+DOCDIR := $(TTCN3_DIR)/doc
+# Target directory for the demo "Hello World!"
+DEMODIR := $(TTCN3_DIR)/demo
+
+CPPFLAGS += -D$(PLATFORM)
+
+ifeq ($(LICENSING), yes)
+ CPPFLAGS += -DLICENSE
+ LICENSE_LIBS = -L$(OPENSSL_DIR)/lib -lcrypto
+else
+ LICENSE_LIBS :=
+endif
+
+ifeq ($(USAGE_STATS), yes)
+ CPPFLAGS += -DUSAGE_STATS
+endif
+
+# Windows/Cygwin specific settings
+ifeq ($(PLATFORM), WIN32)
+ EXESUFFIX := .exe
+ LDFLAGS += -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc
+
+ ifdef MINGW
+ MINGW_LIBS := -lgdi32
+ endif
+else
+ EXESUFFIX :=
+
+ ifdef MINGW
+ $(error MingW not supported on $(PLATFORM))
+ endif
+
+ CCFLAGS += -fPIC
+ CXXFLAGS += -fPIC
+ LDFLAGS += -fPIC
+endif
+
+# Try to use -isystem for Qt headers (this is a GCC feature).
+# This avoids the myriads of warnings issued for the Qt headers.
+ifneq (,$(findstring SOLARIS,$(PLATFORM)))
+# Avoid using it on Solaris, because
+# -isystem puts an implicit "extern C" around every system header,
+# which causes compilation of Qt headers to fail miserably :-(
+# (this could be fixed by recompiling GCC)
+ INCLUDEQT := -I
+else
+# Not Solaris
+ INCLUDEQT := -isystem
+endif
+
+# Setting EPOLL usage - It is Linux specific
+ifeq ($(PLATFORM), LINUX)
+ CPPFLAGS += -DUSE_EPOLL
+endif
+
+ifdef ALPINE_LINUX
+ CPPFLAGS += -DALPINE_LINUX
+endif
+
+#not useful in compiler2/asn1, for example
+#REL_DIR := $(notdir $(CURDIR))
+
+export ABS_TOP := $(abspath $(TOP))/
+ifeq "$(ABS_TOP)" "/"
+# abspath only from GNU make 3.81, here's a replacement
+ABS_TOP := $(shell cd $(TOP); pwd)/
+endif
+
+ifdef SRCDIR
+
+REL_DIR := $(subst $(ABS_TOP),,$(CURDIR))
+
+ABS_SRC := $(SRCDIR)/$(REL_DIR)
+
+CPPFLAGS += -I. -I$(ABS_SRC)
+
+SRC_TOP := $(SRCDIR)
+
+else
+
+ABS_SRC := $(abspath $(CURDIR))
+ifeq "$(ABS_SRC)" ""
+ABS_SRC := $(shell cd $(CURDIR); pwd)
+endif
+
+SRC_TOP := $(TOP)
+
+endif
+
+
diff --git a/libsummarylogger/Makefile.genrules b/libsummarylogger/Makefile.genrules
new file mode 100644
index 00000000..f52054b5
--- /dev/null
+++ b/libsummarylogger/Makefile.genrules
@@ -0,0 +1,174 @@
+#############################################################################
+# Copyright (c) 2000-2017 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Balasko, Jeno
+# Baranyi, Botond
+# Forstner, Matyas
+# Kovacs, Ferenc
+# Pandi, Krisztian
+# Raduly, Csaba
+# Szabo, Janos Zoltan – initial implementation
+#
+##############################################################################
+# General stuff (to be included at the end of makefiles). The
+# following variables are used: DEPFILES, SUBDIRS...
+
+tags: $(SOURCES)
+ifdef SUBDIRS
+ @for i in $(SUBDIRS) ; do \
+ (cd $$i && $(MAKE) tags) || exit 1; \
+ done
+endif
+ etags --members *.hh *.h *.c *.cc
+
+dep:
+ifdef SUBDIRS
+ @for i in $(SUBDIRS) ; do \
+ (cd $$i && $(MAKE) dep) || exit 1; \
+ done
+endif
+ifdef DEPFILES
+ $(MAKE) $(DEPFILES)
+endif
+
+clean:
+ifdef SUBDIRS
+ @for i in $(SUBDIRS) ; do \
+ (cd $$i && $(MAKE) clean) || exit 1; \
+ done
+endif
+ $(RM) $(TARGETS) $(OBJECTS) $(TOBECLEANED)
+
+distclean:
+ifdef SUBDIRS
+ @for i in $(SUBDIRS) ; do \
+ (cd $$i && $(MAKE) distclean) || exit 1; \
+ done
+endif
+ $(RM) $(TARGETS) $(OBJECTS) $(TOBECLEANED) \
+ $(GENERATED_HEADERS) $(GENERATED_SOURCES) \
+ $(GENERATED_OTHERS) \
+ $(DEPFILES) TAGS *.gcno *.gcda
+
+# This target allows us to "make ../clean"
+../% $(foreach dir, $(SUBDIRS), $(dir)/%):
+ cd $(dir $@) && $(MAKE) $(notdir $@)
+
+# General rules to compile C(++) files.
+#
+# These macros implement "silent" rules during building.
+# Define the V make variable or environment variable to a nonzero value to get
+# the exact call to the compiler: e.g. make V=1
+#
+# Define the VD variable to get the exact (verbose) action while
+# generating dependencies.
+#
+NULL :=
+SPACE := ${NULL} ${NULL}
+
+DEF_V := 0
+DEF_VD:= 0
+
+V_CC_0 = @echo " (CC) " $<;$(SPACE)
+V_CXX_0 = @echo " (C++) " $<;$(SPACE)
+V_DEP_0 = @echo " (dep) " $<;$(SPACE)
+
+V_CC_ = $(V_CC_$(DEF_V))
+V_CXX_ = $(V_CXX_$(DEF_V))
+V_DEP_ = $(V_DEP_$(DEF_VD))
+
+V_CC = $(V_CC_$(V))
+V_CXX = $(V_CXX_$(V))
+V_DEP = $(V_DEP_$(VD))
+
+%.o: %.c
+ $(V_CC)$(CC) -c $(CPPFLAGS) $(CCFLAGS) $< -o $@
+
+# Special rule for building profmerge files
+%.profmerge.o: %.cc
+ $(V_CXX)$(CXX) -c -DPROF_MERGE $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+%.o: %.cc
+ $(V_CXX)$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+# Preprocess C/C++ files
+%.i: %.c
+ $(CC) -E $(CPPFLAGS) $(CCFLAGS) \
+ $< > $@
+
+%.ii: %.cc
+ $(CXX) -E $(CPPFLAGS) $(CXXFLAGS) \
+ $< > $@
+
+# General rules to create the dependency file.
+
+%.d: %.c
+ $(V_DEP)set -e; $(CC) $(CCDEPFLAG) $(CPPFLAGS) $< \
+ | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@; \
+ [ -s $@ ] || rm -f $@
+
+%.d: %.cc
+ $(V_DEP)set -e; $(CXX) $(CXXDEPFLAG) $(CPPFLAGS) $< \
+ | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@; \
+ [ -s $@ ] || rm -f $@
+
+ifdef DEPFILES
+ ifndef MAKECMDGOALS
+ DEPFILES_NEEDED := yes
+ else
+ DEPFILES_NEEDED := $(filter-out clean distclean, $(MAKECMDGOALS))
+ endif
+ ifdef DEPFILES_NEEDED
+ DEPFILES_INCLUDE := $(filter-out $(MAKECMDGOALS), $(DEPFILES))
+ ifdef DEPFILES_INCLUDE
+ ifeq (,$(findstring n,$(MAKEFLAGS)))
+ # -n was *not* given to make
+ -include $(DEPFILES_INCLUDE)
+ endif
+ endif
+ endif
+endif
+
+# Building PDFs from man pages (for MinGW)
+%.pdf: %.1
+ man2pdf ./$< $@
+# The "./" prefix is important, it tells man that the input is a filename,
+# so it shouldn't search through MANPATH.
+
+# List of fake targets:
+.PHONY: all install tags dep clean distclean
+
+# Disable all built-in suffix rules of make
+.SUFFIXES:
+
+# Do not delete generated headers while building .d files
+# (.PRECIOUS would also keep them if make is killed)
+.SECONDARY: $(GENERATED_HEADERS)
+
+ifdef SRCDIR
+
+REQUIRED_MAKE_VERSION = 3.81
+# 3.80 is known not to work; 3.82 does work
+REAL_MAKE_VERSION = $(firstword $(MAKE_VERSION))
+EARLIER_MAKE_VERSION = $(firstword $(sort $(REAL_MAKE_VERSION) $(REQUIRED_MAKE_VERSION)))
+ifeq "$(REQUIRED_MAKE_VERSION)" "$(EARLIER_MAKE_VERSION)"
+
+# Declare a search path for every source.
+# "vpath %.cc $(ABS_SRC)" would lump in generated .cc files,
+# potentially picking up generated files laying around in the source dir
+# instead of generating them in the build dir.
+$(foreach src, $(STATIC_SOURCES) $(ORIGINATORS), $(eval vpath $(src) $(ABS_SRC)))
+
+else
+
+# alas, make 3.80 can't cope with the "foreach/eval vpath" above
+#$(warning no OOBE with make $(MAKE_VERSION))
+
+endif
+
+endif
diff --git a/libsummarylogger/SummaryLogger.cc b/libsummarylogger/SummaryLogger.cc
new file mode 100644
index 00000000..9cadb55a
--- /dev/null
+++ b/libsummarylogger/SummaryLogger.cc
@@ -0,0 +1,226 @@
+/******************************************************************************
+ * Copyright (c) 2018 sysmocom - s.f.m.c. GmbH
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Neels Hofmeyr
+ *
+ ******************************************************************************/
+#include "SummaryLogger.hh"
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <sys/time.h>
+
+extern "C" {
+ ILoggerPlugin *create_plugin() { return new SummaryLogger(); }
+ void destroy_plugin(ILoggerPlugin *plugin) { delete plugin; }
+}
+
+
+TestCase::TestCase()
+{
+ reset();
+}
+
+void TestCase::reset()
+{
+ verdict = Unbound;
+ expected_verdict = Skipped;
+ tc_name = "";
+ module_name = "";
+}
+
+TestSuite::~TestSuite()
+{
+ for (TestCases::const_iterator it = testcases.begin(); it != testcases.end(); ++it) {
+ delete (*it);
+ }
+}
+
+SummaryLogger::SummaryLogger()
+ : filename_stem_(NULL), testsuite_name_(mcopystr("Titan")), out_filename_(NULL), file_stream_(NULL)
+{
+ major_version_ = 1;
+ minor_version_ = 0;
+ name_ = mcopystr("SummaryLogger");
+ help_ = mcopystr("SummaryLogger writes a brief summary, keeping track of expected-to-fail items");
+}
+
+SummaryLogger::~SummaryLogger()
+{
+ close_file();
+
+ Free(name_);
+ Free(help_);
+ Free(out_filename_);
+ Free(testsuite_name_);
+ Free(filename_stem_);
+ name_ = help_ = out_filename_ = filename_stem_ = NULL;
+ file_stream_ = NULL;
+}
+
+void SummaryLogger::init(const char *)
+{
+ fprintf(stderr, "Initializing `%s' (v%u.%u): %s\n", name_, major_version_, minor_version_, help_);
+}
+
+void SummaryLogger::fini()
+{
+}
+
+void SummaryLogger::set_parameter(const char *parameter_name, const char *parameter_value)
+{
+ if (!strcmp("filename_stem", parameter_name)) {
+ if (filename_stem_ != NULL)
+ Free(filename_stem_);
+ filename_stem_ = mcopystr(parameter_value);
+ } else if (!strcmp("testsuite_name", parameter_name)) {
+ if (filename_stem_ != NULL)
+ Free(testsuite_name_);
+ testsuite_name_ = mcopystr(parameter_value);
+ } else {
+ fprintf(stderr, "Unsupported parameter: `%s' with value: `%s'\n",
+ parameter_name, parameter_value);
+ }
+}
+
+void SummaryLogger::open_file(bool is_first) {
+ if (is_first) {
+ if (filename_stem_ == NULL) {
+ filename_stem_ = mcopystr("summary");
+ }
+ }
+
+ if (file_stream_ != NULL)
+ return;
+
+ if (!TTCN_Runtime::is_single() && !TTCN_Runtime::is_mtc())
+ return; // don't bother, only MTC has testcases
+
+ out_filename_ = mprintf("%s-%lu.log", filename_stem_, (unsigned long)getpid());
+
+ file_stream_ = fopen(out_filename_, "w");
+ if (!file_stream_) {
+ fprintf(stderr, "%s was unable to open log file `%s', reinitialization "
+ "may help\n", plugin_name(), out_filename_);
+ return;
+ }
+
+ is_configured_ = true;
+ testsuite.ts_name = testsuite_name_;
+}
+
+void SummaryLogger::close_file() {
+ if (file_stream_ != NULL) {
+ testsuite.write(file_stream_);
+ fclose(file_stream_);
+ file_stream_ = NULL;
+ }
+ if (out_filename_) {
+ Free(out_filename_);
+ out_filename_ = NULL;
+ }
+}
+
+void SummaryLogger::log(const TitanLoggerApi::TitanLogEvent& event,
+ bool /*log_buffered*/, bool /*separate_file*/,
+ bool /*use_emergency_mask*/)
+{
+ if (file_stream_ == NULL) return;
+
+ const TitanLoggerApi::LogEventType_choice& choice = event.logEvent().choice();
+
+ switch (choice.get_selection()) {
+ case TitanLoggerApi::LogEventType_choice::ALT_testcaseOp:
+ {
+ const TitanLoggerApi::TestcaseEvent_choice& tcev = choice.testcaseOp().choice();
+
+ switch (tcev.get_selection()) {
+ case TitanLoggerApi::TestcaseEvent_choice::ALT_testcaseStarted:
+ testcase.tc_name = tcev.testcaseStarted().testcase__name();
+ // remember the start time
+ testcase.verdict = TestCase::Unbound;
+ break;
+
+ case TitanLoggerApi::TestcaseEvent_choice::ALT_testcaseFinished:
+ {
+ const TitanLoggerApi::TestcaseType& tct = tcev.testcaseFinished();
+ testcase.module_name = tct.name().module__name();
+
+ testcase.setTCVerdict(event);
+ testsuite.addTestCase(testcase);
+ testcase.reset();
+ break;
+ }
+
+ case TitanLoggerApi::TestcaseEvent_choice::UNBOUND_VALUE:
+ testcase.verdict = TestCase::Unbound;
+ break;
+ }
+
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ fflush(file_stream_);
+}
+
+void TestCase::writeTestCase(FILE* file_stream_) const{
+ fprintf(file_stream_, "%s.%s: %s\n", module_name.data(), tc_name.data(), verdict);
+ fflush(file_stream_);
+}
+
+void TestSuite::addTestCase(const TestCase& testcase) {
+ testcases.push_back(new TestCase(testcase));
+ all++;
+
+ if (testcase.verdict == TestCase::Fail) failed++;
+ else if (testcase.verdict == TestCase::Skipped) skipped++;
+ else if (testcase.verdict == TestCase::Error) error++;
+ else if (testcase.verdict == TestCase::Inconc) inconc++;
+}
+
+void TestSuite::write(FILE* file_stream_) {
+ for (TestCases::const_iterator it = testcases.begin(); it != testcases.end(); ++it) {
+ (*it)->writeTestCase(file_stream_);
+ }
+ fflush(file_stream_);
+}
+
+void TestCase::setTCVerdict(const TitanLoggerApi::TitanLogEvent& event){
+ TitanLoggerApi::Verdict tc_verdict = event.logEvent().choice().testcaseOp().choice().testcaseFinished().verdict();
+ switch (tc_verdict) {
+ case TitanLoggerApi::Verdict::UNBOUND_VALUE:
+ case TitanLoggerApi::Verdict::UNKNOWN_VALUE:
+ verdict = TestCase::Unbound;
+ break;
+
+ case TitanLoggerApi::Verdict::v0none:
+ verdict = TestCase::Skipped;
+ break;
+
+ case TitanLoggerApi::Verdict::v1pass:
+ verdict = TestCase::Pass;
+ break;
+
+ case TitanLoggerApi::Verdict::v2inconc:
+ verdict = TestCase::Inconc;
+ break;
+
+ case TitanLoggerApi::Verdict::v3fail:
+ verdict = TestCase::Fail;
+ break;
+
+ case TitanLoggerApi::Verdict::v4error:
+ verdict = TestCase::Error;
+ break;
+ }
+}
diff --git a/libsummarylogger/SummaryLogger.hh b/libsummarylogger/SummaryLogger.hh
new file mode 100644
index 00000000..a98533a9
--- /dev/null
+++ b/libsummarylogger/SummaryLogger.hh
@@ -0,0 +1,96 @@
+/******************************************************************************
+ * Copyright (c) 2018 sysmocom - s.f.m.c. GmbH
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Neels Hofmeyr
+ *
+ ******************************************************************************/
+#ifndef SummaryLogger_HH2
+#define SummaryLogger_HH2
+
+namespace TitanLoggerApi { class TitanLogEvent; }
+
+#ifndef TITAN_RUNTIME_2
+#include "RT1/TitanLoggerApi.hh"
+#else
+#include "RT2/TitanLoggerApi.hh"
+#endif
+
+#include "ILoggerPlugin.hh"
+#include <stdio.h>
+#include <string>
+#include <vector>
+
+struct TestCase {
+ static constexpr const char* Pass = "pass";
+ static constexpr const char* Inconc = "INCONCLUSIVE";
+ static constexpr const char* Fail = "FAIL";
+ static constexpr const char* Error = "ERROR";
+ static constexpr const char* Unbound = "UNBOUND";
+ static constexpr const char* Skipped = "skipped";
+
+ const char *expected_verdict;
+ const char *verdict;
+ std::string tc_name;
+ std::string module_name;
+
+ TestCase();
+
+ void writeTestCase(FILE* file_stream_) const;
+ void setTCVerdict(const TitanLoggerApi::TitanLogEvent& event);
+ void reset();
+};
+
+
+struct TestSuite {
+ typedef std::vector<TestCase*> TestCases;
+
+ std::string ts_name;
+ int all;
+ int skipped;
+ int failed;
+ int error;
+ int inconc;
+ TestCases testcases;
+
+ TestSuite():ts_name(""), all(0), skipped(0), failed(0), error(0), inconc(0) {}
+ ~TestSuite();
+
+ void addTestCase(const TestCase& element);
+ void write(FILE* file_stream_);
+};
+
+class SummaryLogger: public ILoggerPlugin
+{
+ public:
+ SummaryLogger();
+ virtual ~SummaryLogger();
+ inline bool is_static() { return false; }
+ void init(const char *options = 0);
+ void fini();
+
+ void log(const TitanLoggerApi::TitanLogEvent& event, bool log_buffered,
+ bool separate_file, bool use_emergency_mask);
+ void set_parameter(const char *parameter_name, const char *parameter_value);
+
+ virtual void open_file(bool is_first);
+ virtual void close_file();
+
+ private:
+ // parameters
+ char *filename_stem_;
+ char *testsuite_name_;
+ // working values
+ char *out_filename_;
+ char *expect_filename_;
+ TestSuite testsuite;
+ TestCase testcase;
+
+ FILE *file_stream_;
+};
+
+#endif // SummaryLogger_HH2
diff --git a/msc/gen_links.sh b/msc/gen_links.sh
index efb37703..18019e0f 100755
--- a/msc/gen_links.sh
+++ b/msc/gen_links.sh
@@ -66,6 +66,8 @@ DIR=$BASEDIR/titan.TestPorts.TELNETasp/src
FILES="TELNETasp_PT.cc TELNETasp_PT.hh TELNETasp_PortType.ttcn"
gen_links $DIR $FILES
+ln -s $BASEDIR/libsummarylogger/*.so* .
+
DIR=../library
FILES="General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc GSUP_Types.ttcn GSUP_Emulation.ttcn "