summaryrefslogtreecommitdiff
path: root/AudioManagerUtilities
diff options
context:
space:
mode:
authorChristian Linke <Christian.Linke@bmw.de>2016-02-11 07:28:47 +0100
committerChristian Linke <Christian.Linke@bmw.de>2016-02-15 09:00:59 +0100
commit5bcd206b9270d9a79e212f91723ea1a08a4d4859 (patch)
tree55b0cd4d07fbd7ebfd15d58d02e9cae6ae61b127 /AudioManagerUtilities
parent59080ecc2c8840fd85c561adea3f85f5344534a8 (diff)
downloadaudiomanager-5bcd206b9270d9a79e212f91723ea1a08a4d4859.tar.gz
* rework of the build structure, adopt to standard cmake package structure7.4
* check versions when loading the libs * introduction of the AudioManagerCore * give control plugin as file or directory * remove SQLITE * either find and use gmock or build and install it * fixed [Bug 411] * compile flag gnu11 is now used Signed-off-by: Christian Linke <Christian.Linke@bmw.de> Signed-off-by: Christian Linke <Christian.Linke@bmw.de>
Diffstat (limited to 'AudioManagerUtilities')
-rw-r--r--AudioManagerUtilities/CMakeLists.txt151
-rw-r--r--AudioManagerUtilities/include/CAmCommonAPIWrapper.h4
-rw-r--r--AudioManagerUtilities/include/CAmDltWrapper.h10
-rw-r--r--AudioManagerUtilities/include/CAmSocketHandler.h43
-rw-r--r--AudioManagerUtilities/include/sd-daemon.h286
-rw-r--r--AudioManagerUtilities/src/CAmDltWrapper.cpp108
-rw-r--r--AudioManagerUtilities/src/CAmSocketHandler.cpp3
-rwxr-xr-xAudioManagerUtilities/src/CAmWatchdog.cpp9
-rw-r--r--AudioManagerUtilities/src/sd-daemon.c534
-rw-r--r--AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp357
-rw-r--r--AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h87
-rw-r--r--AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt50
-rw-r--r--AudioManagerUtilities/test/CMakeLists.txt4
13 files changed, 689 insertions, 957 deletions
diff --git a/AudioManagerUtilities/CMakeLists.txt b/AudioManagerUtilities/CMakeLists.txt
index 69555fa..f859026 100644
--- a/AudioManagerUtilities/CMakeLists.txt
+++ b/AudioManagerUtilities/CMakeLists.txt
@@ -15,25 +15,22 @@
# For further information see http://www.genivi.org/.
#
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
-PROJECT(AudioManagerUtilities)
-
-set(AudioManagerUtilities_VERSION_MAJOR 1)
-set(AudioManagerUtilities_VERSION_MINOR 0)
-set(AudioManagerUtilities_VERSION_PATCH 0)
-set(AudioManagerUtilities_VERSION_STRING ${AudioManagerUtilities_VERSION_MAJOR}.${AudioManagerUtilities_VERSION_MINOR}.${AudioManagerUtilities_VERSION_PATCH})
+PROJECT(AudioManagerUtilities LANGUAGES CXX VERSION ${DAEMONVERSION})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
-SET(INCLUDE_FOLDER "include")
-INCLUDE_DIRECTORIES(
- ${INCLUDE_FOLDER}
+SET(AUDIOMANAGER_UTILITIES_INCLUDE
+ ${AUDIOMANAGER_UTILITIES}/include
${AUDIO_INCLUDE_FOLDER}
- ${AUDIOMANAGER_INCLUDE_FOLDER}
- ${DBUS_INCLUDE_DIRS}
${TCLAP_INCLUDE_DIR}
-)
+ ${AUDIOMANAGER_INCLUDE_FOLDER}
+ CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE)
+
+SET(AUDIO_MANAGER_UTILITIES_LIBS
+ ${CMAKE_DL_LIBS}
+ CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE)
IF (WITH_SHARED_UTILITIES)
SET(LIBRARY_TYPE SHARED)
@@ -47,79 +44,117 @@ SET(AUDIO_MANAGER_UTILITIES_SRCS_CXX
src/CAmSocketHandler.cpp)
if(WITH_SYSTEMD_WATCHDOG)
-
- pkg_check_modules(SYSTEMD libsystemd>=44)
- if (SYSTEMD_FOUND)
- message(STATUS "Found libsystemd-daemon, version: ${SYSTEMD_VERSION}")
- else (SYSTEMD_FOUND)
- message(STATUS "Did not find libsystemd-daemon, using own lib")
- endif(SYSTEMD_FOUND)
-
+ pkg_check_modules(SYSTEMD REQUIRED "libsystemd >= 44")
+
+ message(STATUS "Found libsystemd-daemon, version: ${SYSTEMD_VERSION}")
+ set (AUDIO_MANAGER_UTILITIES_LIBS
+ ${AUDIO_MANAGER_UTILITIES_LIBS}
+ ${SYSTEMD_LIBRARIES}
+ CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE)
+ set(AUDIOMANAGER_UTILITIES_INCLUDE
+ ${AUDIOMANAGER_UTILITIES_INCLUDE}
+ ${SYSTEMD_INCLUDEDIR})
set (AUDIO_MANAGER_UTILITIES_SRCS_CXX
${AUDIO_MANAGER_UTILITIES_SRCS_CXX}
src/CAmWatchdog.cpp)
- set (AM_LINK_LIBS
- ${AM_LINK_LIBS}
- ${SYSTEMD_LIBRARIES})
-endif(WITH_SYSTEMD_WATCHDOG)
-
-
-if (NOT SYSTEMD_FOUND)
- set (AUDIO_MANAGER_UTILITIES_SRCS_CXX
- ${AUDIO_MANAGER_UTILITIES_SRCS_CXX}
- src/sd-daemon.c)
-endif (NOT SYSTEMD_FOUND)
-
-
-IF (WITH_DBUS_WRAPPER)
- pkg_check_modules (DBUS "dbus-1 >= 1.4")
-ENDIF (WITH_DBUS_WRAPPER)
-IF (WITH_CAPI_WRAPPER)
- FIND_PACKAGE(CommonAPI REQUIRED)
-ENDIF (WITH_CAPI_WRAPPER)
+endif(WITH_SYSTEMD_WATCHDOG)
IF (WITH_DBUS_WRAPPER)
- SET (AM_LINK_LIBS
- ${AM_LINK_LIBS}
- ${DBUS_LIBRARIES})
- SET(AUDIO_MANAGER_UTILITIES_SRCS_CXX
+ pkg_check_modules (DBUS REQUIRED "dbus-1 >= 1.4")
+
+ set(AUDIOMANAGER_UTILITIES_INCLUDE
+ ${AUDIOMANAGER_UTILITIES_INCLUDE}
+ ${DBUS_INCLUDE_DIRS}
+ CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE)
+
+ set (AUDIO_MANAGER_UTILITIES_LIBS
+ ${AUDIO_MANAGER_UTILITIES_LIBS}
+ ${DBUS_LIBRARIES}
+ CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE)
+
+ set(AUDIO_MANAGER_UTILITIES_SRCS_CXX
${AUDIO_MANAGER_UTILITIES_SRCS_CXX}
src/CAmDbusWrapper.cpp)
ENDIF (WITH_DBUS_WRAPPER)
IF (WITH_CAPI_WRAPPER)
- SET(AM_LINK_LIBS
- ${AM_LINK_LIBS}
- ${DBUS_LIBRARIES}
- ${COMMON_API_LIBRARIES}
- ${COMMON_API_DBUS_LIBRARIES})
- SET(AUDIO_MANAGER_UTILITIES_SRCS_CXX
+ pkg_check_modules(COMMONAPI REQUIRED "CommonAPI >= 3.1.5")
+
+ set(AUDIO_MANAGER_UTILITIES_LIBS
+ ${AUDIO_MANAGER_UTILITIES_LIBS}
+ ${COMMONAPI_LIBRARIES}
+ ${COMMONAPI_DBUS_LIBRARIES}
+ CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE)
+
+ set(AUDIO_MANAGER_UTILITIES_SRCS_CXX
${AUDIO_MANAGER_UTILITIES_SRCS_CXX}
src/CAmCommonAPIWrapper.cpp)
- INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES}
- ${COMMONAPI_INCLUDE_DIRS})
+
+ set(AUDIOMANAGER_UTILITIES_INCLUDE
+ ${AUDIOMANAGER_UTILITIES_INCLUDE}
+ ${COMMONAPI_INCLUDE_DIRS}
+ CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE)
ENDIF (WITH_CAPI_WRAPPER)
+if(WITH_DLT)
+ pkg_check_modules(DLT REQUIRED "automotive-dlt >= 2.2.0")
+
+ add_definitions(${DLT_CFLAGS_OTHER})
+
+ set(AUDIO_MANAGER_UTILITIES_LIBS
+ ${AUDIO_MANAGER_UTILITIES_LIBS}
+ ${DLT_LIBRARIES}
+ CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE)
+
+ SET(AUDIOMANAGER_UTILITIES_INCLUDE
+ ${AUDIOMANAGER_UTILITIES_INCLUDE}
+ ${DLT_LIBRARY_DIRS}
+ CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE)
+endif(WITH_DLT)
+
+
+INCLUDE_DIRECTORIES(${AUDIOMANAGER_UTILITIES_INCLUDE})
+
ADD_LIBRARY(AudioManagerUtilities ${LIBRARY_TYPE} ${AUDIO_MANAGER_UTILITIES_SRCS_CXX})
-TARGET_LINK_LIBRARIES(AudioManagerUtilities ${AM_LINK_LIBS})
+TARGET_LINK_LIBRARIES(AudioManagerUtilities ${AUDIO_MANAGER_UTILITIES_LIBS})
-set_target_properties(AudioManagerUtilities PROPERTIES VERSION ${AudioManagerUtilities_VERSION_STRING} SOVERSION ${AudioManagerUtilities_VERSION_MAJOR})
+set_target_properties(AudioManagerUtilities PROPERTIES VERSION ${AudioManagerUtilities_VERSION} SOVERSION ${AudioManagerUtilities_VERSION_MAJOR})
IF (WITH_SHARED_UTILITIES)
INSTALL(TARGETS AudioManagerUtilities
LIBRARY DESTINATION lib
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ
COMPONENT bin)
- configure_file( ${CMAKE_SOURCE_DIR}/cmake/audiomanagerutilities.pc.in ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc DESTINATION lib/pkgconfig COMPONENT devel)
ELSE (WITH_SHARED_UTILITIES)
INSTALL(TARGETS AudioManagerUtilities
ARCHIVE DESTINATION lib
COMPONENT dev)
ENDIF (WITH_SHARED_UTILITIES)
-INSTALL(DIRECTORY "${AUDIOMANAGER_UTILITIES_INCLUDE}/"
- DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIB_INSTALL_SUFFIX}
+configure_file( ${CMAKE_SOURCE_DIR}/cmake/audiomanagerutilities.pc.in ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc @ONLY )
+install(FILES ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc DESTINATION lib/pkgconfig COMPONENT devel)
+
+configure_package_config_file (
+ ${CMAKE_SOURCE_DIR}/cmake/AudioManagerUtilitiesConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfig.cmake
+ INSTALL_DESTINATION lib/${LIB_INSTALL_SUFFIX}/cmake
+ PATH_VARS AUDIO_INCLUDE_FOLDER )
+
+write_basic_package_version_file(
+ ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfigVersion.cmake
+ VERSION ${DAEMONVERSION}
+ COMPATIBILITY SameMajorVersion )
+
+install(
+FILES ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfig.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfigVersion.cmake
+DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/cmake/AudioManagerUtilities-${DAEMONVERSION})
+
+INSTALL(DIRECTORY "include/"
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIB_INSTALL_SUFFIX}/AudioManagerUtilities
COMPONENT dev)
+
+if(WITH_TESTS)
+ add_subdirectory (test)
+endif(WITH_TESTS)
diff --git a/AudioManagerUtilities/include/CAmCommonAPIWrapper.h b/AudioManagerUtilities/include/CAmCommonAPIWrapper.h
index f9a6b01..82328d6 100644
--- a/AudioManagerUtilities/include/CAmCommonAPIWrapper.h
+++ b/AudioManagerUtilities/include/CAmCommonAPIWrapper.h
@@ -35,10 +35,6 @@
#include "audiomanagerconfig.h"
#include "CAmSocketHandler.h"
-#if COMMONAPI_VERSION_NUMBER < 300
-#error "CommonAPI versions < 300 are not supported."
-#endif
-
/**
* A Common-API wrapper class, which loads the common-api runtime and instantiates all necessary objects.
* It is implemented as singleton and usually instantiated at the beginning with CAmSocketHandler as parameter.
diff --git a/AudioManagerUtilities/include/CAmDltWrapper.h b/AudioManagerUtilities/include/CAmDltWrapper.h
index 7e4d2d4..d227929 100644
--- a/AudioManagerUtilities/include/CAmDltWrapper.h
+++ b/AudioManagerUtilities/include/CAmDltWrapper.h
@@ -131,7 +131,10 @@ public:
template<typename T = const char*> void append(const char* value)
{
#ifdef WITH_DLT
- dlt_user_log_write_string(&mDltContextData, value);
+ if(mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_string(&mDltContextData, value);
+ }
#else
mDltContextData.buffer << value;
#endif
@@ -153,7 +156,8 @@ public:
"E_ABORTED",
"E_WRONG_FORMAT"
};
- append(str_error[value]);
+ if(mEnableNoDLTDebug)
+ append(str_error[value]);
}
// Template to print unknown pointer types with their address
@@ -188,10 +192,10 @@ private:
CAmDltWrapper(const bool enableNoDLTDebug); //is private because of singleton pattern
#ifndef WITH_DLT
template<class T> void appendNoDLT(T value);
- bool mEnableNoDLTDebug;
#endif
DltContext mDltContext; //!< the default context
DltContextData mDltContextData; //!< contextdata
+ bool mEnableNoDLTDebug;
static CAmDltWrapper* mpDLTWrapper; //!< pointer to the wrapper instance
static pthread_mutex_t mMutex;
diff --git a/AudioManagerUtilities/include/CAmSocketHandler.h b/AudioManagerUtilities/include/CAmSocketHandler.h
index 5e11fa5..1a988c5 100644
--- a/AudioManagerUtilities/include/CAmSocketHandler.h
+++ b/AudioManagerUtilities/include/CAmSocketHandler.h
@@ -441,16 +441,7 @@ private:
bool mRecreatePollfds; //!<when this is true, the poll list needs to be recreated
timespec mStartTime; //!<here the actual time is saved for timecorrection
-// void debugPrintTimerList ()
-// {
-// std::list<sh_timer_s>::iterator it(mListActiveTimer.begin());
-// for(;it!=mListActiveTimer.end();++it)
-// {
-// std::cout<< "Handle " << it->handle << "sec " << it->countdown.tv_sec << "nsec " << it->countdown.tv_nsec<<std::endl;
-// }
-// }
-}
-;
+};
/**
* template to create the functor for a class
@@ -465,9 +456,7 @@ public:
TAmShTimerCallBack(TClass* instance, void (TClass::*function)(sh_timerHandle_t handle, void* userData)) :
mInstance(instance), //
mFunction(function)
- {
- }
- ;
+ {};
virtual void Call(sh_timerHandle_t handle, void* userData)
{
@@ -488,15 +477,12 @@ public:
TAmShPollPrepare(TClass* instance, void (TClass::*function)(const sh_timerHandle_t handle, void* userData)) :
mInstance(instance), //
mFunction(function)
- {
- }
- ;
+ {};
virtual void Call(const sh_timerHandle_t handle, void* userData)
{
(*mInstance.*mFunction)(handle, userData);
- }
- ;
+ };
};
/**make private, not public
@@ -512,15 +498,12 @@ public:
TAmShPollFired(TClass* instance, void (TClass::*function)(const pollfd pollfd, const sh_pollHandle_t handle, void* userData)) :
mInstance(instance), //
mFunction(function)
- {
- }
- ;
+ {};
virtual void Call(const pollfd pollfd, const sh_pollHandle_t handle, void* userData)
{
(*mInstance.*mFunction)(pollfd, handle, userData);
- }
- ;
+ };
};
/**
@@ -536,15 +519,12 @@ public:
TAmShPollCheck(TClass* instance, bool (TClass::*function)(const sh_pollHandle_t handle, void* userData)) :
mInstance(instance), //
mFunction(function)
- {
- }
- ;
+ {};
virtual bool Call(const sh_pollHandle_t handle, void* userData)
{
return ((*mInstance.*mFunction)(handle, userData));
- }
- ;
+ };
};
/**
@@ -560,15 +540,12 @@ public:
TAmShPollDispatch(TClass* instance, bool (TClass::*function)(const sh_pollHandle_t handle, void* userData)) :
mInstance(instance), //
mFunction(function)
- {
- }
- ;
+ {};
virtual bool Call(const sh_pollHandle_t handle, void* userData)
{
return ((*mInstance.*mFunction)(handle, userData));
- }
- ;
+ };
};
} /* namespace am */
#endif /* SOCKETHANDLER_H_ */
diff --git a/AudioManagerUtilities/include/sd-daemon.h b/AudioManagerUtilities/include/sd-daemon.h
deleted file mode 100644
index 50f7409..0000000
--- a/AudioManagerUtilities/include/sd-daemon.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/**
- * SPDX license identifier: MIT
- */
-
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
-#ifndef foosddaemonhfoo
-#define foosddaemonhfoo
-
-/***
- Copyright 2010 Lennart Poettering
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-***/
-
-#include <sys/types.h>
-#include <inttypes.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- Reference implementation of a few systemd related interfaces for
- writing daemons. These interfaces are trivial to implement. To
- simplify porting we provide this reference implementation.
- Applications are welcome to reimplement the algorithms described
- here if they do not want to include these two source files.
-
- The following functionality is provided:
-
- - Support for logging with log levels on stderr
- - File descriptor passing for socket-based activation
- - Daemon startup and status notification
- - Detection of systemd boots
-
- You may compile this with -DDISABLE_SYSTEMD to disable systemd
- support. This makes all those calls NOPs that are directly related to
- systemd (i.e. only sd_is_xxx() will stay useful).
-
- Since this is drop-in code we don't want any of our symbols to be
- exported in any case. Hence we declare hidden visibility for all of
- them.
-
- You may find an up-to-date version of these source files online:
-
- http://cgit.freedesktop.org/systemd/systemd/plain/src/systemd/sd-daemon.h
- http://cgit.freedesktop.org/systemd/systemd/plain/src/sd-daemon.c
-
- This should compile on non-Linux systems, too, but with the
- exception of the sd_is_xxx() calls all functions will become NOPs.
-
- See sd-daemon(7) for more information.
-*/
-
-#ifndef _sd_printf_attr_
-#if __GNUC__ >= 4
-#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
-#else
-#define _sd_printf_attr_(a,b)
-#endif
-#endif
-
-/*
- Log levels for usage on stderr:
-
- fprintf(stderr, SD_NOTICE "Hello World!\n");
-
- This is similar to printk() usage in the kernel.
-*/
-#define SD_EMERG "<0>" /* system is unusable */
-#define SD_ALERT "<1>" /* action must be taken immediately */
-#define SD_CRIT "<2>" /* critical conditions */
-#define SD_ERR "<3>" /* error conditions */
-#define SD_WARNING "<4>" /* warning conditions */
-#define SD_NOTICE "<5>" /* normal but significant condition */
-#define SD_INFO "<6>" /* informational */
-#define SD_DEBUG "<7>" /* debug-level messages */
-
-/* The first passed file descriptor is fd 3 */
-#define SD_LISTEN_FDS_START 3
-
-/*
- Returns how many file descriptors have been passed, or a negative
- errno code on failure. Optionally, removes the $LISTEN_FDS and
- $LISTEN_PID file descriptors from the environment (recommended, but
- problematic in threaded environments). If r is the return value of
- this function you'll find the file descriptors passed as fds
- SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative
- errno style error code on failure. This function call ensures that
- the FD_CLOEXEC flag is set for the passed file descriptors, to make
- sure they are not passed on to child processes. If FD_CLOEXEC shall
- not be set, the caller needs to unset it after this call for all file
- descriptors that are used.
-
- See sd_listen_fds(3) for more information.
-*/
-int sd_listen_fds(int unset_environment);
-
-/*
- Helper call for identifying a passed file descriptor. Returns 1 if
- the file descriptor is a FIFO in the file system stored under the
- specified path, 0 otherwise. If path is NULL a path name check will
- not be done and the call only verifies if the file descriptor
- refers to a FIFO. Returns a negative errno style error code on
- failure.
-
- See sd_is_fifo(3) for more information.
-*/
-int sd_is_fifo(int fd, const char *path);
-
-/*
- Helper call for identifying a passed file descriptor. Returns 1 if
- the file descriptor is a special character device on the file
- system stored under the specified path, 0 otherwise.
- If path is NULL a path name check will not be done and the call
- only verifies if the file descriptor refers to a special character.
- Returns a negative errno style error code on failure.
-
- See sd_is_special(3) for more information.
-*/
-int sd_is_special(int fd, const char *path);
-
-/*
- Helper call for identifying a passed file descriptor. Returns 1 if
- the file descriptor is a socket of the specified family (AF_INET,
- ...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If
- family is 0 a socket family check will not be done. If type is 0 a
- socket type check will not be done and the call only verifies if
- the file descriptor refers to a socket. If listening is > 0 it is
- verified that the socket is in listening mode. (i.e. listen() has
- been called) If listening is == 0 it is verified that the socket is
- not in listening mode. If listening is < 0 no listening mode check
- is done. Returns a negative errno style error code on failure.
-
- See sd_is_socket(3) for more information.
-*/
-int sd_is_socket(int fd, int family, int type, int listening);
-
-/*
- Helper call for identifying a passed file descriptor. Returns 1 if
- the file descriptor is an Internet socket, of the specified family
- (either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM,
- SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version
- check is not done. If type is 0 a socket type check will not be
- done. If port is 0 a socket port check will not be done. The
- listening flag is used the same way as in sd_is_socket(). Returns a
- negative errno style error code on failure.
-
- See sd_is_socket_inet(3) for more information.
-*/
-int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port);
-
-/*
- Helper call for identifying a passed file descriptor. Returns 1 if
- the file descriptor is an AF_UNIX socket of the specified type
- (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0
- a socket type check will not be done. If path is NULL a socket path
- check will not be done. For normal AF_UNIX sockets set length to
- 0. For abstract namespace sockets set length to the length of the
- socket name (including the initial 0 byte), and pass the full
- socket path in path (including the initial 0 byte). The listening
- flag is used the same way as in sd_is_socket(). Returns a negative
- errno style error code on failure.
-
- See sd_is_socket_unix(3) for more information.
-*/
-int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length);
-
-/*
- Helper call for identifying a passed file descriptor. Returns 1 if
- the file descriptor is a POSIX Message Queue of the specified name,
- 0 otherwise. If path is NULL a message queue name check is not
- done. Returns a negative errno style error code on failure.
-*/
-int sd_is_mq(int fd, const char *path);
-
-/*
- Informs systemd about changed daemon state. This takes a number of
- newline separated environment-style variable assignments in a
- string. The following variables are known:
-
- READY=1 Tells systemd that daemon startup is finished (only
- relevant for services of Type=notify). The passed
- argument is a boolean "1" or "0". Since there is
- little value in signaling non-readiness the only
- value daemons should send is "READY=1".
-
- STATUS=... Passes a single-line status string back to systemd
- that describes the daemon state. This is free-from
- and can be used for various purposes: general state
- feedback, fsck-like programs could pass completion
- percentages and failing programs could pass a human
- readable error message. Example: "STATUS=Completed
- 66% of file system check..."
-
- ERRNO=... If a daemon fails, the errno-style error code,
- formatted as string. Example: "ERRNO=2" for ENOENT.
-
- BUSERROR=... If a daemon fails, the D-Bus error-style error
- code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut"
-
- MAINPID=... The main pid of a daemon, in case systemd did not
- fork off the process itself. Example: "MAINPID=4711"
-
- WATCHDOG=1 Tells systemd to update the watchdog timestamp.
- Services using this feature should do this in
- regular intervals. A watchdog framework can use the
- timestamps to detect failed services.
-
- Daemons can choose to send additional variables. However, it is
- recommended to prefix variable names not listed above with X_.
-
- Returns a negative errno-style error code on failure. Returns > 0
- if systemd could be notified, 0 if it couldn't possibly because
- systemd is not running.
-
- Example: When a daemon finished starting up, it could issue this
- call to notify systemd about it:
-
- sd_notify(0, "READY=1");
-
- See sd_notifyf() for more complete examples.
-
- See sd_notify(3) for more information.
-*/
-int sd_notify(int unset_environment, const char *state);
-
-/*
- Similar to sd_notify() but takes a format string.
-
- Example 1: A daemon could send the following after initialization:
-
- sd_notifyf(0, "READY=1\n"
- "STATUS=Processing requests...\n"
- "MAINPID=%lu",
- (unsigned long) getpid());
-
- Example 2: A daemon could send the following shortly before
- exiting, on failure:
-
- sd_notifyf(0, "STATUS=Failed to start up: %s\n"
- "ERRNO=%i",
- strerror(errno),
- errno);
-
- See sd_notifyf(3) for more information.
-*/
-int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3);
-
-/*
- Returns > 0 if the system was booted with systemd. Returns < 0 on
- error. Returns 0 if the system was not booted with systemd. Note
- that all of the functions above handle non-systemd boots just
- fine. You should NOT protect them with a call to this function. Also
- note that this function checks whether the system, not the user
- session is controlled by systemd. However the functions above work
- for both user and system services.
-
- See sd_booted(3) for more information.
-*/
-int sd_booted(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/AudioManagerUtilities/src/CAmDltWrapper.cpp b/AudioManagerUtilities/src/CAmDltWrapper.cpp
index 33baa46..3b10ef4 100644
--- a/AudioManagerUtilities/src/CAmDltWrapper.cpp
+++ b/AudioManagerUtilities/src/CAmDltWrapper.cpp
@@ -48,7 +48,10 @@ CAmDltWrapper *CAmDltWrapper::instance(const bool enableNoDLTDebug)
void CAmDltWrapper::unregisterContext(DltContext & handle)
{
#ifdef WITH_DLT
- dlt_unregister_context(&handle);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_unregister_context(&handle);
+ }
#else
(void) handle;
#endif
@@ -57,16 +60,17 @@ void CAmDltWrapper::unregisterContext(DltContext & handle)
void CAmDltWrapper::deinit()
{
#ifdef WITH_DLT
- unregisterContext(mDltContext);
+ if (mEnableNoDLTDebug)
+ {
+ unregisterContext(mDltContext);
+ }
#endif
}
-CAmDltWrapper::CAmDltWrapper(const bool enableNoDLTDebug) :
-#ifndef WITH_DLT
- mEnableNoDLTDebug(enableNoDLTDebug),
-#endif
+CAmDltWrapper::CAmDltWrapper(const bool enableNoDLTDebug=true) :
mDltContext(), //
- mDltContextData()
+ mDltContextData(), //
+ mEnableNoDLTDebug(enableNoDLTDebug)
{
(void) enableNoDLTDebug;
#ifndef WITH_DLT
@@ -77,9 +81,12 @@ CAmDltWrapper::CAmDltWrapper(const bool enableNoDLTDebug) :
void CAmDltWrapper::registerApp(const char *appid, const char *description)
{
#ifdef WITH_DLT
- dlt_register_app(appid, description);
- //register a default context
- dlt_register_context(&mDltContext, "def", "default Context registered by DLTWrapper CLass");
+ if (mEnableNoDLTDebug)
+ {
+ dlt_register_app(appid, description);
+ //register a default context
+ dlt_register_context(&mDltContext, "def", "default Context registered by DLTWrapper CLass");
+ }
#else
(void) appid;
(void) description;
@@ -89,7 +96,10 @@ void CAmDltWrapper::registerApp(const char *appid, const char *description)
void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, const char *description)
{
#ifdef WITH_DLT
- dlt_register_context(&handle, contextid, description);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_register_context(&handle, contextid, description);
+ }
#else
strncpy(handle.contextID,contextid,4);
@@ -115,7 +125,10 @@ void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, c
const DltLogLevelType level, const DltTraceStatusType status)
{
#ifdef WITH_DLT
- dlt_register_context_ll_ts(&handle, contextid, description, level, status);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_register_context_ll_ts(&handle, contextid, description, level, status);
+ }
#else
strncpy(handle.contextID,contextid,4);
@@ -144,14 +157,15 @@ bool CAmDltWrapper::init(DltLogLevelType loglevel, DltContext* context)
if (!context)
context = &mDltContext;
#ifdef WITH_DLT
- if (dlt_user_log_write_start(context, &mDltContextData, loglevel) <= 0)
+ if (mEnableNoDLTDebug)
+ if(dlt_user_log_write_start(context, &mDltContextData, loglevel) <= 0)
#else
if((mEnableNoDLTDebug == false) || (loglevel > context->log_level_user))
#endif
- {
- pthread_mutex_unlock(&mMutex);
- return false;
- }
+ {
+ pthread_mutex_unlock(&mMutex);
+ return false;
+ }
#ifndef WITH_DLT
std::cout << "\e[0;34m[" << context->contextID << "]\e[0;30m\t";
#endif
@@ -161,7 +175,10 @@ bool CAmDltWrapper::init(DltLogLevelType loglevel, DltContext* context)
void CAmDltWrapper::send()
{
#ifdef WITH_DLT
- dlt_user_log_write_finish(&mDltContextData);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_finish(&mDltContextData);
+ }
#else
if(mEnableNoDLTDebug)
std::cout << mDltContextData.buffer.str().c_str() << std::endl;
@@ -175,7 +192,10 @@ void CAmDltWrapper::send()
void CAmDltWrapper::append(const int8_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_int8(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_int8(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -184,7 +204,10 @@ void CAmDltWrapper::append(const int8_t value)
void CAmDltWrapper::append(const uint8_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_uint8(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_uint8(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -193,7 +216,10 @@ void CAmDltWrapper::append(const uint8_t value)
void CAmDltWrapper::append(const int16_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_int16(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_int16(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -202,7 +228,10 @@ void CAmDltWrapper::append(const int16_t value)
void CAmDltWrapper::append(const uint16_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_uint16(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_uint16(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -211,7 +240,10 @@ void CAmDltWrapper::append(const uint16_t value)
void CAmDltWrapper::append(const int32_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_int32(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_int32(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -220,7 +252,10 @@ void CAmDltWrapper::append(const int32_t value)
void CAmDltWrapper::append(const uint32_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_uint32(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_uint32(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -228,13 +263,17 @@ void CAmDltWrapper::append(const uint32_t value)
void CAmDltWrapper::append(const std::string& value)
{
- append(value.c_str());
+ if (mEnableNoDLTDebug)
+ append(value.c_str());
}
void CAmDltWrapper::append(const bool value)
{
#ifdef WITH_DLT
- dlt_user_log_write_bool(&mDltContextData, static_cast<uint8_t>(value));
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_bool(&mDltContextData, static_cast<uint8_t>(value));
+ }
#else
appendNoDLT(value);
#endif
@@ -243,7 +282,10 @@ void CAmDltWrapper::append(const bool value)
void CAmDltWrapper::append(const int64_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_int64(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_int64(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -252,7 +294,10 @@ void CAmDltWrapper::append(const int64_t value)
void CAmDltWrapper::append(const uint64_t value)
{
#ifdef WITH_DLT
- dlt_user_log_write_uint64(&mDltContextData, value);
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_uint64(&mDltContextData, value);
+ }
#else
appendNoDLT(value);
#endif
@@ -261,7 +306,10 @@ void CAmDltWrapper::append(const uint64_t value)
void CAmDltWrapper::append(const std::vector<uint8_t> & data)
{
#ifdef WITH_DLT
- dlt_user_log_write_raw(&mDltContextData,(void*)data.data(),data.size());
+ if (mEnableNoDLTDebug)
+ {
+ dlt_user_log_write_raw(&mDltContextData,(void*)data.data(),data.size());
+ }
#else
mDltContextData.buffer << data.data();
#endif
@@ -281,7 +329,7 @@ void CAmDltWrapper::enableNoDLTDebug(const bool enableNoDLTDebug)
CAmDltWrapper::~CAmDltWrapper()
{
- if (mpDLTWrapper)
+ if (mpDLTWrapper && mEnableNoDLTDebug)
{
mpDLTWrapper->unregisterContext(mDltContext);
delete mpDLTWrapper;
diff --git a/AudioManagerUtilities/src/CAmSocketHandler.cpp b/AudioManagerUtilities/src/CAmSocketHandler.cpp
index 4b113fa..8947a5a 100644
--- a/AudioManagerUtilities/src/CAmSocketHandler.cpp
+++ b/AudioManagerUtilities/src/CAmSocketHandler.cpp
@@ -22,7 +22,6 @@
*/
#include "CAmSocketHandler.h"
-//#include <audiomanagerconfig.h>
#include <cassert>
#include <sys/fcntl.h>
#include <sys/errno.h>
@@ -113,7 +112,7 @@ void CAmSocketHandler::start_listenting()
else
{
logError("SocketHandler::start_listenting ppoll returned with error", errno);
- exit(0);
+ throw std::runtime_error(std::string("SocketHandler::start_listenting ppoll returned with error."));
}
}
diff --git a/AudioManagerUtilities/src/CAmWatchdog.cpp b/AudioManagerUtilities/src/CAmWatchdog.cpp
index db65095..9de2a85 100755
--- a/AudioManagerUtilities/src/CAmWatchdog.cpp
+++ b/AudioManagerUtilities/src/CAmWatchdog.cpp
@@ -27,12 +27,7 @@
#include <stdexcept>
#include "audiomanagerconfig.h"
#include "CAmDltWrapper.h"
-
-#ifdef SYSTEMD_FOUND
- #include <systemd/sd-daemon.h>
-#else
- #include "sd-daemon.h"
-#endif
+#include <systemd/sd-daemon.h>
namespace am
{
@@ -61,7 +56,7 @@ CAmWatchdog::CAmWatchdog(CAmSocketHandler* CAmSocketHandler) :
timeout.tv_sec = (watchdogTimeout / 2) / 1000000;
timeout.tv_nsec = ((watchdogTimeout / 2) % 1000000) * 1000;
logInfo("CAmWatchdog::CAmWatchdog setting watchdog timeout:", watchdogTimeout, "us. Notification set to:",
- timeout.tv_sec, "sec and", timeout.tv_nsec, "ns");
+ (int)timeout.tv_sec, "sec and", (int)timeout.tv_nsec, "ns");
//add the timer here
if (mpCAmSocketHandler->addTimer(timeout, &TimerCallback, mHandle, NULL))
diff --git a/AudioManagerUtilities/src/sd-daemon.c b/AudioManagerUtilities/src/sd-daemon.c
deleted file mode 100644
index cf35148..0000000
--- a/AudioManagerUtilities/src/sd-daemon.c
+++ /dev/null
@@ -1,534 +0,0 @@
-/**
- * SPDX license identifier: MIT
- */
-
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
-/***
- Copyright 2010 Lennart Poettering
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-***/
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#ifdef __BIONIC__
-#include <linux/fcntl.h>
-#else
-#include <sys/fcntl.h>
-#endif
-#include <netinet/in.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stddef.h>
-#include <limits.h>
-
-#if defined(__linux__)
-#include <mqueue.h>
-#endif
-
-#include "sd-daemon.h"
-
-#if (__GNUC__ >= 4)
-#ifdef SD_EXPORT_SYMBOLS
-/* Export symbols */
-#define _sd_export_ __attribute__ ((visibility("default")))
-#else
-/* Don't export the symbols */
-#define _sd_export_ __attribute__ ((visibility("hidden")))
-#endif
-#else
-#define _sd_export_
-#endif
-
-_sd_export_ int sd_listen_fds(int unset_environment) {
-
-#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
- return 0;
-#else
- int r, fd;
- const char *e;
- char *p = NULL;
- unsigned long l;
-
- if (!(e = getenv("LISTEN_PID"))) {
- r = 0;
- goto finish;
- }
-
- errno = 0;
- l = strtoul(e, &p, 10);
-
- if (errno != 0) {
- r = -errno;
- goto finish;
- }
-
- if (!p || *p || l <= 0) {
- r = -EINVAL;
- goto finish;
- }
-
- /* Is this for us? */
- if (getpid() != (pid_t) l) {
- r = 0;
- goto finish;
- }
-
- if (!(e = getenv("LISTEN_FDS"))) {
- r = 0;
- goto finish;
- }
-
- errno = 0;
- l = strtoul(e, &p, 10);
-
- if (errno != 0) {
- r = -errno;
- goto finish;
- }
-
- if (!p || *p) {
- r = -EINVAL;
- goto finish;
- }
-
- for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) {
- int flags;
-
- if ((flags = fcntl(fd, F_GETFD)) < 0) {
- r = -errno;
- goto finish;
- }
-
- if (flags & FD_CLOEXEC)
- continue;
-
- if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
- r = -errno;
- goto finish;
- }
- }
-
- r = (int) l;
-
-finish:
- if (unset_environment) {
- unsetenv("LISTEN_PID");
- unsetenv("LISTEN_FDS");
- }
-
- return r;
-#endif
-}
-
-_sd_export_ int sd_is_fifo(int fd, const char *path) {
- struct stat st_fd;
-
- if (fd < 0)
- return -EINVAL;
-
- memset(&st_fd, 0, sizeof(st_fd));
- if (fstat(fd, &st_fd) < 0)
- return -errno;
-
- if (!S_ISFIFO(st_fd.st_mode))
- return 0;
-
- if (path) {
- struct stat st_path;
-
- memset(&st_path, 0, sizeof(st_path));
- if (stat(path, &st_path) < 0) {
-
- if (errno == ENOENT || errno == ENOTDIR)
- return 0;
-
- return -errno;
- }
-
- return
- st_path.st_dev == st_fd.st_dev &&
- st_path.st_ino == st_fd.st_ino;
- }
-
- return 1;
-}
-
-_sd_export_ int sd_is_special(int fd, const char *path) {
- struct stat st_fd;
-
- if (fd < 0)
- return -EINVAL;
-
- if (fstat(fd, &st_fd) < 0)
- return -errno;
-
- if (!S_ISREG(st_fd.st_mode) && !S_ISCHR(st_fd.st_mode))
- return 0;
-
- if (path) {
- struct stat st_path;
-
- if (stat(path, &st_path) < 0) {
-
- if (errno == ENOENT || errno == ENOTDIR)
- return 0;
-
- return -errno;
- }
-
- if (S_ISREG(st_fd.st_mode) && S_ISREG(st_path.st_mode))
- return
- st_path.st_dev == st_fd.st_dev &&
- st_path.st_ino == st_fd.st_ino;
- else if (S_ISCHR(st_fd.st_mode) && S_ISCHR(st_path.st_mode))
- return st_path.st_rdev == st_fd.st_rdev;
- else
- return 0;
- }
-
- return 1;
-}
-
-static int sd_is_socket_internal(int fd, int type, int listening) {
- struct stat st_fd;
-
- if (fd < 0 || type < 0)
- return -EINVAL;
-
- if (fstat(fd, &st_fd) < 0)
- return -errno;
-
- if (!S_ISSOCK(st_fd.st_mode))
- return 0;
-
- if (type != 0) {
- int other_type = 0;
- socklen_t l = sizeof(other_type);
-
- if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0)
- return -errno;
-
- if (l != sizeof(other_type))
- return -EINVAL;
-
- if (other_type != type)
- return 0;
- }
-
- if (listening >= 0) {
- int accepting = 0;
- socklen_t l = sizeof(accepting);
-
- if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0)
- return -errno;
-
- if (l != sizeof(accepting))
- return -EINVAL;
-
- if (!accepting != !listening)
- return 0;
- }
-
- return 1;
-}
-
-union sockaddr_union {
- struct sockaddr sa;
- struct sockaddr_in in4;
- struct sockaddr_in6 in6;
- struct sockaddr_un un;
- struct sockaddr_storage storage;
-};
-
-_sd_export_ int sd_is_socket(int fd, int family, int type, int listening) {
- int r;
-
- if (family < 0)
- return -EINVAL;
-
- if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
- return r;
-
- if (family > 0) {
- union sockaddr_union sockaddr;
- socklen_t l;
-
- memset(&sockaddr, 0, sizeof(sockaddr));
- l = sizeof(sockaddr);
-
- if (getsockname(fd, &sockaddr.sa, &l) < 0)
- return -errno;
-
- if (l < sizeof(sa_family_t))
- return -EINVAL;
-
- return sockaddr.sa.sa_family == family;
- }
-
- return 1;
-}
-
-_sd_export_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) {
- union sockaddr_union sockaddr;
- socklen_t l;
- int r;
-
- if (family != 0 && family != AF_INET && family != AF_INET6)
- return -EINVAL;
-
- if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
- return r;
-
- memset(&sockaddr, 0, sizeof(sockaddr));
- l = sizeof(sockaddr);
-
- if (getsockname(fd, &sockaddr.sa, &l) < 0)
- return -errno;
-
- if (l < sizeof(sa_family_t))
- return -EINVAL;
-
- if (sockaddr.sa.sa_family != AF_INET &&
- sockaddr.sa.sa_family != AF_INET6)
- return 0;
-
- if (family > 0)
- if (sockaddr.sa.sa_family != family)
- return 0;
-
- if (port > 0) {
- if (sockaddr.sa.sa_family == AF_INET) {
- if (l < sizeof(struct sockaddr_in))
- return -EINVAL;
-
- return htons(port) == sockaddr.in4.sin_port;
- } else {
- if (l < sizeof(struct sockaddr_in6))
- return -EINVAL;
-
- return htons(port) == sockaddr.in6.sin6_port;
- }
- }
-
- return 1;
-}
-
-_sd_export_ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) {
- union sockaddr_union sockaddr;
- socklen_t l;
- int r;
-
- if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
- return r;
-
- memset(&sockaddr, 0, sizeof(sockaddr));
- l = sizeof(sockaddr);
-
- if (getsockname(fd, &sockaddr.sa, &l) < 0)
- return -errno;
-
- if (l < sizeof(sa_family_t))
- return -EINVAL;
-
- if (sockaddr.sa.sa_family != AF_UNIX)
- return 0;
-
- if (path) {
- if (length <= 0)
- length = strlen(path);
-
- if (length <= 0)
- /* Unnamed socket */
- return l == offsetof(struct sockaddr_un, sun_path);
-
- if (path[0])
- /* Normal path socket */
- return
- (l >= offsetof(struct sockaddr_un, sun_path) + length + 1) &&
- memcmp(path, sockaddr.un.sun_path, length+1) == 0;
- else
- /* Abstract namespace socket */
- return
- (l == offsetof(struct sockaddr_un, sun_path) + length) &&
- memcmp(path, sockaddr.un.sun_path, length) == 0;
- }
-
- return 1;
-}
-
-_sd_export_ int sd_is_mq(int fd, const char *path) {
-#if !defined(__linux__)
- return 0;
-#else
- struct mq_attr attr;
-
- if (fd < 0)
- return -EINVAL;
-
- if (mq_getattr(fd, &attr) < 0)
- return -errno;
-
- if (path) {
- char fpath[PATH_MAX];
- struct stat a, b;
-
- if (path[0] != '/')
- return -EINVAL;
-
- if (fstat(fd, &a) < 0)
- return -errno;
-
- strncpy(stpcpy(fpath, "/dev/mqueue"), path, sizeof(fpath) - 12);
- fpath[sizeof(fpath)-1] = 0;
-
- if (stat(fpath, &b) < 0)
- return -errno;
-
- if (a.st_dev != b.st_dev ||
- a.st_ino != b.st_ino)
- return 0;
- }
-
- return 1;
-#endif
-}
-
-_sd_export_ int sd_notify(int unset_environment, const char *state) {
-#if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC)
- return 0;
-#else
- int fd = -1, r;
- struct msghdr msghdr;
- struct iovec iovec;
- union sockaddr_union sockaddr;
- const char *e;
-
- if (!state) {
- r = -EINVAL;
- goto finish;
- }
-
- if (!(e = getenv("NOTIFY_SOCKET")))
- return 0;
-
- /* Must be an abstract socket, or an absolute path */
- if ((e[0] != '@' && e[0] != '/') || e[1] == 0) {
- r = -EINVAL;
- goto finish;
- }
-
- if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
- r = -errno;
- goto finish;
- }
-
- memset(&sockaddr, 0, sizeof(sockaddr));
- sockaddr.sa.sa_family = AF_UNIX;
- strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path));
-
- if (sockaddr.un.sun_path[0] == '@')
- sockaddr.un.sun_path[0] = 0;
-
- memset(&iovec, 0, sizeof(iovec));
- iovec.iov_base = (char*) state;
- iovec.iov_len = strlen(state);
-
- memset(&msghdr, 0, sizeof(msghdr));
- msghdr.msg_name = &sockaddr;
- msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + strlen(e);
-
- if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
- msghdr.msg_namelen = sizeof(struct sockaddr_un);
-
- msghdr.msg_iov = &iovec;
- msghdr.msg_iovlen = 1;
-
- if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0) {
- r = -errno;
- goto finish;
- }
-
- r = 1;
-
-finish:
- if (unset_environment)
- unsetenv("NOTIFY_SOCKET");
-
- if (fd >= 0)
- close(fd);
-
- return r;
-#endif
-}
-
-_sd_export_ int sd_notifyf(int unset_environment, const char *format, ...) {
-#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
- return 0;
-#else
- va_list ap;
- char *p = NULL;
- int r;
-
- va_start(ap, format);
- r = vasprintf(&p, format, ap);
- va_end(ap);
-
- if (r < 0 || !p)
- return -ENOMEM;
-
- r = sd_notify(unset_environment, p);
- free(p);
-
- return r;
-#endif
-}
-
-_sd_export_ int sd_booted(void) {
-#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
- return 0;
-#else
-
- struct stat a, b;
-
- /* We simply test whether the systemd cgroup hierarchy is
- * mounted */
-
- if (lstat("/sys/fs/cgroup", &a) < 0)
- return 0;
-
- if (lstat("/sys/fs/cgroup/systemd", &b) < 0)
- return 0;
-
- return a.st_dev != b.st_dev;
-#endif
-}
diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp
new file mode 100644
index 0000000..50e2aa9
--- /dev/null
+++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp
@@ -0,0 +1,357 @@
+/**
+ * SPDX license identifier: MPL-2.0
+ *
+ * Copyright (C) 2012, BMW AG
+ *
+ * This file is part of GENIVI Project AudioManager.
+ *
+ * Contributions are licensed to the GENIVI Alliance under one or more
+ * Contribution License Agreements.
+ *
+ * \copyright
+ * This Source Code Form is subject to the terms of the
+ * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
+ * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ *
+ * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012
+ *
+ * For further information see http://www.genivi.org/.
+ *
+ */
+
+#include "CAmSocketHandlerTest.h"
+#include <cstdio>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <sys/un.h>
+#include <sys/poll.h>
+#include "CAmSocketHandler.h"
+
+//todo: expand test, implement more usecases
+//todo: test removeFD
+
+#define SOCK_PATH "/tmp/mysock"
+
+using namespace testing;
+using namespace am;
+
+CAmSocketHandlerTest::CAmSocketHandlerTest()
+{
+}
+
+CAmSocketHandlerTest::~CAmSocketHandlerTest()
+{
+}
+
+CAmTimerCb::CAmTimerCb(CAmSocketHandler *myHandler) :
+ pTimer1Callback(this, &CAmTimerCb::timer1Callback), //
+ pTimer2Callback(this, &CAmTimerCb::timer2Callback), //
+ pTimer3Callback(this, &CAmTimerCb::timer3Callback), //
+ pTimer4Callback(this, &CAmTimerCb::timer4Callback), //
+ mSocketHandler(myHandler)
+
+{
+}
+
+am::CAmTimerCb::~CAmTimerCb()
+{
+}
+
+void am::CAmTimerCb::timer1Callback(sh_timerHandle_t handle, void* userData)
+{
+ (void) handle;
+ (void) userData;
+ std::cout << "callback1 called" << std::endl;
+ timespec timeout;
+ timeout.tv_nsec = 0;
+ timeout.tv_sec = 1;
+ mSocketHandler->updateTimer(handle,timeout);
+}
+
+void am::CAmTimerCb::timer2Callback(sh_timerHandle_t handle, void* userData)
+{
+ (void) handle;
+ (void) userData;
+ std::cout << "callback2 called" << std::endl;
+ timespec timeout;
+ timeout.tv_nsec = 011110000;
+ timeout.tv_sec = 1;
+ mSocketHandler->updateTimer(handle,timeout);
+}
+
+void am::CAmTimerCb::timer3Callback(sh_timerHandle_t, void* userData)
+{
+ (void) userData;
+ std::cout << "callback3 called" << std::endl;
+}
+
+void am::CAmTimerCb::timer4Callback(sh_timerHandle_t, void* userData)
+{
+ (void) userData;
+ std::cout << "callback4 called" << std::endl;
+ mSocketHandler->stop_listening();
+}
+
+void* playWithSocketServer(void* data)
+{
+ (void) data;
+ CAmSocketHandler myHandler;
+ CAmSamplePlugin::sockType_e type = CAmSamplePlugin::INET;
+ CAmSamplePlugin myplugin(&myHandler, type);
+ myHandler.start_listenting();
+ return (NULL);
+}
+
+void* playWithUnixSocketServer(void* data)
+{
+ (void) data;
+ CAmSocketHandler myHandler;
+ CAmSamplePlugin::sockType_e type = CAmSamplePlugin::UNIX;
+ CAmSamplePlugin myplugin(&myHandler, type);
+ myHandler.start_listenting();
+ return (NULL);
+}
+
+TEST(CAmSocketHandlerTest,playWithTimers)
+{
+ CAmSocketHandler myHandler;
+ CAmTimerCb testCallback(&myHandler);
+ timespec timeoutTime, timeout2, timeout3, timeout4;
+ timeoutTime.tv_sec = 1;
+ timeoutTime.tv_nsec = 02223234;
+ timeout2.tv_nsec = 333000;
+ timeout2.tv_sec = 0;
+ timeout3.tv_nsec = 333;
+ timeout3.tv_sec = 3;
+ timeout4.tv_nsec = 0;
+ timeout4.tv_sec = 20;
+ sh_timerHandle_t handle;
+ myHandler.addTimer(timeoutTime, &testCallback.pTimer1Callback, handle, NULL);
+ myHandler.addTimer(timeout2, &testCallback.pTimer2Callback, handle, NULL);
+ myHandler.addTimer(timeout3, &testCallback.pTimer3Callback, handle, NULL);
+ myHandler.addTimer(timeout4, &testCallback.pTimer4Callback, handle, NULL);
+ myHandler.start_listenting();
+
+}
+
+
+TEST(CAmSocketHandlerTest,playWithUNIXSockets)
+{
+ pthread_t serverThread;
+ struct sockaddr_un servAddr;
+ int socket_;
+
+ //creates a thread that handles the serverpart
+ pthread_create(&serverThread, NULL, playWithUnixSocketServer, NULL);
+
+ sleep(1); //we need that here because the port needs to be opened
+ if ((socket_ = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+ {
+ std::cout << "socket problem" << std::endl;
+
+ }
+
+ memset(&servAddr, 0, sizeof(servAddr));
+ strcpy(servAddr.sun_path, SOCK_PATH);
+ servAddr.sun_family = AF_UNIX;
+ if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
+ {
+ std::cout << "ERROR: connect() failed\n" << std::endl;
+ }
+
+ for (int i = 0; i <= 1000; i++)
+ {
+ std::string string("Got It?");
+ send(socket_, string.c_str(), string.size(), 0);
+ }
+ std::string string("finish!");
+ send(socket_, string.c_str(), string.size(), 0);
+
+ pthread_join(serverThread, NULL);
+}
+
+TEST(CAmSocketHandlerTest,playWithSockets)
+{
+ pthread_t serverThread;
+ struct sockaddr_in servAddr;
+ unsigned short servPort = 6060;
+ struct hostent *host;
+ int socket_;
+
+ //creates a thread that handles the serverpart
+ pthread_create(&serverThread, NULL, playWithSocketServer, NULL);
+
+ sleep(1); //we need that here because the port needs to be opened
+ if ((socket_ = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
+ {
+ std::cout << "socket problem" << std::endl;
+
+ }
+
+ if ((host = (struct hostent*) gethostbyname("localhost")) == 0)
+ {
+ std::cout << "ERROR: gethostbyname() failed\n" << std::endl;
+ exit(1);
+ }
+
+ memset(&servAddr, 0, sizeof(servAddr));
+ servAddr.sin_family = AF_INET;
+ servAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*) (host->h_addr_list[0])));
+ servAddr.sin_port = htons(servPort);
+
+ if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
+ {
+ std::cout << "ERROR: connect() failed\n" << std::endl;
+ }
+
+ for (int i = 0; i <= 1000; i++)
+ {
+ std::string string("Got It?");
+ send(socket_, string.c_str(), string.size(), 0);
+ }
+ std::string string("finish!");
+ send(socket_, string.c_str(), string.size(), 0);
+
+ pthread_join(serverThread, NULL);
+}
+
+
+void CAmSocketHandlerTest::SetUp()
+{
+}
+
+void CAmSocketHandlerTest::TearDown()
+{
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
+
+am::CAmSamplePlugin::CAmSamplePlugin(CAmSocketHandler *mySocketHandler, sockType_e socketType) :
+ connectFiredCB(this, &CAmSamplePlugin::connectSocket), //
+ receiveFiredCB(this, &CAmSamplePlugin::receiveData), //
+ sampleDispatchCB(this, &CAmSamplePlugin::dispatchData), //
+ sampleCheckCB(this, &CAmSamplePlugin::check), //
+ mSocketHandler(mySocketHandler), //
+ mConnecthandle(), //
+ mReceiveHandle(), //
+ msgList()
+{
+ int yes = 1;
+
+ int socketHandle;
+ struct sockaddr_in servAddr;
+ struct sockaddr_un unixAddr;
+ unsigned int servPort = 6060;
+
+ switch (socketType)
+ {
+ case UNIX:
+ socketHandle = socket(AF_UNIX, SOCK_STREAM, 0);
+ unixAddr.sun_family = AF_UNIX;
+ strcpy(unixAddr.sun_path, SOCK_PATH);
+ unlink(unixAddr.sun_path);
+ bind(socketHandle, (struct sockaddr *) &unixAddr, strlen(unixAddr.sun_path) + sizeof(unixAddr.sun_family));
+ break;
+ case INET:
+ socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ setsockopt(socketHandle, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
+ memset(&servAddr, 0, sizeof(servAddr));
+ servAddr.sin_family = AF_INET;
+ servAddr.sin_addr.s_addr = INADDR_ANY;
+ servAddr.sin_port = htons(servPort);
+ bind(socketHandle, (struct sockaddr *) &servAddr, sizeof(servAddr));
+ break;
+ default:
+ break;
+ }
+
+ if (listen(socketHandle, 3) < 0)
+ {
+ std::cout << "listen ok" << std::endl;
+ } /* if */
+
+ int a = 1;
+ ioctl(socketHandle, FIONBIO, (char *) &a);
+ setsockopt(socketHandle, SOL_SOCKET, SO_KEEPALIVE, (char *) &a, sizeof(a));
+
+ short events = 0;
+ events |= POLLIN;
+ mySocketHandler->addFDPoll(socketHandle, events, NULL, &connectFiredCB, NULL, NULL, NULL, mConnecthandle);
+ std::cout << "setup server - listening" << std::endl;
+}
+
+void am::CAmSamplePlugin::connectSocket(const pollfd pollfd1, const sh_pollHandle_t handle, void *userData)
+{
+ (void) handle;
+ (void) userData;
+ //first, accept the connection, create a new filedescriptor
+ std::cout << "Got a connection request !" << std::endl;
+ struct sockaddr answer;
+ socklen_t len = sizeof(answer);
+ int receiveFD = accept(pollfd1.fd, (struct sockaddr*) &answer, &len);
+
+ //set the correct event:
+ short event = 0;
+ event |= POLLIN;
+
+ //aded the filedescriptor to the sockethandler and register the callbacks for receiving the data
+ mSocketHandler->addFDPoll(receiveFD, event, NULL, &receiveFiredCB, &sampleCheckCB, &sampleDispatchCB, NULL, mReceiveHandle);
+
+}
+
+void am::CAmSamplePlugin::receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void *userData)
+{
+ (void) handle;
+ (void) userData;
+ //initialize buffer
+ char buffer[10];
+ //read until buffer is full or no more data is there
+ int read = recv(pollfd.fd, buffer, 7, 0);
+ if (read > 1)
+ {
+ //read the message and store it in a queue
+ std::string msg = std::string(buffer, read);
+ msgList.push(msg);
+ std::cout << "Got a message !" << std::endl;
+ }
+}
+
+bool am::CAmSamplePlugin::dispatchData(const sh_pollHandle_t handle, void *userData)
+{
+ (void) handle;
+ (void) userData;
+ //read data from the queue
+ std::cout << "Data:" << msgList.front() << std::endl;
+
+ //if the message was our finish message, we quit the poll loop
+ if (msgList.front().compare("finish!") == 0)
+ {
+ mSocketHandler->stop_listening();
+ }
+ //remove the message from the queue and return false if there is no more message to read.
+ msgList.pop();
+ if (msgList.size() != 0)
+ return true;
+ return false;
+}
+
+bool am::CAmSamplePlugin::check(const sh_pollHandle_t handle, void *userData)
+{
+ (void) handle;
+ (void) userData;
+ //checks if there is data to dispatch
+ std::cout << "check!:" << std::endl;
+ if (msgList.size() != 0)
+ return true;
+ return false;
+}
+
diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h
new file mode 100644
index 0000000..95e5446
--- /dev/null
+++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h
@@ -0,0 +1,87 @@
+/**
+ * SPDX license identifier: MPL-2.0
+ *
+ * Copyright (C) 2012, BMW AG
+ *
+ * This file is part of GENIVI Project AudioManager.
+ *
+ * Contributions are licensed to the GENIVI Alliance under one or more
+ * Contribution License Agreements.
+ *
+ * \copyright
+ * This Source Code Form is subject to the terms of the
+ * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
+ * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ *
+ * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012
+ *
+ * For further information see http://www.genivi.org/.
+ *
+ */
+
+#ifndef SOCKETHANDLERTEST_H_
+#define SOCKETHANDLERTEST_H_
+
+#define WITH_DLT
+
+#include "gtest/gtest.h"
+#include <queue>
+#include "CAmSocketHandler.h"
+
+namespace am
+{
+
+class CAmSamplePlugin
+{
+public:
+ enum sockType_e
+ {
+ UNIX, INET
+ };
+ CAmSamplePlugin(CAmSocketHandler *mySocketHandler, sockType_e socketType);
+ ~CAmSamplePlugin()
+ {
+ }
+ ;
+ void connectSocket(const pollfd pollfd, const sh_pollHandle_t handle, void* userData);
+ void receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void* userData);
+ bool dispatchData(const sh_pollHandle_t handle, void* userData);
+ bool check(const sh_pollHandle_t handle, void* userData);
+ TAmShPollFired<CAmSamplePlugin> connectFiredCB;
+ TAmShPollFired<CAmSamplePlugin> receiveFiredCB;
+ TAmShPollDispatch<CAmSamplePlugin> sampleDispatchCB;
+ TAmShPollCheck<CAmSamplePlugin> sampleCheckCB;
+private:
+ CAmSocketHandler *mSocketHandler;
+ sh_pollHandle_t mConnecthandle, mReceiveHandle;
+ std::queue<std::string> msgList;
+};
+
+class CAmTimerCb
+{
+public:
+ CAmTimerCb(CAmSocketHandler *SocketHandler);
+ virtual ~CAmTimerCb();
+ void timer1Callback(sh_timerHandle_t handle, void * userData);
+ void timer2Callback(sh_timerHandle_t handle, void * userData);
+ void timer3Callback(sh_timerHandle_t handle, void * userData);
+ void timer4Callback(sh_timerHandle_t handle, void * userData);
+ TAmShTimerCallBack<CAmTimerCb> pTimer1Callback;
+ TAmShTimerCallBack<CAmTimerCb> pTimer2Callback;
+ TAmShTimerCallBack<CAmTimerCb> pTimer3Callback;
+ TAmShTimerCallBack<CAmTimerCb> pTimer4Callback;
+ CAmSocketHandler *mSocketHandler;
+};
+
+class CAmSocketHandlerTest: public ::testing::Test
+{
+public:
+ CAmSocketHandlerTest();
+ ~CAmSocketHandlerTest();
+ void SetUp();
+ void TearDown();
+};
+
+} /* namespace am */
+#endif /* SOCKETHANDLERTEST_H_ */
diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt b/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt
new file mode 100644
index 0000000..2a3b9d8
--- /dev/null
+++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt
@@ -0,0 +1,50 @@
+# Copyright (C) 2012, BMW AG
+#
+# This file is part of GENIVI Project AudioManager.
+#
+# Contributions are licensed to the GENIVI Alliance under one or more
+# Contribution License Agreements.
+#
+# copyright
+# This Source Code Form is subject to the terms of the
+# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
+# this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# author Christian Linke, christian.linke@bmw.de BMW 2011,2012
+#
+# For further information see http://www.genivi.org/.
+#
+
+cmake_minimum_required(VERSION 3.0)
+
+project(AmSocketHandlerTest LANGUAGES CXX VERSION ${DAEMONVERSION})
+
+INCLUDE_DIRECTORIES(
+ ${AUDIOMANAGER_UTILITIES_INCLUDE}
+ ${GMOCK_INCLUDE_DIRS}
+)
+
+
+file(GLOB Socket_SRCS_CXX
+ "*.cpp"
+)
+
+ADD_EXECUTABLE(AmSocketHandlerTest ${Socket_SRCS_CXX})
+
+TARGET_LINK_LIBRARIES(AmSocketHandlerTest
+ ${GTEST_LIBRARIES}
+ ${GMOCK_LIBRARIES}
+ AudioManagerUtilities
+)
+
+ADD_TEST(AmSocketHandlerTest AmSocketHandlerTest ${Socket_SRCS_CXX})
+
+ADD_DEPENDENCIES(AmSocketHandlerTest AudioManagerUtilities)
+
+INSTALL(TARGETS AmSocketHandlerTest
+ DESTINATION ${TEST_EXECUTABLE_INSTALL_PATH}
+ PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ
+ COMPONENT tests
+)
+
+
diff --git a/AudioManagerUtilities/test/CMakeLists.txt b/AudioManagerUtilities/test/CMakeLists.txt
new file mode 100644
index 0000000..fb55831
--- /dev/null
+++ b/AudioManagerUtilities/test/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_subdirectory (AmSocketHandlerTest)
+
+
+