diff options
author | Alexander Kutsan (GitHub) <akutsan@luxoft.com> | 2017-01-20 10:30:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-20 10:30:57 +0200 |
commit | da7aa0163ca7cabf4738dc9c02518b1aa2c55685 (patch) | |
tree | 75312fceb34520d2e45e8b5159071aae8c5337b8 | |
parent | 9ad368a244fa87e7a592e95e0d6a1368bfb2ba1c (diff) | |
parent | f2e85eb39cedb9ca2ea1328eda8cd0e1b76d979d (diff) | |
download | sdl_core-da7aa0163ca7cabf4738dc9c02518b1aa2c55685.tar.gz |
Merge pull request #1189 from LuxoftAKutsan/feature/merge_external_policies_to_develop
WIP Feature/merge external policies to develop ( external ATF check)
175 files changed, 4299 insertions, 2555 deletions
diff --git a/.travis.yml b/.travis.yml index b8b82df3fc..6263b30767 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ addons: - libbluetooth3 - libbluetooth-dev - libudev-dev + - libusb-1.0 - cmake - html2text - clang-format-3.6 @@ -34,7 +35,8 @@ script: - bash -e tools/infrastructure/check_style.sh - mkdir build && cd build && cmake ../ -DBUILD_TESTS=ON -DENABLE_GCOV=ON && make install - sudo ldconfig - - make test + - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/bin/lib ; make test + - bash ../tools/infrastructure/show_disabled.sh - bash -ex ../tools/infrastructure/collect_coverage.sh ./ env: global: diff --git a/CMakeLists.txt b/CMakeLists.txt index 8740c77330..07dd4e8bea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,9 +28,13 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -cmake_minimum_required(VERSION 2.8.0) +cmake_minimum_required(VERSION 2.8.11) set (PROJECT smartDeviceLinkCore) +project (${PROJECT}) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/tools/cmake/modules/") + +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) #Jenkins integration section #dont modify this section if you dont know details about integration with Jenkins!!! @@ -48,6 +52,7 @@ option(ENABLE_GCOV "gcov code coverage feature" OFF) option(ENABLE_SANITIZE "Sanitize tool" OFF) option(ENABLE_SECURITY "Security Ford protocol protection" ON) option(ENABLE_HMI_PTU_DECRYPTION "Policy table update parsed by hmi" ON) +option(ENABLE_EXTENDED_POLICY "Turns extended flow which requires embedded system interaction" ON) option(USE_COTIRE "Use Cotire to speed up build (currently only for commands tests)" ON) option(USE_GOLD_LD "Use gold linker intead of GNU linker" ON) option(USE_CCACHE "Turn on ccache usage" ON) @@ -72,9 +77,9 @@ set(POLICY_OPTION "$ENV{POLICY_TYPE}") set(SECURITY_OPTION "$ENV{SECURITY_MODE}") set(COMPONENTS_DIR ${CMAKE_SOURCE_DIR}/src/components) set(SNAPSHOT_TAG "$ENV{SNAPSHOT_TAG}") - set(CMAKE_CXX_COMPILER $ENV{CMAKE_CXX_COMPILER}) set(CMAKE_C_COMPILER $ENV{CMAKE_C_COMPILER}) +set(BUILDDIR "$ENV{BUILDDIR}") if (ARCH_TYPE_OPTION) if (NOT (${ARCH_TYPE_OPTION} STREQUAL "x86") AND NOT (${ARCH_TYPE_OPTION} STREQUAL "armv7")) @@ -119,9 +124,6 @@ if (HMI_ADAPTER_OPTION) elseif (${HMI_ADAPTER_OPTION} STREQUAL "DBUS") message(STATUS "Jenkins integration: selected HMI adapter DBUS") set (HMIADAPTER "dbus") - elseif (${HMI_ADAPTER_OPTION} STREQUAL "MQUEUE") - message(STATUS "Jenkins integration: selected HMI adapter MQUEUE") - set (HMIADAPTER "mqueue") endif() endif() @@ -239,11 +241,15 @@ endif(USE_DISTCC) if(ENABLE_SANITIZE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") + message(STATUS "Sanitizing enabled") endif() + if(ENABLE_GCOV) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") add_definitions(-DGCOV_ENABLED) + message(STATUS "GCOV enabled") endif() + set(CMAKE_CXX_FLAGS_RELEASE " -DNDEBUG -s -O2") set(CMAKE_CXX_FLAGS_DEBUG " -DDEBUG -g3 -ggdb3") @@ -260,26 +266,29 @@ endif() if (BUILD_USB_SUPPORT) add_definitions(-DUSB_SUPPORT) find_package(UDev REQUIRED) - message(STATUS "USB support is enabled") + message(STATUS "USB support enabled") endif() if (BUILD_BT_SUPPORT) add_definitions(-DBLUETOOTH_SUPPORT) - message(STATUS "Bluetooth support is enabled") + message(STATUS "Bluetooth support enabled") endif() if (BUILD_BACKTRACE_SUPPORT) add_definitions(-DBACKTRACE_SUPPORT) + message(STATUS "Backtrace support enabled") endif() if(ENABLE_LOG) add_definitions(-DENABLE_LOG) set(install-3rd_party_logger "install-3rd_party_logger") + message(STATUS "Logger enabled") endif() if (TELEMETRY_MONITOR) - add_definitions(-DTELEMETRY_MONITOR) + add_definitions(-DTELEMETRY_MONITOR) + message(STATUS "Telemetry monitor enabled") endif() if (${EXTENDED_POLICY} STREQUAL "EXTERNAL_PROPRIETARY") @@ -287,13 +296,13 @@ if (${EXTENDED_POLICY} STREQUAL "EXTERNAL_PROPRIETARY") set(POLICY_PATH ${COMPONENTS_DIR}/policy/policy_external/) set(POLICY_GLOBAL_INCLUDE_PATH ${COMPONENTS_DIR}/include/policy/policy_external/) set(POLICY_MOCK_INCLUDE_PATH ${COMPONENTS_DIR}/include/test/policy/policy_external/) - message(STATUS "DEFINED EXTERNAL_PROPRIETARY POLICY") + message(STATUS "EXTERNAL_PROPRIETARY policy enabled") else() if (${EXTENDED_POLICY} STREQUAL "PROPRIETARY") add_definitions(-DPROPRIETARY_MODE) - message(STATUS "DEFINED PROPRIETARY POLICY") + message(STATUS "PROPRIETARY policy enabled") else() - message(STATUS "DEFINED HTTP POLICY") + message(STATUS "HTTP policy enabled") endif() set(POLICY_PATH ${COMPONENTS_DIR}/policy/policy_regular/) set(POLICY_GLOBAL_INCLUDE_PATH ${COMPONENTS_DIR}/include/policy/policy_regular/) @@ -304,103 +313,38 @@ endif() add_definitions(-DOS_POSIX) if (EXTENDED_MEDIA_MODE) -add_definitions(-DEXTENDED_MEDIA_MODE) -# required to find 'glibconfig.h' -find_package(PkgConfig) -pkg_check_modules(GLIB2 REQUIRED glib-2.0) -add_definitions(${GLIB2_CFLAGS}) -endif() - - -# --- Interface generator - -find_package(PythonInterp) -if(NOT PYTHONINTERP_FOUND) - message(STATUS "Python interpreter is not found") - message(STATUS "To install it type in the command line:") - message(STATUS "sudo apt-get install python") - message(FATAL_ERROR "Exiting!") -endif(NOT PYTHONINTERP_FOUND) - -if (HMI STREQUAL "qt") - cmake_minimum_required(VERSION 2.8.11) - if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - set(qt_version "4.8.5") - else () - set(qt_version "5.1.0") - endif () - - execute_process( - COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version} - OUTPUT_VARIABLE qt_bin_dir - ) - message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}") - set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH}) - - if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative) - else () - find_package(Qt5Core REQUIRED) - find_package(Qt5DBus REQUIRED) - find_package(Qt5Qml REQUIRED) - find_package(Qt5Quick REQUIRED) - set(qmlplugindump_binary ${qt_bin_dir}/qmlplugindump) - endif () + add_definitions(-DEXTENDED_MEDIA_MODE) + message(STATUS "Extended media mode enabled") + # required to find 'glibconfig.h' + find_package(PkgConfig) + pkg_check_modules(GLIB2 REQUIRED glib-2.0) + add_definitions(${GLIB2_CFLAGS}) endif() -set(INTEFRACE_GENERATOR "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/Generator.py") -set(INTEFRACE_GENERATOR_CMD ${PYTHON_EXECUTABLE} -B ${INTEFRACE_GENERATOR}) -file(GLOB_RECURSE INTERFACE_GENERATOR_DEPENDENCIES "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/*.*") - -macro (GenerateInterface arg_xml_name arg_namespace parser_type) - string(REGEX MATCH "^[a-zA-Z_0-9]*[^.]" file_name ${arg_xml_name}) # TODO: make expression more robust - - set(hpp_file - "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h" - "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h" - ) - - set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc") - set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}") - - add_custom_command( OUTPUT ${hpp_file} ${cpp_file} - COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} ${arg_namespace} ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "${parser_type}" - DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name} - COMMENT "Generating files:\n ${hpp_file}\n ${cpp_file}\nfrom:\n ${arg_xml_name} ..." - VERBATIM - ) - - include_directories ( - ${COMPONENTS_DIR}/smart_objects/include - ${COMPONENTS_DIR}/formatters/include/ - ${CMAKE_BINARY_DIR} - ) - - add_library("${file_name}" ${cpp_file}) -endmacro(GenerateInterface) - -# --- Useful macro -macro(create_test NAME SOURCES LIBS) - add_executable("${NAME}" ${CMAKE_SOURCE_DIR}/src/components/test_main.cc ${SOURCES}) - target_link_libraries("${NAME}" ${LIBS}) - target_link_libraries("${NAME}" Utils) +if(HMI STREQUAL "qt") if(CMAKE_SYSTEM_NAME STREQUAL "QNX") - add_test(${NAME} ${CMAKE_SOURCE_DIR}/qnx/remote_run_test.sh ${NAME}) - elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_test(NAME ${NAME} - COMMAND ${NAME} --gtest_output=xml:${CMAKE_BINARY_DIR}/test_results/) + set(qt_version "4.8.5") else() - add_test(${NAME} ${NAME}) + set(qt_version "5.1.0") endif() -endmacro(create_test) -# --replace in list macro -macro(LIST_REPLACE LIST INDEX NEWVALUE) - list(INSERT ${LIST} ${INDEX} ${NEWVALUE}) - MATH(EXPR __INDEX "${INDEX} + 1") - list (REMOVE_AT ${LIST} ${__INDEX}) -endmacro(LIST_REPLACE) + execute_process( + COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version} + OUTPUT_VARIABLE qt_bin_dir + ) + message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}") + set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH}) + if(CMAKE_SYSTEM_NAME STREQUAL "QNX") + find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative) + else () + find_package(Qt5Core REQUIRED) + find_package(Qt5DBus REQUIRED) + find_package(Qt5Qml REQUIRED) + find_package(Qt5Quick REQUIRED) + set(qmlplugindump_binary ${qt_bin_dir}/qmlplugindump) + endif() +endif() # Building application @@ -422,9 +366,6 @@ endif() if (HMI STREQUAL "web" AND NOT DEFINED HMIADAPTER) set(HMIADAPTER "messagebroker") endif() -if (HMI STREQUAL "no" AND NOT DEFINED HMIADAPTER) - set(HMIADAPTER "mqueue") -endif() if (HMIADAPTER STREQUAL "dbus") set(HMI_DBUS_API ON) @@ -437,11 +378,6 @@ if (HMIADAPTER STREQUAL "messagebroker") add_definitions(-DMESSAGEBROKER_HMIADAPTER) add_definitions(-DHMI_JSON_API) endif() -if (HMIADAPTER STREQUAL "mqueue") - set(HMI_JSON_API ON) - add_definitions(-DMQUEUE_HMIADAPTER) - add_definitions(-DHMI_JSON_API) -endif() # --- Directory with SDL interfaces, global types and ProtocolLib component include_directories( @@ -449,243 +385,8 @@ include_directories( ${COMPONENTS_DIR}/protocol/include ) -if (BUILD_TESTS) - include_directories( - ${COMPONENTS_DIR}/include/test - ) -endif () - # --- 3rd party libs -INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/src/3rd_party/set_3rd_party_paths.cmake) - -set(3RD_PARTY_SOURCE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/3rd_party) -set(3RD_PARTY_BINARY_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src/3rd_party) - -set (install-3rd_party_logger_var "") -set (install-3rd_party_dbus_var "") - -if(NO_REBUILD_3RD_PARTY) - set(NO_REBUILD_3RD_PARTY_LOGGER ON) - set(NO_REBUILD_3RD_PARTY_DBUS ON) -endif() - -if(FORCE_3RD_PARTY) - if(NO_REBUILD_3RD_PARTY) - message(FATAL_ERROR "Please don't turn on both FORCE_3RD_PARTY and NO_REBUILD_3RD_PARTY at the same time.") - else() - set(FORCE_3RD_PARTY_LOGGER ON) - set(FORCE_3RD_PARTY_DBUS ON) - endif() -endif() - -if(ENABLE_LOG) - if(NO_REBUILD_3RD_PARTY_LOGGER) - message(STATUS "Not rebuilding logger.") - else() - if(FORCE_3RD_PARTY_LOGGER) - message(STATUS "Force to rebuild logger.") - - #build logger - add_custom_target(3rd_party_logger - make - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - - #install logger - #install either to default place with sudo or non-default plase without sudo. - #to install with sudo to non-default place use manual installation - add_custom_target(install-3rd_party_logger - COMMAND /bin/bash -c \"USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; - if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then - sudo -k \; - sudo make install\; - else - make install\; - fi\" - DEPENDS 3rd_party_logger - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - else() - #build logger - add_custom_target(3rd_party_logger - COMMAND /bin/bash -c \"cd ${CMAKE_CURRENT_SOURCE_DIR} && - grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]\; then - VAR1=\\$$\( readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 2>/dev/null\)\; - VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; - VAR2=-1\; - cd ${CMAKE_CURRENT_SOURCE_DIR}\; - git log . 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]; then - VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/apache-log4cxx-0.10.0\)\; - fi\; - if [ \\$$VAR1 != \\$$VAR2 ]\; then - echo " Need to rebuild logger. " \; - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make\; - else - echo " Logger is actual. " \; - fi\; - else - echo " Need to build logger. " \; - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make\; - fi\" - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - - #install logger - #install either to default place with sudo or non-default plase without sudo. - #to install with sudo to non-default place use manual installation - add_custom_target(install-3rd_party_logger - COMMAND /bin/bash -c \"cd ${CMAKE_CURRENT_SOURCE_DIR} && - grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]\; then - VAR1=\\$$\( readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 2>/dev/null\)\; - VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; - VAR2=-1\; - cd ${CMAKE_CURRENT_SOURCE_DIR}\; - git log . 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]; then - VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/apache-log4cxx-0.10.0\)\; - fi\; - if [ \\$$VAR1 != \\$$VAR2 ]\; then - USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; - if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - sudo -k \; - sudo make install\; - else - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make install\; - fi\; - fi\; - else - USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; - if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - sudo -k \; - sudo make install\; - else - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make install\; - fi\; - fi\" - DEPENDS 3rd_party_logger - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - endif() - - set (install-3rd_party_logger_var "install-3rd_party_logger") - endif() -endif() - -if (HMIADAPTER STREQUAL "dbus") - if(NO_REBUILD_3RD_PARTY_DBUS) - message(STATUS "Not rebuilding D-Bus.") - else() - if(FORCE_3RD_PARTY_DBUS) - message(STATUS "Force to rebuild D-Bus.") - - #build d-bus - add_custom_target(3rd_party_dbus - make - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - - #install d-bus - #install either to default place with sudo or non-default plase without sudo. - #to install with sudo to non-default place use manual installation - add_custom_target(install-3rd_party_dbus - COMMAND /bin/bash -c \"USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; - if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then - sudo -k \; - sudo make install\; - else - make install\; - fi\" - DEPENDS 3rd_party_dbus - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - else() - #build d-bus - add_custom_target(3rd_party_dbus - COMMAND /bin/bash -c \"grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]\; then - VAR1=\\$$\(readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 2>/dev/null\)\; - VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; - VAR2=-1\; - cd ${CMAKE_CURRENT_SOURCE_DIR}\; - git log . 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]; then - VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/dbus-1.7.8\)\; - fi\; - if [ \\$$VAR1 != \\$$VAR2 ]\; then - echo " Need to rebuild D-Bus. " \; - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make\; - else - echo " D-Bus is actual. " \; - fi\; - else - echo " Need to build D-Bus. " \; - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make\; - fi\" - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - - #install d-bus - #install either to default place with sudo or non-default plase without sudo. - #to install with sudo to non-default place use manual installation - add_custom_target(install-3rd_party_dbus - COMMAND /bin/bash -c \"grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]\; then - VAR1=\\$$\(readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 2>/dev/null\)\; - VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; - VAR2=-1\; - cd ${CMAKE_CURRENT_SOURCE_DIR}\; - git log . 1>/dev/null 2>&1\; - if [ \\$$? == 0 ]; then - VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/dbus-1.7.8\)\; - fi\; - if [ \\$$VAR1 != \\$$VAR2 ]\; then - USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; - if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - sudo -k \; - sudo make install\; - else - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make install\; - fi\; - fi\; - else - USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; - if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - sudo -k \; - sudo make install\; - else - cd ${3RD_PARTY_BINARY_DIRECTORY}\; - make install\; - fi\; - fi\" - DEPENDS 3rd_party_dbus - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} - ) - endif() - - set (install-3rd_party_dbus_var "install-3rd_party_dbus") - endif() -endif() - -add_subdirectory(${3RD_PARTY_SOURCE_DIRECTORY} ${3RD_PARTY_BINARY_DIRECTORY} EXCLUDE_FROM_ALL) -add_custom_target(install-3rd_party - DEPENDS ${install-3rd_party_logger_var} - DEPENDS ${install-3rd_party_dbus_var} - WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} -) +add_subdirectory(./src/3rd_party EXCLUDE_FROM_ALL) find_package(OpenSSL REQUIRED) if(ENABLE_LOG) @@ -697,25 +398,27 @@ if(ENABLE_SECURITY) set(SecurityManagerLibrary SecurityManager) set(SecurityManagerIncludeDir ${COMPONENTS_DIR}/security_manager/include) #set(SecurityManagerTestIncludeDir ${CMAKE_SOURCE_DIR}/test/components/security_manager/include) + message(STATUS "Security enabled") endif() if(ENABLE_HMI_PTU_DECRYPTION) - MESSAGE("USE DHMI_PTU_PARSER") add_definitions(-DUSE_HMI_PTU_DECRYPTION) + message(STATUS "HMI PTU decription enabled") endif() set(RTLIB rt) if(CMAKE_SYSTEM_NAME STREQUAL "QNX") -set(RTLIB ) + set(RTLIB ) endif() # Building tests if(BUILD_TESTS) enable_testing() add_definitions(-DBUILD_TESTS) - # Framework GoogleTest is also integrated together gmock - # and must not be added separately - add_subdirectory(./src/3rd_party-static/gmock-1.7.0) + include_directories( + ${COMPONENTS_DIR}/include/test + ) + message(STATUS "Tests enabled") endif() # --- 3rd party libs (static) @@ -724,7 +427,6 @@ add_subdirectory(./src/3rd_party-static) # --- Tools add_subdirectory(./tools) - # --- Components add_subdirectory(./src/components) @@ -734,35 +436,31 @@ add_subdirectory(./src/appMain) # --- Plugins add_subdirectory(./src/plugins) - -# Building tests -if(BUILD_TESTS) - # Directory test is deprecated. Use src/components/<name>/test - include(Dart) - #add_subdirectory(./test) -endif() +add_dependencies(${PROJECT} Policy) +add_dependencies(${PROJECT} copy_policy_library) # Building documentation # At first creating directory for generated documentation. Unfortunately doxygen # cannot generate it byself -FIND_PACKAGE(Doxygen) - IF(DOXYGEN_FOUND) +find_package(Doxygen) + if(DOXYGEN_FOUND) option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON) + message(STATUS "Doxygen found. Documentation will be generated") if(DOXYGEN_ENABLE_DIAGRAMS) set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES") - else(DOXYGEN_ENABLE_DIAGRAMS) + else() set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO") endif() configure_file("${PROJECT_SOURCE_DIR}/Doxyfile" "${PROJECT_BINARY_DIR}/Doxyfile") file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/doc/doxygen") - ADD_CUSTOM_TARGET(doxygen COMMAND ${DOXYGEN_EXECUTABLE} "${PROJECT_BINARY_DIR}/Doxyfile") - ELSE(DOXYGEN_FOUND) - MESSAGE(STATUS "Doxygen not found. Documentation will not be generated") - MESSAGE(STATUS "To enable documentation generation please install doxygen and graphviz packages") - MESSAGE(STATUS "sudo apt-get install doxygen graphviz") - MESSAGE(STATUS "To enable processing of MscGen comments please install mscgen") - MESSAGE(STATUS "sudo apt-get install mscgen") -ENDIF(DOXYGEN_FOUND) + add_custom_target(doxygen COMMAND ${DOXYGEN_EXECUTABLE} "${PROJECT_BINARY_DIR}/Doxyfile") + else() + message(STATUS "Doxygen not found. Documentation will not be generated") + message(STATUS "To enable documentation generation please install doxygen and graphviz packages") + message(STATUS "sudo apt-get install doxygen graphviz") + message(STATUS "To enable processing of MscGen comments please install mscgen") + message(STATUS "sudo apt-get install mscgen") +endif() diff --git a/src/3rd_party-static/CMakeLists.txt b/src/3rd_party-static/CMakeLists.txt index 8dfcf6595a..2acd7be27c 100644 --- a/src/3rd_party-static/CMakeLists.txt +++ b/src/3rd_party-static/CMakeLists.txt @@ -32,8 +32,8 @@ add_subdirectory(./jsoncpp) set(JSONCPP_INCLUDE_DIRECTORY ${JSONCPP_INCLUDE_DIRECTORY} PARENT_SCOPE) -# --- MessageBroker -add_subdirectory(./MessageBroker) +# --- Message Broker +add_subdirectory(./message_broker) set(MESSAGE_BROKER_INCLUDE_DIRECTORY ${MESSAGE_BROKER_INCLUDE_DIRECTORY} PARENT_SCOPE) # --- encryption @@ -48,6 +48,9 @@ if (BUILD_USB_SUPPORT) endif() endif() +# --- gmock if(BUILD_TESTS) + add_subdirectory(./gmock-1.7.0) + set(GMOCK_INCLUDE_DIRECTORY ${GMOCK_INCLUDE_DIRECTORY} PARENT_SCOPE) add_subdirectory(test) endif() diff --git a/src/3rd_party-static/MessageBroker/CMakeLists.txt b/src/3rd_party-static/MessageBroker/CMakeLists.txt deleted file mode 100644 index 87a0fe2a2a..0000000000 --- a/src/3rd_party-static/MessageBroker/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -set(MESSAGE_BROKER_INCLUDE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include) -set(MESSAGE_BROKER_INCLUDE_DIRECTORY ${MESSAGE_BROKER_INCLUDE_DIRECTORY} PARENT_SCOPE) - -include_directories ( - ./include/ - ../jsoncpp/include - ../../components/utils/include - -) - -set (MESSAGE_BROKER_SOURCES - ./src/lib_messagebroker/CMessageBroker.cpp - ./src/lib_messagebroker/CMessageBrokerRegistry.cpp - ./src/lib_messagebroker/md5.cpp - ./src/lib_messagebroker/system.cpp - ./src/lib_messagebroker/websocket_handler.cpp -) - -set (MESSAGE_BROKER_CLIENT_SOURCES - ./src/client/mb_client.cpp - ./src/client/mb_tcpclient.cpp - ./src/client/mb_controller.cpp -) - -set (MESSAGE_BROKER_SERVER_SOURCES - ./src/server/mb_server.cpp - ./src/server/mb_tcpserver.cpp - ./src/server/networking.cpp -) - -add_library("MessageBroker" ${MESSAGE_BROKER_SOURCES}) -target_link_libraries(MessageBroker Utils) - - -add_library("MessageBrokerClient" ${MESSAGE_BROKER_CLIENT_SOURCES}) -target_link_libraries("MessageBrokerClient" "MessageBroker") - -add_library("MessageBrokerServer" ${MESSAGE_BROKER_SERVER_SOURCES}) -target_link_libraries("MessageBrokerServer" "MessageBroker") diff --git a/src/3rd_party-static/encryption/CMakeLists.txt b/src/3rd_party-static/encryption/CMakeLists.txt index 3802c83cb5..5096f59c22 100644 --- a/src/3rd_party-static/encryption/CMakeLists.txt +++ b/src/3rd_party-static/encryption/CMakeLists.txt @@ -1,14 +1,43 @@ +# Copyright (c) 2015, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + set(ENCRYPTION_INCLUDE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include) set(ENCRYPTION_INCLUDE_DIRECTORY ${ENCRYPTION_INCLUDE_DIRECTORY} PARENT_SCOPE) include_directories ( - ./include + ${ENCRYPTION_INCLUDE_DIRECTORY} ) -set (SOURCES - ./src/Base64.cpp - ./src/hashing.cc -) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") set (LIBRARIES crypto) diff --git a/src/3rd_party-static/jsoncpp/CMakeLists.txt b/src/3rd_party-static/jsoncpp/CMakeLists.txt index 04a4bd960c..ac273cfe7b 100644 --- a/src/3rd_party-static/jsoncpp/CMakeLists.txt +++ b/src/3rd_party-static/jsoncpp/CMakeLists.txt @@ -1,14 +1,42 @@ +# Copyright (c) 2016, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + set(JSONCPP_INCLUDE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include) set(JSONCPP_INCLUDE_DIRECTORY ${JSONCPP_INCLUDE_DIRECTORY} PARENT_SCOPE) -include_directories ( - ./include/ +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/include ) -set (SOURCES - ./src/lib_json/json_value.cpp - ./src/lib_json/json_writer.cpp - ./src/lib_json/json_reader.cpp -) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/lib_json") -add_library("jsoncpp" ${SOURCES}) +add_library(jsoncpp ${SOURCES}) diff --git a/cmake/Modules/sources.cmake b/src/3rd_party-static/message_broker/CMakeLists.txt index 1414a33809..348d050887 100644 --- a/cmake/Modules/sources.cmake +++ b/src/3rd_party-static/message_broker/CMakeLists.txt @@ -28,24 +28,51 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -function(create_cotired_test NAME SOURCES LIBS) - add_executable( - ${NAME} - EXCLUDE_FROM_ALL - ${CMAKE_SOURCE_DIR}/src/components/test_main.cc - ${SOURCES} - ) - if(${USE_COTIRE}) - include(cotire) - cotire(${NAME}) - set(NAME "${NAME}_unity") - endif() - target_link_libraries(${NAME} ${LIBS}) - set_target_properties( - ${NAME} - PROPERTIES - EXCLUDE_FROM_ALL 0 - ) - add_test(NAME ${NAME} - COMMAND ${NAME} --gtest_output=xml:${CMAKE_BINARY_DIR}/test_results/) -endfunction() +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + +set(MESSAGE_BROKER_INCLUDE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include) +set(MESSAGE_BROKER_INCLUDE_DIRECTORY ${MESSAGE_BROKER_INCLUDE_DIRECTORY} PARENT_SCOPE) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${JSONCPP_INCLUDE_DIRECTORY} +) + +set(CLIENT_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/src/client +) +collect_sources(CLIENT_SOURCES "${CLIENT_PATHS}") + +set(SERVER_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/src/server +) +collect_sources(SERVER_SOURCES "${SERVER_PATHS}") + +set(EXCLUDE_PATHS + ${CLIENT_PATHS} + ${SERVER_PATHS} + ${CMAKE_CURRENT_SOURCE_DIR}/src/example +) + +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") + +set(LIBRARIES + Utils +) + +add_library(message_broker ${SOURCES}) +target_link_libraries(message_broker ${LIBRARIES}) + +list(APPEND LIBRARIES + message_broker +) + +add_library(message_broker_client ${CLIENT_SOURCES}) +target_link_libraries(message_broker_client ${LIBRARIES}) + +add_library(message_broker_server ${SERVER_SOURCES}) +target_link_libraries(message_broker_server ${LIBRARIES}) diff --git a/src/3rd_party-static/MessageBroker/include/CMessageBroker.hpp b/src/3rd_party-static/message_broker/include/CMessageBroker.hpp index c542043796..c542043796 100644 --- a/src/3rd_party-static/MessageBroker/include/CMessageBroker.hpp +++ b/src/3rd_party-static/message_broker/include/CMessageBroker.hpp diff --git a/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp b/src/3rd_party-static/message_broker/include/CMessageBrokerRegistry.hpp index 001f978bbf..001f978bbf 100644 --- a/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp +++ b/src/3rd_party-static/message_broker/include/CMessageBrokerRegistry.hpp diff --git a/src/3rd_party-static/MessageBroker/include/CSender.hpp b/src/3rd_party-static/message_broker/include/CSender.hpp index 78faf7dad2..78faf7dad2 100644 --- a/src/3rd_party-static/MessageBroker/include/CSender.hpp +++ b/src/3rd_party-static/message_broker/include/CSender.hpp diff --git a/src/3rd_party-static/MessageBroker/include/MBDebugHelper.h b/src/3rd_party-static/message_broker/include/MBDebugHelper.h index fa835da3f0..fa835da3f0 100644 --- a/src/3rd_party-static/MessageBroker/include/MBDebugHelper.h +++ b/src/3rd_party-static/message_broker/include/MBDebugHelper.h diff --git a/src/3rd_party-static/MessageBroker/include/mb_client.hpp b/src/3rd_party-static/message_broker/include/mb_client.hpp index cd70a31cd8..cd70a31cd8 100644 --- a/src/3rd_party-static/MessageBroker/include/mb_client.hpp +++ b/src/3rd_party-static/message_broker/include/mb_client.hpp diff --git a/src/3rd_party-static/MessageBroker/include/mb_controller.hpp b/src/3rd_party-static/message_broker/include/mb_controller.hpp index 2d196aced2..2d196aced2 100644 --- a/src/3rd_party-static/MessageBroker/include/mb_controller.hpp +++ b/src/3rd_party-static/message_broker/include/mb_controller.hpp diff --git a/src/3rd_party-static/MessageBroker/include/mb_server.hpp b/src/3rd_party-static/message_broker/include/mb_server.hpp index 684a89055a..684a89055a 100644 --- a/src/3rd_party-static/MessageBroker/include/mb_server.hpp +++ b/src/3rd_party-static/message_broker/include/mb_server.hpp diff --git a/src/3rd_party-static/MessageBroker/include/mb_tcpclient.hpp b/src/3rd_party-static/message_broker/include/mb_tcpclient.hpp index 07697dbde7..07697dbde7 100644 --- a/src/3rd_party-static/MessageBroker/include/mb_tcpclient.hpp +++ b/src/3rd_party-static/message_broker/include/mb_tcpclient.hpp diff --git a/src/3rd_party-static/MessageBroker/include/mb_tcpserver.hpp b/src/3rd_party-static/message_broker/include/mb_tcpserver.hpp index 8ab2ce6a6d..8ab2ce6a6d 100644 --- a/src/3rd_party-static/MessageBroker/include/mb_tcpserver.hpp +++ b/src/3rd_party-static/message_broker/include/mb_tcpserver.hpp diff --git a/src/3rd_party-static/MessageBroker/include/networking.h b/src/3rd_party-static/message_broker/include/networking.h index a08853bb31..a08853bb31 100644 --- a/src/3rd_party-static/MessageBroker/include/networking.h +++ b/src/3rd_party-static/message_broker/include/networking.h diff --git a/src/3rd_party-static/MessageBroker/include/system.h b/src/3rd_party-static/message_broker/include/system.h index fac4f7926b..fac4f7926b 100644 --- a/src/3rd_party-static/MessageBroker/include/system.h +++ b/src/3rd_party-static/message_broker/include/system.h diff --git a/src/3rd_party-static/MessageBroker/include/websocket_handler.hpp b/src/3rd_party-static/message_broker/include/websocket_handler.hpp index 8bed007436..8bed007436 100644 --- a/src/3rd_party-static/MessageBroker/include/websocket_handler.hpp +++ b/src/3rd_party-static/message_broker/include/websocket_handler.hpp diff --git a/src/3rd_party-static/MessageBroker/src/client/mb_client.cpp b/src/3rd_party-static/message_broker/src/client/mb_client.cpp index 6342c776a8..6342c776a8 100644 --- a/src/3rd_party-static/MessageBroker/src/client/mb_client.cpp +++ b/src/3rd_party-static/message_broker/src/client/mb_client.cpp diff --git a/src/3rd_party-static/MessageBroker/src/client/mb_controller.cpp b/src/3rd_party-static/message_broker/src/client/mb_controller.cpp index 8a4a77cf30..8a4a77cf30 100644 --- a/src/3rd_party-static/MessageBroker/src/client/mb_controller.cpp +++ b/src/3rd_party-static/message_broker/src/client/mb_controller.cpp diff --git a/src/3rd_party-static/MessageBroker/src/client/mb_tcpclient.cpp b/src/3rd_party-static/message_broker/src/client/mb_tcpclient.cpp index 02db417c26..02db417c26 100644 --- a/src/3rd_party-static/MessageBroker/src/client/mb_tcpclient.cpp +++ b/src/3rd_party-static/message_broker/src/client/mb_tcpclient.cpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerAVA.cpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerAVA.cpp index 77ab1ca2c1..77ab1ca2c1 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerAVA.cpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerAVA.cpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerAVA.hpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerAVA.hpp index 47e684a7e4..47e684a7e4 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerAVA.hpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerAVA.hpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerBackend.cpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerBackend.cpp index cbbe39492b..cbbe39492b 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerBackend.cpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerBackend.cpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerBackend.hpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerBackend.hpp index b79411dc98..b79411dc98 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerBackend.hpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerBackend.hpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerPhone.cpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerPhone.cpp index 6f308e71c2..6f308e71c2 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerPhone.cpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerPhone.cpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerPhone.hpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerPhone.hpp index e6f4898226..e6f4898226 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerControllerPhone.hpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerControllerPhone.hpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerServer.cpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerServer.cpp index 405b3fcbd5..405b3fcbd5 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerServer.cpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerServer.cpp diff --git a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerServer.hpp b/src/3rd_party-static/message_broker/src/example/MessageBrokerServer.hpp index 884ed0309f..884ed0309f 100644 --- a/src/3rd_party-static/MessageBroker/src/example/MessageBrokerServer.hpp +++ b/src/3rd_party-static/message_broker/src/example/MessageBrokerServer.hpp diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBroker.cpp b/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBroker.cpp index 3b14489a8c..3b14489a8c 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBroker.cpp +++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBroker.cpp diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp b/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp index fb24d08f1c..fb24d08f1c 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp +++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/libMBDebugHelper.h b/src/3rd_party-static/message_broker/src/lib_messagebroker/libMBDebugHelper.h index 0d5260cdda..0d5260cdda 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/libMBDebugHelper.h +++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/libMBDebugHelper.h diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/md5.cpp b/src/3rd_party-static/message_broker/src/lib_messagebroker/md5.cpp index b3e347d9d7..b3e347d9d7 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/md5.cpp +++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/md5.cpp diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/md5.h b/src/3rd_party-static/message_broker/src/lib_messagebroker/md5.h index 2c54c03b1b..2c54c03b1b 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/md5.h +++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/md5.h diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/system.cpp b/src/3rd_party-static/message_broker/src/lib_messagebroker/system.cpp index 456362f9d8..456362f9d8 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/system.cpp +++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/system.cpp diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/websocket_handler.cpp b/src/3rd_party-static/message_broker/src/lib_messagebroker/websocket_handler.cpp index 7d3890b7a8..7d3890b7a8 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/websocket_handler.cpp +++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/websocket_handler.cpp diff --git a/src/3rd_party-static/MessageBroker/src/server/mb_server.cpp b/src/3rd_party-static/message_broker/src/server/mb_server.cpp index 25ec7fc9f3..25ec7fc9f3 100644 --- a/src/3rd_party-static/MessageBroker/src/server/mb_server.cpp +++ b/src/3rd_party-static/message_broker/src/server/mb_server.cpp diff --git a/src/3rd_party-static/MessageBroker/src/server/mb_tcpserver.cpp b/src/3rd_party-static/message_broker/src/server/mb_tcpserver.cpp index bdd7b2bfdf..bdd7b2bfdf 100644 --- a/src/3rd_party-static/MessageBroker/src/server/mb_tcpserver.cpp +++ b/src/3rd_party-static/message_broker/src/server/mb_tcpserver.cpp diff --git a/src/3rd_party-static/MessageBroker/src/server/networking.cpp b/src/3rd_party-static/message_broker/src/server/networking.cpp index f054431690..f054431690 100644 --- a/src/3rd_party-static/MessageBroker/src/server/networking.cpp +++ b/src/3rd_party-static/message_broker/src/server/networking.cpp diff --git a/src/3rd_party-static/test/CMakeLists.txt b/src/3rd_party-static/test/CMakeLists.txt index 33bcd82694..a38a392a01 100644 --- a/src/3rd_party-static/test/CMakeLists.txt +++ b/src/3rd_party-static/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,21 +28,16 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) -include_directories ( +include_directories( ${GMOCK_INCLUDE_DIRECTORY} ${JSONCPP_INCLUDE_DIRECTORY} ) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") + set(LIBRARIES gmock jsoncpp ) -set (SOURCES - json_reader_test.cc -) - -add_library("test_JSONCPPTest" ${SOURCES}) -create_test("test_JSONCPP" "${SOURCES}" "${LIBRARIES}") -endif()
\ No newline at end of file +create_test(jsoncpp_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/3rd_party/CMakeLists.txt b/src/3rd_party/CMakeLists.txt index c7965992f4..cddc2d16b6 100644 --- a/src/3rd_party/CMakeLists.txt +++ b/src/3rd_party/CMakeLists.txt @@ -28,7 +28,27 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -INCLUDE("./set_3rd_party_paths.cmake") +include("./set_3rd_party_paths.cmake") + +set(3RD_PARTY_SOURCE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +set(3RD_PARTY_BINARY_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + +set (install-3rd_party_logger_var "") +set (install-3rd_party_dbus_var "") + +if(NO_REBUILD_3RD_PARTY) + set(NO_REBUILD_3RD_PARTY_LOGGER ON) + set(NO_REBUILD_3RD_PARTY_DBUS ON) +endif() + +if(FORCE_3RD_PARTY) + if(NO_REBUILD_3RD_PARTY) + message(FATAL_ERROR "Please don't turn on both FORCE_3RD_PARTY and NO_REBUILD_3RD_PARTY at the same time.") + else() + set(FORCE_3RD_PARTY_LOGGER ON) + set(FORCE_3RD_PARTY_DBUS ON) + endif() +endif() if(ENABLE_LOG OR HMI_DBUS_API) # --- libexpat @@ -37,14 +57,112 @@ if(ENABLE_LOG OR HMI_DBUS_API) endif() if(ENABLE_LOG) + if(NO_REBUILD_3RD_PARTY_LOGGER) + message(STATUS "Not rebuilding logger.") + else() + if(FORCE_3RD_PARTY_LOGGER) + message(STATUS "Force to rebuild logger.") + + #build logger + add_custom_target(3rd_party_logger + make + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + + #install logger + #install either to default place with sudo or non-default plase without sudo. + #to install with sudo to non-default place use manual installation + add_custom_target(install-3rd_party_logger + COMMAND /bin/bash -c \"USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; + if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then + sudo -k \; + sudo make install\; + else + make install\; + fi\" + DEPENDS 3rd_party_logger + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + else() + #build logger + add_custom_target(3rd_party_logger + COMMAND /bin/bash -c \"cd ${CMAKE_CURRENT_SOURCE_DIR} && + grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]\; then + VAR1=\\$$\( readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 2>/dev/null\)\; + VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; + VAR2=-1\; + cd ${CMAKE_CURRENT_SOURCE_DIR}\; + git log . 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]; then + VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/apache-log4cxx-0.10.0\)\; + fi\; + if [ \\$$VAR1 != \\$$VAR2 ]\; then + echo " Need to rebuild logger. " \; + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make\; + else + echo " Logger is actual. " \; + fi\; + else + echo " Need to build logger. " \; + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make\; + fi\" + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + + #install logger + #install either to default place with sudo or non-default plase without sudo. + #to install with sudo to non-default place use manual installation + add_custom_target(install-3rd_party_logger + COMMAND /bin/bash -c \"cd ${CMAKE_CURRENT_SOURCE_DIR} && + grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]\; then + VAR1=\\$$\( readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/liblog4cxx.so 2>/dev/null\)\; + VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; + VAR2=-1\; + cd ${CMAKE_CURRENT_SOURCE_DIR}\; + git log . 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]; then + VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/apache-log4cxx-0.10.0\)\; + fi\; + if [ \\$$VAR1 != \\$$VAR2 ]\; then + USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; + if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + sudo -k \; + sudo make install\; + else + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make install\; + fi\; + fi\; + else + USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; + if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + sudo -k \; + sudo make install\; + else + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make install\; + fi\; + fi\" + DEPENDS 3rd_party_logger + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + endif() + + set(install-3rd_party_logger_var "install-3rd_party_logger") + endif() + set(APR_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib PARENT_SCOPE) set(APR_INCLUDE_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX}/include PARENT_SCOPE) set(APR_UTIL_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib PARENT_SCOPE) set(LOG4CXX_INCLUDE_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX}/include PARENT_SCOPE) set(LOG4CXX_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib PARENT_SCOPE) -endif() -if(ENABLE_LOG) # --- libapr-1 add_subdirectory(apr-cmake) @@ -57,14 +175,117 @@ endif() # --- D-Bus if(HMI_DBUS_API) + if(NO_REBUILD_3RD_PARTY_DBUS) + message(STATUS "Not rebuilding D-Bus.") + else() + if(FORCE_3RD_PARTY_DBUS) + message(STATUS "Force to rebuild D-Bus.") + + #build d-bus + add_custom_target(3rd_party_dbus + make + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + + #install d-bus + #install either to default place with sudo or non-default plase without sudo. + #to install with sudo to non-default place use manual installation + add_custom_target(install-3rd_party_dbus + COMMAND /bin/bash -c \"USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; + if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then + sudo -k \; + sudo make install\; + else + make install\; + fi\" + DEPENDS 3rd_party_dbus + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + else() + #build d-bus + add_custom_target(3rd_party_dbus + COMMAND /bin/bash -c \"grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]\; then + VAR1=\\$$\(readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 2>/dev/null\)\; + VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; + VAR2=-1\; + cd ${CMAKE_CURRENT_SOURCE_DIR}\; + git log . 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]; then + VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/dbus-1.7.8\)\; + fi\; + if [ \\$$VAR1 != \\$$VAR2 ]\; then + echo " Need to rebuild D-Bus. " \; + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make\; + else + echo " D-Bus is actual. " \; + fi\; + else + echo " Need to build D-Bus. " \; + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make\; + fi\" + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + + #install d-bus + #install either to default place with sudo or non-default plase without sudo. + #to install with sudo to non-default place use manual installation + add_custom_target(install-3rd_party_dbus + COMMAND /bin/bash -c \"grep .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]\; then + VAR1=\\$$\(readelf -p .commit_hash ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib/libdbus-1.so 2>/dev/null\)\; + VAR1=\\$$\(echo \\$$VAR1 | awk '{print \\$$NF}'\)\; + VAR2=-1\; + cd ${CMAKE_CURRENT_SOURCE_DIR}\; + git log . 1>/dev/null 2>&1\; + if [ \\$$? == 0 ]; then + VAR2=\\$$\(git log --pretty=\"format:%H\" -1 ${3RD_PARTY_SOURCE_DIRECTORY}/dbus-1.7.8\)\; + fi\; + if [ \\$$VAR1 != \\$$VAR2 ]\; then + USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; + if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + sudo -k \; + sudo make install\; + else + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make install\; + fi\; + fi\; + else + USE_DEFAULT_3RD_PARTY_PATH=${USE_DEFAULT_3RD_PARTY_PATH}\; + if [ \\$$USE_DEFAULT_3RD_PARTY_PATH == "true" ]\; then + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + sudo -k \; + sudo make install\; + else + cd ${3RD_PARTY_BINARY_DIRECTORY}\; + make install\; + fi\; + fi\" + DEPENDS 3rd_party_dbus + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} + ) + + set(install-3rd_party_dbus_var "install-3rd_party_dbus") + endif() + endif() + + # --- D-Bus set(DBUS_INCLUDE_DIR ${3RD_PARTY_INSTALL_PREFIX}/include) set(DBUS_INCLUDE_DIR_ARCH ${3RD_PARTY_INSTALL_PREFIX_ARCH}/include) set(DBUS_INCLUDE_DIRS ${DBUS_INCLUDE_DIR} ${DBUS_INCLUDE_DIR_ARCH}) set(DBUS_INCLUDE_DIRS ${DBUS_INCLUDE_DIRS} PARENT_SCOPE) set(DBUS_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX_ARCH}/lib PARENT_SCOPE) -endif() -if(HMI_DBUS_API) add_subdirectory(dbus-cmake) endif() +add_custom_target(install-3rd_party + DEPENDS ${install-3rd_party_logger_var} + DEPENDS ${install-3rd_party_dbus_var} + WORKING_DIRECTORY ${3RD_PARTY_BINARY_DIRECTORY} +) + diff --git a/src/3rd_party/apache-log4cxx-cmake/CMakeLists.txt b/src/3rd_party/apache-log4cxx-cmake/CMakeLists.txt index a3dd48d1f7..57291f88a4 100644 --- a/src/3rd_party/apache-log4cxx-cmake/CMakeLists.txt +++ b/src/3rd_party/apache-log4cxx-cmake/CMakeLists.txt @@ -74,7 +74,7 @@ add_custom_target(liblog4cxx ALL make cd ${CMAKE_CURRENT_SOURCE_DIR} && git log --pretty=\\"format:%H\\" -1 ${LOG4CXX_SOURCE_DIRECTORY} > /tmp/commit_hash 2>/dev/null && echo \\"Adding .commit_hash section\\" && - ${objcopy} --add-section .commit_hash=/tmp/commit_hash ${LOG4CXX_LIBS_DIRECTORY}/liblog4cxx.so ${LOG4CXX_LIBS_DIRECTORY}/liblog4cxx.so 1>/dev/null 2>&1\; + objcopy --add-section .commit_hash=/tmp/commit_hash ${LOG4CXX_LIBS_DIRECTORY}/liblog4cxx.so ${LOG4CXX_LIBS_DIRECTORY}/liblog4cxx.so 1>/dev/null 2>&1\; fi; fi\" DEPENDS ${LOG4CXX_BUILD_DIRECTORY}/Makefile diff --git a/src/appMain/CMakeLists.txt b/src/appMain/CMakeLists.txt index a6774ec6f3..1382a07d2f 100644 --- a/src/appMain/CMakeLists.txt +++ b/src/appMain/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,12 +28,44 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -IF (HMIADAPTER STREQUAL "messagebroker") -set (BROKER_LIBRARIES - MessageBrokerClient - MessageBrokerServer +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + +find_package(SDLOpenSSL REQUIRED) + +include_directories( + ${COMPONENTS_DIR}/protocol_handler/include + ${COMPONENTS_DIR}/application_manager/include + ${COMPONENTS_DIR}/formatters/include + ${COMPONENTS_DIR}/transport_manager/include + ${COMPONENTS_DIR}/security_manager/include + ${COMPONENTS_DIR}/security_manager/include + ${COMPONENTS_DIR}/config_profile/include + ${COMPONENTS_DIR}/utils/include + ${COMPONENTS_DIR}/connection_handler/include + ${COMPONENTS_DIR}/hmi_message_handler/include + ${COMPONENTS_DIR}/request_watchdog/include + ${COMPONENTS_DIR}/smart_objects/include + ${COMPONENTS_DIR}/media_manager/include + ${COMPONENTS_DIR}/telemetry_monitor/include + ${POLICY_PATH}/include/ + ${POLICY_GLOBAL_INCLUDE_PATH}/ + ${COMPONENTS_DIR}/resumption/include + ${COMPONENTS_DIR}/dbus/include + ${CMAKE_BINARY_DIR}/src/components + ${JSONCPP_INCLUDE_DIRECTORY} + ${LOG4CXX_INCLUDE_DIRECTORY} + ${OPENSSL_INCLUDE_DIRECTORY} + ${MESSAGE_BROKER_INCLUDE_DIRECTORY} ) -ENDIF () + +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") + +if (HMIADAPTER STREQUAL "messagebroker") + set (BROKER_LIBRARIES + message_broker_client + message_broker_server + ) +endif() cmake_policy(PUSH) # make link_directories() treat paths relative to the source dir @@ -43,18 +75,18 @@ link_directories(${LIBUSB_LIBS_DIRECTORY}) cmake_policy(POP) if (EXTENDED_MEDIA_MODE) -set(default_media_inc -${GSTREAMER_gst_INCLUDE_DIR} -${GSTREAMER_gstconfig_INCLUDE_DIR} -) + set(default_media_inc + ${GSTREAMER_gst_INCLUDE_DIR} + ${GSTREAMER_gstconfig_INCLUDE_DIR} + ) else(EXTENDED_MEDIA_MODE) -set(default_media_inc -) + set(default_media_inc) endif() if (TELEMETRY_MONITOR) - set(TELEMETRY_MONITOR_LIB - TelemetryMonitor) + set(TELEMETRY_MONITOR_LIB + TelemetryMonitor + ) endif() set(LIBRARIES @@ -73,7 +105,7 @@ set(LIBRARIES TransportManager ${SecurityManagerLibrary} HMIMessageHandler - MessageBroker + message_broker ${BROKER_LIBRARIES} Utils jsoncpp @@ -87,12 +119,15 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux") endif() if (BUILD_BT_SUPPORT) - list(APPEND LIBRARIES bluetooth) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND LIBRARIES bluetooth) + endif() endif() + if (BUILD_USB_SUPPORT) -if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND LIBRARIES Libusb-1.0.16) -endif() + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND LIBRARIES Libusb-1.0.16) + endif() endif() if(ENABLE_LOG) @@ -102,45 +137,6 @@ if(ENABLE_LOG) list(APPEND LIBRARIES expat -L${EXPAT_LIBS_DIRECTORY}) endif() -include_directories ( - ./ - ${COMPONENTS_DIR}/protocol_handler/include/ - ${JSONCPP_INCLUDE_DIRECTORY} - ${COMPONENTS_DIR}/application_manager/include - ${COMPONENTS_DIR}/formatters/include - ${COMPONENTS_DIR}/transport_manager/include - ${COMPONENTS_DIR}/security_manager/include - ${SecurityManagerIncludeDir} - ${COMPONENTS_DIR}/security_manager/include - ${COMPONENTS_DIR}/config_profile/include - ${COMPONENTS_DIR}/utils/include/ - ${COMPONENTS_DIR}/connection_handler/include/ - ${COMPONENTS_DIR}/hmi_message_handler/include - ${COMPONENTS_DIR}/request_watchdog/include - ${COMPONENTS_DIR}/smart_objects/include/ - ${COMPONENTS_DIR}/media_manager/include/ - ${COMPONENTS_DIR}/telemetry_monitor/include - ${POLICY_PATH}/include/ - ${POLICY_GLOBAL_INCLUDE_PATH}/ - ${COMPONENTS_DIR}/resumption/include/ - ${MESSAGE_BROKER_INCLUDE_DIRECTORY} - ${ENCRYPTION_INCLUDE_DIRECTORY} - ${COMPONENTS_DIR} - ${CMAKE_BINARY_DIR}/src/components/ - ${COMPONENTS_DIR}/dbus/include/ - ${CMAKE_SOURCE_DIR} - ${default_media_inc} - ${LOG4CXX_INCLUDE_DIRECTORY} - ${CMAKE_SOURCE_DIR}/src/3rd_party/dbus-1.7.8 - ${CMAKE_SOURCE_DIR}/src/3rd_party/dbus-1.7.8/dbus/ -) - -set (SOURCES - main.cc - life_cycle.cc - signal_handlers.cc -) - if( NOT CMAKE_BUILD_TYPE ) set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build. Options are: None, Debug, Release, RelWithDebInfo, MinSizeRel." FORCE) endif() @@ -148,7 +144,6 @@ endif() add_executable(${PROJECT} ${SOURCES}) target_link_libraries(${PROJECT} ${LIBRARIES}) - file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/audio.8bit.wav DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/appMain/life_cycle.cc b/src/appMain/life_cycle.cc index 3c3895d02f..9b4910585f 100644 --- a/src/appMain/life_cycle.cc +++ b/src/appMain/life_cycle.cc @@ -1,5 +1,5 @@ /* -* Copyright (c) 2016, Ford Motor Company +* Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,7 @@ #include "utils/signals.h" #include "utils/make_shared.h" #include "config_profile/profile.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #ifdef ENABLE_SECURITY #include "security_manager/security_manager_impl.h" @@ -102,8 +102,8 @@ LifeCycle::LifeCycle(const profile::Profile& profile) bool LifeCycle::StartComponents() { LOG4CXX_AUTO_TRACE(logger_); DCHECK(!last_state_); - last_state_ = new resumption::LastState(profile_.app_storage_folder(), - profile_.app_info_storage()); + last_state_ = new resumption::LastStateImpl(profile_.app_storage_folder(), + profile_.app_info_storage()); DCHECK(!transport_manager_); transport_manager_ = new transport_manager::TransportManagerDefault(profile_); @@ -292,15 +292,6 @@ bool LifeCycle::InitMessageSystem() { } #endif // DBUS_HMIADAPTER -#ifdef MQUEUE_HMIADAPTER -bool LifeCycle::InitMessageSystem() { - hmi_message_adapter_ = new hmi_message_handler::MqueueAdapter(hmi_handler_); - hmi_handler.AddHMIMessageAdapter(hmi_message_adapter_); - return true; -} - -#endif // MQUEUE_HMIADAPTER - namespace { void sig_handler(int sig) { switch (sig) { diff --git a/src/appMain/life_cycle.h b/src/appMain/life_cycle.h index 2d6e0b938e..f1b3800254 100644 --- a/src/appMain/life_cycle.h +++ b/src/appMain/life_cycle.h @@ -43,9 +43,6 @@ #if (defined(MESSAGEBROKER_HMIADAPTER) || defined(PASA_HMI)) #include "hmi_message_handler/messagebroker_adapter.h" #endif // #if ( defined (MESSAGEBROKER_HMIADAPTER) || defined(PASA_HMI) ) -#ifdef MQUEUE_HMIADAPTER -#include "hmi_message_handler/mqueue_adapter.h" -#endif // MQUEUE_HMIADAPTER #include "application_manager/application_manager_impl.h" #include "connection_handler/connection_handler_impl.h" #include "protocol_handler/protocol_handler_impl.h" diff --git a/src/components/CMakeLists.txt b/src/components/CMakeLists.txt index b4063c7934..0304ce986f 100644 --- a/src/components/CMakeLists.txt +++ b/src/components/CMakeLists.txt @@ -28,38 +28,38 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -set(COMPONENTS_DIR ${CMAKE_SOURCE_DIR}/src/components) +set(COMPONENTS_DIR ${COMPONENTS_DIR} PARENT_SCOPE) -# --- HMI_API interfaces +# --- HMI, MOBILE Interfaces add_subdirectory(./interfaces) -# --- ProtocolHandler +# --- Protocol Handler add_subdirectory(./protocol) -# --- TransportManager +# --- Transport Manager add_subdirectory(./transport_manager) -# --- Policies +# --- Resumption add_subdirectory(./resumption) -# --- formatters +# --- Formatters add_subdirectory(./formatters) -# --- ProtocolHandler +# --- Protocol Handler add_subdirectory(./protocol_handler) -# --- ConnectionHandler +# --- Connection Handler add_subdirectory(./connection_handler) # --- Utils add_subdirectory(./utils) -# --- Security manager +# --- Security Manager if(ENABLE_SECURITY) add_subdirectory(./security_manager) endif() - +# --- Policy if (${EXTENDED_POLICY} STREQUAL "EXTERNAL_PROPRIETARY") add_subdirectory(./policy/policy_external/) message(STATUS "Use external policy") @@ -68,35 +68,30 @@ else() message(STATUS "Use regular policy") endif() -# --- Validated types +# --- Validated Types add_subdirectory(./rpc_base) -# --- SmartObjects +# --- Smart Objects add_subdirectory(./smart_objects) -# --- Application manager +# --- Application Manager add_subdirectory(./application_manager) # --- HMI Message Handler add_subdirectory(./hmi_message_handler) -# --- Config +# --- Config Profile add_subdirectory(./config_profile) -# --- AudioManager +# --- Media Manager add_subdirectory(./media_manager) -if (TELEMETRY_MONITOR) - add_subdirectory(./telemetry_monitor) +# --- Telemetry Monitor +if(TELEMETRY_MONITOR) + add_subdirectory(./telemetry_monitor) endif() - -if (${HMI_DBUS_API}) # --- DBus - add_subdirectory(./dbus) -endif () -if (${QT_HMI}) -# --- Qt HMI - add_subdirectory(./qt_hmi) -endif () - +if(HMI_DBUS_API) + add_subdirectory(./dbus) +endif() diff --git a/src/components/HMI/IVSU/PROPRIETARY_REQUEST~ b/src/components/HMI/IVSU/PROPRIETARY_REQUEST~ deleted file mode 100644 index e69de29bb2..0000000000 --- a/src/components/HMI/IVSU/PROPRIETARY_REQUEST~ +++ /dev/null diff --git a/src/components/application_manager/CMakeLists.txt b/src/components/application_manager/CMakeLists.txt index da68a64400..1a0e0f9880 100644 --- a/src/components/application_manager/CMakeLists.txt +++ b/src/components/application_manager/CMakeLists.txt @@ -28,6 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) set (AM_SOURCE_DIR ${COMPONENTS_DIR}/application_manager) set (AM_TEST_DIR ${AM_SOURCE_DIR}/test) @@ -41,23 +43,21 @@ include_directories ( ${COMPONENTS_DIR}/protocol_handler/include/ ${COMPONENTS_DIR}/smart_objects/include/ ${COMPONENTS_DIR}/hmi_message_handler/include - ${COMPONENTS_DIR}/media_manager/include/ - ${COMPONENTS_DIR}/connection_handler/include/ - ${COMPONENTS_DIR}/config_profile/include/ - ${COMPONENTS_DIR}/request_watchdog/include/ - ${COMPONENTS_DIR}/resumption/include/ - ${COMPONENTS_DIR}/app_launch/include/ - ${COMPONENTS_DIR}/rpc_base/include/ - ${COMPONENTS_DIR}/interfaces + ${COMPONENTS_DIR}/media_manager/include + ${COMPONENTS_DIR}/connection_handler/include + ${COMPONENTS_DIR}/config_profile/include + ${COMPONENTS_DIR}/request_watchdog/include + ${COMPONENTS_DIR}/resumption/include + ${COMPONENTS_DIR}/rpc_base/include ${POLICY_PATH}/include/ ${POLICY_GLOBAL_INCLUDE_PATH}/ - ${CMAKE_BINARY_DIR}/src/components/ - ${POLICY_INCLUDE_PATH}/ + ${CMAKE_BINARY_DIR}/src/components ${JSONCPP_INCLUDE_DIRECTORY} ${ENCRYPTION_INCLUDE_DIRECTORY} ${MESSAGE_BROKER_INCLUDE_DIRECTORY} ${LOG4CXX_INCLUDE_DIRECTORY} ) +MESSAGE (ERROR "${POLICY_PATH}") if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") include_directories( @@ -71,48 +71,60 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") ) endif() -file (GLOB SOURCES - ${AM_SOURCE_DIR}/src/* +set (MESSAGE_HELPER_SOURCE_DIR + ${AM_SOURCE_DIR}/src/message_helper ) -set (MESSAGE_HELPER_SOURCES - ${AM_SOURCE_DIR}/src/message_helper/message_helper.cc +set (MESSAGE_HELPER_PATHS + ${MESSAGE_HELPER_SOURCE_DIR} ) +collect_sources(MESSAGE_HELPER_SOURCES "${MESSAGE_HELPER_PATHS}") -set (POLICIES_MANAGER -${AM_SOURCE_DIR}/src/policies/policy_handler.cc -${AM_SOURCE_DIR}/src/usage_statistics.cc -${AM_SOURCE_DIR}/src/policies/policy_event_observer.cc -${AM_SOURCE_DIR}/src/policies/delegates/app_permission_delegate.cc -${AM_SOURCE_DIR}/src/policies/delegates/statistics_delegate.cc + +set (POLICIES_SOURCE_DIR + ${AM_SOURCE_DIR}/src/policies ) - include_directories( - ${POLICY_PATH}/src/policy/policy_table/table_struct - ) -file (GLOB EVENT_ENGINE - ${AM_SOURCE_DIR}/src/event_engine/* +set (POLICIES_MANAGER_SOURCES + ${POLICIES_SOURCE_DIR}/policy_handler.cc + ${POLICIES_SOURCE_DIR}/policy_event_observer.cc + ${POLICIES_SOURCE_DIR}/delegates/app_permission_delegate.cc + ${POLICIES_SOURCE_DIR}/delegates/statistics_delegate.cc + ${CMAKE_CURRENT_SOURCE_DIR}/src/usage_statistics.cc +) + +include_directories( + ${POLICY_PATH}/src/policy/policy_table/table_struct ) -file (GLOB RESUMPTION - ${AM_SOURCE_DIR}/src/resumption/* +set (EVENT_ENGINE_SOURCE_DIR + ${AM_SOURCE_DIR}/src/event_engine ) -file (GLOB APP_LAUNCH - ${AM_SOURCE_DIR}/src/app_launch/* +set (EVENT_ENGINE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/application_manager/event_engine + ${EVENT_ENGINE_SOURCE_DIR} ) +collect_sources(EVENT_ENGINE_SOURCES "${EVENT_ENGINE_PATHS}") set (COMMANDS_SOURCE_DIR ${AM_SOURCE_DIR}/src/commands ) +collect_sources(POLICIES_SOURCES "${POLICIES_PATHS}") -file (GLOB MOBILE_COMMANDS_SOURCES - ${COMMANDS_SOURCE_DIR}/* - ${COMMANDS_SOURCE_DIR}/mobile/* +set(MOBILE_COMMANDS_EXCLUDE_PATHS + ${COMMANDS_SOURCE_DIR}/hmi ) +set (MOBILE_COMMANDS_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/application_manager/commands + ${CMAKE_CURRENT_SOURCE_DIR}/include/application_manager/commands/mobile + ${COMMANDS_SOURCE_DIR} + ${COMMANDS_SOURCE_DIR}/mobile +) +collect_sources(MOBILE_COMMANDS_SOURCES "${MOBILE_COMMANDS_PATHS}" "${MOBILE_COMMANDS_EXCLUDE_PATHS}") - set (HMI_COMMANDS_SOURCES +set (HMI_COMMANDS_SOURCES ${COMMANDS_SOURCE_DIR}/hmi/request_to_hmi.cc ${COMMANDS_SOURCE_DIR}/hmi/response_from_hmi.cc ${COMMANDS_SOURCE_DIR}/hmi/request_from_hmi.cc @@ -129,8 +141,6 @@ file (GLOB MOBILE_COMMANDS_SOURCES ${COMMANDS_SOURCE_DIR}/hmi/activate_app_response.cc ${COMMANDS_SOURCE_DIR}/hmi/get_system_info_request.cc ${COMMANDS_SOURCE_DIR}/hmi/get_system_info_response.cc - ${COMMANDS_SOURCE_DIR}/hmi/decrypt_certificate_request.cc - ${COMMANDS_SOURCE_DIR}/hmi/decrypt_certificate_response.cc ${COMMANDS_SOURCE_DIR}/hmi/sdl_get_list_of_permissions_request.cc ${COMMANDS_SOURCE_DIR}/hmi/sdl_get_list_of_permissions_response.cc ${COMMANDS_SOURCE_DIR}/hmi/sdl_get_user_friendly_message_request.cc @@ -318,6 +328,8 @@ file (GLOB MOBILE_COMMANDS_SOURCES ${COMMANDS_SOURCE_DIR}/hmi/dial_number_request.cc ${COMMANDS_SOURCE_DIR}/hmi/dial_number_response.cc ${COMMANDS_SOURCE_DIR}/hmi/on_event_changed_notification.cc + ${COMMANDS_SOURCE_DIR}/hmi/decrypt_certificate_response.cc + ${COMMANDS_SOURCE_DIR}/hmi/decrypt_certificate_request.cc ) set (HMI_COMMANDS_SOURCES_JSON @@ -361,7 +373,20 @@ if (${HMI_DBUS_API}) set (HMI_COMMANDS_SOURCES ${HMI_COMMANDS_SOURCES} ${HMI_COMMANDS_SOURCES_DBUS}) endif (${HMI_DBUS_API}) -SET (LIBRARIES +set(EXCLUDE_PATHS + ${COMMANDS_SOURCE_DIR} + ${EVENT_ENGINE_SOURCE_DIR} + ${MESSAGE_HELPER_SOURCE_DIR} + ${POLICIES_SOURCE_DIR} +) + +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") + +set(LIBRARIES HMI_API MOBILE_API v4_protocol_v1_2_no_extra @@ -377,15 +402,14 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux") list(APPEND LIBRARIES sqlite3) endif () -IF(${CMAKE_SYSTEM_NAME} MATCHES "QNX") +if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") list(REMOVE_ITEM LIBRARIES dl) endif() -add_library("AMEventEngine" ${EVENT_ENGINE}) +add_library("AMEventEngine" ${EVENT_ENGINE_SOURCES}) target_link_libraries("AMEventEngine" ${LIBRARIES}) - -add_library("AMPolicyLibrary" ${POLICIES_MANAGER} ) +add_library("AMPolicyLibrary" ${POLICIES_MANAGER_SOURCES} ) target_link_libraries("AMPolicyLibrary" ${LIBRARIES} AMEventEngine) add_library("AMHMICommandsLibrary" ${HMI_COMMANDS_SOURCES}) @@ -396,18 +420,21 @@ add_library("MessageHelper" ${MESSAGE_HELPER_SOURCES}) add_library("AMMobileCommandsLibrary" ${MOBILE_COMMANDS_SOURCES} ) target_link_libraries("AMMobileCommandsLibrary" ${LIBRARIES} AMEventEngine) -add_library("ApplicationManager" ${SOURCES} ${RESUMPTION} ${APP_LAUNCH}) +add_library("ApplicationManager" ${SOURCES}) -target_link_libraries("ApplicationManager" ${LIBRARIES} AMHMICommandsLibrary - AMMobileCommandsLibrary - AMEventEngine - AMPolicyLibrary) +list(APPEND LIBRARIES + AMEventEngine + AMPolicyLibrary + AMHMICommandsLibrary + AMMobileCommandsLibrary +) if(ENABLE_LOG) - target_link_libraries("ApplicationManager" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() +target_link_libraries("ApplicationManager" ${LIBRARIES}) + if(BUILD_TESTS) add_subdirectory(test) - add_subdirectory(test/message_helper) endif() diff --git a/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h b/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h index 47f4e687ce..628d3257d9 100644 --- a/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h +++ b/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h @@ -68,14 +68,24 @@ class RequestFromHMI : public CommandImpl, public event_engine::EventObserver { * @param correlation_id the correlation id for the response. * @param function_id the function id for which response will be sent * @param result_code the result code. + * @param error_message info message for error. */ void SendErrorResponse(const uint32_t correlation_id, - hmi_apis::FunctionID::eType function_id, - hmi_apis::Common_Result::eType result_code); + const hmi_apis::FunctionID::eType function_id, + const hmi_apis::Common_Result::eType result_code, + const std::string error_message); - void FillCommonParametersOfSO(smart_objects::SmartObject* message, - uint32_t correlation_id, - hmi_apis::FunctionID::eType function_id); + private: + /** + * @brief Fills common parameters for SO + * @param message Contains SO for filling + * @param correlation_id the correlation id for the response. + * @param function_id the function id for which response will be sent + */ + void FillCommonParametersOfSO( + NsSmartDeviceLink::NsSmartObjects::SmartObject& message, + const uint32_t correlation_id, + const hmi_apis::FunctionID::eType function_id); private: DISALLOW_COPY_AND_ASSIGN(RequestFromHMI); diff --git a/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h b/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h index 0053c14f3c..49e5fe34ff 100644 --- a/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h +++ b/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h @@ -108,6 +108,16 @@ class ResetGlobalPropertiesRequest : public CommandRequestImpl { application_manager::ApplicationSharedPtr const app); /* + * @brief Prepare result for sending to mobile application + * @param out_result_code contains result code for sending to mobile + * application + * @param out_response_info contains info for sending to mobile applicaion + * @return result for sending to mobile application. + */ + bool PrepareResponseParameters(mobile_apis::Result::eType& out_result_code, + std::string& out_response_info); + + /* * @brief Check if there some not delivered hmi responses exist * * @return true if all responses received @@ -124,6 +134,8 @@ class ResetGlobalPropertiesRequest : public CommandRequestImpl { hmi_apis::Common_Result::eType ui_result_; hmi_apis::Common_Result::eType tts_result_; + std::string ui_response_info_; + std::string tts_response_info_; }; } // namespace commands diff --git a/src/components/application_manager/src/app_launch/app_launch_data_json.cc b/src/components/application_manager/src/app_launch/app_launch_data_json.cc index 260dde7205..7599dcccb3 100644 --- a/src/components/application_manager/src/app_launch/app_launch_data_json.cc +++ b/src/components/application_manager/src/app_launch/app_launch_data_json.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,10 +70,9 @@ Json::Value& AppLaunchDataJson::GetApplicationData() const { using namespace application_manager; LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); - Json::Value& dictionary = last_state().dictionary; + Json::Value& dictionary = last_state().get_dictionary(); if (!dictionary.isMember(strings::app_launch)) { - last_state().dictionary[strings::app_launch] = - Json::Value(Json::objectValue); + dictionary[strings::app_launch] = Json::Value(Json::objectValue); LOG4CXX_WARN(logger_, "app_launch section is missed"); } Json::Value& app_launch = dictionary[strings::app_launch]; @@ -276,7 +275,7 @@ bool AppLaunchDataJson::DeleteOldestAppData() { bool AppLaunchDataJson::Persist() { LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); - last_state().SaveToFileSystem(); + last_state().SaveStateToFileSystem(); return true; } diff --git a/src/components/application_manager/src/commands/command_request_impl.cc b/src/components/application_manager/src/commands/command_request_impl.cc index 2c57773a8f..ab0a17f1fb 100644 --- a/src/components/application_manager/src/commands/command_request_impl.cc +++ b/src/components/application_manager/src/commands/command_request_impl.cc @@ -562,11 +562,11 @@ void CommandRequestImpl::RemoveDisallowedParameters() { parameters_permissions_.disallowed_params.end(); for (; it_disallowed != it_disallowed_end; ++it_disallowed) { if (params.keyExists(*it_disallowed)) { - params.erase(*it_disallowed); - removed_parameters_permissions_.disallowed_params.insert(*it_disallowed); - LOG4CXX_INFO( - logger_, - "Following parameter is disallowed by user: " << *it_disallowed); + const std::string key = *it_disallowed; + params.erase(key); + removed_parameters_permissions_.disallowed_params.insert(key); + LOG4CXX_INFO(logger_, + "Following parameter is disallowed by user: " << key); } } @@ -577,11 +577,11 @@ void CommandRequestImpl::RemoveDisallowedParameters() { parameters_permissions_.undefined_params.end(); for (; it_undefined != it_undefined_end; ++it_undefined) { if (params.keyExists(*it_undefined)) { - params.erase(*it_undefined); - removed_parameters_permissions_.undefined_params.insert(*it_undefined); - LOG4CXX_INFO( - logger_, - "Following parameter is disallowed by policy: " << *it_undefined); + const std::string key = *it_undefined; + params.erase(key); + removed_parameters_permissions_.undefined_params.insert(key); + LOG4CXX_INFO(logger_, + "Following parameter is disallowed by policy: " << key); } } diff --git a/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc b/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc index 1e46eab52e..0bcb26df8a 100644 --- a/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc +++ b/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc @@ -156,7 +156,7 @@ void AudioStartStreamRequest::RetryStartSession() { } uint32_t curr_retry_number = app->audio_stream_retry_number(); - if (curr_retry_number < retry_number_ - 1) { + if (curr_retry_number < retry_number_) { LOG4CXX_DEBUG( logger_, "Send AudioStartStream retry. retry_number = " << curr_retry_number); diff --git a/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc b/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc index 9f1c4b7902..b06c69e703 100644 --- a/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc +++ b/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc @@ -113,7 +113,7 @@ void NaviStartStreamRequest::on_event(const event_engine::Event& event) { } if (hmi_apis::Common_Result::REJECTED == code) { LOG4CXX_INFO(logger_, "StartStream response REJECTED "); - SendRequest(); + RetryStartSession(); break; } } @@ -156,7 +156,7 @@ void NaviStartStreamRequest::RetryStartSession() { } uint32_t curr_retry_number = app->video_stream_retry_number(); - if (curr_retry_number < retry_number_ - 1) { + if (curr_retry_number < retry_number_) { LOG4CXX_DEBUG( logger_, "Send NaviStartStream retry. retry_number = " << curr_retry_number); diff --git a/src/components/application_manager/src/commands/hmi/request_from_hmi.cc b/src/components/application_manager/src/commands/hmi/request_from_hmi.cc index 72469d88ce..1119e7c4fd 100644 --- a/src/components/application_manager/src/commands/hmi/request_from_hmi.cc +++ b/src/components/application_manager/src/commands/hmi/request_from_hmi.cc @@ -1,5 +1,5 @@ /* - Copyright (c) 2013, Ford Motor Company + Copyright (c) 2016, Ford Motor Company All rights reserved. Redistribution and use in source and binary forms, with or without @@ -65,9 +65,10 @@ void RequestFromHMI::SendResponse( const uint32_t correlation_id, const hmi_apis::FunctionID::eType function_id, const hmi_apis::Common_Result::eType result_code) { - smart_objects::SmartObject* message = - new smart_objects::SmartObject(smart_objects::SmartType_Map); - FillCommonParametersOfSO(message, correlation_id, function_id); + smart_objects::SmartObjectSPtr message = + ::utils::MakeShared<smart_objects::SmartObject>( + smart_objects::SmartType_Map); + FillCommonParametersOfSO(*message, correlation_id, function_id); (*message)[strings::params][strings::message_type] = MessageType::kResponse; (*message)[strings::params][hmi_response::code] = 0; (*message)[strings::msg_params][strings::success] = success; @@ -79,26 +80,28 @@ void RequestFromHMI::SendResponse( void RequestFromHMI::SendErrorResponse( const uint32_t correlation_id, const hmi_apis::FunctionID::eType function_id, - const hmi_apis::Common_Result::eType result_code) { - smart_objects::SmartObject* message = - new smart_objects::SmartObject(smart_objects::SmartType_Map); - FillCommonParametersOfSO(message, correlation_id, function_id); + const hmi_apis::Common_Result::eType result_code, + const std::string error_message) { + smart_objects::SmartObjectSPtr message = + ::utils::MakeShared<smart_objects::SmartObject>( + smart_objects::SmartType_Map); + FillCommonParametersOfSO(*message, correlation_id, function_id); (*message)[strings::params][strings::message_type] = MessageType::kErrorResponse; (*message)[strings::params][hmi_response::code] = result_code; - (*message)[strings::params][strings::error_msg] = "HMIDeactivate is active"; + (*message)[strings::params][strings::error_msg] = error_message; application_manager_.ManageHMICommand(message); } void RequestFromHMI::FillCommonParametersOfSO( - smart_objects::SmartObject* message, - uint32_t correlation_id, - hmi_apis::FunctionID::eType function_id) { - (*message)[strings::params][strings::function_id] = function_id; - (*message)[strings::params][strings::protocol_type] = hmi_protocol_type_; - (*message)[strings::params][strings::protocol_version] = protocol_version_; - (*message)[strings::params][strings::correlation_id] = correlation_id; + smart_objects::SmartObject& message, + const uint32_t correlation_id, + const hmi_apis::FunctionID::eType function_id) { + (message)[strings::params][strings::function_id] = function_id; + (message)[strings::params][strings::protocol_type] = hmi_protocol_type_; + (message)[strings::params][strings::protocol_version] = protocol_version_; + (message)[strings::params][strings::correlation_id] = correlation_id; } } // namespace commands diff --git a/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc b/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc index 347a3c0984..3a5a8d25f9 100644 --- a/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc +++ b/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc @@ -110,7 +110,8 @@ void SDLActivateAppRequest::Run() { "Sends response with result code REJECTED"); SendErrorResponse(correlation_id(), static_cast<eType>(function_id()), - hmi_apis::Common_Result::REJECTED); + hmi_apis::Common_Result::REJECTED, + "HMIDeactivate is active"); } else { const uint32_t application_id = app_id(); application_manager_.GetPolicyHandler().OnActivateApp(application_id, @@ -153,6 +154,18 @@ void SDLActivateAppRequest::Run() { "Found application to activate. Application id is " << app_to_activate->app_id()); + if (application_manager_.state_controller().IsStateActive( + HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) { + LOG4CXX_WARN(logger_, + "DeactivateHmi state is active. " + "Sends response with result code REJECTED"); + SendErrorResponse(correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id()), + hmi_apis::Common_Result::REJECTED, + "HMIDeactivate is active"); + return; + } + if (app_to_activate->IsRegistered()) { LOG4CXX_DEBUG(logger_, "Application is registered. Activating."); application_manager_.GetPolicyHandler().OnActivateApp(application_id, @@ -169,7 +182,8 @@ void SDLActivateAppRequest::Run() { "Can't find regular foreground app with the same " "connection id:" << device_handle); - SendResponse(false, correlation_id(), SDL_ActivateApp, NO_APPS_REGISTERED); + SendErrorResponse( + correlation_id(), SDL_ActivateApp, NO_APPS_REGISTERED, ""); return; } @@ -201,8 +215,8 @@ void SDLActivateAppRequest::onTimeOut() { using namespace hmi_apis::Common_Result; using namespace application_manager; unsubscribe_from_event(BasicCommunication_OnAppRegistered); - SendResponse( - false, correlation_id(), SDL_ActivateApp, APPLICATION_NOT_REGISTERED); + SendErrorResponse( + correlation_id(), SDL_ActivateApp, APPLICATION_NOT_REGISTERED, ""); } void SDLActivateAppRequest::on_event(const event_engine::Event& event) { diff --git a/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc b/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc index fa0d15252e..8876ffa2e8 100644 --- a/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc +++ b/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc @@ -129,23 +129,32 @@ mobile_apis::Result::eType CreateInteractionChoiceSetRequest::CheckChoiceSet( const SmartArray* choice_set = (*message_)[strings::msg_params][strings::choice_set].asArray(); - SmartArray::const_iterator choice_set_it = choice_set->begin(); + SmartArray::const_iterator current_choice_set_it = choice_set->begin(); + SmartArray::const_iterator next_choice_set_it; - for (; choice_set->end() != choice_set_it; ++choice_set_it) { + for (; choice_set->end() != current_choice_set_it; ++current_choice_set_it) { std::pair<std::set<uint32_t>::iterator, bool> ins_res = - choice_id_set.insert((*choice_set_it)[strings::choice_id].asInt()); + choice_id_set.insert( + (*current_choice_set_it)[strings::choice_id].asInt()); if (!ins_res.second) { LOG4CXX_ERROR(logger_, "Choise with ID " - << (*choice_set_it)[strings::choice_id].asInt() + << (*current_choice_set_it)[strings::choice_id].asInt() << " already exists"); return mobile_apis::Result::INVALID_ID; } - if (IsWhiteSpaceExist(*choice_set_it)) { + if (IsWhiteSpaceExist(*current_choice_set_it)) { LOG4CXX_ERROR(logger_, "Incoming choice set has contains \t\n \\t \\n"); return mobile_apis::Result::INVALID_DATA; } + for (next_choice_set_it = current_choice_set_it + 1; + choice_set->end() != next_choice_set_it; + ++next_choice_set_it) { + if (compareSynonyms(*current_choice_set_it, *next_choice_set_it)) { + return mobile_apis::Result::DUPLICATE_NAME; + } + } } return mobile_apis::Result::SUCCESS; } diff --git a/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc b/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc index 82836717a3..7c631d6d4b 100644 --- a/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc +++ b/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc @@ -94,6 +94,14 @@ void OnButtonEventNotification::Run() { return; } + if ((mobile_api::HMILevel::HMI_FULL != app->hmi_level()) && + (mobile_api::HMILevel::HMI_LIMITED != app->hmi_level())) { + LOG4CXX_WARN(logger_, + "CUSTOM_BUTTON OnButtonEvent notification is allowed only " + << "in FULL or LIMITED hmi level"); + return; + } + SendButtonEvent(app); return; } diff --git a/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc b/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc index c77cd9fbba..ae6658b93a 100644 --- a/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc +++ b/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc @@ -94,6 +94,15 @@ void OnButtonPressNotification::Run() { return; } + // Send ButtonPress notification only in HMI_FULL or HMI_LIMITED mode + if ((mobile_api::HMILevel::HMI_FULL != app->hmi_level()) && + (mobile_api::HMILevel::HMI_LIMITED != app->hmi_level())) { + LOG4CXX_WARN(logger_, + "CUSTOM_BUTTON OnButtonPress notification is allowed only " + << "in FULL or LIMITED hmi level"); + return; + } + SendButtonPress(app); return; } diff --git a/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc b/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc index 851e9f3059..427f52c12b 100644 --- a/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc +++ b/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc @@ -58,7 +58,9 @@ void OnKeyBoardInputNotification::Run() { for (; accessor.GetData().end() != it; ++it) { // if there is app with active perform interaction use it for notification ApplicationSharedPtr app = *it; - if (app->is_perform_interaction_active()) { + if (app->is_perform_interaction_active() && + (*it)->perform_interaction_layout() == + mobile_apis::LayoutMode::KEYBOARD) { LOG4CXX_INFO(logger_, "There is application with active PerformInteraction"); app_to_notify = app; diff --git a/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc index d094c3d80e..007440e8e6 100644 --- a/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc +++ b/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc @@ -205,6 +205,7 @@ void PerformInteractionRequest::Run() { app->set_perform_interaction_mode(static_cast<int32_t>(interaction_mode_)); app->set_perform_interaction_active(true); + app->set_perform_interaction_layout(interaction_layout); // increment amount of active requests ++pi_requests_count_; SendVRPerformInteractionRequest(app); diff --git a/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc b/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc index e47ed01f51..ebc0e43838 100644 --- a/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc +++ b/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc @@ -251,6 +251,7 @@ void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { is_ui_received_ = true; ui_result_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asInt()); + GetInfo(message, ui_response_info_); break; } case hmi_apis::FunctionID::TTS_SetGlobalProperties: { @@ -258,6 +259,7 @@ void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { is_tts_received_ = true; tts_result_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asInt()); + GetInfo(message, tts_response_info_); break; } default: { @@ -266,49 +268,64 @@ void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { } } - if (!IsPendingResponseExist()) { - bool result = - ((hmi_apis::Common_Result::SUCCESS == ui_result_) && - (hmi_apis::Common_Result::SUCCESS == tts_result_ || - hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == tts_result_)) || - ((hmi_apis::Common_Result::SUCCESS == ui_result_) && - (hmi_apis::Common_Result::INVALID_ENUM == tts_result_)) || - ((hmi_apis::Common_Result::INVALID_ENUM == ui_result_) && - (hmi_apis::Common_Result::SUCCESS == tts_result_)); - - mobile_apis::Result::eType result_code; - const char* return_info = NULL; - - if (result) { - if (hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == tts_result_) { - result_code = mobile_apis::Result::WARNINGS; - return_info = - std::string("Unsupported phoneme type sent in a prompt").c_str(); - } else { - result_code = static_cast<mobile_apis::Result::eType>( - std::max(ui_result_, tts_result_)); - } - } else { - result_code = static_cast<mobile_apis::Result::eType>( - std::max(ui_result_, tts_result_)); - } + if (IsPendingResponseExist()) { + LOG4CXX_DEBUG(logger_, "Waiting for remaining responses"); + return; + } - SendResponse(result, - static_cast<mobile_apis::Result::eType>(result_code), - return_info, - &(message[strings::msg_params])); + mobile_apis::Result::eType result_code = mobile_apis::Result::INVALID_ENUM; + std::string response_info; + const bool result = PrepareResponseParameters(result_code, response_info); - if (!application) { - LOG4CXX_ERROR(logger_, "NULL pointer"); - return; - } + SendResponse(result, + static_cast<mobile_apis::Result::eType>(result_code), + response_info.empty() ? NULL : response_info.c_str(), + &(message[strings::msg_params])); - if (result) { - application->UpdateHash(); - } + if (!application) { + LOG4CXX_ERROR(logger_, "NULL pointer"); + return; + } + + if (result) { + application->UpdateHash(); + } +} + +bool ResetGlobalPropertiesRequest::PrepareResponseParameters( + mobile_apis::Result::eType& out_result_code, + std::string& out_response_info) { + LOG4CXX_AUTO_TRACE(logger_); + using namespace helpers; + + bool result = false; + ResponseInfo ui_properties_info(ui_result_, HmiInterfaces::HMI_INTERFACE_UI); + ResponseInfo tts_properties_info(tts_result_, + HmiInterfaces::HMI_INTERFACE_TTS); + + HmiInterfaces::InterfaceState tts_interface_state = + application_manager_.hmi_interfaces().GetInterfaceState( + HmiInterfaces::HMI_INTERFACE_TTS); + + if (hmi_apis::Common_Result::SUCCESS == ui_result_ && + hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == tts_result_ && + HmiInterfaces::STATE_AVAILABLE == tts_interface_state) { + result = true; + out_result_code = mobile_apis::Result::WARNINGS; + out_response_info = + std::string("Unsupported phoneme type sent in a prompt").c_str(); } else { - LOG4CXX_WARN(logger_, "unable to find application: " << connection_key()); + result = + PrepareResultForMobileResponse(ui_properties_info, tts_properties_info); + out_result_code = + PrepareResultCodeForResponse(ui_properties_info, tts_properties_info); + out_response_info = MergeInfos(tts_properties_info, + tts_response_info_, + ui_properties_info, + ui_response_info_); } + + return result; } bool ResetGlobalPropertiesRequest::IsPendingResponseExist() { diff --git a/src/components/application_manager/src/commands/mobile/system_request.cc b/src/components/application_manager/src/commands/mobile/system_request.cc index 0ed01e294d..74d25508e0 100644 --- a/src/components/application_manager/src/commands/mobile/system_request.cc +++ b/src/components/application_manager/src/commands/mobile/system_request.cc @@ -528,8 +528,8 @@ void SystemRequest::Run() { } if (!(mobile_apis::RequestType::HTTP == request_type && 0 == origin_file_name.compare(kIVSU))) { - LOG4CXX_DEBUG(logger_, "Binary data required. Reject"); - SendResponse(false, mobile_apis::Result::REJECTED); + LOG4CXX_DEBUG(logger_, "Binary data required. Invalid data"); + SendResponse(false, mobile_apis::Result::INVALID_DATA); return; } LOG4CXX_DEBUG(logger_, "IVSU does not require binary data. Continue"); diff --git a/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc b/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc index 6902a9d659..9b0c0a673f 100644 --- a/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc +++ b/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2013, Ford Motor Company + Copyright (c) 2017, Ford Motor Company All rights reserved. Redistribution and use in source and binary forms, with or without @@ -201,16 +201,14 @@ void UnsubscribeVehicleDataRequest::Run() { } if (is_everything_already_unsubscribed) { - mobile_apis::Result::eType result_code = - vi_already_unsubscribed_by_this_app_.size() - ? mobile_apis::Result::IGNORED - : mobile_apis::Result::SUCCESS; - - const char* info = vi_already_unsubscribed_by_this_app_.size() - ? "Already subscribed on some provided VehicleData." - : NULL; - - SendResponse(true, result_code, info, &response_params); + if (!vi_already_unsubscribed_by_this_app_.empty()) { + SendResponse(false, + mobile_apis::Result::IGNORED, + "Some provided VehicleData was not subscribed.", + &response_params); + } else { + SendResponse(true, mobile_apis::Result::SUCCESS, NULL, &response_params); + } return; } diff --git a/src/components/application_manager/src/hmi_interfaces_impl.cc b/src/components/application_manager/src/hmi_interfaces_impl.cc index 5665d0654a..8a9944bec4 100644 --- a/src/components/application_manager/src/hmi_interfaces_impl.cc +++ b/src/components/application_manager/src/hmi_interfaces_impl.cc @@ -48,10 +48,6 @@ generate_function_to_interface_convert_map() { HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnUpdateDeviceList] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; - convert_map[BasicCommunication_OnPhoneCall] = - HmiInterfaces::HMI_INTERFACE_BasicCommunication; - convert_map[BasicCommunication_OnEmergencyEvent] = - HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnResumeAudioSource] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnSDLPersistenceComplete] = @@ -104,8 +100,6 @@ generate_function_to_interface_convert_map() { HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnIgnitionCycleOver] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; - convert_map[BasicCommunication_OnDeactivateHMI] = - HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnEventChanged] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[VR_IsReady] = HmiInterfaces::HMI_INTERFACE_VR; diff --git a/src/components/application_manager/src/hmi_language_handler.cc b/src/components/application_manager/src/hmi_language_handler.cc index 7cab18ab27..4e5390a1b4 100644 --- a/src/components/application_manager/src/hmi_language_handler.cc +++ b/src/components/application_manager/src/hmi_language_handler.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -80,7 +80,8 @@ void HMILanguageHandler::set_language_for( LOG4CXX_DEBUG(logger_, "Setting language " << language << " for interface " << interface); - last_state_->dictionary[LanguagesKey][key] = language; + Json::Value& dictionary = last_state_->get_dictionary(); + dictionary[LanguagesKey][key] = language; return; } @@ -105,10 +106,11 @@ hmi_apis::Common_Language::eType HMILanguageHandler::get_language_for( return Common_Language::INVALID_ENUM; } - if (last_state_->dictionary.isMember(LanguagesKey)) { - if (last_state_->dictionary[LanguagesKey].isMember(key)) { + const Json::Value& dictionary = last_state_->get_dictionary(); + if (dictionary.isMember(LanguagesKey)) { + if (dictionary[LanguagesKey].isMember(key)) { Common_Language::eType language = static_cast<Common_Language::eType>( - last_state_->dictionary[LanguagesKey][key].asInt()); + dictionary[LanguagesKey][key].asInt()); return language; } } diff --git a/src/components/application_manager/src/hmi_state.cc b/src/components/application_manager/src/hmi_state.cc index 80628f9f33..1f05232476 100644 --- a/src/components/application_manager/src/hmi_state.cc +++ b/src/components/application_manager/src/hmi_state.cc @@ -175,7 +175,7 @@ mobile_apis::HMILevel::eType AudioSource::hmi_level() const { HMILevel::HMI_NONE)) { return parent()->hmi_level(); } - if (is_navi_app(app_id_)) { + if (is_navi_app(app_id_) || is_voice_communication_app(app_id_)) { return HMILevel::HMI_LIMITED; } return HMILevel::HMI_BACKGROUND; diff --git a/src/components/application_manager/src/resumption/resumption_data_json.cc b/src/components/application_manager/src/resumption/resumption_data_json.cc index f60f934fef..7866fc4de1 100644 --- a/src/components/application_manager/src/resumption/resumption_data_json.cc +++ b/src/components/application_manager/src/resumption/resumption_data_json.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -372,10 +372,9 @@ Json::Value& ResumptionDataJson::GetResumptionData() const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& dictionary = last_state().dictionary; + Json::Value& dictionary = last_state().get_dictionary(); if (!dictionary.isMember(strings::resumption)) { - last_state().dictionary[strings::resumption] = - Json::Value(Json::objectValue); + dictionary[strings::resumption] = Json::Value(Json::objectValue); LOG4CXX_WARN(logger_, "resumption section is missed"); } Json::Value& resumption = dictionary[strings::resumption]; @@ -481,7 +480,7 @@ bool ResumptionDataJson::DropAppDataResumption(const std::string& device_id, } void ResumptionDataJson::Persist() { - last_state().SaveToFileSystem(); + last_state().SaveStateToFileSystem(); } } // resumption diff --git a/src/components/application_manager/test/CMakeLists.txt b/src/components/application_manager/test/CMakeLists.txt index a7f5d8b243..84354d3f5b 100644 --- a/src/components/application_manager/test/CMakeLists.txt +++ b/src/components/application_manager/test/CMakeLists.txt @@ -28,44 +28,46 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + # TODO{ALeshin}: APPLINK-10792. Do not write tests which use # application manager(AM) singleton while refactoring of AM is finished. -if (BUILD_TESTS) - - include_directories( - ${GMOCK_INCLUDE_DIRECTORY} - ${CMAKE_BINARY_DIR}/src/components/ - ${COMPONENTS_DIR}/application_manager/include/ - ${COMPONENTS_DIR}/utils/include/ - ${COMPONENTS_DIR}/resumption/include/ - ${COMPONENTS_DIR}/utils/include/ - ${POLICY_PATH}/include/ - ${COMPONENTS_DIR}/media_manager/include/ - ${COMPONENTS_DIR}/security_manager/include/ - ${POLICY_PATH}/policy/test/include/ - ${POLICY_MOCK_INCLUDE_PATH}/ - ${COMPONENTS_DIR}/application_manager/test/include/ - ) - - set(testSources - ${AM_TEST_DIR}/mobile_message_handler_test.cc - ${AM_TEST_DIR}/mobile_message_handler_v1_test.cc - ${AM_TEST_DIR}/request_info_test.cc - ${AM_TEST_DIR}/request_tracker_test.cc - ${AM_TEST_DIR}/resumption_sql_queries_test.cc - ${AM_TEST_DIR}/event_engine_test.cc - ${AM_TEST_DIR}/policy_event_observer_test.cc - ${AM_TEST_DIR}/application_impl_test.cc - ${AM_TEST_DIR}/hmi_capabilities_test.cc - ${AM_TEST_DIR}/application_state_test.cc - ${AM_TEST_DIR}/usage_statistics_test.cc - ${AM_TEST_DIR}/policy_handler_test.cc - ${AM_TEST_DIR}/mock_message_helper.cc - ) - set (request_controller_SOURCES - ${AM_TEST_DIR}/request_controller/request_controller_test.cc - ) +include_directories( + ${GMOCK_INCLUDE_DIRECTORY} + ${CMAKE_BINARY_DIR}/src/components/ + ${COMPONENTS_DIR}/application_manager/include/ + ${COMPONENTS_DIR}/utils/include/ + ${COMPONENTS_DIR}/resumption/include/ + ${COMPONENTS_DIR}/utils/include/ + ${POLICY_PATH}/include/ + ${POLICY_PATH}/policy/test/include/ + ${POLICY_MOCK_INCLUDE_PATH}/ + ${COMPONENTS_DIR}/media_manager/include/ + ${COMPONENTS_DIR}/security_manager/include/ + ${COMPONENTS_DIR}/policy/test/include/ + ${COMPONENTS_DIR}/application_manager/test/include/ +) + +set(testSources + ${AM_TEST_DIR}/mobile_message_handler_test.cc + ${AM_TEST_DIR}/mobile_message_handler_v1_test.cc + ${AM_TEST_DIR}/request_info_test.cc + ${AM_TEST_DIR}/resumption_sql_queries_test.cc + ${AM_TEST_DIR}/event_engine_test.cc + ${AM_TEST_DIR}/policy_event_observer_test.cc + ${AM_TEST_DIR}/application_impl_test.cc + ${AM_TEST_DIR}/hmi_capabilities_test.cc + ${AM_TEST_DIR}/application_state_test.cc + ${AM_TEST_DIR}/usage_statistics_test.cc + ${AM_TEST_DIR}/policy_handler_test.cc + ${AM_TEST_DIR}/mock_message_helper.cc +) + +set(request_controller_SOURCES + ${AM_TEST_DIR}/request_controller/request_controller_test.cc +) set(testLibraries ApplicationManager @@ -106,72 +108,73 @@ set(test_exec_libraries Resumption ) -IF(${CMAKE_SYSTEM_NAME} MATCHES "QNX") +if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") + list(REMOVE_ITEM test_exec_libraries dl) +endif() + +set(testLibraries + Utils + ApplicationManager + jsoncpp + Policy + connectionHandler + HMI_API + MOBILE_API + v4_protocol_v1_2_no_extra + SmartObjects + formatters + gmock_main + UsageStatistics + dl + ProtocolLibrary + ConfigProfile + MediaManager + Resumption + ProtocolHandler + SecurityManager +) + +if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") list(REMOVE_ITEM test_exec_libraries dl) endif() - set(testLibraries - Utils - ApplicationManager - jsoncpp - Policy - connectionHandler - HMI_API - MOBILE_API - v4_protocol_v1_2_no_extra - SmartObjects - formatters - gmock_main - UsageStatistics - dl - ProtocolLibrary - ConfigProfile - MediaManager - Resumption - ProtocolHandler - SecurityManager - ) - - if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") - list(REMOVE_ITEM test_exec_libraries dl) - endif() - - if (ENABLE_LOG) - list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) - list(APPEND LIBRARIES apr-1 -L${APR_LIBS_DIRECTORY}) - list(APPEND LIBRARIES aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY}) - list(APPEND LIBRARIES expat -L${EXPAT_LIBS_DIRECTORY}) - endif() - - file(COPY smartDeviceLink_test2.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY sdl_pt_update.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +if (ENABLE_LOG) + list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + list(APPEND LIBRARIES apr-1 -L${APR_LIBS_DIRECTORY}) + list(APPEND LIBRARIES aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY}) + list(APPEND LIBRARIES expat -L${EXPAT_LIBS_DIRECTORY}) +endif() + +file(COPY smartDeviceLink_test2.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY sdl_pt_update.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) add_custom_command( -OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libPolicy.so - COMMAND ${CMAKE_COMMAND} -E - copy ${POLICY_PATH}/libPolicy.so ${CMAKE_CURRENT_BINARY_DIR}) - set(CMAKE_EXE_LINKER_FLAGS - "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}") - create_test("application_manager_test" "${testSources}" "${testLibraries}" ) + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libPolicy.so + COMMAND ${CMAKE_COMMAND} -E + copy ${POLICY_PATH}/libPolicy.so ${CMAKE_CURRENT_BINARY_DIR} +) +set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}" +) +create_test("application_manager_test" "${testSources}" "${testLibraries}") + # TODO [AKozoriz] : Fix not buildable tests - set(ResumptionData_SOURCES - ${AM_TEST_DIR}/resumption/resumption_data_test.cc - ${AM_TEST_DIR}/resumption/resumption_data_db_test.cc - ${AM_TEST_DIR}/resumption/resumption_data_json_test.cc - ${AM_TEST_DIR}/resumption/resume_ctrl_test.cc - ${AM_TEST_DIR}/mock_message_helper.cc - ) - - file(COPY hmi_capabilities.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resumption) - file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resumption) - create_test("resumption/data_resumption_test" "${ResumptionData_SOURCES}" "${testLibraries}") - - add_subdirectory(state_controller) -endif() +set(ResumptionData_SOURCES + ${AM_TEST_DIR}/resumption/resumption_data_test.cc + ${AM_TEST_DIR}/resumption/resumption_data_db_test.cc + ${AM_TEST_DIR}/resumption/resumption_data_json_test.cc + ${AM_TEST_DIR}/resumption/resume_ctrl_test.cc + ${AM_TEST_DIR}/mock_message_helper.cc +) + +file(COPY hmi_capabilities.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resumption) +file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resumption) +create_test("resumption/data_resumption_test" "${ResumptionData_SOURCES}" "${testLibraries}") +add_subdirectory(state_controller) add_subdirectory(app_launch) add_subdirectory(commands) diff --git a/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc b/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc index 6b00365dd3..cc7d3f5814 100644 --- a/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc +++ b/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,7 +39,7 @@ #include "utils/make_shared.h" #include "utils/file_system.h" #include "utils/date_time.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "smart_objects/smart_object.h" #include "application_manager/smart_object_keys.h" #include "application_manager/mock_app_launch_settings.h" @@ -68,7 +68,7 @@ class AppLaunchDataJsonTest : public ::testing::Test { virtual void SetUp() { ::file_system::DeleteFile(kAppStorageFile); test_last_state_ = std::auto_ptr<resumption::LastState>( - new resumption::LastState(kAppStorageFolder, kAppInfoStorage)); + new resumption::LastStateImpl(kAppStorageFolder, kAppInfoStorage)); ASSERT_TRUE(::file_system::CreateFile(kAppStorageFile)); NiceMock<app_launch_test::MockAppLaunchSettings> mock_app_launch_settings_; diff --git a/src/components/application_manager/test/commands/CMakeLists.txt b/src/components/application_manager/test/commands/CMakeLists.txt index 068823fcfa..e5a083b5b2 100644 --- a/src/components/application_manager/test/commands/CMakeLists.txt +++ b/src/components/application_manager/test/commands/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -include(sources) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} diff --git a/src/components/application_manager/test/commands/mobile/add_command_request_test.cc b/src/components/application_manager/test/commands/mobile/add_command_request_test.cc index 78a6aa2f4d..567c3d32f9 100644 --- a/src/components/application_manager/test/commands/mobile/add_command_request_test.cc +++ b/src/components/application_manager/test/commands/mobile/add_command_request_test.cc @@ -57,285 +57,1055 @@ namespace mobile_commands_test { namespace add_command_request { namespace am = application_manager; - -using am::commands::AddCommandRequest; using am::commands::CommandImpl; using am::ApplicationManager; using am::commands::MessageSharedPtr; using am::ApplicationSharedPtr; using am::MockMessageHelper; using am::MockHmiInterfaces; - using ::testing::_; -using ::testing::Mock; -using ::testing::Return; -using ::testing::ReturnRef; using ::utils::SharedPtr; +using ::testing::Return; +using ::testing::Mock; +using ::testing::InSequence; +using am::commands::AddCommandRequest; +using NsSmartDeviceLink::NsSmartObjects::SmartObjectSPtr; using ::test::components::application_manager_test::MockApplication; +using am::event_engine::EventObserver; +using namespace smart_objects; namespace custom_str = utils::custom_string; namespace strings = ::application_manager::strings; +namespace mobile_result = mobile_apis::Result; namespace hmi_response = ::application_manager::hmi_response; +namespace hmi_request = ::application_manager::hmi_request; +using namespace strings; namespace { -const int32_t kCommandId = 1; +const hmi_apis::FunctionID::eType kInvalidFunctionId = + hmi_apis::FunctionID::INVALID_ENUM; const uint32_t kAppId = 1u; const uint32_t kCmdId = 1u; const uint32_t kConnectionKey = 2u; +const std::string kMenuName = "LG"; +const uint32_t kFirstParentId = 10u; +const uint32_t kSecondParentId = 1u; +const std::string kErroredVRCommand = "l\namer"; +const std::string kFirstVrCommand = "lamer"; +const std::string kSecondVrCommand = "hacker"; +const uint32_t kFirstCommandId = 10u; +const uint32_t kSecondCommandId = 11u; +const int32_t kType = 34; +const int32_t kGrammarId = 12; +const int32_t kPosition = 10; } // namespace class AddCommandRequestTest : public CommandRequestTest<CommandsTestMocks::kIsNice> { public: AddCommandRequestTest() - : mock_message_helper_(*MockMessageHelper::message_helper_mock()) - , mock_app_(CreateMockApp()) {} + : msg_(CreateMessage()) + , default_app_name_("test_default_app_name_") + , mock_message_helper_(*MockMessageHelper::message_helper_mock()) + , mock_app_(CreateMockApp()) { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillRepeatedly(Return(mock_app_)); + InitGetters(); + InitBasicMessage(); + } + + ~AddCommandRequestTest() { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + } protected: - MessageSharedPtr CreateFullParamsVRSO() { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[strings::params][strings::connection_key] = kConnectionKey; - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params[strings::cmd_id] = kCmdId; - msg_params[strings::vr_commands] = - smart_objects::SmartObject(smart_objects::SmartType_Array); - msg_params[strings::vr_commands][0] = "lamer"; - msg_params[strings::type] = 34; - msg_params[strings::grammar_id] = 12; - msg_params[strings::app_id] = kAppId; - (*msg)[strings::msg_params] = msg_params; - - return msg; + void InitBasicMessage() { + (*msg_)[params][connection_key] = kConnectionKey; + (*msg_)[msg_params][app_id] = kAppId; + (*msg_)[msg_params][app_name] = default_app_name_; } - MessageSharedPtr CreateFullParamsUISO() { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[am::strings::params][am::strings::connection_key] = kConnectionKey; - smart_objects::SmartObject menu_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - menu_params[am::strings::position] = 10; - menu_params[am::strings::menu_name] = "LG"; - - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params[am::strings::cmd_id] = kCmdId; - msg_params[am::strings::menu_params] = menu_params; - msg_params[am::strings::app_id] = kAppId; - msg_params[am::strings::cmd_icon] = 1; - msg_params[am::strings::cmd_icon][am::strings::value] = "10"; - (*msg)[am::strings::msg_params] = msg_params; - - return msg; + void InitGetters() { + ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId)); + ON_CALL(*mock_app_, FindCommand(kCmdId)) + .WillByDefault(Return(so_ptr_.get())); } - MessageSharedPtr CreateParamsUISOWithOutCmdIcon() { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[am::strings::params][am::strings::connection_key] = kConnectionKey; - smart_objects::SmartObject menu_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - menu_params[am::strings::position] = 10; - menu_params[am::strings::menu_name] = "LG"; - - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params[am::strings::cmd_id] = kCmdId; - msg_params[am::strings::menu_params] = menu_params; - msg_params[am::strings::app_id] = kAppId; - (*msg)[am::strings::msg_params] = msg_params; - - return msg; + void CreateBasicParamsUIRequest() { + SmartObject menu_params = SmartObject(SmartType_Map); + menu_params[position] = kPosition; + menu_params[menu_name] = kMenuName; + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[cmd_id] = kCmdId; + msg_params[strings::menu_params] = menu_params; + msg_params[cmd_icon] = 1; + msg_params[cmd_icon][value] = "10"; + msg_params[info] = "UI info"; } - void SetUp() OVERRIDE { - ON_CALL(app_mngr_, application(kConnectionKey)) - .WillByDefault(Return(mock_app_)); - ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kConnectionKey)); - ON_CALL(app_mngr_, hmi_interfaces()) - .WillByDefault(ReturnRef(hmi_interfaces_)); + void CreateBasicParamsVRRequest() { + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[cmd_id] = kCmdId; + msg_params[vr_commands] = SmartObject(SmartType_Array); + msg_params[vr_commands][0] = kFirstVrCommand; + msg_params[type] = kPosition; + msg_params[grammar_id] = kGrammarId; + msg_params[info] = "VR info"; } - void TearDown() OVERRIDE { - Mock::VerifyAndClearExpectations(&mock_message_helper_); + const am::CommandsMap CreateCommandsMap(SmartObject& first_command, + SmartObject& second_command) { + second_command[menu_params] = SmartObject(SmartType_Map); + second_command[menu_params][hmi_request::parent_id] = kFirstParentId; + second_command[menu_params][menu_name] = kMenuName; + second_command[vr_commands] = SmartObject(SmartType_Array); + second_command[vr_commands][0] = kSecondVrCommand; + am::CommandsMap commands_map; + commands_map.insert(std::make_pair(kFirstCommandId, &first_command)); + commands_map.insert(std::make_pair(kSecondCommandId, &second_command)); + return commands_map; } - void ResultCommandExpectations(MessageSharedPtr msg, - const std::string& info) { - EXPECT_EQ((*msg)[am::strings::msg_params][am::strings::success].asBool(), - true); - EXPECT_EQ( - (*msg)[am::strings::msg_params][am::strings::result_code].asInt(), - static_cast<int32_t>(hmi_apis::Common_Result::UNSUPPORTED_RESOURCE)); - EXPECT_EQ((*msg)[am::strings::msg_params][am::strings::info].asString(), - info); + void CheckOnTimeOutCommandDeletion( + const hmi_apis::FunctionID::eType incoming_cmd, + const hmi_apis::FunctionID::eType cmd_to_delete) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)) + .WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return(DataAccessor<application_manager::CommandsMap>( + commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + { + InSequence dummy; + EXPECT_CALL(app_mngr_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL(app_mngr_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + Event event(incoming_cmd); + event.set_smart_object(*msg_); + request_ptr->on_event(event); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL(app_mngr_, ManageHMICommand(HMIResultCodeIs(cmd_to_delete))) + .WillOnce(Return(true)); + SmartObjectSPtr response; + EXPECT_CALL( + mock_message_helper_, + CreateNegativeResponse(_, _, _, mobile_apis::Result::GENERIC_ERROR)) + .WillOnce(Return(response)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand(response, + am::commands::Command::CommandOrigin::ORIGIN_SDL)); + utils::SharedPtr<CommandRequestImpl> base_class_request = + static_cast<utils::SharedPtr<CommandRequestImpl> >(request_ptr); + base_class_request->onTimeOut(); } + MessageSharedPtr msg_; + SmartObjectSPtr so_ptr_; + const utils::custom_string::CustomString default_app_name_; + am::MockMessageHelper& mock_message_helper_; sync_primitives::Lock lock_; - NiceMock<MockHmiInterfaces> hmi_interfaces_; - MockMessageHelper& mock_message_helper_; MockAppPtr mock_app_; }; -TEST_F(AddCommandRequestTest, OnTimeout_GENERIC_ERROR) { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[strings::msg_params][strings::result_code] = - am::mobile_api::Result::GENERIC_ERROR; - (*msg)[strings::msg_params][strings::success] = false; - (*msg)[strings::params][strings::connection_key] = kConnectionKey; +TEST_F(AddCommandRequestTest, Run_AppNotExisted_EXPECT_AppNotRegistered) { + CreateBasicParamsUIRequest(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(ApplicationSharedPtr())); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_result::APPLICATION_NOT_REGISTERED), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, Run_ImageVerificationFailed_EXPECT_INVALID_DATA) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::INVALID_DATA)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, Run_MenuNameHasSyntaxError_EXPECT_INVALID_DATA) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kFirstParentId; + const std::string errored_menu_name = "L\nG"; + msg_params[menu_params][menu_name] = errored_menu_name; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + SmartObject parent = SmartObject(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kFirstParentId)) + .WillOnce(Return(&parent)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_VRCommandsHaveSyntaxError_EXPECT_INVALID_DATA) { + CreateBasicParamsVRRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[vr_commands][0] = kErroredVRCommand; + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} - utils::SharedPtr<AddCommandRequest> command = +TEST_F(AddCommandRequestTest, Run_CMDIconHasError_EXPECT_INVALID_DATA) { + MessageSharedPtr msg = CreateMessage(); + SmartObject& msg_params = (*msg)[strings::msg_params]; + (*msg)[params][connection_key] = kConnectionKey; + msg_params[cmd_id] = kCmdId; + msg_params[cmd_icon] = 1; + const std::string errored_cmd_icon_value = "1\n0"; + msg_params[cmd_icon][value] = errored_cmd_icon_value; + msg_params[vr_commands][0] = kFirstVrCommand; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = CreateCommand<AddCommandRequest>(msg); + request_ptr->Run(); +} - ON_CALL(*mock_app_, get_grammar_id()).WillByDefault(Return(kConnectionKey)); - ON_CALL(*mock_app_, RemoveCommand(_)).WillByDefault(Return()); +TEST_F(AddCommandRequestTest, Run_CommandIDAlreadyExists_EXPECT_INVALID_ID) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_ID), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} - EXPECT_CALL( - mock_message_helper_, - CreateNegativeResponse(_, _, _, am::mobile_api::Result::GENERIC_ERROR)) - .WillOnce(Return(msg)); +TEST_F(AddCommandRequestTest, + Run_CommandNameAlreadyExists_EXPECT_DUPLICATE_NAME) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kFirstParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::DUPLICATE_NAME), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_CmdAndMsgParentIDsAreDifferentSubmenuNotExisted_EXPECT_INVALID_ID) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_ID), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_CmdAndMsgVrSynonymsAreTheSame_EXPECT_DUPLICATE_NAME) { + CreateBasicParamsVRRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + msg_params[vr_commands][0] = kSecondVrCommand; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); - MessageSharedPtr command_result; + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::DUPLICATE_NAME), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, Run_MsgDataEmpty_EXPECT_INVALID_DATA) { + MessageSharedPtr msg = CreateMessage(); + (*msg)[params][connection_key] = kConnectionKey; + SmartObject& msg_params = (*msg)[strings::msg_params]; + msg_params[app_id] = kAppId; + msg_params[cmd_id] = kCmdId; + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_CmdAndMsg_UI_and_Vr_AreCorrect_EXPECT_VR_AND_UI_SENT) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, GetRunMethods_SUCCESS) { + CreateBasicParamsUIRequest(); + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_)[msg_params])); + + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); EXPECT_CALL( app_mngr_, - ManageMobileCommand(_, am::commands::Command::CommandOrigin::ORIGIN_SDL)) - .WillOnce(DoAll(SaveArg<0>(&command_result), Return(true))); - - command->onTimeOut(); - EXPECT_EQ((*command_result)[strings::msg_params][strings::success].asBool(), - false); - EXPECT_EQ( - (*command_result)[strings::msg_params][strings::result_code].asInt(), - static_cast<int32_t>(am::mobile_api::Result::GENERIC_ERROR)); + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); } -TEST_F(AddCommandRequestTest, OnEvent_VR_HmiSendSuccess_UNSUPPORTED_RESOURCE) { - MessageSharedPtr msg_vr = CreateFullParamsVRSO(); - (*msg_vr)[strings::msg_params][strings::menu_params] - [am::hmi_request::parent_id] = 10u; - (*msg_vr)[strings::msg_params][strings::menu_params][strings::menu_name] = - "menu_name"; +TEST_F(AddCommandRequestTest, OnEvent_UI_SUCCESS) { + CreateBasicParamsUIRequest(); + (*msg_)[params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_)[msg_params])); - utils::SharedPtr<AddCommandRequest> command = - CreateCommand<AddCommandRequest>(msg_vr); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly( + Return(DataAccessor<am::CommandsMap>(commands_map, lock_))); - ON_CALL(*mock_app_, FindSubMenu(_)).WillByDefault(Return(&(*msg_vr))); - ON_CALL(hmi_interfaces_, GetInterfaceFromFunction(_)) - .WillByDefault(Return(am::HmiInterfaces::HMI_INTERFACE_VR)); - ON_CALL(hmi_interfaces_, GetInterfaceState(_)) - .WillByDefault(Return(am::HmiInterfaces::STATE_NOT_AVAILABLE)); + Event event(hmi_apis::FunctionID::UI_AddCommand); + event.set_smart_object(*msg_); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, UpdateHash()); + request_ptr->on_event(event); +} - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[strings::params][hmi_response::code] = - hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; - (*msg)[am::strings::msg_params][am::strings::info] = - "VR is not supported by system"; - (*msg)[strings::msg_params][strings::cmd_id] = kCommandId; +TEST_F(AddCommandRequestTest, OnEvent_VR_SUCCESS) { + CreateBasicParamsVRRequest(); + MessageSharedPtr msg = CreateMessage(SmartType_Map); + (*msg)[params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + (*msg)[msg_params][cmd_id] = kCmdId; Event event(hmi_apis::FunctionID::VR_AddCommand); event.set_smart_object(*msg); - - smart_objects::SmartObject* ptr = NULL; - ON_CALL(*mock_app_, FindCommand(kCmdId)).WillByDefault(Return(ptr)); - - ON_CALL(mock_message_helper_, HMIToMobileResult(_)) - .WillByDefault(Return(mobile_apis::Result::SUCCESS)); - - EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_vr)[strings::msg_params])); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_)[msg_params])); am::CommandsMap commands_map; - ON_CALL(*mock_app_, commands_map()) - .WillByDefault( + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly( Return(DataAccessor<am::CommandsMap>(commands_map, lock_))); - EXPECT_CALL(*mock_app_, UpdateHash()); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + request_ptr->on_event(event); +} - MessageSharedPtr msg_ui(CreateMessage(smart_objects::SmartType_Map)); - (*msg_ui)[am::strings::params][am::hmi_response::code] = - hmi_apis::Common_Result::SUCCESS; +TEST_F(AddCommandRequestTest, OnTimeOut_EXPECT_VR_DeleteCommand) { + CheckOnTimeOutCommandDeletion(hmi_apis::FunctionID::VR_AddCommand, + hmi_apis::FunctionID::VR_DeleteCommand); +} + +TEST_F(AddCommandRequestTest, OnTimeOut_EXPECT_UI_DeleteCommand) { + CheckOnTimeOutCommandDeletion(hmi_apis::FunctionID::UI_AddCommand, + hmi_apis::FunctionID::UI_DeleteCommand); +} + +TEST_F(AddCommandRequestTest, OnEvent_BothSend_SUCCESS) { + MessageSharedPtr command_msg = CreateMessage(SmartType_Map); + (*command_msg)[params][connection_key] = kConnectionKey; + MessageSharedPtr event_msg = CreateMessage(SmartType_Map); + (*event_msg)[params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + (*event_msg)[msg_params][cmd_id] = kCmdId; Event event_ui(hmi_apis::FunctionID::UI_AddCommand); - event_ui.set_smart_object(*msg_ui); + event_ui.set_smart_object(*event_msg); + + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*event_msg); - command->Run(); - command->on_event(event_ui); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(0); - MessageSharedPtr vr_command_result; + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(command_msg); + request_ptr->Run(); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} + +TEST_F(AddCommandRequestTest, OnEvent_UnknownEvent_UNSUCCESS) { + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + Event event(hmi_apis::FunctionID::INVALID_ENUM); + request_ptr->on_event(event); +} + +TEST_F(AddCommandRequestTest, OnEvent_AppNotExisted_UNSUCCESS) { + CreateBasicParamsUIRequest(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(ApplicationSharedPtr())); + Event event(hmi_apis::FunctionID::UI_AddCommand); + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->on_event(event); +} + +TEST_F(AddCommandRequestTest, + OnEvent_HmiResponseCodeIsRejected_ExpectUICommandRemoved) { + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::REJECTED; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); EXPECT_CALL( app_mngr_, - ManageMobileCommand(_, am::commands::Command::CommandOrigin::ORIGIN_SDL)) - .WillOnce(DoAll(SaveArg<0>(&vr_command_result), Return(true))); - - command->on_event(event); + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::REJECTED)) + .WillOnce(Return(mobile_apis::Result::REJECTED)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::REJECTED), _)); + Event event(hmi_apis::FunctionID::UI_AddCommand); + event.set_smart_object(*msg_); + request_ptr->on_event(event); +} - ResultCommandExpectations(vr_command_result, "VR is not supported by system"); +TEST_F(AddCommandRequestTest, + OnEvent_HmiResponseCodeIsWarnings_ExpectCommandUpdated) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::WARNINGS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::WARNINGS), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + EXPECT_CALL(*mock_app_, UpdateHash()); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); } -TEST_F(AddCommandRequestTest, OnEvent_UI_HmiSendSuccess_UNSUPPORTED_RESOURCE) { - MessageSharedPtr msg_vr = CreateFullParamsUISO(); - (*msg_vr)[am::strings::msg_params][am::strings::vr_commands][0] = - "vr_command"; +TEST_F( + AddCommandRequestTest, + OnEvent_UI_HmiResponseCodeIsGenericError_VR_HmiResponseCodeIsUnsupportedResourse_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::GENERIC_ERROR; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::GENERIC_ERROR)) + .WillRepeatedly(Return(mobile_apis::Result::GENERIC_ERROR)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - utils::SharedPtr<AddCommandRequest> command = - CreateCommand<AddCommandRequest>(msg_vr); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + request_ptr->on_event(event_ui); + + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + MessageSharedPtr msg_vr = CreateMessage(SmartType_Map); + (*msg_vr)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + (*msg_vr)[msg_params][cmd_id] = kCmdId; + event_vr.set_smart_object(*msg_vr); + request_ptr->on_event(event_vr); +} + +TEST_F( + AddCommandRequestTest, + OnEvent_VR_HmiResponseCodeIsGenericError_UI_HmiResponseCodeIsUnsupportedResourse_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::GENERIC_ERROR; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } - ON_CALL(*mock_app_, FindSubMenu(_)).WillByDefault(Return(&(*msg_vr))); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::GENERIC_ERROR)) + .WillRepeatedly(Return(mobile_apis::Result::GENERIC_ERROR)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - ON_CALL(hmi_interfaces_, GetInterfaceFromFunction(_)) - .WillByDefault(Return(am::HmiInterfaces::HMI_INTERFACE_UI)); - ON_CALL(hmi_interfaces_, - GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) - .WillByDefault(Return(am::HmiInterfaces::STATE_NOT_AVAILABLE)); - ON_CALL(hmi_interfaces_, - GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) - .WillByDefault(Return(am::HmiInterfaces::STATE_NOT_AVAILABLE)); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + request_ptr->on_event(event_vr); - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[am::strings::params][am::hmi_response::code] = + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + MessageSharedPtr msg_ui = CreateMessage(SmartType_Map); + (*msg_ui)[strings::params][hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; - (*msg)[am::strings::msg_params][am::strings::info] = - "UI is not supported by system"; - (*msg)[am::strings::msg_params][am::strings::cmd_id] = kCommandId; + (*msg_ui)[msg_params][cmd_id] = kCmdId; + event_ui.set_smart_object(*msg_ui); + request_ptr->on_event(event_ui); +} - Event event(hmi_apis::FunctionID::UI_AddCommand); - event.set_smart_object(*msg); +TEST_F( + AddCommandRequestTest, + OnEvent_UI_VR_HmiResponseCodeIsUnsupportedResourse_UI_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - smart_objects::SmartObject* ptr = NULL; - ON_CALL(*mock_app_, FindCommand(kCmdId)).WillByDefault(Return(ptr)); - EXPECT_EQ(NULL, ptr); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly(Return(am::HmiInterfaces::STATE_AVAILABLE)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} - ON_CALL(mock_message_helper_, HMIToMobileResult(_)) - .WillByDefault(Return(mobile_apis::Result::SUCCESS)); +TEST_F( + AddCommandRequestTest, + OnEvent_UI_VR_HmiResponseCodeIsUnsupportedResourse_VR_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - ON_CALL(mock_message_helper_, VerifyImage(_, _, _)) - .WillByDefault(Return(mobile_apis::Result::SUCCESS)); - EXPECT_CALL(*mock_app_, - AddCommand(kCmdId, (*msg_vr)[am::strings::msg_params])); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly(Return(am::HmiInterfaces::STATE_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} +TEST_F( + AddCommandRequestTest, + OnEvent_UI_HmiResponseCodeIsUnsupportedResource_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); am::CommandsMap commands_map; - ON_CALL(*mock_app_, commands_map()) - .WillByDefault( - Return(DataAccessor<am::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + Event event(hmi_apis::FunctionID::UI_AddCommand); + event.set_smart_object(*msg_); + request_ptr->on_event(event); +} - EXPECT_CALL(*mock_app_, UpdateHash()); +TEST_F( + AddCommandRequestTest, + OnEvent_VR_HmiResponseCodeIsUnsupportedResource_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + Event event(hmi_apis::FunctionID::VR_AddCommand); + event.set_smart_object(*msg_); + request_ptr->on_event(event); +} - MessageSharedPtr msg_ui(CreateMessage(smart_objects::SmartType_Map)); - (*msg_ui)[am::strings::params][am::hmi_response::code] = - hmi_apis::Common_Result::SUCCESS; +TEST_F(AddCommandRequestTest, + OnEvent_UI_EventWithNotSuccesResponseCode_ExpectVRCommandDelete) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::GENERIC_ERROR), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + MessageSharedPtr msg_ui = CreateMessage(SmartType_Map); + (*msg_ui)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::ABORTED; + (*msg_ui)[msg_params][cmd_id] = kCmdId; + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_ui); Event event_vr(hmi_apis::FunctionID::VR_AddCommand); - event_vr.set_smart_object(*msg_vr); + event_vr.set_smart_object(*msg_); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::ABORTED)) + .WillOnce(Return(mobile_apis::Result::ABORTED)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_DeleteCommand))) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(2); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} - command->Run(); - command->on_event(event_vr); - MessageSharedPtr ui_command_result; +TEST_F(AddCommandRequestTest, + OnEvent_UI_VR_Events_VRErrorPresent_ExpectRemoveCommand) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::GENERIC_ERROR), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::ABORTED)) + .WillOnce(Return(mobile_apis::Result::ABORTED)); + + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + request_ptr->on_event(event_ui); EXPECT_CALL( app_mngr_, - ManageMobileCommand(_, am::commands::Command::CommandOrigin::ORIGIN_SDL)) - .WillOnce(DoAll(SaveArg<0>(&ui_command_result), Return(true))); + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_DeleteCommand))) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(2); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + MessageSharedPtr msg_vr = CreateMessage(SmartType_Map); + (*msg_vr)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::ABORTED; + (*msg_vr)[msg_params][cmd_id] = kCmdId; + event_vr.set_smart_object(*msg_vr); + request_ptr->on_event(event_vr); +} - command->on_event(event); +TEST_F(AddCommandRequestTest, + OnTimeOut_AppNotExisted_NoAppRemoveCommandCalled) { + CreateBasicParamsUIRequest(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(ApplicationSharedPtr())); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(0); + SmartObjectSPtr response; + EXPECT_CALL( + mock_message_helper_, + CreateNegativeResponse(_, _, _, mobile_apis::Result::GENERIC_ERROR)) + .WillOnce(Return(response)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + response, am::commands::Command::CommandOrigin::ORIGIN_SDL)); + utils::SharedPtr<CommandRequestImpl> base_class_request = + static_cast<utils::SharedPtr<CommandRequestImpl> >( + CreateCommand<AddCommandRequest>(msg_)); + base_class_request->onTimeOut(); +} - ResultCommandExpectations(ui_command_result, "UI is not supported by system"); +TEST_F(AddCommandRequestTest, OnTimeOut_AppRemoveCommandCalled) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + SmartObject& image = msg_params[cmd_icon]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + SmartObjectSPtr response; + EXPECT_CALL( + mock_message_helper_, + CreateNegativeResponse(_, _, _, mobile_apis::Result::GENERIC_ERROR)) + .WillOnce(Return(response)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + response, am::commands::Command::CommandOrigin::ORIGIN_SDL)); + utils::SharedPtr<CommandRequestImpl> base_class_request = + static_cast<utils::SharedPtr<CommandRequestImpl> >(request_ptr); + base_class_request->onTimeOut(); } } // namespace add_command_test diff --git a/src/components/application_manager/test/commands/mobile/alert_request_test.cc b/src/components/application_manager/test/commands/mobile/alert_request_test.cc index e8ebcd0f60..b384cd9f11 100644 --- a/src/components/application_manager/test/commands/mobile/alert_request_test.cc +++ b/src/components/application_manager/test/commands/mobile/alert_request_test.cc @@ -210,4 +210,4 @@ TEST_F(AlertRequestTest, OnEvent_UI_HmiSendSuccess_UNSUPPORTED_RESOURCE) { } // namespace mobile_commands_test } // namespace commands_test } // namespace components -} // namespace tests +} // namespace test diff --git a/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc b/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc index 793f379286..48f4497033 100644 --- a/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc +++ b/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc @@ -227,8 +227,9 @@ TYPED_TEST(OnButtonNotificationCommandsTest, Run_CustomButton_SUCCESS) { this->template CreateCommand<Notification>(notification_msg)); typename TestFixture::MockAppPtr mock_app = this->CreateMockApp(); + ON_CALL(*mock_app, hmi_level()) + .WillByDefault(Return(mobile_apis::HMILevel::HMI_FULL)); EXPECT_CALL(this->app_mngr_, application(kAppId)).WillOnce(Return(mock_app)); - EXPECT_CALL(*mock_app, IsSubscribedToSoftButton(kCustomButtonId)) .WillOnce(Return(true)); diff --git a/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc b/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc index d8240dfb62..d56cd98904 100644 --- a/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc +++ b/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc @@ -108,6 +108,8 @@ TEST_F(OnKeyBoardInputNotificationTest, Run_ActionActive_SUCCESS) { MockAppPtr mock_app(InitAppSetDataAccessor(app_set_)); EXPECT_CALL(*mock_app, is_perform_interaction_active()).WillOnce(Return(1)); + EXPECT_CALL(*mock_app, perform_interaction_layout()) + .WillOnce(Return(mobile_apis::LayoutMode::KEYBOARD)); EXPECT_CALL(*mock_app, hmi_level()).Times(0); EXPECT_CALL(*mock_app, app_id()).WillOnce(Return(kConnectionKey)); diff --git a/src/components/application_manager/test/commands/mobile/read_did_request_test.cc b/src/components/application_manager/test/commands/mobile/read_did_request_test.cc index 111dbf4e27..334f559ae6 100644 --- a/src/components/application_manager/test/commands/mobile/read_did_request_test.cc +++ b/src/components/application_manager/test/commands/mobile/read_did_request_test.cc @@ -46,7 +46,7 @@ #include "interfaces/MOBILE_API.h" #include "interfaces/HMI_API.h" #include "application_manager/smart_object_keys.h" -#include "event_engine/event.h" +#include "application_manager/event_engine/event.h" namespace test { namespace components { diff --git a/src/components/application_manager/test/commands/mobile/send_location_request_test.cc b/src/components/application_manager/test/commands/mobile/send_location_request_test.cc new file mode 100644 index 0000000000..df412695fd --- /dev/null +++ b/src/components/application_manager/test/commands/mobile/send_location_request_test.cc @@ -0,0 +1,399 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include <stdint.h> +#include <string> + +#include "gtest/gtest.h" +#include "application_manager/commands/mobile/send_location_request.h" +#include "application_manager/mock_hmi_capabilities.h" +#include "application_manager/mock_message_helper.h" +#include "utils/shared_ptr.h" +#include "commands/command_request_test.h" + +namespace test { +namespace components { +namespace commands_test { +namespace mobile_commands_test { +namespace send_location_request { + +using application_manager::commands::MessageSharedPtr; +using application_manager::commands::SendLocationRequest; +using application_manager::MockMessageHelper; +using test::components::application_manager_test::MockHMICapabilities; +using smart_objects::SmartObject; +using utils::SharedPtr; +using testing::_; +using testing::Return; +using testing::ReturnRef; +using ::testing::Mock; + +namespace strings = application_manager::strings; +namespace hmi_response = application_manager::hmi_response; +namespace Common_TextFieldName = hmi_apis::Common_TextFieldName; + +namespace { +const uint32_t kConnectionKey = 1u; +const uint32_t kFunctionID = 2u; +const uint32_t kAppID = 3u; +const double kLongitudeDegrees = 13.4; +const std::string kLocationDescription = "Location_Description"; +const std::string kNewLine = "\\n"; +const std::string kAddressLine = "Address_Line"; +const std::string kPhoneNumber = "Phone_number"; +const std::string kCorrectAddress = "Correct address"; +const std::string kEmptyAddress = ""; +const std::string kAddressWithWrongSyntax = "Wrong Syntax\\n"; +} // namespace + +class SendLocationRequestTest + : public CommandRequestTest<CommandsTestMocks::kIsNice> { + public: + class UnwrappedSendLocationRequest : public SendLocationRequest { + public: + UnwrappedSendLocationRequest( + const MessageSharedPtr& message, + application_manager::ApplicationManager& application_manager) + : SendLocationRequest(message, application_manager) {} + + ::application_manager::CommandParametersPermissions& + get_parameters_permissions() { + return parameters_permissions_; + } + }; + + typedef SharedPtr<UnwrappedSendLocationRequest> CommandSPrt; + + SendLocationRequestTest() + : mock_message_helper_(*MockMessageHelper::message_helper_mock()) { + mock_app_ = CreateMockApp(); + disp_cap_ = utils::MakeShared<SmartObject>(smart_objects::SmartType_Map); + message_ = CreateMessage(); + command_ = CreateCommand<UnwrappedSendLocationRequest>(message_); + } + + void TearDown() OVERRIDE { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + } + + void InitialSetup(MessageSharedPtr message_) { + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + (*message_)[strings::params][strings::function_id] = kFunctionID; + (*message_)[strings::msg_params] = + SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::address] = kCorrectAddress; + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(mock_app_)); + + AllowMandatoryFields(); + } + + void HMICapabilitiesSetupHelper() { + EXPECT_CALL(app_mngr_, hmi_capabilities()) + .WillOnce(ReturnRef(mock_hmi_capabilities_)); + EXPECT_CALL(mock_hmi_capabilities_, is_ui_cooperating()) + .WillOnce(Return(true)); + } + + void HMICapabilitiesSetupWithArguments( + Common_TextFieldName::eType field_name) { + HMICapabilitiesSetupHelper(); + (*disp_cap_)[hmi_response::text_fields] = + SmartObject(smart_objects::SmartType_Array); + (*disp_cap_)[hmi_response::text_fields][0] = + SmartObject(smart_objects::SmartType_Map); + (*disp_cap_)[hmi_response::text_fields][0][strings::name] = field_name; + EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) + .Times(2) + .WillRepeatedly(Return(disp_cap_.get())); + } + + void FinishSetup() { + EXPECT_CALL(*mock_app_, hmi_app_id()).WillOnce(Return(kAppID)); + EXPECT_CALL(app_mngr_, + ManageHMICommand(HMIResultCodeIs( + hmi_apis::FunctionID::Navigation_SendLocation))); + } + + void FinishSetupCancelled(mobile_apis::Result::eType result) { + EXPECT_CALL(*mock_app_, hmi_app_id()).Times(0); + EXPECT_CALL(app_mngr_, ManageHMICommand(_)).Times(0); + EXPECT_CALL(app_mngr_, ManageMobileCommand(MobileResultCodeIs(result), _)); + } + + void AllowMandatoryFields() { + application_manager::CommandParametersPermissions& permissions = + command_->get_parameters_permissions(); + permissions.allowed_params.insert(strings::longitude_degrees); + permissions.allowed_params.insert(strings::latitude_degrees); + } + + MockAppPtr mock_app_; + MockHMICapabilities mock_hmi_capabilities_; + MockMessageHelper& mock_message_helper_; + SharedPtr<SmartObject> disp_cap_; + MessageSharedPtr message_; + CommandSPrt command_; +}; + +TEST_F(SendLocationRequestTest, Run_InvalidApp_Success) { + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(MockAppPtr())); + FinishSetupCancelled(mobile_apis::Result::APPLICATION_NOT_REGISTERED); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_DeliveryMode_Success) { + InitialSetup(message_); + SmartObject msg_params = (*message_)[strings::msg_params]; + msg_params[strings::delivery_mode] = SmartObject(); + (*message_)[strings::msg_params] = msg_params; + msg_params.erase(strings::delivery_mode); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationNameIsAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_name] = "Location_Name"; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationName); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationNameIsNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_name] = "Location_Name"; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationNameWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_name] = "Location_Name\\n"; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationName); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationDescriptionIsAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_description] = + kLocationDescription; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationDescription); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationDescriptionIsNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_description] = + kLocationDescription; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationDescriptionWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_description] = + kLocationDescription + kNewLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationDescription); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressLinesAreAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address_lines] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address_lines][0] = kAddressLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::addressLines); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressLinesAreNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address_lines] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address_lines][0] = kAddressLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressLinesWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address_lines] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address_lines][0] = + kAddressLine + kNewLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::addressLines); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_PhoneNumberIsAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = kPhoneNumber; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::phoneNumber); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_PhoneNumberIsNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = kPhoneNumber; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_PhoneNumberWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = + kPhoneNumber + kNewLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::phoneNumber); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressesContainWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address]["Address 1"] = + kCorrectAddress; + (*message_)[strings::msg_params][strings::address]["Address 2"] = + kAddressWithWrongSyntax; + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationImageValid_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_image] = + SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::location_image][strings::value] = + "1"; + EXPECT_CALL( + mock_message_helper_, + VerifyImage( + (*message_)[strings::msg_params][strings::location_image], _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationImageInvalid_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_image] = + SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::location_image][strings::value] = + "1"; + EXPECT_CALL( + mock_message_helper_, + VerifyImage( + (*message_)[strings::msg_params][strings::location_image], _, _)) + .WillOnce(Return(mobile_apis::Result::ABORTED)); + FinishSetupCancelled(mobile_apis::Result::ABORTED); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_HMIUINotCoop_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = kPhoneNumber; + (*disp_cap_)[hmi_response::text_fields] = + SmartObject(smart_objects::SmartType_Array); + (*disp_cap_)[hmi_response::text_fields][0] = + SmartObject(smart_objects::SmartType_Map); + (*disp_cap_)[hmi_response::text_fields][0][strings::name] = + Common_TextFieldName::phoneNumber; + EXPECT_CALL(app_mngr_, hmi_capabilities()) + .WillOnce(ReturnRef(mock_hmi_capabilities_)); + EXPECT_CALL(mock_hmi_capabilities_, is_ui_cooperating()) + .WillOnce(Return(false)); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, OnEvent_Success) { + mobile_apis::Result::eType response_code = mobile_apis::Result::SUCCESS; + (*message_)[strings::params][hmi_response::code] = response_code; + Event event(hmi_apis::FunctionID::Navigation_SendLocation); + event.set_smart_object(*message_); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + command_->on_event(event); +} + +TEST_F(SendLocationRequestTest, OnEvent_Cancelled) { + (*message_)[strings::params][hmi_response::code] = + mobile_apis::Result::SUCCESS; + Event event(hmi_apis::FunctionID::Navigation_OnWayPointChange); + event.set_smart_object(*message_); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand(MobileResultCodeIs(mobile_apis::Result::SUCCESS), _)) + .Times(0); + command_->on_event(event); +} + +TEST_F(SendLocationRequestTest, Run_MandatoryParamsDisallowed_InvalidData) { + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + (*message_)[strings::params][strings::function_id] = kFunctionID; + (*message_)[strings::msg_params] = SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::address] = kCorrectAddress; + (*message_)[strings::msg_params][strings::longitude_degrees] = + kLongitudeDegrees; + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(mock_app_)); + application_manager::CommandParametersPermissions& permissions = + command_->get_parameters_permissions(); + // 1st one allowed + permissions.allowed_params.insert(strings::longitude_degrees); + // 2nd one disallowed + permissions.disallowed_params.insert(strings::latitude_degrees); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + command_->Run(); +} + +} // namespace send_location_request +} // namespace mobile_commands_test +} // namespace commands_test +} // namespace components +} // namespace test diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index 164f0c20ce..0a5d6116db 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,7 +45,7 @@ #include "application_manager/mock_application_manager_settings.h" #include "application_manager/mock_event_dispatcher.h" #include "application_manager/state_controller.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "application_manager/resumption/resume_ctrl.h" namespace test { @@ -94,7 +94,7 @@ class HMICapabilitiesTest : public ::testing::Test { void SetCooperating(); MockApplicationManager app_mngr_; event_engine_test::MockEventDispatcher mock_event_dispatcher; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; MockApplicationManagerSettings mock_application_manager_settings_; utils::SharedPtr<HMICapabilitiesForTesting> hmi_capabilities_test; const std::string file_name_; diff --git a/src/components/application_manager/test/message_helper/CMakeLists.txt.user b/src/components/application_manager/test/message_helper/CMakeLists.txt.user deleted file mode 100755 index e7522c1793..0000000000 --- a/src/components/application_manager/test/message_helper/CMakeLists.txt.user +++ /dev/null @@ -1,189 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 3.5.1, 2015-11-19T12:59:06. --> -<qtcreator> - <data> - <variable>EnvironmentId</variable> - <value type="QByteArray">{6965f0e8-9b58-4b26-8426-81354d6c3400}</value> - </data> - <data> - <variable>ProjectExplorer.Project.ActiveTarget</variable> - <value type="int">0</value> - </data> - <data> - <variable>ProjectExplorer.Project.EditorSettings</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="EditorConfiguration.AutoIndent">true</value> - <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> - <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> - <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> - <value type="QString" key="language">Cpp</value> - <valuemap type="QVariantMap" key="value"> - <value type="QByteArray" key="CurrentPreferences">CppGlobal</value> - </valuemap> - </valuemap> - <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1"> - <value type="QString" key="language">QmlJS</value> - <valuemap type="QVariantMap" key="value"> - <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> - </valuemap> - </valuemap> - <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> - <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> - <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> - <value type="int" key="EditorConfiguration.IndentSize">4</value> - <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> - <value type="int" key="EditorConfiguration.MarginColumn">80</value> - <value type="bool" key="EditorConfiguration.MouseHiding">true</value> - <value type="bool" key="EditorConfiguration.MouseNavigation">true</value> - <value type="int" key="EditorConfiguration.PaddingMode">1</value> - <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> - <value type="bool" key="EditorConfiguration.ShowMargin">false</value> - <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> - <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> - <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> - <value type="int" key="EditorConfiguration.TabSize">8</value> - <value type="bool" key="EditorConfiguration.UseGlobal">true</value> - <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> - <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> - <value type="bool" key="EditorConfiguration.cleanIndentation">true</value> - <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> - <value type="bool" key="EditorConfiguration.inEntireDocument">false</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.PluginSettings</variable> - <valuemap type="QVariantMap"/> - </data> - <data> - <variable>ProjectExplorer.Project.Target.0</variable> - <valuemap type="QVariantMap"> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.5.1 GCC 64bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.5.1 GCC 64bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.55.gcc_64_kit</value> - <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> - <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> - <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> - <value type="bool" key="CMakeProjectManager.CMakeBuildConfiguration.UseNinja">false</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/oherasym/sdl_panasonic/src/components/application_manager/test/message_helper-build</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"/> - <value type="bool" key="CMakeProjectManager.MakeStep.Clean">false</value> - <value type="QString" key="CMakeProjectManager.MakeStep.MakeCommand"></value> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments">clean</value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"/> - <value type="bool" key="CMakeProjectManager.MakeStep.Clean">true</value> - <value type="QString" key="CMakeProjectManager.MakeStep.MakeCommand"></value> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">all</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> - <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> - <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> - <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> - <value type="int" key="Analyzer.Valgrind.NumCallers">25</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> - <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> - <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> - <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> - <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> - <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> - <value type="int">0</value> - <value type="int">1</value> - <value type="int">2</value> - <value type="int">3</value> - <value type="int">4</value> - <value type="int">5</value> - <value type="int">6</value> - <value type="int">7</value> - <value type="int">8</value> - <value type="int">9</value> - <value type="int">10</value> - <value type="int">11</value> - <value type="int">12</value> - <value type="int">13</value> - <value type="int">14</value> - </valuelist> - <value type="int" key="PE.EnvironmentAspect.Base">2</value> - <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> - <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value> - <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value> - <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value> - <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value> - <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> - <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> - <value type="bool" key="RunConfiguration.UseMultiProcess">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.TargetCount</variable> - <value type="int">1</value> - </data> - <data> - <variable>ProjectExplorer.Project.Updater.FileVersion</variable> - <value type="int">18</value> - </data> - <data> - <variable>Version</variable> - <value type="int">18</value> - </data> -</qtcreator> diff --git a/src/components/application_manager/test/resumption/resumption_data_json_test.cc b/src/components/application_manager/test/resumption/resumption_data_json_test.cc index 0f51d29e0e..834637fa62 100644 --- a/src/components/application_manager/test/resumption/resumption_data_json_test.cc +++ b/src/components/application_manager/test/resumption/resumption_data_json_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,7 +38,7 @@ #include "application_manager/mock_application.h" #include "application_manager/mock_resumption_data.h" #include "interfaces/MOBILE_API.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "application_manager/resumption_data_test.h" #include "formatters/CFormatterJsonBase.h" @@ -81,7 +81,7 @@ class ResumptionDataJsonTest : public ResumptionDataTest { } void CheckSavedJson() { - Value& dictionary = last_state_.dictionary; + Value& dictionary = last_state_.get_dictionary(); ASSERT_TRUE(dictionary[am::strings::resumption].isObject()); ASSERT_TRUE( dictionary[am::strings::resumption][am::strings::resume_app_list] @@ -97,13 +97,13 @@ class ResumptionDataJsonTest : public ResumptionDataTest { } void SetZeroIgnOff() { - Value& dictionary = last_state_.dictionary; + Value& dictionary = last_state_.get_dictionary(); Value& res = dictionary[am::strings::resumption]; res[am::strings::last_ign_off_time] = 0; - last_state_.SaveToFileSystem(); + last_state_.SaveStateToFileSystem(); } - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; ResumptionDataJson res_json; }; diff --git a/src/components/config_profile/CMakeLists.txt b/src/components/config_profile/CMakeLists.txt index e441375336..9a8b37e58a 100644 --- a/src/components/config_profile/CMakeLists.txt +++ b/src/components/config_profile/CMakeLists.txt @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -36,13 +37,18 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/config_profile/src/profile.cc - ${COMPONENTS_DIR}/config_profile/src/ini_file.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +set(LIBRARIES + Utils +) + +collect_sources(SOURCES "${PATHS}") add_library("ConfigProfile" ${SOURCES}) -target_link_libraries("ConfigProfile" Utils) +target_link_libraries("ConfigProfile" ${LIBRARIES}) if(BUILD_TESTS) add_subdirectory(test) diff --git a/src/components/config_profile/src/ini_file.cc b/src/components/config_profile/src/ini_file.cc index d6d72060e8..1c30c8b201 100644 --- a/src/components/config_profile/src/ini_file.cc +++ b/src/components/config_profile/src/ini_file.cc @@ -188,15 +188,18 @@ char ini_write_value(const char* fname, fd = mkstemp(temp_fname); if (-1 == fd) { + fclose(rd_fp); return FALSE; } wr_fp = fdopen(fd, "w"); if (NULL == wr_fp) { unlink(temp_fname); close(fd); + fclose(rd_fp); return FALSE; } } else { + fclose(rd_fp); return FALSE; } } diff --git a/src/components/config_profile/test/CMakeLists.txt b/src/components/config_profile/test/CMakeLists.txt index 1246bff066..597be8fe00 100644 --- a/src/components/config_profile/test/CMakeLists.txt +++ b/src/components/config_profile/test/CMakeLists.txt @@ -28,23 +28,20 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${GMOCK_INCLUDE_DIRECTORY} ${COMPONENTS_DIR}/config_profile/include ) - -set(testSources - profile_test.cc - ini_file_test.cc -) - -set(testLibraries +set(LIBRARIES gmock ConfigProfile ) + +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") +create_test(config_profile_test "${SOURCES}" "${LIBRARIES}") file(COPY smartDeviceLink.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) @@ -52,6 +49,3 @@ file(COPY smartDeviceLink_invalid_pairs.ini DESTINATION ${CMAKE_CURRENT_BINARY_D file(COPY smartDeviceLink_invalid_string.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY smartDeviceLink_invalid_int.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY smartDeviceLink_invalid_boolean.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -create_test("config_profile_test" "${testSources}" "${testLibraries}") - -endif() diff --git a/src/components/connection_handler/CMakeLists.txt b/src/components/connection_handler/CMakeLists.txt index dc1b2d24d6..2cdfec91f2 100644 --- a/src/components/connection_handler/CMakeLists.txt +++ b/src/components/connection_handler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(CH_SRC_DIR ${COMPONENTS_DIR}/connection_handler/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -39,20 +38,20 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${CH_SRC_DIR}/connection_handler_impl.cc - ${CH_SRC_DIR}/connection.cc - ${CH_SRC_DIR}/device.cc - ${CH_SRC_DIR}/heartbeat_monitor.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) set(LIBRARIES ProtocolLibrary + encryption ) +collect_sources(SOURCES "${PATHS}") add_library(connectionHandler ${SOURCES}) -target_link_libraries(connectionHandler encryption) +target_link_libraries(connectionHandler ${LIBRARIES}) if(BUILD_TESTS) - add_subdirectory(test) + add_subdirectory(test) endif() diff --git a/src/components/connection_handler/test/CMakeLists.txt b/src/components/connection_handler/test/CMakeLists.txt index 32da4bdcd8..033a45e97d 100644 --- a/src/components/connection_handler/test/CMakeLists.txt +++ b/src/components/connection_handler/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,9 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) - -set(appMain_DIR ${CMAKE_SOURCE_DIR}/src/appMain) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} @@ -46,15 +44,7 @@ set(LIBRARIES ProtocolHandler ) -set(SOURCES - connection_handler_impl_test.cc - connection_test.cc - device_test.cc - heart_beat_monitor_test.cc -) - -file(COPY ${appMain_DIR}/smartDeviceLink.ini DESTINATION "./") - -create_test("connection_handler_test" "${SOURCES}" "${LIBRARIES}") +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") +create_test(connection_handler_test "${SOURCES}" "${LIBRARIES}") -endif() +file(COPY ${CMAKE_SOURCE_DIR}/src/appMain/smartDeviceLink.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/components/dbus/CMakeLists.txt b/src/components/dbus/CMakeLists.txt index 7e7f2af787..cb1ce30a6d 100644 --- a/src/components/dbus/CMakeLists.txt +++ b/src/components/dbus/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${DBUS_INCLUDE_DIRS} @@ -40,17 +41,17 @@ include_directories ( ${CMAKE_BINARY_DIR}/src/components/ ) -set (SOURCES +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/introspection_xml.cc ${CMAKE_CURRENT_BINARY_DIR}/message_descriptions.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/dbus_adapter.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/dbus_message.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/dbus_message_controller.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/schema.cc ) +collect_sources(SOURCES "${PATHS}") -set (LIBRARIES dbus-1 -L${DBUS_LIBS_DIRECTORY}) - +set(LIBRARIES + dbus-1 -L${DBUS_LIBS_DIRECTORY} +) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/message_descriptions.cc @@ -71,7 +72,7 @@ add_custom_command( ) add_library("DBus" ${SOURCES}) -ADD_DEPENDENCIES("DBus" Utils install-3rd_party_dbus) +add_dependecnies("DBus" Utils install-3rd_party_dbus) target_link_libraries("DBus" "${LIBRARIES}") diff --git a/src/components/dbus/test/CMakeLists.txt b/src/components/dbus/test/CMakeLists.txt index d96f2388fb..1b3df2c0e7 100644 --- a/src/components/dbus/test/CMakeLists.txt +++ b/src/components/dbus/test/CMakeLists.txt @@ -28,13 +28,20 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${GMOCK_INCLUDE_DIRECTORY} ${COMPONENTS_DIR}/dbus/include/ ) +#FIXME: exclude some tests +set (EXCLUDE_PATHS + test_dbus_message_controller.cc +) + +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" ${EXCLUDE_PATHS}) + set (LIBRARIES gmock DBus @@ -42,12 +49,4 @@ set (LIBRARIES SmartObjects ) -set(testSources - ${COMPONENTS_DIR}/dbus/test/test_schema.cc - ${COMPONENTS_DIR}/dbus/test/test_dbus_adapter.cc -) - -create_test("test_DBus_test" "${testSources}" "${LIBRARIES}") - -endif() - +create_test(test_DBus_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/formatters/CMakeLists.txt b/src/components/formatters/CMakeLists.txt index 1858342ff3..02a337e278 100644 --- a/src/components/formatters/CMakeLists.txt +++ b/src/components/formatters/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(FORMATTERS_SRC_DIR ${COMPONENTS_DIR}/formatters/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include/ @@ -41,22 +40,13 @@ include_directories ( ${COMPONENTS_DIR}/utils/include ) -set (SOURCES - ${FORMATTERS_SRC_DIR}/CSmartFactory.cc -) - -set (FORMATTER_SOURCES - ${FORMATTERS_SRC_DIR}/CFormatterJsonBase.cc - ${FORMATTERS_SRC_DIR}/CFormatterJsonSDLRPCv1.cc - ${FORMATTERS_SRC_DIR}/CFormatterJsonSDLRPCv2.cc - ${FORMATTERS_SRC_DIR}/formatter_json_rpc.cc - ${FORMATTERS_SRC_DIR}/meta_formatter.cc - ${FORMATTERS_SRC_DIR}/generic_json_formatter.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) -add_library("formatters" ${SOURCES} - ${FORMATTER_SOURCES} -) +collect_sources(SOURCES "${PATHS}") +add_library(formatters ${SOURCES}) if(BUILD_TESTS) add_subdirectory(test) diff --git a/src/components/formatters/test/CMakeLists.txt b/src/components/formatters/test/CMakeLists.txt index d245626dae..c80c3d0e40 100644 --- a/src/components/formatters/test/CMakeLists.txt +++ b/src/components/formatters/test/CMakeLists.txt @@ -29,7 +29,7 @@ # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} @@ -49,19 +49,15 @@ set(LIBRARIES jsoncpp ) -set(SOURCES - ${COMPONENTS_DIR}/formatters/test/src/SmartFactoryTestHelper.cc - ${COMPONENTS_DIR}/formatters/test/CSmartFactory_test.cc - ${COMPONENTS_DIR}/formatters/test/CFormatterJsonBase_test.cc - ${COMPONENTS_DIR}/formatters/test/generic_json_formatter_test.cc - ${COMPONENTS_DIR}/formatters/test/formatter_json_rpc_test.cc - ${COMPONENTS_DIR}/formatters/test/src/create_smartSchema.cc - ${COMPONENTS_DIR}/formatters/test/cFormatterJsonSDLRPCv1_test.cc - ${COMPONENTS_DIR}/formatters/test/cFormatterJsonSDLRPCv2_test.cc - ${COMPONENTS_DIR}/formatters/test/src/meta_formatter_test_helper.cc - ${COMPONENTS_DIR}/formatters/test/meta_formatter_test.cc +set (SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR} ) -create_test("formatters_test" "${SOURCES}" "${LIBRARIES}") +set (EXCLUDE_PATHS +) + +collect_sources(SOURCES "") +create_test(formatters_test "${SOURCES}" "${LIBRARIES}") -endif() diff --git a/src/components/hmi_message_handler/CMakeLists.txt b/src/components/hmi_message_handler/CMakeLists.txt index aa10729458..c1dfca5e67 100644 --- a/src/components/hmi_message_handler/CMakeLists.txt +++ b/src/components/hmi_message_handler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include/ @@ -46,30 +48,36 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -IF (HMIADAPTER STREQUAL "dbus") - set (DBUS_SOURCE ./src/dbus_message_adapter.cc) - set (DBUS_ADAPTER DBus) -ENDIF () +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +if (HMIADAPTER STREQUAL "dbus") + set(EXCLUDE_PATHS) + set(DBUS_ADAPTER DBus) +else() + set(EXCLUDE_PATHS dbus_message_adapter.cc) + set(DBUS_ADAPTER) +endif () -set (SOURCES - ${COMPONENTS_DIR}/hmi_message_handler/src/hmi_message_handler_impl.cc - ${COMPONENTS_DIR}/hmi_message_handler/src/messagebroker_adapter.cc - ${COMPONENTS_DIR}/hmi_message_handler/src/hmi_message_adapter_impl.cc - ${COMPONENTS_DIR}/hmi_message_handler/src/mqueue_adapter.cc - ${DBUS_SOURCE} +list(APPEND EXCLUDE_PATHS + mqueue_adapter.cc ) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") + set(LIBRARIES - Utils - ${DBUS_ADAPTER} - ${RTLIB} + Utils + ${DBUS_ADAPTER} + ${RTLIB} ) add_library("HMIMessageHandler" ${SOURCES}) target_link_libraries("HMIMessageHandler" ${LIBRARIES}) if(ENABLE_LOG) - target_link_libraries("HMIMessageHandler" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + target_link_libraries("HMIMessageHandler" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() # Tests temporary are inactivated. For details please check diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h b/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h index 3b829b0f27..8b238b4aa8 100644 --- a/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h +++ b/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h @@ -106,6 +106,14 @@ class HMIMessageHandlerImpl : public HMIMessageHandler, HMIMessageObserver* observer() const { return observer_; } + + impl::ToHmiQueue* messages_to_hmi() { + return &messages_to_hmi_; + } + + impl::FromHmiQueue* messages_from_hmi() { + return &messages_from_hmi_; + } #endif // BUILD_TESTS private: diff --git a/src/components/hmi_message_handler/src/dbus_message_adapter.cc b/src/components/hmi_message_handler/src/dbus_message_adapter.cc index daefd32de9..00f5ad6be8 100644 --- a/src/components/hmi_message_handler/src/dbus_message_adapter.cc +++ b/src/components/hmi_message_handler/src/dbus_message_adapter.cc @@ -126,8 +126,6 @@ void DBusMessageAdapter::SubscribeTo() { DBusMessageController::SubscribeTo("BasicCommunication", "OnSystemRequest"); DBusMessageController::SubscribeTo("BasicCommunication", "OnSystemInfoChanged"); - DBusMessageController::SubscribeTo("BasicCommunication", "OnPhoneCall"); - DBusMessageController::SubscribeTo("BasicCommunication", "OnEmergencyEvent"); DBusMessageController::SubscribeTo("TTS", "Started"); DBusMessageController::SubscribeTo("TTS", "Stopped"); DBusMessageController::SubscribeTo("TTS", "OnLanguageChange"); diff --git a/src/components/hmi_message_handler/src/mqueue_adapter.cc b/src/components/hmi_message_handler/src/mqueue_adapter.cc deleted file mode 100644 index 4cfebbe9e8..0000000000 --- a/src/components/hmi_message_handler/src/mqueue_adapter.cc +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2014, Ford Motor Company - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Ford Motor Company nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "hmi_message_handler/mqueue_adapter.h" -#include "hmi_message_handler/hmi_message_handler.h" -#include "utils/logger.h" - -namespace hmi_message_handler { - -const uint32_t kMqueueSize = 100; -const uint32_t kMqueueMessageSize = 65536; -const char* kSdlToHmiQueue = "/sdl_to_hmi"; -const char* kHmiToSdlQueue = "/hmi_to_sdl"; - -CREATE_LOGGERPTR_GLOBAL(logger_, "HMIMessageHandler") - -class ReceiverThreadDelegate : public threads::ThreadDelegate { - public: - ReceiverThreadDelegate(mqd_t mqueue_descriptor, - HMIMessageHandler* hmi_message_handler) - : mqueue_descriptor_(mqueue_descriptor) - , hmi_message_handler_(hmi_message_handler) {} - - private: - virtual void threadMain() { - while (true) { - static char buffer[kMqueueMessageSize]; - const ssize_t size = - mq_receive(mqueue_descriptor_, buffer, kMqueueMessageSize, NULL); - if (-1 == size) { - LOG4CXX_ERROR(logger_, "Message queue receive failed, error " << errno); - continue; - } - const std::string message_string(buffer, buffer + size); - LOG4CXX_DEBUG(logger_, "Message: " << message_string); - MessageSharedPointer message(new application_manager::Message( - protocol_handler::MessagePriority::kDefault)); - message->set_json_message(message_string); - message->set_protocol_version(application_manager::ProtocolVersion::kHMI); - hmi_message_handler_->OnMessageReceived(message); - } - } - - const mqd_t mqueue_descriptor_; - HMIMessageHandler* hmi_message_handler_; -}; - -MqueueAdapter::MqueueAdapter(HMIMessageHandler* hmi_message_handler) - : HMIMessageAdapterImpl(hmi_message_handler) - , sdl_to_hmi_mqueue_(-1) - , hmi_to_sdl_mqueue_(-1) - , receiver_thread_(NULL) { - mq_attr mq_attributes; - mq_attributes.mq_maxmsg = kMqueueSize; - mq_attributes.mq_msgsize = kMqueueMessageSize; - sdl_to_hmi_mqueue_ = - mq_open(kSdlToHmiQueue, O_CREAT | O_RDWR, S_IRWXU, &mq_attributes); - if (-1 == sdl_to_hmi_mqueue_) { - LOG4CXX_ERROR(logger_, - "Could not open message queue " << kSdlToHmiQueue - << ", error " << errno); - return; - } - hmi_to_sdl_mqueue_ = - mq_open(kHmiToSdlQueue, O_CREAT | O_RDWR, S_IRWXU, &mq_attributes); - if (-1 == hmi_to_sdl_mqueue_) { - LOG4CXX_ERROR(logger_, - "Could not open message queue " << kHmiToSdlQueue - << ", error " << errno); - return; - } - receiver_thread_delegate_ = - new ReceiverThreadDelegate(hmi_to_sdl_mqueue_, hmi_message_handler); - receiver_thread_ = - threads::CreateThread("MqueueAdapter", receiver_thread_delegate_); - receiver_thread_->start(); -} - -MqueueAdapter::~MqueueAdapter() { - receiver_thread_->join(); - delete receiver_thread_delegate_; - threads::DeleteThread(receiver_thread_); - if (-1 != hmi_to_sdl_mqueue_) - mq_close(hmi_to_sdl_mqueue_); - if (-1 != sdl_to_hmi_mqueue_) - mq_close(sdl_to_hmi_mqueue_); - mq_unlink(kHmiToSdlQueue); - mq_unlink(kSdlToHmiQueue); -} - -void MqueueAdapter::SendMessageToHMI(const MessageSharedPointer message) { - LOG4CXX_AUTO_TRACE(logger_); - - if (-1 == sdl_to_hmi_mqueue_) { - LOG4CXX_ERROR(logger_, "Message queue is not opened"); - return; - } - const std::string& json = message->json_message(); - if (json.size() > kMqueueMessageSize) { - LOG4CXX_ERROR(logger_, "Message size " << json.size() << " is too big"); - return; - } - const int rc = mq_send(sdl_to_hmi_mqueue_, json.c_str(), json.size(), 0); - if (0 != rc) { - LOG4CXX_ERROR(logger_, "Could not send message, error " << errno); - return; - } -} - -void MqueueAdapter::SubscribeTo() { - // empty implementation of pure virtual method, actually it's not called -} - -} // namespace hmi_message_handler diff --git a/src/components/hmi_message_handler/test/CMakeLists.txt b/src/components/hmi_message_handler/test/CMakeLists.txt index 98e9fd5653..0d7ccd9ee1 100644 --- a/src/components/hmi_message_handler/test/CMakeLists.txt +++ b/src/components/hmi_message_handler/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,7 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${GMOCK_INCLUDE_DIRECTORY} @@ -36,27 +37,31 @@ include_directories ( ${COMPONENTS_DIR}/hmi_message_handler/test/include ) +if (HMIADAPTER STREQUAL "messagebroker") + set (BROKER_LIBRARIES + message_broker_client + message_broker_server + ) +endif() + +set(EXCLUDE_PATHS) + set(LIBRARIES gmock ApplicationManager HMIMessageHandler jsoncpp - MessageBrokerClient - MessageBrokerServer + ${BROKER_LIBRARIES} ConfigProfile ) -set(SOURCES -${COMPONENTS_DIR}/hmi_message_handler/test/hmi_message_handler_impl_test.cc -${COMPONENTS_DIR}/hmi_message_handler/test/hmi_message_adapter_test.cc -) - -if(${QT_HMI}) - list (APPEND SOURCES - ${COMPONENTS_DIR}/hmi_message_handler/test/mock_subscriber.cc - ${COMPONENTS_DIR}/hmi_message_handler/test/dbus_message_adapter_test.cc +if(NOT HMI_DBUS_API}) + list (APPEND EXCLUDE_PATHS + mock_subscriber.cc + dbus_message_adapter_test.cc ) endif() -create_test("hmi_message_handler_test" "${SOURCES}" "${LIBRARIES}") -endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") + +create_test(hmi_message_handler_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc b/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc index 06cca74ba9..a551c8a1f2 100644 --- a/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc +++ b/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc @@ -36,13 +36,15 @@ #include "hmi_message_handler/messagebroker_adapter.h" #include "hmi_message_handler/mock_hmi_message_observer.h" #include "hmi_message_handler/mock_hmi_message_handler_settings.h" -#include "utils/make_shared.h" +#include "hmi_message_handler/mock_hmi_message_adapter_impl.h" namespace test { namespace components { namespace hmi_message_handler_test { using ::testing::ReturnRef; +using ::testing::_; + class HMIMessageHandlerImplTest : public ::testing::Test { public: HMIMessageHandlerImplTest() @@ -63,10 +65,13 @@ class HMIMessageHandlerImplTest : public ::testing::Test { .WillByDefault(ReturnRef(stack_size)); hmi_handler_ = new hmi_message_handler::HMIMessageHandlerImpl( mock_hmi_message_handler_settings); + ASSERT_TRUE(NULL != hmi_handler_); mb_adapter_ = new hmi_message_handler::MessageBrokerAdapter( hmi_handler_, "localhost", 22); + ASSERT_TRUE(NULL != mb_adapter_); mock_hmi_message_observer_ = new hmi_message_handler::MockHMIMessageObserver(); + ASSERT_TRUE(NULL != mock_hmi_message_observer_); hmi_handler_->set_message_observer(mock_hmi_message_observer_); EXPECT_TRUE(NULL != hmi_handler_->observer()); } @@ -77,6 +82,13 @@ class HMIMessageHandlerImplTest : public ::testing::Test { delete hmi_handler_; delete mb_adapter_; } + + hmi_message_handler::MessageSharedPointer CreateMessage() { + // The ServiceType doesn't really matter + return new application_manager::Message( + protocol_handler::MessagePriority::FromServiceType( + protocol_handler::ServiceType::kInvalidServiceType)); + } }; TEST_F(HMIMessageHandlerImplTest, @@ -91,16 +103,23 @@ TEST_F(HMIMessageHandlerImplTest, TEST_F(HMIMessageHandlerImplTest, OnErrorSending_NotEmptyMessage_ExpectOnErrorSendingProceeded) { // Arrange - utils::SharedPtr<application_manager::Message> message( - utils::MakeShared<application_manager::Message>( - protocol_handler::MessagePriority::FromServiceType( - protocol_handler::ServiceType::kControl))); + utils::SharedPtr<application_manager::Message> message = CreateMessage(); EXPECT_CALL(*mock_hmi_message_observer_, OnErrorSending(message)); // Act hmi_handler_->OnErrorSending(message); } +TEST_F(HMIMessageHandlerImplTest, OnErrorSending_InvalidObserver_Cancelled) { + // Arrange + utils::SharedPtr<application_manager::Message> message = CreateMessage(); + + hmi_handler_->set_message_observer(NULL); + EXPECT_CALL(*mock_hmi_message_observer_, OnErrorSending(_)).Times(0); + // Act + hmi_handler_->OnErrorSending(message); +} + TEST_F(HMIMessageHandlerImplTest, AddHMIMessageAdapter_AddExistedAdapter_ExpectAdded) { // Check before action @@ -131,6 +150,40 @@ TEST_F(HMIMessageHandlerImplTest, RemoveHMIMessageAdapter_ExpectRemoved) { EXPECT_TRUE(hmi_handler_->message_adapters().empty()); } +// TODO(atimchenko) SDLOPEN-44 Wrong message to observer +TEST_F(HMIMessageHandlerImplTest, + DISABLED_OnMessageReceived_ValidObserver_Success) { + hmi_message_handler::MessageSharedPointer message = CreateMessage(); + EXPECT_CALL(*mock_hmi_message_observer_, OnMessageReceived(message)); + + hmi_handler_->OnMessageReceived(message); + // Wait for the message to be processed + hmi_handler_->messages_from_hmi()->WaitDumpQueue(); +} + +TEST_F(HMIMessageHandlerImplTest, OnMessageReceived_InvalidObserver_Cancelled) { + hmi_message_handler::MessageSharedPointer message = CreateMessage(); + EXPECT_CALL(*mock_hmi_message_observer_, OnMessageReceived(_)).Times(0); + // Make the observer invalid + hmi_handler_->set_message_observer(NULL); + hmi_handler_->OnMessageReceived(message); + hmi_handler_->messages_from_hmi()->WaitDumpQueue(); +} + +TEST_F(HMIMessageHandlerImplTest, SendMessageToHMI_Success) { + hmi_message_handler::MessageSharedPointer message = CreateMessage(); + + MockHMIMessageAdapterImpl message_adapter(hmi_handler_); + EXPECT_CALL(message_adapter, SendMessageToHMI(message)); + + hmi_handler_->AddHMIMessageAdapter(&message_adapter); + hmi_handler_->SendMessageToHMI(message); + + // Wait for the message to be processed + hmi_handler_->messages_to_hmi()->WaitDumpQueue(); + testing::Mock::AsyncVerifyAndClearExpectations(100); +} + } // namespace hmi_message_handler_test } // namespace components } // namespace test diff --git a/src/components/hmi_message_handler/test/mqueue_adapter_test.cc b/src/components/hmi_message_handler/test/mqueue_adapter_test.cc deleted file mode 100644 index e5c5d2a396..0000000000 --- a/src/components/hmi_message_handler/test/mqueue_adapter_test.cc +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2014, Ford Motor Company - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Ford Motor Company nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <gtest/gtest.h> -#include <gmock/gmock.h> - -#include "hmi_message_handler/hmi_message_handler.h" -#include "hmi_message_handler/mqueue_adapter.h" - -using hmi_message_handler::MessageSharedPointer; -using hmi_message_handler::HMIMessageHandler; -using hmi_message_handler::HMIMessageAdapter; -using hmi_message_handler::MqueueAdapter; -using application_manager::Message; - -class MockHandler : public HMIMessageHandler { - public: - MOCK_METHOD1(OnMessageReceived, void(MessageSharedPointer message)); - MOCK_METHOD1(AddHMIMessageAdapter, void(HMIMessageAdapter* adapter)); - MOCK_METHOD1(RemoveHMIMessageAdapter, void(HMIMessageAdapter* adapter)); - MOCK_METHOD1(OnErrorSending, void(MessageSharedPointer message)); - MOCK_METHOD1(SendMessageToHMI, void(MessageSharedPointer message)); -}; - -// TODO{ALeshin}: APPLINK-10846 -// TEST(MqueueAdapter, Send) { -// MockHandler handler; -// HMIMessageAdapter* adapter = new MqueueAdapter(&handler); - -// MessageSharedPointer message( -// new Message(protocol_handler::MessagePriority::kDefault)); -// message->set_json_message("{}"); -// adapter->SendMessageToHMI(message); - -// mqd_t mqd = mq_open("/sdl_to_hmi", O_RDONLY); -// ASSERT_NE(-1, mqd); -// static char buf[65536]; -// ssize_t sz = mq_receive(mqd, buf, 65536, NULL); -// ASSERT_EQ(2, sz); -// EXPECT_STREQ("{}", buf); - -// delete adapter; -//} - -// TODO{ALeshin}: APPLINK-10846 -// TEST(MqueueAdapter, Receive) { -// MockHandler handler; -// HMIMessageAdapter* adapter = new MqueueAdapter(&handler); - -// using ::testing::Property; -// using ::testing::Pointee; -// EXPECT_CALL( -// handler, -// OnMessageReceived(Property( -// &MessageSharedPointer::get, -// Pointee(Property(&Message::json_message, std::string("()")))))); - -// mqd_t mqd = mq_open("/hmi_to_sdl", O_WRONLY); -// ASSERT_NE(-1, mqd); -// const char buf[] = "()"; -// int rc = mq_send(mqd, buf, sizeof(buf) - 1, 0); -// ASSERT_EQ(0, rc); - -// delete adapter; -//} diff --git a/src/components/include/test/hmi_message_handler/mock_hmi_message_handler.h b/src/components/include/test/resumption/mock_last_state.h index 19aa92f932..419deba3cf 100644 --- a/src/components/include/test/hmi_message_handler/mock_hmi_message_handler.h +++ b/src/components/include/test/resumption/mock_last_state.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,25 +30,20 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SRC_COMPONENTS_INCLUDE_TEST_HMI_MESSAGE_HANDLER_MOCK_HMI_MESSAGE_HANDLER_H_ -#define SRC_COMPONENTS_INCLUDE_TEST_HMI_MESSAGE_HANDLER_MOCK_HMI_MESSAGE_HANDLER_H_ +#ifndef SRC_COMPONENTS_INCLUDE_TEST_RESUMPTION_MOCK_LAST_STATE_H_ +#define SRC_COMPONENTS_INCLUDE_TEST_RESUMPTION_MOCK_LAST_STATE_H_ #include "gmock/gmock.h" -#include "hmi_message_handler/hmi_message_handler.h" +#include "resumption/last_state.h" -namespace test { -namespace components { -namespace hmi_message_handler_test { +namespace resumption { -using hmi_message_handler::HMIMessageAdapter; - -class MockHMIMessageHandler : public ::hmi_message_handler::HMIMessageHandler { +class MockLastState : public resumption::LastState { public: - MOCK_METHOD1(AddHMIMessageAdapter, void(HMIMessageAdapter* adapter)); - MOCK_METHOD1(RemoveHMIMessageAdapter, void(HMIMessageAdapter* adapter)); + MOCK_METHOD0(SaveStateToFileSystem, void()); + MOCK_METHOD0(get_dictionary, Json::Value&()); }; -} // namespace hmi_message_handler_test -} // namespace components -} // namespace test -#endif // SRC_COMPONENTS_INCLUDE_TEST_HMI_MESSAGE_HANDLER_MOCK_HMI_MESSAGE_HANDLER_H_ +} // resumption + +#endif // SRC_COMPONENTS_INCLUDE_TEST_RESUMPTION_MOCK_LAST_STATE_H_ diff --git a/src/components/include/utils/threads/CMakeLists.txt b/src/components/include/utils/threads/CMakeLists.txt deleted file mode 100644 index f97039c21b..0000000000 --- a/src/components/include/utils/threads/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -set(UtilsIncludeDir ${COMPONENTS_DIR/utils/include) - -include_directories ( - ${UtilsIncludeDir} -)
\ No newline at end of file diff --git a/src/components/interfaces/CMakeLists.txt b/src/components/interfaces/CMakeLists.txt index bcb47976ea..2c84e48235 100644 --- a/src/components/interfaces/CMakeLists.txt +++ b/src/components/interfaces/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,54 +28,46 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/generators.cmake) include_directories ( - ${COMPONENTS_DIR}/utils/include/ + ${COMPONENTS_DIR}/include + ${COMPONENTS_DIR}/utils/include ${COMPONENTS_DIR}/formatters/include + ${COMPONENTS_DIR}/smart_objects/include + ${CMAKE_BINARY_DIR} ) - -GenerateInterface("v4_protocol_v1_2_no_extra.xml" "NsSmartDeviceLinkRPC::V1" "sdlrpcv1") -GenerateInterface("MOBILE_API.xml" "mobile_apis" "sdlrpcv2") - -IF (${HMI_JSON_API}) - GenerateInterface("HMI_API.xml" "hmi_apis" "jsonrpc") -ENDIF (${HMI_JSON_API}) -IF (${HMI_DBUS_API}) - set(hpp_file - "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h" - "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h" - ) +generate_interface("v4_protocol_v1_2_no_extra.xml" "NsSmartDeviceLinkRPC::V1" "sdlrpcv1") +add_library(v4_protocol_v1_2_no_extra ${CMAKE_CURRENT_BINARY_DIR}/v4_protocol_v1_2_no_extra_schema.cc) - set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.cc") - set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/QT_HMI_API.xml") +generate_interface("MOBILE_API.xml" "mobile_apis" "sdlrpcv2") +add_library(MOBILE_API ${CMAKE_CURRENT_BINARY_DIR}/MOBILE_API_schema.cc) - add_custom_command( OUTPUT ${hpp_file} ${cpp_file} - COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} hmi_apis ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "jsonrpc" - DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name} - COMMENT "Generating files:\n ${hpp_file}\n ${cpp_file}\nfrom:\n QT_HMI_API.xml ..." - VERBATIM - ) +if(HMI_JSON_API) + generate_interface("HMI_API.xml" "hmi_apis" "jsonrpc") + add_library(HMI_API ${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc) +endif() - include_directories ( - ${COMPONENTS_DIR}/smart_objects/include - ${COMPONENTS_DIR}/formatters/include/ - ${CMAKE_BINARY_DIR} - ) +if(HMI_DBUS_API) + generate_interface("QT_HMI_API.xml" "hmi_apis" "jsonrpc") - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h" + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h" COMMAND sed "-e" "s/QT_HMI_API/HMI_API/g" "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h" > "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h") - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h" + ) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" COMMAND sed "-e" "s/QT_HMI_API/HMI_API/g" "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h" > "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h") - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h" + ) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc" COMMAND sed "-e" "s/QT_HMI_API/HMI_API/g" "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.cc" > "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc" DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.cc" "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h") - add_library(HMI_API "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc") -ENDIF (${HMI_DBUS_API}) + + add_library(HMI_API ${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc) +endif() add_dependencies(HMI_API Utils) diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index a7b3923cb0..2182496760 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -2140,21 +2140,6 @@ <function name="OnUpdateDeviceList" messagetype="notification"> <description>Notification from HMI to SDL sent when HMI requires update of device list (i.e. when user clicks 'Change Device' button)</description> </function> - <function name="OnPhoneCall" messagetype="notification"> - <description>Sender: HMI->SDL. When: upon phone-call event started or ended</description> - <param name="isActive" type="Boolean" mandatory="true"> - <description>Must be 'true' - when the phone call is started on HMI. Must be 'false' when the phone call is ended on HMI</description> - </param> - </function> - <function name="OnEmergencyEvent" messagetype="notification"> - <description> - "Sender: HMI->SDL. Conditions: when HMI enters the mode of "911 Assist", or other rear view camera, - or something else in the future. Purpose: for SDL to change the audioStreamingState of the related apps to - NOT_AUDIBLE when "enabled:true" and back to AUDIBLE when "enabled:false"" - </description> - <param name="enabled" type="Boolean" mandatory="true"> - </param> - </function> <function name="OnResumeAudioSource" messagetype="notification"> <description>This method must be invoked by SDL to update audio state.</description> <param name="appID" type="Integer" mandatory="true"> @@ -2465,16 +2450,6 @@ <description>SUCCESS - in case the certificate is decrypted and placed to the same file from request.</description> </function> <!-- End of Policies --> - <function name="OnDeactivateHMI" messagetype="notification"> - <description> - Sender: HMI->SDL. When: in case GAL/DIO is active or disabling - </description> - <param name="isDeactivated" type="Boolean" mandatory="true"> - <description> - Must be 'true' - GAL/DIO is active. Must be 'false' when GAL/DIO is disabling - </description> - </param> - </function> <function name="OnEventChanged" messagetype="notification"> <description>Sender: HMI->SDL. When event is become active</description> <param name="eventName" type="Common.EventTypes" mandatory="true"> @@ -3424,9 +3399,9 @@ <param name="wayPointType" type="Common.WayPointType" defvalue="ALL" mandatory="false"> <description>To request for either the destination only or for all waypoints including destination</description> </param> - <param name="appID" type="Integer" mandatory="true"> - <description>ID of the application.</description> - </param> + <param name="appID" type="Integer" mandatory="true"> + <description>ID of the application.</description> + </param> </function> <function name="GetWayPoints" functionID="GetWayPointsID" messagetype="response"> <param name="appID" type="Integer" mandatory="true"> diff --git a/src/components/media_manager/CMakeLists.txt b/src/components/media_manager/CMakeLists.txt index 46146855bb..a679239033 100644 --- a/src/components/media_manager/CMakeLists.txt +++ b/src/components/media_manager/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,63 +28,10 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) -if (EXTENDED_MEDIA_MODE) -find_package(Gstreamer-1.0 REQUIRED) -find_package(Glib-2.0 REQUIRED) -find_package(PkgConfig) -pkg_check_modules(GLIB2 REQUIRED glib-2.0) -add_definitions(${GLIB2_CFLAGS}) -set(default_includes - ${GSTREAMER_gst_INCLUDE_DIR} - ${GSTREAMER_gstconfig_INCLUDE_DIR} - ${GLIB_glib_2_INCLUDE_DIR} -) -set(default_sources - ${COMPONENTS_DIR}/media_manager/src/audio/a2dp_source_player_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/from_mic_recorder_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/from_mic_to_file_recorder_thread.cc - ${COMPONENTS_DIR}/media_manager/src/audio/socket_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/pipe_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/file_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/socket_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/pipe_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/file_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/pipe_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/socket_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/file_streamer_adapter.cc -) -set(LIBRARIES - ${GSTREAMER_gstreamer_LIBRARY} - ApplicationManager - pulse-simple - pulse - gobject-2.0 - glib-2.0 -) -else(EXTENDED_MEDIA_MODE) -set(default_includes -) - -set(default_sources - ${COMPONENTS_DIR}/media_manager/src/audio/socket_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/pipe_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/file_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/socket_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/pipe_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/file_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/pipe_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/socket_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/file_streamer_adapter.cc -) -set(LIBRARIES - ProtocolLibrary -) -endif() - -include_directories ( +include_directories( include ${COMPONENTS_DIR}/media_manager/include/audio/ ${COMPONENTS_DIR}/media_manager/include/video/ @@ -100,22 +47,60 @@ include_directories ( ${CMAKE_BINARY_DIR}/src/components/ ${POLICY_PATH}/include/ ${POLICY_GLOBAL_INCLUDE_PATH}/ - ${default_includes} ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/media_manager/src/media_adapter_impl.cc - ${COMPONENTS_DIR}/media_manager/src/audio/from_mic_recorder_listener.cc - ${COMPONENTS_DIR}/media_manager/src/audio/audio_stream_sender_thread.cc - ${COMPONENTS_DIR}/media_manager/src/streamer_listener.cc - ${COMPONENTS_DIR}/media_manager/src/media_manager_impl.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) -add_library("MediaManager" ${SOURCES} ${default_sources}) +set(EXCLUDE_PATHS + video_stream_to_file_adapter.cc +) + +set(LIBRARIES + ProtocolLibrary +) + +if(EXTENDED_MEDIA_MODE) + find_package(Gstreamer-1.0 REQUIRED) + find_package(Glib-2.0 REQUIRED) + find_package(PkgConfig) + pkg_check_modules(GLIB2 REQUIRED glib-2.0) + add_definitions(${GLIB2_CFLAGS}) + + include_directories( + ${GSTREAMER_gst_INCLUDE_DIR} + ${GSTREAMER_gstconfig_INCLUDE_DIR} + ${GLIB_glib_2_INCLUDE_DIR} + ) + list(APPEND EXCLUDE_PATHS + + ) + list(APPEND LIBRARIES + ${GSTREAMER_gstreamer_LIBRARY} + pulse-simple + pulse + gobject-2.0 + glib-2.0 + ) +else() + list(APPEND EXCLUDE_PATHS + a2dp_source_player_adapter.cc + from_mic_recorder_adapter.cc + from_mic_to_file_recorder_thread.cc + ) +endif() + +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") +add_library("MediaManager" ${SOURCES}) target_link_libraries("MediaManager" ${LIBRARIES}) -if(BUILD_TESTS) - add_subdirectory(test) +if(ENABLE_LOG) + target_link_libraries("MediaManager" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() +if(BUILD_TESTS) + add_subdirectory(test) +endif() diff --git a/src/components/media_manager/test/CMakeLists.txt b/src/components/media_manager/test/CMakeLists.txt index ede6f27f95..f5d596f681 100644 --- a/src/components/media_manager/test/CMakeLists.txt +++ b/src/components/media_manager/test/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} @@ -46,9 +46,7 @@ if(EXTENDED_MEDIA_MODE) ) endif() -set(SOURCES - ${COMPONENTS_DIR}/media_manager/test/media_manager_impl_test.cc -) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") set(LIBRARIES SmartObjects @@ -74,7 +72,3 @@ create_test("media_manager_test" "${SOURCES}" "${LIBRARIES}") if(ENABLE_LOG) target_link_libraries("media_manager_test" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() - -endif() - -# vim: set ts=2 sw=2 et: diff --git a/src/components/policy/policy_regular/CMakeLists.txt b/src/components/policy/policy_regular/CMakeLists.txt index 49d7b93152..6deb2cb2f4 100644 --- a/src/components/policy/policy_regular/CMakeLists.txt +++ b/src/components/policy/policy_regular/CMakeLists.txt @@ -28,12 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -set(target Policy) -set(install_destination bin) -set(copy_destination ${CMAKE_BINARY_DIR}/src/appMain) -set(library_name ${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX}) - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${POLICY_PATH}/include @@ -45,40 +41,45 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set(SOURCES - ${POLICY_PATH}/src/policy_manager_impl.cc - ${POLICY_PATH}/src/policy_helper.cc - ${POLICY_PATH}/src/policy_table.cc - ${POLICY_PATH}/src/sql_pt_queries.cc - ${POLICY_PATH}/src/sql_pt_representation.cc - ${POLICY_PATH}/src/update_status_manager.cc - ${POLICY_PATH}/src/status.cc - ${POLICY_PATH}/src/cache_manager.cc - ${COMPONENTS_DIR}/rpc_base/src/rpc_base/rpc_base.cc +set(POLICY_TABLE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/policy/policy_table + ${CMAKE_CURRENT_SOURCE_DIR}/src/policy_table ) +collect_sources(POLICY_TABLE_SOURCES "${POLICY_TABLE_PATHS}") +add_library(policy_struct ${POLICY_TABLE_SOURCES}) +target_link_libraries(policy_struct Utils) -# --- Table struct section -set(policy_struct_target policy_struct) -set(POLICY_TABLE_SOURCES - ${POLICY_PATH}/src/policy_table/enums.cc - ${POLICY_PATH}/src/policy_table/types.cc - ${POLICY_PATH}/src/policy_table/validation.cc +set(USAGE_STATISTICS_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/policy/usage_statistics + ${CMAKE_CURRENT_SOURCE_DIR}/src/usage_statistics ) +collect_sources(USAGE_STATISTICS_SOURCES "${USAGE_STATISTICS_PATHS}") +add_library(UsageStatistics ${USAGE_STATISTICS_SOURCES}) -add_library(${policy_struct_target} ${POLICY_TABLE_SOURCES}) -target_link_libraries(${policy_struct_target} Utils) -# --- end of Table struct section +set(EXCLUDE_PATHS + ${POLICY_TABLE_PATHS} + ${USAGE_STATISTICS_PATHS} + sql_pt_ext_queries.cc + sql_pt_ext_representation.cc +) -# --- Usage statistics section -set(USAGE_STATISTICS_SOURCES - ${POLICY_PATH}/src/usage_statistics/counter.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/ + ${CMAKE_CURRENT_SOURCE_DIR}/src/ + ${COMPONENTS_DIR}/rpc_base/src/rpc_base/rpc_base.cc +) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") + +set(LIBRARIES + ConfigProfile + policy_struct + dbms + jsoncpp + Utils ) -add_library(UsageStatistics ${USAGE_STATISTICS_SOURCES}) -# --- end of Usage statistics section -set(LIBRARIES ConfigProfile policy_struct dbms jsoncpp Utils) if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - # --- QDB Wrapper + # --- QDB Wrapper include_directories (${COMPONENTS_DIR}/utils/include/utils) else () # --- SQLite Wrapper @@ -86,22 +87,28 @@ else () list(APPEND LIBRARIES sqlite3) endif () -add_library(${target} SHARED ${SOURCES}) -target_link_libraries(${target} ${LIBRARIES} ) +add_library(Policy SHARED ${SOURCES}) +target_link_libraries(Policy ${LIBRARIES}) if(ENABLE_LOG) - target_link_libraries(${target} log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + target_link_libraries(Policy log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -add_custom_target(copy_library_${target} ALL - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_BINARY_DIR}/${library_name} - ${copy_destination} - DEPENDS ${target} - COMMENT "Copying library ${library_name}") +set(LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}Policy${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(TARGET_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}) +set(INSTALL_DESTINATION bin) +set(COPY_DESTINATION ${CMAKE_BINARY_DIR}/src/appMain) -install(TARGETS ${target} - DESTINATION ${install_destination} +add_custom_target(copy_policy_library ALL + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${TARGET_LOCATION} + ${COPY_DESTINATION}/${LIBRARY_NAME} + DEPENDS Policy + COMMENT "Copying library ${LIBRARY_NAME}" +) + +install(TARGETS Policy + DESTINATION ${INSTALL_DESTINATION} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE @@ -109,4 +116,4 @@ install(TARGETS ${target} if(BUILD_TESTS) add_subdirectory(test) -endif() # BUILD_TESTS +endif() diff --git a/src/components/policy/policy_regular/test/CMakeLists.txt b/src/components/policy/policy_regular/test/CMakeLists.txt index dcd6522a21..997c3637e8 100644 --- a/src/components/policy/policy_regular/test/CMakeLists.txt +++ b/src/components/policy/policy_regular/test/CMakeLists.txt @@ -28,6 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + include_directories( include ${COMPONENTS_DIR} @@ -41,26 +43,16 @@ include_directories( ${POLICY_MOCK_INCLUDE_PATH}/ ) -set(testLibraries +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") + +set(LIBRARIES gmock Utils Policy UsageStatistics ) -set(testSources - counter_test.cc - shared_library_test.cc - generated_code_test.cc - policy_manager_impl_test.cc - update_status_manager_test.cc -) - -list (APPEND testSources - sql_pt_representation_test.cc -) - -create_test("policy_test" "${testSources}" "${testLibraries}") +create_test(policy_test "${SOURCES}" "${LIBRARIES}") file(COPY valid_sdl_pt_update.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/components/protocol/CMakeLists.txt b/src/components/protocol/CMakeLists.txt index 8524ff4f44..7d8579bdbc 100644 --- a/src/components/protocol/CMakeLists.txt +++ b/src/components/protocol/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,18 +28,18 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( - ./include - ${APR_INCLUDE_DIRECTORY} + ${COMPONENTS_DIR}/include + ${COMPONENTS_DIR}/utils/include ) -set(SOURCES - ${COMPONENTS_DIR}/protocol/src/raw_message.cc - ${COMPONENTS_DIR}/protocol/src/service_type.cc - ${COMPONENTS_DIR}/protocol/src/message_priority.cc - ${COMPONENTS_DIR}/protocol/src/rpc_type.cc +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") + +set(LIBRARIES + Utils ) add_library(ProtocolLibrary ${SOURCES}) -target_link_libraries(ProtocolLibrary Utils) +target_link_libraries(ProtocolLibrary ${LIBRARIES}) diff --git a/src/components/protocol_handler/CMakeLists.txt b/src/components/protocol_handler/CMakeLists.txt index a09a565844..559acf8956 100644 --- a/src/components/protocol_handler/CMakeLists.txt +++ b/src/components/protocol_handler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include @@ -37,13 +38,11 @@ include_directories( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set(SOURCES - ${COMPONENTS_DIR}/protocol_handler/src/incoming_data_handler.cc - ${COMPONENTS_DIR}/protocol_handler/src/protocol_handler_impl.cc - ${COMPONENTS_DIR}/protocol_handler/src/protocol_packet.cc - ${COMPONENTS_DIR}/protocol_handler/src/protocol_payload.cc - ${COMPONENTS_DIR}/protocol_handler/src/multiframe_builder.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") set(LIBRARIES ProtocolLibrary diff --git a/src/components/protocol_handler/test/CMakeLists.txt b/src/components/protocol_handler/test/CMakeLists.txt index 87d91bfd54..ca079dcc7e 100644 --- a/src/components/protocol_handler/test/CMakeLists.txt +++ b/src/components/protocol_handler/test/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if (BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -38,9 +38,12 @@ include_directories ( ${COMPONENTS_DIR}/protocol_handler/test/include ${COMPONENTS_DIR}/include/protocol ${JSONCPP_INCLUDE_DIRECTORY} + ${GMOCK_INCLUDE_DIRECTORY} ) -set (LIBRARIES +collect_sources(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}) + +set(LIBRARIES gmock ProtocolHandler connectionHandler @@ -49,15 +52,4 @@ set (LIBRARIES ProtocolLibrary ) -set (SOURCES - incoming_data_handler_test.cc - protocol_header_validator_test.cc - protocol_handler_tm_test.cc - protocol_packet_test.cc - protocol_payload_test.cc - multiframe_builder_test.cc -) - -create_test ("protocol_handler_test" "${SOURCES}" "${LIBRARIES}") - -endif () +create_test(protocol_handler_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/qt_hmi/test/CMakeLists.txt b/src/components/qt_hmi/test/CMakeLists.txt index b0c48a4348..91ec2cd20c 100644 --- a/src/components/qt_hmi/test/CMakeLists.txt +++ b/src/components/qt_hmi/test/CMakeLists.txt @@ -29,8 +29,6 @@ # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) - cmake_minimum_required(VERSION 2.8.11) set(QT_HMI_TESTS_LIST @@ -67,4 +65,3 @@ foreach( file_i ${QT_HMI_TESTS_LIST}) file(COPY ${file_i} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) endforeach( file_i ) -endif()
\ No newline at end of file diff --git a/src/components/resumption/CMakeLists.txt b/src/components/resumption/CMakeLists.txt index b8fa277cae..4fb0876c0d 100644 --- a/src/components/resumption/CMakeLists.txt +++ b/src/components/resumption/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2017, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -37,9 +38,11 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/resumption/src/last_state.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") add_library("Resumption" ${SOURCES}) diff --git a/src/components/resumption/include/resumption/last_state.h b/src/components/resumption/include/resumption/last_state.h index a331d9291c..3481fc9327 100644 --- a/src/components/resumption/include/resumption/last_state.h +++ b/src/components/resumption/include/resumption/last_state.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,7 +35,6 @@ #include <string> -#include "utils/macro.h" #include "json/json.h" namespace resumption { @@ -43,36 +42,19 @@ namespace resumption { class LastState { public: /** - * @brief Constructor - */ - LastState(const std::string& app_storage_folder, - const std::string& app_info_storage); - - /** * @brief Destructor */ - ~LastState(); + virtual ~LastState() {} /** * @brief Saving dictionary to filesystem */ - void SaveToFileSystem(); - - /** - * @brief public dictionary - */ - Json::Value dictionary; - - private: - DISALLOW_COPY_AND_ASSIGN(LastState); + virtual void SaveStateToFileSystem() = 0; /** - * @brief Load dictionary from filesystem + * @brief Get reference to dictionary */ - void LoadFromFileSystem(); - - std::string app_storage_folder_; - std::string app_info_storage_; + virtual Json::Value& get_dictionary() = 0; }; } // namespace resumption diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/mqueue_adapter.h b/src/components/resumption/include/resumption/last_state_impl.h index 69634ea00e..2da3147930 100644 --- a/src/components/hmi_message_handler/include/hmi_message_handler/mqueue_adapter.h +++ b/src/components/resumption/include/resumption/last_state_impl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,37 +30,54 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SRC_COMPONENTS_HMI_MESSAGE_HANDLER_INCLUDE_HMI_MESSAGE_HANDLER_MQUEUE_ADAPTER_H_ -#define SRC_COMPONENTS_HMI_MESSAGE_HANDLER_INCLUDE_HMI_MESSAGE_HANDLER_MQUEUE_ADAPTER_H_ +#ifndef SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ +#define SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ -#include <memory> -#include <mqueue.h> -#include "utils/threads/thread.h" -#include "hmi_message_handler/hmi_message_adapter_impl.h" +#include "resumption/last_state.h" +#include "utils/macro.h" -namespace hmi_message_handler { - -class ReceiverThreadDelegate; +namespace resumption { /** - * \brief HMI message adapter for mqueue + * @brief The LastStateImpl class handles interface of last state */ -class MqueueAdapter : public HMIMessageAdapterImpl { + +class LastStateImpl : public LastState { public: - MqueueAdapter(HMIMessageHandler* hmi_message_handler); - virtual ~MqueueAdapter(); + /** + * @brief Constructor + */ + LastStateImpl(const std::string& app_storage_folder, + const std::string& app_info_storage); + + /** + * @brief Destructor + */ + ~LastStateImpl(); - protected: - virtual void SendMessageToHMI(MessageSharedPointer message); - virtual void SubscribeTo(); + /** + * @brief Saving dictionary to filesystem + */ + void SaveStateToFileSystem() OVERRIDE; + + /** + * @brief Get reference to dictionary + */ + Json::Value& get_dictionary() OVERRIDE; private: - mqd_t sdl_to_hmi_mqueue_; - mqd_t hmi_to_sdl_mqueue_; + const std::string app_storage_folder_; + const std::string app_info_storage_; + Json::Value dictionary_; + + /** + * @brief Load dictionary from filesystem + */ + void LoadStateFromFileSystem(); - ReceiverThreadDelegate* receiver_thread_delegate_; - threads::Thread* receiver_thread_; + DISALLOW_COPY_AND_ASSIGN(LastStateImpl); }; -} // namespace hmi_message_handler -#endif // SRC_COMPONENTS_HMI_MESSAGE_HANDLER_INCLUDE_HMI_MESSAGE_HANDLER_MQUEUE_ADAPTER_H_ +} // namespace resumption + +#endif // SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ diff --git a/src/components/resumption/src/last_state.cc b/src/components/resumption/src/last_state_impl.cc index c1b8534bfc..4d3fd1526c 100644 --- a/src/components/resumption/src/last_state.cc +++ b/src/components/resumption/src/last_state_impl.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,7 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "utils/file_system.h" #include "utils/logger.h" @@ -38,37 +38,41 @@ namespace resumption { CREATE_LOGGERPTR_GLOBAL(logger_, "Resumption") -LastState::LastState(const std::string& app_storage_folder, - const std::string& app_info_storage) +LastStateImpl::LastStateImpl(const std::string& app_storage_folder, + const std::string& app_info_storage) : app_storage_folder_(app_storage_folder) , app_info_storage_(app_info_storage) { - LoadFromFileSystem(); + LoadStateFromFileSystem(); LOG4CXX_AUTO_TRACE(logger_); } -LastState::~LastState() { +LastStateImpl::~LastStateImpl() { LOG4CXX_AUTO_TRACE(logger_); - SaveToFileSystem(); + SaveStateToFileSystem(); } -void LastState::SaveToFileSystem() { +void LastStateImpl::SaveStateToFileSystem() { LOG4CXX_AUTO_TRACE(logger_); - const std::string& str = dictionary.toStyledString(); + const std::string& str = dictionary_.toStyledString(); const std::vector<uint8_t> char_vector_pdata(str.begin(), str.end()); DCHECK(file_system::CreateDirectoryRecursively(app_storage_folder_)); LOG4CXX_INFO(logger_, - "LastState::SaveToFileSystem " << app_info_storage_ << str); + "LastState::SaveStateToFileSystem " << app_info_storage_ << str); DCHECK(file_system::Write(app_info_storage_, char_vector_pdata)); } -void LastState::LoadFromFileSystem() { +Json::Value& LastStateImpl::get_dictionary() { + return dictionary_; +} + +void LastStateImpl::LoadStateFromFileSystem() { std::string buffer; bool result = file_system::ReadFile(app_info_storage_, buffer); Json::Reader m_reader; - if (result && m_reader.parse(buffer, dictionary)) { + if (result && m_reader.parse(buffer, dictionary_)) { LOG4CXX_INFO(logger_, - "Valid last state was found." << dictionary.toStyledString()); + "Valid last state was found." << dictionary_.toStyledString()); return; } LOG4CXX_WARN(logger_, "No valid last state was found."); diff --git a/src/components/resumption/test/CMakeLists.txt b/src/components/resumption/test/CMakeLists.txt index 6fa1c07381..5481d5f80f 100644 --- a/src/components/resumption/test/CMakeLists.txt +++ b/src/components/resumption/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${LOG4CXX_INCLUDE_DIRECTORY} @@ -41,22 +41,14 @@ include_directories( ${CMAKE_BINARY_DIR} ) +collect_sources(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}) + set(LIBRARIES gmock ConfigProfile Utils Resumption jsoncpp - ConfigProfile ) -set(SOURCES - ${COMPONENTS_DIR}/resumption/test/last_state_test.cc -) - -#file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -#file(COPY app_info.dat DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - -create_test("resumption_test" "${SOURCES}" "${LIBRARIES}") - -endif() +create_test(resumption_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/resumption/test/last_state_test.cc b/src/components/resumption/test/last_state_test.cc index 78acc68c90..15180fa12c 100644 --- a/src/components/resumption/test/last_state_test.cc +++ b/src/components/resumption/test/last_state_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,7 @@ #include "gtest/gtest.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "utils/file_system.h" namespace test { @@ -69,17 +69,17 @@ class LastStateTest : public ::testing::Test { const std::string empty_dictionary_; const std::string app_info_dat_file_; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; }; TEST_F(LastStateTest, Basic) { - const Value& dictionary = last_state_.dictionary; + const Value& dictionary = last_state_.get_dictionary(); EXPECT_EQ(empty_dictionary_, dictionary.toStyledString()); } TEST_F(LastStateTest, SetGetData) { { - const Value& dictionary = last_state_.dictionary; + Value& dictionary = last_state_.get_dictionary(); const Value& bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"]; EXPECT_EQ(empty_dictionary_, bluetooth_info.toStyledString()); @@ -98,14 +98,14 @@ TEST_F(LastStateTest, SetGetData) { Value test_value; test_value["name"] = "test_device"; - last_state_.dictionary["TransportManager"]["TcpAdapter"]["devices"] = - test_value; - last_state_.dictionary["TransportManager"]["BluetoothAdapter"]["devices"] = + dictionary["TransportManager"]["TcpAdapter"]["devices"] = test_value; + + dictionary["TransportManager"]["BluetoothAdapter"]["devices"] = "bluetooth_device"; - last_state_.SaveToFileSystem(); + last_state_.SaveStateToFileSystem(); } - const Value& dictionary = last_state_.dictionary; + const Value& dictionary = last_state_.get_dictionary(); const Value& bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"]; diff --git a/src/components/rpc_base/CMakeLists.txt b/src/components/rpc_base/CMakeLists.txt index 94e67cc985..700cec72bb 100644 --- a/src/components/rpc_base/CMakeLists.txt +++ b/src/components/rpc_base/CMakeLists.txt @@ -28,31 +28,27 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(RPC_BASE_INCLUDE_DIR ${COMPONENTS_DIR}/rpc_base/include) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( - include + ${COMPONENTS_DIR}/rpc_base/include + ${COMPONENTS_DIR}/utils/include ${JSONCPP_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/rpc_base/src/rpc_base/rpc_base.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") -set (HEADERS - ${RPC_BASE_INCLUDE_DIR}/rpc_base/gtest_support.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base_dbus_inl.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base_inl.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base_json_inl.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_message.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/validation_report.h +set(LIBRARIES + jsoncpp ) -add_library(rpc_base ${HEADERS} ${SOURCES}) -target_link_libraries(rpc_base jsoncpp) +add_library(rpc_base ${SOURCES}) +target_link_libraries(rpc_base ${LIBRARIES}) if(BUILD_TESTS) add_subdirectory(test) -endif()
\ No newline at end of file +endif() diff --git a/src/components/rpc_base/test/CMakeLists.txt b/src/components/rpc_base/test/CMakeLists.txt index 76cf738f46..566f0ddcde 100644 --- a/src/components/rpc_base/test/CMakeLists.txt +++ b/src/components/rpc_base/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,9 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if (BUILD_TESTS) - include_directories ( +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + +include_directories( ${COMPONENTS_DIR}/dbus/include ${COMPONENTS_DIR}/dbus/src ${COMPONENTS_DIR}/rpc_base/include @@ -43,20 +44,16 @@ set(LIBRARIES jsoncpp ) -set(SOURCES - rpc_base_json_test.cc - rpc_base_test.cc - validation_report_test.cc -) - -if (${HMI_DBUS_API}) - # Build dbus tests +if(${HMI_DBUS_API}) include_directories(${DBUS_INCLUDE_DIRS}) - set (LIBRARIES ${LIBRARIES} DBus) - set (SOURCES ${SOURCES} rpc_base_dbus_test.cc) -endif () - -create_test("rpc_base_test" "${SOURCES}" "${LIBRARIES}") - + list(APPEND LIBRARIES + DBus + ) +else() + set(EXCLUDE_PATHS + rpc_base_dbus_test.cc + ) endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") +create_test(rpc_base_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/security_manager/CMakeLists.txt b/src/components/security_manager/CMakeLists.txt index 3cc6178931..bb50ad50c9 100644 --- a/src/components/security_manager/CMakeLists.txt +++ b/src/components/security_manager/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2015, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -27,7 +27,9 @@ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - + + +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include/ @@ -41,15 +43,22 @@ include_directories( ${APR_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/security_manager/src/security_manager_impl.cc - ${COMPONENTS_DIR}/security_manager/src/security_query.cc - ${COMPONENTS_DIR}/security_manager/src/crypto_manager_impl.cc - ${COMPONENTS_DIR}/security_manager/src/ssl_context_impl.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +collect_sources(SOURCES "${PATHS}") + +set(LIBRARIES + crypto + ssl + ProtocolHandler + jsoncpp + ProtocolLibrary ) add_library(SecurityManager ${SOURCES}) -target_link_libraries(SecurityManager crypto ssl ProtocolHandler jsoncpp ProtocolLibrary) +target_link_libraries(SecurityManager ${LIBRARIES}) if(BUILD_TESTS) add_subdirectory(test) diff --git a/src/components/security_manager/test/CMakeLists.txt b/src/components/security_manager/test/CMakeLists.txt index 6707e5ea5a..ba1fbcca8b 100644 --- a/src/components/security_manager/test/CMakeLists.txt +++ b/src/components/security_manager/test/CMakeLists.txt @@ -28,8 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if (BUILD_TESTS) - +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + include_directories( ${GMOCK_INCLUDE_DIRECTORY} ${COMPONENTS_DIR}/protocol_handler/test/include @@ -39,20 +39,15 @@ include_directories( ${JSONCPP_INCLUDE_DIRECTORY} ) -set(SOURCES - ${COMPONENTS_DIR}/security_manager/test/crypto_manager_impl_test.cc - ${COMPONENTS_DIR}/security_manager/test/security_manager_test.cc - ${COMPONENTS_DIR}/security_manager/test/security_query_test.cc - ${COMPONENTS_DIR}/security_manager/test/security_query_matcher.cc - ${COMPONENTS_DIR}/security_manager/test/ssl_context_test.cc - ${COMPONENTS_DIR}/security_manager/test/ssl_certificate_handshake_test.cc - ) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") set(LIBRARIES gmock ${SecurityManagerLibrary} ) +create_test (security_manager_test "${SOURCES}" "${LIBRARIES}") + set(CERT_LIST ${CMAKE_SOURCE_DIR}/mycert.pem ${CMAKE_SOURCE_DIR}/mykey.pem @@ -64,11 +59,8 @@ add_custom_target(generate_certificates WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) -foreach( file_i ${CERT_LIST}) - file(COPY ${file_i} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -endforeach( file_i ) +foreach(CERT_ENTRY ${CERT_LIST}) + file(COPY ${CERT_ENTRY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +endforeach() -create_test (security_manager_test "${SOURCES}" "${LIBRARIES}") add_dependencies(security_manager_test generate_certificates) - -endif () diff --git a/src/components/smart_objects/CMakeLists.txt b/src/components/smart_objects/CMakeLists.txt index c1d599db67..339cf90ea4 100644 --- a/src/components/smart_objects/CMakeLists.txt +++ b/src/components/smart_objects/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,28 +28,19 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) -set(SMART_OBJECTS_SRC_DIR ${COMPONENTS_DIR}/smart_objects/src) - -include_directories ( - include - ${COMPONENTS_DIR}/utils/include/ +include_directories( + ${COMPONENTS_DIR}/include + ${COMPONENTS_DIR}/smart_objects/include + ${COMPONENTS_DIR}/utils/include ) -set (SOURCES - ${SMART_OBJECTS_SRC_DIR}/smart_object.cc - ${SMART_OBJECTS_SRC_DIR}/smart_schema.cc - ${SMART_OBJECTS_SRC_DIR}/schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/always_false_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/always_true_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/default_shema_item.cc - ${SMART_OBJECTS_SRC_DIR}/bool_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/number_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/enum_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/string_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/object_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/array_schema_item.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") add_library("SmartObjects" ${SOURCES}) @@ -60,4 +51,3 @@ endif() if(BUILD_TESTS) add_subdirectory(test) endif() - diff --git a/src/components/smart_objects/test/CMakeLists.txt b/src/components/smart_objects/test/CMakeLists.txt index e8bc20b6b8..e0cc37e104 100644 --- a/src/components/smart_objects/test/CMakeLists.txt +++ b/src/components/smart_objects/test/CMakeLists.txt @@ -28,8 +28,11 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + if(BUILD_TESTS) -add_definitions(-DUNIT_TESTS) + add_definitions(-DUNIT_TESTS) +endif() include_directories ( ${GMOCK_INCLUDE_DIRECTORY} @@ -45,22 +48,10 @@ set(LIBRARIES jsoncpp ) -set(SOURCES - ${COMPONENTS_DIR}/smart_objects/test/SmartObjectDraft_test.cc - ${COMPONENTS_DIR}/smart_objects/test/SmartObjectInvalid_test.cc - ${COMPONENTS_DIR}/smart_objects/test/SmartObjectStress_test.cc - ${COMPONENTS_DIR}/smart_objects/test/SmartObjectUnit_test.cc - ${COMPONENTS_DIR}/smart_objects/test/smart_object_performance_test.cc - ${COMPONENTS_DIR}/smart_objects/test/map_performance_test.cc - ${COMPONENTS_DIR}/smart_objects/test/BoolSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/NumberSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/StringSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/ArraySchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/CObjectSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/AlwaysTrueSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/AlwaysFalseSchemaItem_test.cc +set(EXCLUDE_PATHS + EnumSchemaItem_test.cc + SmartObjectConvertionTime_test.cc ) -create_test("smart_object_test" "${SOURCES}" "${LIBRARIES}") - -endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") +create_test(smart_object_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/telemetry_monitor/CMakeLists.txt b/src/components/telemetry_monitor/CMakeLists.txt index 354badb41a..5ac90d1967 100644 --- a/src/components/telemetry_monitor/CMakeLists.txt +++ b/src/components/telemetry_monitor/CMakeLists.txt @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(TELEMETRY_MONITOR_SRC_DIR ${COMPONENTS_DIR}/telemetry_monitor/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -51,15 +50,15 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set(SOURCES - ${TELEMETRY_MONITOR_SRC_DIR}/metric_wrapper.cc - ${TELEMETRY_MONITOR_SRC_DIR}/telemetry_monitor.cc - ${TELEMETRY_MONITOR_SRC_DIR}/application_manager_observer.cc - ${TELEMETRY_MONITOR_SRC_DIR}/transport_manager_observer.cc - ${TELEMETRY_MONITOR_SRC_DIR}/protocol_handler_observer.cc - ${TELEMETRY_MONITOR_SRC_DIR}/application_manager_metric_wrapper.cc - ${TELEMETRY_MONITOR_SRC_DIR}/transport_manager_metric_wrapper.cc - ${TELEMETRY_MONITOR_SRC_DIR}/protocol_handler_metric_wrapper.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +collect_sources(SOURCES "${PATHS}") + +set(LIBRARIES + HMI_API + MOBILE_API ) add_library("TelemetryMonitor" ${SOURCES}) diff --git a/src/components/telemetry_monitor/test/CMakeLists.txt b/src/components/telemetry_monitor/test/CMakeLists.txt index 7d2de19854..ea2698dfb2 100644 --- a/src/components/telemetry_monitor/test/CMakeLists.txt +++ b/src/components/telemetry_monitor/test/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include @@ -40,20 +40,10 @@ include_directories( ${COMPONENTS_DIR}/resumption/include ${JSONCPP_INCLUDE_DIRECTORY} ) - -set(testSources - metric_wrapper_test.cc - telemetry_monitor_test.cc - protocol_handler_metric_test.cc - protocol_handler_observer_test.cc - transport_manager_metric_test.cc - transport_manager_observer_test.cc - application_manager_metric_test.cc - application_manager_observer_test.cc -) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") -set(testLibraries +set(LIBRARIES gmock TelemetryMonitor jsoncpp @@ -68,7 +58,7 @@ set(testLibraries MessageHelper Resumption jsoncpp - transport_manager + TransportManager MediaManager ProtocolHandler connectionHandler @@ -82,8 +72,8 @@ if (BUILD_BT_SUPPORT) list(APPEND testLibraries bluetooth) endif() -file(COPY log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +create_test("telemetry_monitor_test" "${SOURCES}" "${LIBRARIES}") + +file(COPY ${COMPONENTS_DIR}/telemetry_monitor/test/log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -create_test("telemetry_monitor_test" "${testSources}" "${testLibraries}") -endif() diff --git a/src/components/transport_manager/CMakeLists.txt b/src/components/transport_manager/CMakeLists.txt index 49a3702896..b764345618 100644 --- a/src/components/transport_manager/CMakeLists.txt +++ b/src/components/transport_manager/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2017, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -set(target TransportManager) -set(TM_SRC_DIR ${COMPONENTS_DIR}/transport_manager/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -43,83 +43,63 @@ include_directories ( ${LIBUSB_INCLUDE_DIRECTORY} ${LOG4CXX_INCLUDE_DIRECTORY} ) -if (BUILD_BT_SUPPORT) - include_directories( - ) -endif() -set (SOURCES - ${TM_SRC_DIR}/transport_manager_impl.cc - ${TM_SRC_DIR}/transport_manager_default.cc - ${TM_SRC_DIR}/transport_adapter/transport_adapter_listener_impl.cc - ${TM_SRC_DIR}/transport_adapter/transport_adapter_impl.cc - ${TM_SRC_DIR}/tcp/tcp_transport_adapter.cc - ${TM_SRC_DIR}/transport_adapter/threaded_socket_connection.cc - ${TM_SRC_DIR}/tcp/tcp_client_listener.cc - ${TM_SRC_DIR}/tcp/tcp_device.cc - ${TM_SRC_DIR}/tcp/tcp_socket_connection.cc - ${TM_SRC_DIR}/tcp/tcp_connection_factory.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +set(EXCLUDE_PATHS) + +set(LIBRARIES + ProtocolLibrary ) -if (BUILD_BT_SUPPORT) - list (APPEND SOURCES - ${TM_SRC_DIR}/bluetooth/bluetooth_device_scanner.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_transport_adapter.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_connection_factory.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_socket_connection.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_device.cc +if(BUILD_BT_SUPPORT) + list(APPEND LIBRARIES + bluetooth + ) +else() + list(APPEND EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/bluetooth + ${COMPONENTS_DIR}/transport_manager/src/bluetooth ) endif() -if (BUILD_USB_SUPPORT) - list (APPEND SOURCES - ${TM_SRC_DIR}/usb/usb_aoa_adapter.cc - ${TM_SRC_DIR}/usb/usb_connection_factory.cc - ${TM_SRC_DIR}/usb/usb_device_scanner.cc - ) +if(BUILD_USB_SUPPORT) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - list (APPEND SOURCES - ${TM_SRC_DIR}/usb/libusb/usb_handler.cc - ${TM_SRC_DIR}/usb/libusb/usb_connection.cc - ${TM_SRC_DIR}/usb/libusb/platform_usb_device.cc + set(EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/usb/qnx + ${COMPONENTS_DIR}/transport_manager/src/usb/qnx + ) + list(APPEND LIBRARIES + Libusb-1.0.16 ) elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX") - list(APPEND SOURCES - ${TM_SRC_DIR}/usb/qnx/usb_handler.cc - ${TM_SRC_DIR}/usb/qnx/usb_connection.cc - ${TM_SRC_DIR}/usb/qnx/platform_usb_device.cc + set(EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/usb/libusb + ${COMPONENTS_DIR}/transport_manager/src/usb/libusb + ) + list(APPEND LIBRARIES + usbdi ) endif() -endif(BUILD_USB_SUPPORT) - - -if (CMAKE_SYSTEM_NAME STREQUAL "QNX") +else() + list(APPEND EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/usb + ${COMPONENTS_DIR}/transport_manager/src/usb + ) endif() -add_library(${target} ${SOURCES}) -target_link_libraries(${target} ProtocolLibrary) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") -if (BUILD_USB_SUPPORT) - if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - target_link_libraries(${target} usbdi) - endif() -endif(BUILD_USB_SUPPORT) +add_library("TransportManager" ${SOURCES}) +target_link_libraries("TransportManager" ${LIBRARIES}) if(ENABLE_LOG) - target_link_libraries(${target} log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) -endif() - -if (BUILD_BT_SUPPORT) - target_link_libraries(${target} bluetooth) + target_link_libraries("TransportManager" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -if (CMAKE_SYSTEM_NAME STREQUAL "QNX") -endif() - -add_library("transport_manager" ${SOURCES} - ${TRANSPORT_MANAGER_SOURCES} -) - if(BUILD_TESTS) add_subdirectory(test) endif() diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h index 3f524dac0f..bd8aaad571 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h @@ -2,7 +2,7 @@ * \file bluetooth_socket_connection.h * \brief BluetoothSocketConnection class header file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -66,12 +66,13 @@ class BluetoothSocketConnection : public ThreadedSocketConnection { protected: /** - * @brief Establish connection. + * @brief Check if we can start the connection attempt and establish + *connection status. * - * @param error Connection error. + * @param error contains information of any error that occurred during + *connection attempt. * - * @return True - connection established. - * false - connection not established. + * @return result that states whether we successfully connected or not. */ virtual bool Establish(ConnectError** error); }; diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h index 7f238e91ec..da24a4d65d 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h @@ -2,7 +2,7 @@ * \file tcp_connection_factory.h * \brief TcpConnectionFactory class header file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,11 +37,12 @@ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_CONNECTION_FACTORY_H_ #include "transport_manager/transport_adapter/server_connection_factory.h" -#include "transport_manager/transport_adapter/transport_adapter_controller.h" namespace transport_manager { namespace transport_adapter { +class TransportAdapterController; + /** * @brief Create connections. */ diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_server_originated_socket_connection.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_server_originated_socket_connection.h new file mode 100644 index 0000000000..bf38fae37e --- /dev/null +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_server_originated_socket_connection.h @@ -0,0 +1,84 @@ +/* + * \file tcp_server_originated_socket_connection.h + * \brief TcpServerOriginatedSocketConnection class header file. + * + * Copyright (c) 2017, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SERVER_ORIGINATED_SOCKET_CONNECTION_H_ +#define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SERVER_ORIGINATED_SOCKET_CONNECTION_H_ + +#include "transport_manager/transport_adapter/threaded_socket_connection.h" + +namespace transport_manager { +namespace transport_adapter { + +class TransportAdapterController; + +/** + * @brief Class responsible for communication over sockets that originated by + * server. + */ +class TcpServerOriginatedSocketConnection : public ThreadedSocketConnection { + public: + /** + * @brief Constructor. + * + * @param device_uid Device unique identifier. + * @param app_handle Handle of application. + * @param controller Pointer to the device adapter controller. + */ + TcpServerOriginatedSocketConnection(const DeviceUID& device_uid, + const ApplicationHandle& app_handle, + TransportAdapterController* controller); + + /** + * @brief Destructor. + */ + virtual ~TcpServerOriginatedSocketConnection(); + + protected: + /** + * @brief Check if we can start the connection attempt and establish + *connection status. + * + * @param error contains information of any error that occurred during + *connection attempt. + * + * @return result that states whether we successfully connected or not. + */ + virtual bool Establish(ConnectError** error); +}; + +} // namespace transport_adapter +} // namespace transport_manager + +#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SERVER_ORIGINATED_SOCKET_CONNECTION_H_ diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h index 4d7901f4f0..a3e081e238 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h @@ -2,7 +2,7 @@ * \file tcp_socket_connection.h * \brief TcpSocketConnection class header file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,11 +36,6 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SOCKET_CONNECTION_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SOCKET_CONNECTION_H_ -#include <arpa/inet.h> -#include <netinet/in.h> -#include <sys/types.h> -#include <sys/socket.h> - #include "transport_manager/transport_adapter/threaded_socket_connection.h" namespace transport_manager { @@ -71,36 +66,13 @@ class TcpSocketConnection : public ThreadedSocketConnection { protected: /** - * @brief - */ - virtual bool Establish(ConnectError** error); -}; - -/** - * @brief Class responsible for communication over sockets that originated by - * server. - */ -class TcpServerOiginatedSocketConnection : public ThreadedSocketConnection { - public: - /** - * @brief Constructor. + * @brief Check if we can start the connection attempt and establish + *connection status. * - * @param device_uid Device unique identifier. - * @param app_handle Handle of application. - * @param controller Pointer to the device adapter controller. - */ - TcpServerOiginatedSocketConnection(const DeviceUID& device_uid, - const ApplicationHandle& app_handle, - TransportAdapterController* controller); - - /** - * @brief Destructor. - */ - virtual ~TcpServerOiginatedSocketConnection(); - - protected: - /** - * @brief + * @param error contains information of any error that occurred during + *connection attempt. + * + * @return result that states whether we successfully connected or not. */ virtual bool Establish(ConnectError** error); }; diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h index ab0c5cbf85..3792b94d7c 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h @@ -1,7 +1,7 @@ /* * \file threaded_socket_connection.h * \brief Header for classes responsible for communication over sockets. - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,6 +40,7 @@ #include "transport_manager/transport_adapter/connection.h" #include "protocol/common.h" +#include "utils/atomic_object.h" #include "utils/threads/thread_delegate.h" #include "utils/lock.h" @@ -88,6 +89,15 @@ class ThreadedSocketConnection : public Connection { bool IsFramesToSendQueueEmpty() const; /** + * @brief Check if connection has been terminated. + * + * @return Information which states that connection was marked as terminated. + */ + bool IsConnectionTerminated() const { + return terminate_flag_; + } + + /** * @brief Set variable that hold socket No. */ void set_socket(int socket) { @@ -111,6 +121,15 @@ class ThreadedSocketConnection : public Connection { */ virtual ~ThreadedSocketConnection(); + /** + * @brief Check if we can start the connection attempt and establish + *connection status. + * + * @param error contains information of any error that occurred during + *connection attempt. + * + * @return result that states whether we successfully connected or not. + */ virtual bool Establish(ConnectError** error) = 0; /** @@ -134,6 +153,25 @@ class ThreadedSocketConnection : public Connection { return app_handle_; } + /** + * @brief Get variable that hold socket No. + */ + int get_socket() const { + return socket_; + } + + /** + * @brief Checks current socket value, sends shutdown and close commands for + * this socket and clear current socket value. + */ + void ShutdownAndCloseSocket(); + + /** + * @brief This method will ensure that thread has finished running and then it + * will delete this thread. + */ + void StopAndJoinThread(); + private: class SocketConnectionDelegate : public threads::ThreadDelegate { public: @@ -163,7 +201,7 @@ class ThreadedSocketConnection : public Connection { FrameQueue frames_to_send_; mutable sync_primitives::Lock frames_to_send_mutex_; - int socket_; + sync_primitives::atomic_int socket_; bool terminate_flag_; bool unexpected_disconnect_; const DeviceUID device_uid_; diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc b/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc index bb27493701..0d8a77c88f 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc @@ -2,7 +2,7 @@ * \file bluetooth_connection_factory.cc * \brief BluetoothConnectionFactory class source file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,11 +33,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "transport_manager/bluetooth/bluetooth_connection_factory.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" +#include "transport_manager/bluetooth/bluetooth_connection_factory.h" #include "transport_manager/bluetooth/bluetooth_socket_connection.h" - #include "utils/logger.h" +#include "utils/make_shared.h" namespace transport_manager { namespace transport_adapter { @@ -54,17 +54,16 @@ TransportAdapter::Error BluetoothConnectionFactory::Init() { TransportAdapter::Error BluetoothConnectionFactory::CreateConnection( const DeviceUID& device_uid, const ApplicationHandle& app_handle) { - LOG4CXX_TRACE(logger_, - "enter. device_uid: " << &device_uid - << ", app_handle: " << &app_handle); - BluetoothSocketConnection* connection( - new BluetoothSocketConnection(device_uid, app_handle, controller_)); + LOG4CXX_AUTO_TRACE(logger_); + utils::SharedPtr<BluetoothSocketConnection> connection = + utils::MakeShared<BluetoothSocketConnection>( + device_uid, app_handle, controller_); + controller_->ConnectionCreated(connection, device_uid, app_handle); TransportAdapter::Error error = connection->Start(); if (TransportAdapter::OK != error) { - LOG4CXX_ERROR(logger_, "connection::Start() failed"); - delete connection; + LOG4CXX_ERROR(logger_, + "Bluetooth connection::Start() failed with error: " << error); } - LOG4CXX_TRACE(logger_, "exit with error: " << error); return error; } diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc index 5f1eed4c5e..16960aa1d4 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -56,7 +56,9 @@ BluetoothSocketConnection::BluetoothSocketConnection( TransportAdapterController* controller) : ThreadedSocketConnection(device_uid, app_handle, controller) {} -BluetoothSocketConnection::~BluetoothSocketConnection() {} +BluetoothSocketConnection::~BluetoothSocketConnection() { + StopAndJoinThread(); +} bool BluetoothSocketConnection::Establish(ConnectError** error) { LOG4CXX_AUTO_TRACE(logger_); diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index a82c40ca15..0f83f32c60 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -2,7 +2,7 @@ * \file bluetooth_transport_adapter.cc * \brief BluetoothTransportAdapter class source file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -111,7 +111,8 @@ void BluetoothTransportAdapter::Store() const { } } bluetooth_adapter_dictionary["devices"] = devices_dictionary; - last_state().dictionary["TransportManager"]["BluetoothAdapter"] = + Json::Value& dictionary = last_state().get_dictionary(); + dictionary["TransportManager"]["BluetoothAdapter"] = bluetooth_adapter_dictionary; LOG4CXX_TRACE(logger_, "exit"); } @@ -120,7 +121,7 @@ bool BluetoothTransportAdapter::Restore() { LOG4CXX_TRACE(logger_, "enter"); bool errors_occured = false; const Json::Value bluetooth_adapter_dictionary = - last_state().dictionary["TransportManager"]["BluetoothAdapter"]; + last_state().get_dictionary()["TransportManager"]["BluetoothAdapter"]; const Json::Value devices_dictionary = bluetooth_adapter_dictionary["devices"]; for (Json::Value::const_iterator i = devices_dictionary.begin(); diff --git a/src/components/transport_manager/src/tcp/tcp_client_listener.cc b/src/components/transport_manager/src/tcp/tcp_client_listener.cc index a075b1afb7..48f5dbd613 100644 --- a/src/components/transport_manager/src/tcp/tcp_client_listener.cc +++ b/src/components/transport_manager/src/tcp/tcp_client_listener.cc @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,6 +53,7 @@ #include <sstream> #include "utils/logger.h" +#include "utils/make_shared.h" #include "utils/threads/thread.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" #include "transport_manager/tcp/tcp_device.h" @@ -222,12 +223,16 @@ void TcpClientListener::Loop() { const ApplicationHandle app_handle = tcp_device->AddIncomingApplication(connection_fd); - TcpSocketConnection* connection(new TcpSocketConnection( - device->unique_device_id(), app_handle, controller_)); + utils::SharedPtr<TcpSocketConnection> connection = + utils::MakeShared<TcpSocketConnection>( + device->unique_device_id(), app_handle, controller_); + controller_->ConnectionCreated( + connection, device->unique_device_id(), app_handle); connection->set_socket(connection_fd); const TransportAdapter::Error error = connection->Start(); - if (error != TransportAdapter::OK) { - delete connection; + if (TransportAdapter::OK != error) { + LOG4CXX_ERROR(logger_, + "TCP connection::Start() failed with error: " << error); } } } diff --git a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc index 5b1e9af6cb..114425076a 100644 --- a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc +++ b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,10 +30,12 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "transport_manager/transport_adapter/transport_adapter_controller.h" #include "transport_manager/tcp/tcp_connection_factory.h" -#include "transport_manager/tcp/tcp_socket_connection.h" +#include "transport_manager/tcp/tcp_server_originated_socket_connection.h" #include "utils/logger.h" +#include "utils/make_shared.h" namespace transport_manager { namespace transport_adapter { @@ -54,16 +56,17 @@ TransportAdapter::Error TcpConnectionFactory::CreateConnection( LOG4CXX_DEBUG(logger_, "DeviceUID: " << &device_uid << ", ApplicationHandle: " << &app_handle); - TcpServerOiginatedSocketConnection* connection( - new TcpServerOiginatedSocketConnection( - device_uid, app_handle, controller_)); - if (connection->Start() == TransportAdapter::OK) { - LOG4CXX_DEBUG(logger_, "TCP connection initialised"); - return TransportAdapter::OK; - } else { - LOG4CXX_ERROR(logger_, "Could not initialise TCP connection"); - return TransportAdapter::FAIL; + utils::SharedPtr<TcpServerOriginatedSocketConnection> connection = + utils::MakeShared<TcpServerOriginatedSocketConnection>( + device_uid, app_handle, controller_); + controller_->ConnectionCreated(connection, device_uid, app_handle); + const TransportAdapter::Error error = connection->Start(); + if (TransportAdapter::OK != error) { + LOG4CXX_ERROR(logger_, + "TCP ServerOriginated connection::Start() failed with error: " + << error); } + return error; } void TcpConnectionFactory::Terminate() {} diff --git a/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc b/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc new file mode 100644 index 0000000000..516f2d3ec4 --- /dev/null +++ b/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc @@ -0,0 +1,111 @@ +/* + * + * Copyright (c) 2017, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "transport_manager/tcp/tcp_server_originated_socket_connection.h" +#include "transport_manager/tcp/tcp_device.h" +#include "transport_manager/transport_adapter/transport_adapter_controller.h" +#include "utils/logger.h" + +namespace transport_manager { +namespace transport_adapter { + +CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") + +TcpServerOriginatedSocketConnection::TcpServerOriginatedSocketConnection( + const DeviceUID& device_uid, + const ApplicationHandle& app_handle, + TransportAdapterController* controller) + : ThreadedSocketConnection(device_uid, app_handle, controller) {} + +TcpServerOriginatedSocketConnection::~TcpServerOriginatedSocketConnection() { + StopAndJoinThread(); +} + +bool TcpServerOriginatedSocketConnection::Establish(ConnectError** error) { + LOG4CXX_AUTO_TRACE(logger_); + DCHECK(error); + LOG4CXX_DEBUG(logger_, "error " << error); + DeviceSptr device = controller()->FindDevice(device_handle()); + if (!device.valid()) { + LOG4CXX_ERROR(logger_, "Device " << device_handle() << " not found"); + *error = new ConnectError(); + return false; + } + TcpDevice* tcp_device = static_cast<TcpDevice*>(device.get()); + + const int port = tcp_device->GetApplicationPort(application_handle()); + if (-1 == port) { + LOG4CXX_ERROR(logger_, + "Application port for " << application_handle() + << " not found"); + *error = new ConnectError(); + return false; + } + + if (IsConnectionTerminated()) { + LOG4CXX_ERROR( + logger_, + "Connection is already terminated. Socket will not be created"); + *error = new ConnectError(); + return false; + } + + const int socket = ::socket(AF_INET, SOCK_STREAM, 0); + if (socket < 0) { + LOG4CXX_ERROR(logger_, "Failed to create socket"); + *error = new ConnectError(); + return false; + } + + struct sockaddr_in addr = {0}; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = tcp_device->in_addr(); + addr.sin_port = htons(port); + + LOG4CXX_DEBUG(logger_, + "Connecting " << inet_ntoa(addr.sin_addr) << ":" << port); + set_socket(socket); + if (::connect(get_socket(), (struct sockaddr*)&addr, sizeof(addr)) < 0) { + LOG4CXX_ERROR(logger_, + "Failed to connect for application " << application_handle() + << ", error " << errno); + *error = new ConnectError(); + ShutdownAndCloseSocket(); + return false; + } + + return true; +} + +} // namespace transport_adapter +} // namespace transport_manager diff --git a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc index acab9f555f..a2ef38f3cb 100644 --- a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc +++ b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,16 +32,9 @@ */ #include "transport_manager/tcp/tcp_socket_connection.h" - -#include <memory.h> -#include <signal.h> -#include <errno.h> -#include <unistd.h> - -#include "utils/logger.h" -#include "utils/threads/thread.h" #include "transport_manager/tcp/tcp_device.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" +#include "utils/logger.h" namespace transport_manager { namespace transport_adapter { @@ -53,65 +46,11 @@ TcpSocketConnection::TcpSocketConnection(const DeviceUID& device_uid, TransportAdapterController* controller) : ThreadedSocketConnection(device_uid, app_handle, controller) {} -TcpSocketConnection::~TcpSocketConnection() {} - -bool TcpSocketConnection::Establish(ConnectError** error) { - return true; +TcpSocketConnection::~TcpSocketConnection() { + StopAndJoinThread(); } -TcpServerOiginatedSocketConnection::TcpServerOiginatedSocketConnection( - const DeviceUID& device_uid, - const ApplicationHandle& app_handle, - TransportAdapterController* controller) - : ThreadedSocketConnection(device_uid, app_handle, controller) {} - -TcpServerOiginatedSocketConnection::~TcpServerOiginatedSocketConnection() {} - -bool TcpServerOiginatedSocketConnection::Establish(ConnectError** error) { - LOG4CXX_AUTO_TRACE(logger_); - DCHECK(error); - LOG4CXX_DEBUG(logger_, "error " << error); - DeviceSptr device = controller()->FindDevice(device_handle()); - if (!device.valid()) { - LOG4CXX_ERROR(logger_, "Device " << device_handle() << " not found"); - *error = new ConnectError(); - return false; - } - TcpDevice* tcp_device = static_cast<TcpDevice*>(device.get()); - - const int port = tcp_device->GetApplicationPort(application_handle()); - if (-1 == port) { - LOG4CXX_ERROR(logger_, - "Application port for " << application_handle() - << " not found"); - *error = new ConnectError(); - return false; - } - - const int socket = ::socket(AF_INET, SOCK_STREAM, 0); - if (socket < 0) { - LOG4CXX_ERROR(logger_, "Failed to create socket"); - *error = new ConnectError(); - return false; - } - - struct sockaddr_in addr = {0}; - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = tcp_device->in_addr(); - addr.sin_port = htons(port); - - LOG4CXX_DEBUG(logger_, - "Connecting " << inet_ntoa(addr.sin_addr) << ":" << port); - if (::connect(socket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOG4CXX_ERROR(logger_, - "Failed to connect for application " << application_handle() - << ", error " << errno); - *error = new ConnectError(); - ::close(socket); - return false; - } - - set_socket(socket); +bool TcpSocketConnection::Establish(ConnectError** error) { return true; } diff --git a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc index a389deb517..0e9e63263b 100644 --- a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc +++ b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -110,7 +110,7 @@ void TcpTransportAdapter::Store() const { } } tcp_adapter_dictionary["devices"] = devices_dictionary; - Json::Value& dictionary = last_state().dictionary; + Json::Value& dictionary = last_state().get_dictionary(); dictionary["TransportManager"]["TcpAdapter"] = tcp_adapter_dictionary; } @@ -118,7 +118,7 @@ bool TcpTransportAdapter::Restore() { LOG4CXX_AUTO_TRACE(logger_); bool errors_occurred = false; const Json::Value tcp_adapter_dictionary = - last_state().dictionary["TransportManager"]["TcpAdapter"]; + last_state().get_dictionary()["TransportManager"]["TcpAdapter"]; const Json::Value devices_dictionary = tcp_adapter_dictionary["devices"]; for (Json::Value::const_iterator i = devices_dictionary.begin(); i != devices_dictionary.end(); diff --git a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc index 5e9f3d941d..081caec50a 100644 --- a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc +++ b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,10 +70,7 @@ ThreadedSocketConnection::ThreadedSocketConnection( ThreadedSocketConnection::~ThreadedSocketConnection() { LOG4CXX_AUTO_TRACE(logger_); - Disconnect(); - thread_->join(); - delete thread_->delegate(); - threads::DeleteThread(thread_); + DCHECK(NULL == thread_); if (-1 != read_fd_) { close(read_fd_); @@ -83,6 +80,14 @@ ThreadedSocketConnection::~ThreadedSocketConnection() { } } +void ThreadedSocketConnection::StopAndJoinThread() { + Disconnect(); + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); + thread_ = NULL; +} + void ThreadedSocketConnection::Abort() { LOG4CXX_AUTO_TRACE(logger_); unexpected_disconnect_ = true; @@ -126,7 +131,8 @@ void ThreadedSocketConnection::Finalize() { LOG4CXX_DEBUG(logger_, "not unexpected_disconnect"); controller_->ConnectionFinished(device_handle(), application_handle()); } - close(socket_); + + ShutdownAndCloseSocket(); } TransportAdapter::Error ThreadedSocketConnection::Notify() const { @@ -157,12 +163,12 @@ TransportAdapter::Error ThreadedSocketConnection::SendData( TransportAdapter::Error ThreadedSocketConnection::Disconnect() { LOG4CXX_AUTO_TRACE(logger_); terminate_flag_ = true; + ShutdownAndCloseSocket(); return Notify(); } void ThreadedSocketConnection::threadMain() { LOG4CXX_AUTO_TRACE(logger_); - controller_->ConnectionCreated(this, device_handle(), application_handle()); ConnectError* connect_error = NULL; if (!Establish(&connect_error)) { LOG4CXX_ERROR(logger_, "Connection Establish failed"); @@ -191,6 +197,22 @@ bool ThreadedSocketConnection::IsFramesToSendQueueEmpty() const { return frames_to_send_.empty(); } +void ThreadedSocketConnection::ShutdownAndCloseSocket() { + LOG4CXX_AUTO_TRACE(logger_); + const int socket = socket_; + socket_ = -1; + if (socket != -1) { + if (shutdown(socket, SHUT_RDWR) != 0) { + LOG4CXX_WARN(logger_, "Socket was unable to be shutdowned"); + } + if (close(socket) != 0) { + LOG4CXX_ERROR_WITH_ERRNO(logger_, "Failed to close socket"); + } + } else { + LOG4CXX_WARN(logger_, "Socket has been already closed or not created yet"); + } +} + void ThreadedSocketConnection::Transmit() { LOG4CXX_AUTO_TRACE(logger_); diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index f0fddfb4f5..026e53670b 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -192,6 +192,10 @@ TransportAdapter::Error TransportAdapterImpl::Connect( LOG4CXX_TRACE(logger_, "exit with BAD_STATE"); return BAD_STATE; } + if (!initialised_) { + LOG4CXX_TRACE(logger_, "exit with BAD_STATE"); + return BAD_STATE; + } connections_lock_.AcquireForWriting(); const bool already_exists = diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index 58000f5ea4..433885a606 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -413,14 +413,17 @@ int TransportManagerImpl::AddTransportAdapter( "transport_adapter_listeners_.end()"); return E_ADAPTER_EXISTS; } - transport_adapter_listeners_[transport_adapter] = - new TransportAdapterListenerImpl(this, transport_adapter); - transport_adapter->AddListener( - transport_adapter_listeners_[transport_adapter]); if (transport_adapter->IsInitialised() || transport_adapter->Init() == TransportAdapter::OK) { + transport_adapter_listeners_[transport_adapter] = + new TransportAdapterListenerImpl(this, transport_adapter); + transport_adapter->AddListener( + transport_adapter_listeners_[transport_adapter]); + transport_adapters_.push_back(transport_adapter); + } else { + delete transport_adapter; } LOG4CXX_TRACE(logger_, "exit with E_SUCCESS"); return E_SUCCESS; @@ -618,22 +621,29 @@ void TransportManagerImpl::AddConnection(const ConnectionInternal& c) { connections_.push_back(c); } +namespace { +struct ConnectionFinder { + const uint32_t id_; + ConnectionFinder(const uint32_t id) : id_(id) {} + bool operator()(const transport_manager::TransportManagerImpl::Connection& + connection) const { + return id_ == connection.id; + } +}; +} + void TransportManagerImpl::RemoveConnection( const uint32_t id, transport_adapter::TransportAdapter* transport_adapter) { LOG4CXX_AUTO_TRACE(logger_); LOG4CXX_DEBUG(logger_, "Id: " << id); sync_primitives::AutoWriteLock lock(connections_lock_); - for (std::vector<ConnectionInternal>::iterator it = connections_.begin(); - it != connections_.end(); - ++it) { - if (it->id == id) { - connections_.erase(it); - if (transport_adapter) { - transport_adapter->RemoveFinalizedConnection(it->device, - it->application); - } - break; + const std::vector<ConnectionInternal>::iterator it = std::find_if( + connections_.begin(), connections_.end(), ConnectionFinder(id)); + if (connections_.end() != it) { + if (transport_adapter) { + transport_adapter->RemoveFinalizedConnection(it->device, it->application); } + connections_.erase(it); } } diff --git a/src/components/transport_manager/src/usb/usb_connection_factory.cc b/src/components/transport_manager/src/usb/usb_connection_factory.cc index 28992d8f40..1136dfad21 100644 --- a/src/components/transport_manager/src/usb/usb_connection_factory.cc +++ b/src/components/transport_manager/src/usb/usb_connection_factory.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,6 +34,7 @@ #include "transport_manager/usb/usb_device.h" #include "transport_manager/transport_adapter/transport_adapter_impl.h" #include "utils/logger.h" +#include "utils/make_shared.h" #if defined(__QNXNTO__) #include "transport_manager/usb/qnx/usb_connection.h" @@ -73,15 +74,14 @@ TransportAdapter::Error UsbConnectionFactory::CreateConnection( } UsbDevice* usb_device = static_cast<UsbDevice*>(device.get()); - UsbConnection* usb_connection = new UsbConnection(device_uid, - app_handle, - controller_, - usb_handler_, - usb_device->usb_device()); - - controller_->ConnectionCreated(usb_connection, device_uid, app_handle); - - if (usb_connection->Init()) { + utils::SharedPtr<UsbConnection> connection = + utils::MakeShared<UsbConnection>(device_uid, + app_handle, + controller_, + usb_handler_, + usb_device->usb_device()); + controller_->ConnectionCreated(connection, device_uid, app_handle); + if (connection->Init()) { LOG4CXX_INFO(logger_, "USB connection initialised"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK. Condition: USB connection " diff --git a/src/components/transport_manager/test/CMakeLists.txt b/src/components/transport_manager/test/CMakeLists.txt index da20f1d43c..184d546f15 100644 --- a/src/components/transport_manager/test/CMakeLists.txt +++ b/src/components/transport_manager/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2017, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) -set(TM_TEST_DIR ${COMPONENTS_DIR}/transport_manager/test) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include @@ -42,10 +41,16 @@ include_directories( ${JSONCPP_INCLUDE_DIRECTORY} ) +set(EXCLUDE_PATHS + raw_message_matcher.cc +) + +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") + set(LIBRARIES gmock ConfigProfile - transport_manager + TransportManager Utils ConfigProfile ProtocolLibrary @@ -58,20 +63,11 @@ if (BUILD_USB_SUPPORT) endif() if (BUILD_BT_SUPPORT) + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") list(APPEND LIBRARIES bluetooth) + endif() endif() -set(SOURCES - ${TM_TEST_DIR}/transport_manager_impl_test.cc - ${TM_TEST_DIR}/transport_adapter_test.cc - ${TM_TEST_DIR}/transport_adapter_listener_test.cc - ${TM_TEST_DIR}/tcp_transport_adapter_test.cc - ${TM_TEST_DIR}/tcp_device_test.cc - ${TM_TEST_DIR}/tcp_client_listener_test.cc - ${TM_TEST_DIR}/transport_manager_default_test.cc -) - create_test("transport_manager_test" "${SOURCES}" "${LIBRARIES}") + file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -file(COPY app_info_storage2 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -endif() diff --git a/src/components/transport_manager/test/app_info_storage2 b/src/components/transport_manager/test/app_info_storage2 deleted file mode 100644 index 794c8b90bc..0000000000 --- a/src/components/transport_manager/test/app_info_storage2 +++ /dev/null @@ -1,99 +0,0 @@ -{ - "TransportManager" : { - "BluetoothAdapter" : null, - "TcpAdapter" : { - "devices" : [ - { - "address" : "57.48.0.1", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name0" - }, - { - "address" : "57.48.0.2", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name1" - }, - { - "address" : "57.48.0.3", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name2" - }, - { - "address" : "57.48.0.4", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name3" - }, - { - "address" : "57.48.0.5", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name4" - }, - { - "address" : "57.48.0.6", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name5" - }, - { - "address" : "57.48.0.7", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name6" - }, - { - "address" : "57.48.0.8", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name7" - }, - { - "address" : "57.48.0.9", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name8" - }, - { - "address" : "57.48.0.10", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name9" - } - ] - } - } -} diff --git a/src/components/transport_manager/test/raw_message_matcher.cc b/src/components/transport_manager/test/raw_message_matcher.cc index 130ddc96c8..00489d7c03 100644 --- a/src/components/transport_manager/test/raw_message_matcher.cc +++ b/src/components/transport_manager/test/raw_message_matcher.cc @@ -30,8 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "include/raw_message_matcher.h" -//#include "../../include/protocol/raw_message.h" +#include "include/transport_manager/raw_message_matcher.h" namespace test { namespace components { diff --git a/src/components/transport_manager/test/tcp_transport_adapter_test.cc b/src/components/transport_manager/test/tcp_transport_adapter_test.cc index 60732f0328..b8ff762f41 100644 --- a/src/components/transport_manager/test/tcp_transport_adapter_test.cc +++ b/src/components/transport_manager/test/tcp_transport_adapter_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,7 +33,7 @@ #include "gtest/gtest.h" #include "transport_manager/tcp/tcp_transport_adapter.h" #include "transport_manager/transport_adapter/connection.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "protocol/raw_message.h" #include "transport_manager/transport_adapter_listener_mock.h" #include "transport_manager/device_mock.h" @@ -58,7 +58,7 @@ class TcpAdapterTest : public ::testing::Test { protected: TcpAdapterTest() : last_state_("app_storage_folder", "app_info_storage") {} MockTransportManagerSettings transport_manager_settings; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; const uint32_t port = 12345; const std::string string_port = "12345"; }; @@ -90,7 +90,7 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { // Check that value is saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -142,7 +142,8 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { // Check that values are saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); for (uint32_t i = 0; i < count_dev; i++) { @@ -199,7 +200,7 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { // Check that value is saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -236,13 +237,15 @@ TEST_F(TcpAdapterTest, StoreData_ConnectionNotExist_DataNotStored) { // Check that value is not saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]["devices"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]["devices"]; + ASSERT_TRUE(tcp_dict.isNull()); } TEST_F(TcpAdapterTest, RestoreData_DataNotStored) { Json::Value& tcp_adapter_dictionary = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + tcp_adapter_dictionary = Json::Value(); MockTCPTransportAdapter transport_adapter( port, last_state_, transport_manager_settings); diff --git a/src/components/transport_manager/test/transport_adapter_test.cc b/src/components/transport_manager/test/transport_adapter_test.cc index f3d7343b24..6e845753ec 100644 --- a/src/components/transport_manager/test/transport_adapter_test.cc +++ b/src/components/transport_manager/test/transport_adapter_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,7 @@ #include "transport_manager/transport_adapter/connection.h" #include "protocol/raw_message.h" #include "utils/make_shared.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "config_profile/profile.h" namespace test { @@ -74,7 +74,7 @@ class TransportAdapterTest : public ::testing::Test { } NiceMock<MockTransportManagerSettings> transport_manager_settings; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; std::string dev_id; std::string uniq_id; int app_handle; diff --git a/src/components/transport_manager/test/transport_manager_default_test.cc b/src/components/transport_manager/test/transport_manager_default_test.cc index 6d0854d2ec..e3bd0e7240 100644 --- a/src/components/transport_manager/test/transport_manager_default_test.cc +++ b/src/components/transport_manager/test/transport_manager_default_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,45 +29,83 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ + #include "gtest/gtest.h" #include "transport_manager/transport_manager.h" #include "transport_manager/transport_manager_default.h" -#include "resumption/last_state.h" #include "transport_manager/mock_transport_manager_settings.h" -#include "resumption/last_state.h" +#include "resumption/mock_last_state.h" namespace test { namespace components { namespace transport_manager_test { +using ::resumption::MockLastState; using ::testing::Return; +using ::testing::ReturnRef; +using ::testing::NiceMock; + +namespace { +const std::string kDeviceName = "name"; +const std::string kDeviceAddress = "address"; +const std::string kDeviceApplications = "applications"; +const std::string kApplicationPort = "port"; +const std::string kApplicationPortValue = "12345"; +const std::string kTransportManager = "TransportManager"; +const std::string kTcpAdapter = "TcpAdapter"; +const std::string kBluetoothAdapter = "BluetoothAdapter"; +const std::string kDevices = "devices"; +} // namespace TEST(TestTransportManagerDefault, Init_LastStateNotUsed) { MockTransportManagerSettings transport_manager_settings; transport_manager::TransportManagerDefault transport_manager( transport_manager_settings); - resumption::LastState last_state("app_storage_folder", "app_info_storage2"); + + NiceMock<resumption::MockLastState> mock_last_state; + Json::Value custom_dictionary = Json::Value(); + + ON_CALL(mock_last_state, get_dictionary()) + .WillByDefault(ReturnRef(custom_dictionary)); EXPECT_CALL(transport_manager_settings, use_last_state()) .WillRepeatedly(Return(false)); EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_port()) .WillRepeatedly(Return(1u)); - transport_manager.Init(last_state); + + transport_manager.Init(mock_last_state); + transport_manager.Stop(); } -TEST(TestTransportManagerDefault, DISABLED_Init_LastStateUsed) { - // TODO (dcherniev) : investigate and fix SegFault issue +TEST(TestTransportManagerDefault, Init_LastStateUsed) { MockTransportManagerSettings transport_manager_settings; transport_manager::TransportManagerDefault transport_manager( transport_manager_settings); - resumption::LastState last_state("app_storage_folder", "app_info_storage2"); + + NiceMock<resumption::MockLastState> mock_last_state; + Json::Value custom_dictionary; + Json::Value tcp_device; + tcp_device[kDeviceName] = "unique_tcp_device_name"; + tcp_device[kDeviceAddress] = "57.48.0.1"; + tcp_device[kDeviceApplications][0][kApplicationPort] = kApplicationPortValue; + Json::Value bluetooth_device; + bluetooth_device[kDeviceName] = "unique_bluetooth_device_name"; + bluetooth_device[kDeviceAddress] = "57.48.0.2"; + bluetooth_device[kDeviceApplications][0][kApplicationPort] = + kApplicationPortValue; + custom_dictionary[kTransportManager][kTcpAdapter][kDevices][0] = tcp_device; + custom_dictionary[kTransportManager][kBluetoothAdapter][kDevices][0] = + bluetooth_device; + + ON_CALL(mock_last_state, get_dictionary()) + .WillByDefault(ReturnRef(custom_dictionary)); EXPECT_CALL(transport_manager_settings, use_last_state()) .WillRepeatedly(Return(true)); EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_port()) .WillRepeatedly(Return(1u)); - transport_manager.Init(last_state); + transport_manager.Init(mock_last_state); transport_manager.Stop(); } diff --git a/src/components/transport_manager/test/transport_manager_impl_test.cc b/src/components/transport_manager/test/transport_manager_impl_test.cc index eb02717d79..5b4e0a7704 100644 --- a/src/components/transport_manager/test/transport_manager_impl_test.cc +++ b/src/components/transport_manager/test/transport_manager_impl_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,7 @@ #include "utils/make_shared.h" #include "utils/shared_ptr.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "utils/make_shared.h" using ::testing::_; @@ -76,7 +76,8 @@ class TransportManagerImplTest : public ::testing::Test { , dev_info_(device_handle_, mac_address_, "TestDeviceName", "BTMAC") {} void SetUp() OVERRIDE { - resumption::LastState last_state_("app_storage_folder", "app_info_storage"); + resumption::LastStateImpl last_state_("app_storage_folder", + "app_info_storage"); tm_.Init(last_state_); mock_adapter_ = new MockTransportAdapter(); tm_listener_ = MakeShared<TransportManagerListenerMock>(); diff --git a/src/components/utils/CMakeLists.txt b/src/components/utils/CMakeLists.txt index f72d43e546..51835c125a 100644 --- a/src/components/utils/CMakeLists.txt +++ b/src/components/utils/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,62 +28,77 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) -set(UTILS_INCLUDE_DIR ${COMPONENTS_DIR}/utils/include) -set(UTILS_SRC_DIR ${COMPONENTS_DIR}/utils/src) +find_package(Sqlite3 REQUIRED) include_directories ( - ${UTILS_INCLUDE_DIR} + ${COMPONENTS_DIR}/utils/include ${COMPONENTS_DIR}/config_profile/include ${COMPONENTS_DIR}/media_manager/include ${COMPONENTS_DIR}/protocol_handler/include ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${UTILS_SRC_DIR}/bitstream.cc - ${UTILS_SRC_DIR}/conditional_variable_posix.cc - ${UTILS_SRC_DIR}/file_system.cc - ${UTILS_SRC_DIR}/threads/posix_thread.cc - ${UTILS_SRC_DIR}/threads/thread_delegate.cc - ${UTILS_SRC_DIR}/threads/thread_validator.cc - ${UTILS_SRC_DIR}/threads/async_runner.cc - ${UTILS_SRC_DIR}/lock_posix.cc - ${UTILS_SRC_DIR}/rwlock_posix.cc - ${UTILS_SRC_DIR}/date_time.cc - ${UTILS_SRC_DIR}/signals_linux.cc - ${UTILS_SRC_DIR}/system.cc - ${UTILS_SRC_DIR}/resource_usage.cc - ${UTILS_SRC_DIR}/appenders_loader.cc - ${UTILS_SRC_DIR}/gen_hash.cc - ${UTILS_SRC_DIR}/convert_utils.cc - ${UTILS_SRC_DIR}/custom_string.cc - ${UTILS_SRC_DIR}/timer.cc +# dbms +set(DBMS_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/utils/sqlite_wrapper + ${CMAKE_CURRENT_SOURCE_DIR}/src/sqlite_wrapper + ${CMAKE_CURRENT_SOURCE_DIR}/include/utils/qdb_wrapper + ${CMAKE_CURRENT_SOURCE_DIR}/src/qdb_wrapper ) +set(EXCLUDE_PATHS + thread_manager.cc + pulse_thread_delegate.cc + ${DBMS_PATHS} +) + +set(LIBRARIES) + +if(NOT BUILD_BACKTRACE_SUPPORT) + list(APPEND EXCLUDE_PATHS + back_trace.cc + ) +endif() + if(ENABLE_LOG) - list(APPEND SOURCES - ${UTILS_SRC_DIR}/push_log.cc - ${UTILS_SRC_DIR}/log_message_loop_thread.cc - ${UTILS_SRC_DIR}/logger_status.cc - ${UTILS_SRC_DIR}/auto_trace.cc - ${UTILS_SRC_DIR}/logger.cc + list(APPEND LIBRARIES + log4cxx -L${LOG4CXX_LIBS_DIRECTORY} + apr-1 -L${APR_LIBS_DIRECTORY} + aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY} + ConfigProfile + ) +else() + list(APPEND EXCLUDE_PATHS + push_log.cc + log_message_loop_thread.cc + logger_status.cc + auto_trace.cc + logger.cc ) endif() -if (BUILD_BACKTRACE_SUPPORT) - list(APPEND SOURCES - ${UTILS_SRC_DIR}/back_trace.cc - ) +if(NOT BUILD_BT_SUPPORT) + list(APPEND EXCLUDE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/utils/bluetooth + ${CMAKE_CURRENT_SOURCE_DIR}/src/bluetooth + ) endif() -if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - list(APPEND SOURCES - ${UTILS_SRC_DIR}/threads/pulse_thread_delegate.cc +if (NOT CMAKE_SYSTEM_NAME STREQUAL "QNX") + list(APPEND EXCLUDE_PATHS + pulse_thread_delegate.cc ) endif() -add_library("Utils" ${SOURCES}) +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") if (CMAKE_SYSTEM_NAME STREQUAL "QNX") # --- QDB Wrapper @@ -94,26 +109,16 @@ else () endif () if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - list(APPEND LIBRARIES dl) + list(APPEND LIBRARIES dl pthread ${RTLIB}) endif() +add_library("Utils" ${SOURCES}) +target_link_libraries("Utils" ${LIBRARIES}) if(ENABLE_LOG) - list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) - list(APPEND LIBRARIES apr-1 -L${APR_LIBS_DIRECTORY}) - list(APPEND LIBRARIES aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY}) - list(APPEND LIBRARIES ConfigProfile) - - ADD_DEPENDENCIES(Utils install-3rd_party_logger) + add_dependencies("Utils" install-3rd_party_logger) endif() -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries("Utils" pthread ${RTLIB}) -endif() - -target_link_libraries("Utils" ${LIBRARIES}) - - if(BUILD_TESTS) add_subdirectory(test) endif() diff --git a/src/components/utils/src/signals_linux.cc b/src/components/utils/src/signals_posix.cc index 274c254716..274c254716 100644 --- a/src/components/utils/src/signals_linux.cc +++ b/src/components/utils/src/signals_posix.cc diff --git a/src/components/utils/src/threads/posix_thread.cc b/src/components/utils/src/threads/thread_posix.cc index 51e59fa108..51e59fa108 100644 --- a/src/components/utils/src/threads/posix_thread.cc +++ b/src/components/utils/src/threads/thread_posix.cc diff --git a/src/components/utils/test/CMakeLists.txt b/src/components/utils/test/CMakeLists.txt index e457e5901e..f6bd24ff09 100644 --- a/src/components/utils/test/CMakeLists.txt +++ b/src/components/utils/test/CMakeLists.txt @@ -28,7 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${JSONCPP_INCLUDE_DIRECTORY} @@ -39,74 +40,61 @@ include_directories ( ${POLICY_PATH}/include ) -set(testSources - messagemeter_test.cc - file_system_test.cc - date_time_test.cc - system_test.cc - thread_validator_test.cc - conditional_variable_test.cc - message_queue_test.cc - resource_usage_test.cc - bitstream_test.cc - prioritized_queue_test.cc - data_accessor_test.cc - lock_posix_test.cc - singleton_test.cc - #posix_thread_test.cc - stl_utils_test.cc - rwlock_posix_test.cc - async_runner_test.cc - shared_ptr_test.cc - scope_guard_test.cc - atomic_object_test.cc - message_loop_thread_test.cc - custom_string_test.cc - timer_test.cc +set(EXCLUDE_PATHS + qdb_wrapper + test_generator ) -set(testLibraries - gmock - Utils - Policy - ConfigProfile -) +if(NOT ENABLE_LOG) + list(APPEND EXCLUDE_PATHS + auto_trace_test.cc + log_message_loop_thread_test.cc + ) +endif() + +if(NOT BUILD_BACKTRACE_SUPPORT) + list(APPEND EXCLUDE_PATHS + back_trace_test.cc + ) +endif() if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - # --- Tests for QDB Wrapper - list (APPEND testSources - ./qdb_wrapper/sql_database_test.cc - ./qdb_wrapper/sql_query_test.cc + # exclude tests for SQLite wrapper + list (APPEND EXCLUDE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/sqlite_wrapper ) file(COPY qdbserver.sh DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY test-qdb.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY policy.sql DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) else () - # --- Tests for SQLite Wrapper find_package(Sqlite3 REQUIRED) - list (APPEND testSources - ./sqlite_wrapper/sql_database_test.cc - ./sqlite_wrapper/sql_query_test.cc - generated_code_with_sqlite_test.cc + # exclude tests for QDB wrapper + list (APPEND EXCLUDE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/qdb_wrapper ) list (APPEND testLibraries sqlite3) endif() -if (ENABLE_LOG) - list(APPEND testSources auto_trace_test.cc) - list(APPEND testSources log_message_loop_thread_test.cc) -endif() +# exclude some tests +list(APPEND EXCLUDE_PATHS + generated_code_with_sqlite_test.cc + posix_thread_test.cc + resource_usage_test.cc +) -if (BUILD_BACKTRACE_SUPPORT) - list(APPEND testSources back_trace_test.cc) -endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") + +set(LIBRARIES + gmock + Utils + Policy + ConfigProfile +) + +create_test(utils_test "${SOURCES}" "${LIBRARIES}") file(COPY testscript.sh DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY smartDeviceLink.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -create_test("utils_test" "${testSources}" "${testLibraries}") - add_subdirectory(test_generator) - -endif() diff --git a/src/components/utils/test/test_generator/CMakeLists.txt b/src/components/utils/test/test_generator/CMakeLists.txt index d649f927a5..5a7f939659 100644 --- a/src/components/utils/test/test_generator/CMakeLists.txt +++ b/src/components/utils/test/test_generator/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,38 +28,35 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/generators.cmake) include_directories ( - ${JSONCPP_INCLUDE_DIRECTORY} - ${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/include - ${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/gtest/include ${CMAKE_SOURCE_DIR}/tools/interfaceGenerator ${CMAKE_CURRENT_BINARY_DIR} ${COMPONENTS_DIR}/utils/include/utils ${COMPONENTS_DIR}/include/utils + ${JSONCPP_INCLUDE_DIRECTORY} + ${GMOCK_INCLUDE_DIRECTORY} ) -set(full_xml_name "${CMAKE_SOURCE_DIR}/src/components/interfaces/MOBILE_API.xml") - -add_custom_target( generate_version - COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} "mobile_apis" - ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "sdlrpcv2" - DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name} - VERBATIM - ) +set(XML_NAME ${CMAKE_SOURCE_DIR}/src/components/interfaces/MOBILE_API.xml) +add_custom_target(generate_version + COMMAND ${INTEFRACE_GENERATOR_CMD} ${XML_NAME} "mobile_apis" + ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "sdlrpcv2" + DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${XML_NAME} + VERBATIM +) -set(testLibraries +set(LIBRARIES gmock Utils ) -set(testSources +set(SOURCES generated_msg_version_test.cc ) -file(COPY ${full_xml_name} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -create_test("generator_test" "${testSources}" "${testLibraries}") -add_dependencies("generator_test" generate_version) +create_test(generator_test "${SOURCES}" "${LIBRARIES}") +file(COPY ${XML_NAME} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -endif() +add_dependencies("generator_test" generate_version) diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt index 1a4eff13b5..4b6f6d8dfa 100644 --- a/src/plugins/CMakeLists.txt +++ b/src/plugins/CMakeLists.txt @@ -29,5 +29,5 @@ # POSSIBILITY OF SUCH DAMAGE. if(ENABLE_LOG) -add_subdirectory(appenders) + add_subdirectory(appenders) endif() diff --git a/src/plugins/appenders/CMakeLists.txt b/src/plugins/appenders/CMakeLists.txt index 9d01599ca3..59628a021b 100644 --- a/src/plugins/appenders/CMakeLists.txt +++ b/src/plugins/appenders/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,22 +28,22 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -SET(target "appenders") - -SET(SOURCES - safe_file_appender.cc - safe_rolling_file_appender.cc -) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${LOG4CXX_INCLUDE_DIRECTORY} ) -add_library(${target} MODULE ${SOURCES}) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") + +set(LIBRARIES + log4cxx -L${LOG4CXX_LIBS_DIRECTORY} +) -target_link_libraries(${target} log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) +add_library(appenders ${SOURCES}) +target_link_libraries(appenders ${LIBRARIES}) -install(TARGETS ${target} +install(TARGETS appenders DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE diff --git a/cmake/Modules/cotire.cmake b/tools/cmake/helpers/cotire.cmake index 741d6901f1..741d6901f1 100644 --- a/cmake/Modules/cotire.cmake +++ b/tools/cmake/helpers/cotire.cmake diff --git a/tools/cmake/helpers/generators.cmake b/tools/cmake/helpers/generators.cmake new file mode 100644 index 0000000000..64f7c1f670 --- /dev/null +++ b/tools/cmake/helpers/generators.cmake @@ -0,0 +1,62 @@ +# Copyright (c) 2016, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +find_package(PythonInterp REQUIRED) + +if(NOT PYTHONINTERP_FOUND) + message(STATUS "Python interpreter is not found") + message(STATUS "To install it type in the command line:") + message(STATUS "sudo apt-get install python") + message(FATAL_ERROR "Exiting!") +endif(NOT PYTHONINTERP_FOUND) + +set(INTEFRACE_GENERATOR "${CMAKE_SOURCE_DIR}/tools/InterfaceGenerator/Generator.py") +set(INTEFRACE_GENERATOR_CMD ${PYTHON_EXECUTABLE} -B ${INTEFRACE_GENERATOR}) +file(GLOB_RECURSE INTERFACE_GENERATOR_DEPENDENCIES "${CMAKE_SOURCE_DIR}/tools/InterfaceGenerator/*.*") + +macro(generate_interface ARG_XML_NAME ARG_NAMESPACE PARSER_TYPE) + string(REGEX MATCH "^[a-zA-Z_0-9]*[^.]" FILE_NAME ${ARG_XML_NAME}) # TODO: make expression more robust + + set(HPP_FILE + "${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}.h" + "${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}_schema.h" + ) + + set(CPP_FILE "${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}_schema.cc") + set(FULL_XML_NAME "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_XML_NAME}") + + add_custom_command( + OUTPUT ${HPP_FILE} ${CPP_FILE} + COMMAND ${INTEFRACE_GENERATOR_CMD} ${FULL_XML_NAME} ${ARG_NAMESPACE} ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "${PARSER_TYPE}" + DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${FULL_XML_NAME} + COMMENT "Generating files:\n ${HPP_FILE}\n ${CPP_FILE}\nfrom:\n ${FULL_XML_NAME} ..." + VERBATIM + ) +endmacro() diff --git a/tools/cmake/helpers/platform.cmake b/tools/cmake/helpers/platform.cmake new file mode 100644 index 0000000000..a377dfd042 --- /dev/null +++ b/tools/cmake/helpers/platform.cmake @@ -0,0 +1,96 @@ +# Copyright (c) 2016, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# SDL build platform includes three necessary components: +# OS, Architecture and SDK. Build parameters and sources code base +# could be varied depends on these three components combination. +# +# Platform helpers provide functionality to get supported by SDL +# OS, Architecture or SDK lists and specified for actual build these +# variables values. Values could be passed to cmake as parameters +# (f.e. "-DOS_WINDOWS=1 -DSDK_QT=1"), otherwise they will be detected +# related to current build environment. +# +# Full list of supported cmake flags: +# OS_POSIX +# OS_WINDOWS +# ARCH_X86 +# ARCH_X64 +# SDK_QT + +function(get_supported_os OS_LIST) + set(${OS_LIST} "posix" "win" PARENT_SCOPE) +endfunction() + +function(get_supported_arch ARCH_LIST) + set(${ARCH_LIST} "x86" "x64" PARENT_SCOPE) +endfunction() + +function(get_supported_sdk SDK_LIST) + set(${SDK_LIST} "qt" PARENT_SCOPE) +endfunction() + +function(get_os OS) + if(OS_POSIX) + set(${OS} "posix" PARENT_SCOPE) + elseif(OS_WINDOWS) + set(${OS} "win" PARENT_SCOPE) + else() + if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(${OS} "posix" PARENT_SCOPE) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set(${OS} "win" PARENT_SCOPE) + else() + message(FATAL_ERROR "Unsupported operation system") + endif() + endif() +endfunction() + +function(get_arch ARCH) + if(ARCH_X86) + set(${ARCH} "x86" PARENT_SCOPE) + elseif(ARCH_X64) + set(${ARCH} "x64" PARENT_SCOPE) + else() + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386") + set(${ARCH} "x86" PARENT_SCOPE) + elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") + set(${ARCH} "x64" PARENT_SCOPE) + else() + message(FATAL_ERROR "Unsupported architecture") + endif() + endif() +endfunction() + +function(get_sdk SDK) + if(SDK_QT) + set(${SDK} "qt" PARENT_SCOPE) + endif() +endfunction() diff --git a/tools/cmake/helpers/sources.cmake b/tools/cmake/helpers/sources.cmake new file mode 100644 index 0000000000..0315b905d9 --- /dev/null +++ b/tools/cmake/helpers/sources.cmake @@ -0,0 +1,166 @@ +# Copyright (c) 2016, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# Sources helpers provide functionality to collect headers, source files +# or any other files depends on current build settings (OS, Architecture, SDK). +# +# Files could be included or excluded to/from build for some platform by +# platform-specific suffix adding to filename. For example file +# sdl_source_file_posix_x86_qt.cc will be added only to build with parameters: +# OS=posix ARCH=x86 SDK=qt but file sdl_source_file_win.cc to all builds +# with OS=win option enabled. Suffixes could be mixed within filename randomly. +# +# Full list of supported suffixes: +# posix +# win +# x86 +# x64 +# qt + +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) + +function(filter_files_by_name FILES IGNORE_NAMES) + set(FILES_LOCAL ${${FILES}}) + foreach(FILE_ENTRY ${${FILES}}) + foreach(IGNORE_ENTRY ${IGNORE_NAMES}) + if(${FILE_ENTRY} MATCHES ${IGNORE_ENTRY}) + list(REMOVE_ITEM FILES_LOCAL ${FILE_ENTRY}) + endif() + endforeach() + endforeach() + set(${FILES} ${FILES_LOCAL} PARENT_SCOPE) +endfunction() + +function(filter_files_by_suffix FILES IGNORE_SUFFIXES) + set(FILES_LOCAL ${${FILES}}) + foreach(FILE_ENTRY ${${FILES}}) + foreach(IGNORE_ENTRY ${IGNORE_SUFFIXES}) + if((${FILE_ENTRY} MATCHES "_${IGNORE_ENTRY}_") OR (${FILE_ENTRY} MATCHES "_${IGNORE_ENTRY}\\.")) + list(REMOVE_ITEM FILES_LOCAL ${FILE_ENTRY}) + endif() + endforeach() + endforeach() + set(${FILES} ${FILES_LOCAL} PARENT_SCOPE) +endfunction() + +function(filter_files_by_os FILES) + set(FILES_LOCAL ${${FILES}}) + get_supported_os(OS_LIST) + get_os(OS) + list(REMOVE_ITEM OS_LIST ${OS}) + filter_files_by_suffix(FILES_LOCAL "${OS_LIST}") + set(${FILES} ${FILES_LOCAL} PARENT_SCOPE) +endfunction() + +function(filter_files_by_arch FILES) + set(FILES_LOCAL ${${FILES}}) + get_supported_arch(ARCH_LIST) + get_arch(ARCH) + list(REMOVE_ITEM ARCH_LIST ${ARCH}) + filter_files_by_suffix(FILES_LOCAL "${ARCH_LIST}") + set(${FILES} ${FILES_LOCAL} PARENT_SCOPE) +endfunction() + +function(filter_files_by_sdk FILES) + set(FILES_LOCAL ${${FILES}}) + get_supported_sdk(SDK_LIST) + get_sdk(SDK) + if(SDK) + list(REMOVE_ITEM SDK_LIST ${SDK}) + endif() + filter_files_by_suffix(FILES_LOCAL "${SDK_LIST}") + set(${FILES} ${FILES_LOCAL} PARENT_SCOPE) +endfunction() + +function(filter_files FILES IGNORE_NAMES) + set(FILES_LOCAL ${${FILES}}) + filter_files_by_name(FILES_LOCAL "${IGNORE_NAMES}") + filter_files_by_os(FILES_LOCAL) + filter_files_by_arch(FILES_LOCAL) + filter_files_by_sdk(FILES_LOCAL) + set(${FILES} ${FILES_LOCAL} PARENT_SCOPE) +endfunction() + +function(collect_sources SOURCES PATHS) + set(OPTIONAL_ARG ${ARGN}) + set(HEADERS_LOCAL) + set(SOURCES_LOCAL) + get_os(OS) + + foreach(PATH_ENTRY ${PATHS}) + file(GLOB_RECURSE SOURCES_TO_FILTER "${PATH_ENTRY}/*.c" "${PATH_ENTRY}/*.cc" "${PATH_ENTRY}/*.cpp") + filter_files(SOURCES_TO_FILTER "${OPTIONAL_ARG}") + list(APPEND SOURCES_LOCAL ${SOURCES_TO_FILTER}) + set(SOURCES_TO_FILTER) + if(${OS} STREQUAL "win") + file(GLOB_RECURSE HEADERS_TO_FILTER "${PATH_ENTRY}/*.h" "${PATH_ENTRY}/*.hpp") + filter_files(HEADERS_TO_FILTER "${OPTIONAL_ARG}") + list(APPEND HEADERS_LOCAL ${HEADERS_TO_FILTER}) + set(HEADERS_TO_FILTER) + endif() + endforeach() + + if(${OS} STREQUAL "win") + source_group("Header Files" FILES ${HEADERS_LOCAL}) + source_group("Source Files" FILES ${SOURCES_LOCAL}) + endif() + set(${SOURCES} ${SOURCES_LOCAL} PARENT_SCOPE) +endfunction() + +function(create_test NAME SOURCES LIBS) + add_executable("${NAME}" ${CMAKE_SOURCE_DIR}/src/components/test_main.cc ${SOURCES}) + target_link_libraries("${NAME}" ${LIBS}) + target_link_libraries("${NAME}" Utils) + add_test(NAME ${NAME} + COMMAND ${NAME} --gtest_output=xml:${CMAKE_BINARY_DIR}/test_results/) +endfunction() + +function(create_cotired_test NAME SOURCES LIBS) + add_executable( + ${NAME} + EXCLUDE_FROM_ALL + ${CMAKE_SOURCE_DIR}/src/components/test_main.cc + ${SOURCES} + ) + # TODO: Fix problems with Cotire on Windows and Qt APPLINK-28060 + if(${USE_COTIRE} AND (${CMAKE_SYSTEM_NAME} MATCHES "Linux")) + include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/cotire.cmake) + cotire(${NAME}) + set(NAME "${NAME}_unity") + endif() + target_link_libraries(${NAME} ${LIBS}) + set_target_properties( + ${NAME} + PROPERTIES + EXCLUDE_FROM_ALL 0 + ) + add_test(NAME ${NAME} + COMMAND ${NAME} --gtest_output=xml:${CMAKE_BINARY_DIR}/test_results/) +endfunction() diff --git a/cmake/Modules/FindGlib-2.0.cmake b/tools/cmake/modules/FindGlib-2.0.cmake index b39da141c9..b39da141c9 100644 --- a/cmake/Modules/FindGlib-2.0.cmake +++ b/tools/cmake/modules/FindGlib-2.0.cmake diff --git a/cmake/Modules/FindGstreamer-1.0.cmake b/tools/cmake/modules/FindGstreamer-1.0.cmake index 8f1d69d01b..8f1d69d01b 100644 --- a/cmake/Modules/FindGstreamer-1.0.cmake +++ b/tools/cmake/modules/FindGstreamer-1.0.cmake diff --git a/cmake/Modules/FindLibXML2.cmake b/tools/cmake/modules/FindLibXML2.cmake index 1daaeb07b7..1daaeb07b7 100644 --- a/cmake/Modules/FindLibXML2.cmake +++ b/tools/cmake/modules/FindLibXML2.cmake diff --git a/cmake/Modules/FindQt5Core.cmake b/tools/cmake/modules/FindQt5Core.cmake index 1a2ad84842..1a2ad84842 100644 --- a/cmake/Modules/FindQt5Core.cmake +++ b/tools/cmake/modules/FindQt5Core.cmake diff --git a/cmake/Modules/FindQt5DBus.cmake b/tools/cmake/modules/FindQt5DBus.cmake index d850010e97..d850010e97 100644 --- a/cmake/Modules/FindQt5DBus.cmake +++ b/tools/cmake/modules/FindQt5DBus.cmake diff --git a/cmake/Modules/FindQt5Qml.cmake b/tools/cmake/modules/FindQt5Qml.cmake index f4bdaa8f71..f4bdaa8f71 100644 --- a/cmake/Modules/FindQt5Qml.cmake +++ b/tools/cmake/modules/FindQt5Qml.cmake diff --git a/cmake/Modules/FindQt5Quick.cmake b/tools/cmake/modules/FindQt5Quick.cmake index 1e16340c2e..1e16340c2e 100644 --- a/cmake/Modules/FindQt5Quick.cmake +++ b/tools/cmake/modules/FindQt5Quick.cmake diff --git a/tools/cmake/modules/FindSDLGstreamer.cmake b/tools/cmake/modules/FindSDLGstreamer.cmake new file mode 100644 index 0000000000..515404d39b --- /dev/null +++ b/tools/cmake/modules/FindSDLGstreamer.cmake @@ -0,0 +1,42 @@ +# - Try to find Gstreamer +# +# GSTREAMER_INCLUDE_DIRECTORY - the Gstreamer include directory +# GSTREAMER_LIBRARIES - the Gstreamer libraries + +get_os(OS) +if(${OS} STREQUAL "posix") + find_package(Gstreamer-1.0 REQUIRED) + find_package(Glib-2.0 REQUIRED) + find_package(PkgConfig) + pkg_check_modules(GLIB2 REQUIRED glib-2.0) + add_definitions(${GLIB2_CFLAGS}) + set(GSTREAMER_INCLUDE_DIRECTORY + ${GSTREAMER_gst_INCLUDE_DIR} + ${GLIB_glib_2_INCLUDE_DIR} + ) + set(GSTREAMER_LIBRARIES + ${GSTREAMER_gstreamer_LIBRARY} + gobject-2.0 + glib-2.0 + ) +elseif(${OS} STREQUAL "win") + get_sdk(SDK) + if(NOT SDK) + if(EXISTS $ENV{SDL_GSTREAMER_DIR}) + set(GSTREAMER_DIR $ENV{SDL_GSTREAMER_DIR}) + else() + message(FATAL_ERROR "Could not find GSTREAMER (Check SDL_GSTREAMER_DIR environment variable)") + endif() + set(GSTREAMER_INCLUDE_DIRECTORY + ${GSTREAMER_DIR}/include/gstreamer-0.10 + ${GSTREAMER_DIR}/include/libxml2 + ${GSTREAMER_DIR}/include/glib-2.0 + ${GSTREAMER_DIR}/lib/glib-2.0/include + ) + set(GSTREAMER_LIBRARIES + ${GSTREAMER_DIR}/lib/gstreamer-0.10.lib + ${GSTREAMER_DIR}/lib/glib-2.0.lib + ${GSTREAMER_DIR}/lib/gobject-2.0.lib + ) + endif() +endif() diff --git a/tools/cmake/modules/FindSDLLibUSB.cmake b/tools/cmake/modules/FindSDLLibUSB.cmake new file mode 100644 index 0000000000..0082d62315 --- /dev/null +++ b/tools/cmake/modules/FindSDLLibUSB.cmake @@ -0,0 +1,19 @@ +# - Try to find libusb +# +# LIBUSB_INCLUDE_DIRECTORY - the libusb include directory +# LIBUSB_LIBRARIES - libusb libraries to link + +get_os(OS) +if(${OS} STREQUAL "posix") + set(LIBUSB_INCLUDE_DIRECTORY /usr/include/libusb-1.0) + set(LIBUSB_LIBRARIES usb-1.0 udev) +elseif(${OS} STREQUAL "win") + get_arch(ARCH) + if(${ARCH} STREQUAL "x86") + set(LIBUSB_DIR ${CMAKE_SOURCE_DIR}/build/libusbx_win_x86) + elseif(${ARCH} STREQUAL "x64") + set(LIBUSB_DIR ${CMAKE_SOURCE_DIR}/build/libusbx_win_x64) + endif() + set(LIBUSB_INCLUDE_DIRECTORY ${LIBUSB_DIR}/libusb) + set(LIBUSB_LIBRARIES ${LIBUSB_DIR}/bin/libusb-1.0.lib) +endif() diff --git a/tools/cmake/modules/FindSDLOpenSSL.cmake b/tools/cmake/modules/FindSDLOpenSSL.cmake new file mode 100644 index 0000000000..c16236a1cb --- /dev/null +++ b/tools/cmake/modules/FindSDLOpenSSL.cmake @@ -0,0 +1,18 @@ +# - Try to find OpenSSL +# +# OPENSSL_INCLUDE_DIRECTORY - the OpenSSL include directory +# OPENSSL_LIBRARIES - the OpenSSL libraries + +get_os(OS) +if(${OS} STREQUAL "posix") + find_package(OpenSSL REQUIRED) +elseif(${OS} STREQUAL "win") + get_arch(ARCH) + if(${ARCH} STREQUAL "x86") + set(OPENSSL_DIR ${CMAKE_SOURCE_DIR}/build/openssl_win_x86) + elseif(${ARCH} STREQUAL "x64") + set(OPENSSL_DIR ${CMAKE_SOURCE_DIR}/build/openssl_win_x64) + endif() + set(OPENSSL_INCLUDE_DIRECTORY ${OPENSSL_DIR}/include) + set(OPENSSL_LIBRARIES ${OPENSSL_DIR}/lib/libeay32.lib ${OPENSSL_DIR}/lib/ssleay32.lib) +endif() diff --git a/cmake/Modules/FindSqlite3.cmake b/tools/cmake/modules/FindSqlite3.cmake index 514ff0b7f9..f6bdcad69c 100644 --- a/cmake/Modules/FindSqlite3.cmake +++ b/tools/cmake/modules/FindSqlite3.cmake @@ -23,7 +23,7 @@ else (SQLITE3_LIBRARIES AND SQLITE3_INCLUDE_DIRS) else (PKG_CONFIG_FOUND) message(WARNING "PkgConfig isn't installed. You need to sure sqlite3>=3.7.11") endif (PKG_CONFIG_FOUND) - + find_path(SQLITE3_INCLUDE_DIR NAMES sqlite3.h diff --git a/cmake/Modules/FindUDev.cmake b/tools/cmake/modules/FindUDev.cmake index cdc8743777..cdc8743777 100644 --- a/cmake/Modules/FindUDev.cmake +++ b/tools/cmake/modules/FindUDev.cmake diff --git a/tools/infrastructure/api_compare.py b/tools/infrastructure/api_compare.py new file mode 100644 index 0000000000..0129119673 --- /dev/null +++ b/tools/infrastructure/api_compare.py @@ -0,0 +1,468 @@ +#!/usr/bin/env python + +import json +import sys +import errno +import argparse +import xml.etree.ElementTree as ElementTree +from collections import namedtuple + +reload(sys) +# Enable Utf-8 support. Needed if script will be run under Windows +sys.setdefaultencoding('utf-8') + + +class colors: + """Class defining colorful output. + Works under UNIX ONLY as Windows does not support ANSI escape sequences + """ + HEADER = '\033[95m' + BLUE = '\033[94m' + GREEN = '\033[92m' + WARN = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + + +def simple_values_comparison(mobile_attribute_value, hmi_attribute_value): + """Simple attribute value comparison""" + return mobile_attribute_value == hmi_attribute_value + + +def parse_command_line_args(): + """Function adds and parses command line arguments""" + parser = argparse.ArgumentParser() + parser.add_argument( + "--mobile_api_file", + type=str, default="MOBILE_API.xml", + help='Enter mobile api file name! ("MOBILE_API.xml" by default)' + ) + parser.add_argument( + "--hmi_api_file", + type=str, default="HMI_API.xml", + help='Enter hmi api file name! ("HMI_API.xml" by default)' + ) + parser.add_argument( + "-o", "--output", + type=str, default="console", + choices=['xml', 'json', 'console'], + help='Choose report type! ("console" by default)' + ) + parser.add_argument( + "--full_info", + action="store_true", + help='Enter this parameter to get full detailed info!' + ) + args = parser.parse_args() + return args + + +def json_to_xml(json_obj, line_padding=" "): + """Function which converts json to xml format""" + result_list = list() + json_obj_type = type(json_obj) + if json_obj_type is list: + for sub_elem in json_obj: + result_list.append(json_to_xml(sub_elem, line_padding)) + return "\n".join(result_list) + if json_obj_type is dict: + for tag_name in json_obj: + sub_obj = json_obj[tag_name] + result_list.append("%s<%s>" % (line_padding, tag_name)) + result_list.append(json_to_xml(sub_obj, "\t" + line_padding)) + result_list.append("%s</%s>" % (line_padding, tag_name)) + return "\n".join(result_list) + return "%s%s" % (line_padding, json_obj) + + +def dict_to_json(summary_result): + """Function converts python dictionary to json format""" + return json.dumps( + summary_result, sort_keys=True, indent=4, separators=(',', ': ')) + + +def set_build_status(comparison_result): + """Function sets up build status depend on comparison result""" + if len(comparison_result) > 0: + sys.exit(errno.EPERM) + else: + return + + +def get_rpc_params(function): + """Function which gets all params from specified RPC""" + params = {} + for function_tag in function: # loop over function tags + if function_tag.tag == 'param': + name = function_tag.attrib['name'] + params[name] = function_tag.attrib + return params + + +Rpc = namedtuple("rpc", ["rpc_name", "rpc_type"]) + + +def extract_functions(interface, functions): + """Function extracting rpcs from passed interface""" + for child in interface: + if child.tag == 'function': + rpc_name = child.attrib['name'] + rpc_type = child.attrib['messagetype'] + key = Rpc(rpc_name=rpc_name, rpc_type=rpc_type) + params = get_rpc_params(child) + if key in functions: + functions[key].update(params) + else: + functions[key] = params + + +def filter_params(rpc, params_to_filter, filter): + "Function filters rpc parameters according passed filter" + filtered = [] + for param in params_to_filter: + # Filter only keys which present in filter + if param not in filter: + filtered.append(param) + else: + filter_func = filter[param] + if filter_func(rpc): + filtered.append(param) + return filtered + + +def create_result_section(param, result): + """Function creating appropriate section in result dictionary""" + if param not in result: + result[param] = {} + if "HMI_API" not in result[param]: + result[param]["HMI_API"] = {} + if "Mobile_API" not in result[param]: + result[param]["Mobile_API"] = {} + mob_api_result_section = result[param]["Mobile_API"] + hmi_api_result_section = result[param]["HMI_API"] + return mob_api_result_section, hmi_api_result_section + + +def compare_params(param, mob_param_attrs, hmi_param_attrs): + """Function comparing mobile and hmi parameter attributes""" + result = {} + mob_param_attrs = dict(mob_param_attrs) + hmi_param_attrs = dict(hmi_param_attrs) + for compare_rule in global_compare_rules: + condition = compare_rule[0] + rule = compare_rule[1] + if (condition(mob_param_attrs, hmi_param_attrs)): + mobile_res, hmi_res = rule( + mob_param_attrs, hmi_param_attrs) + if len(mobile_res) > 0 or len(hmi_res) > 0: + m_res, h_res = create_result_section(param, result) + m_res.update(mobile_res) + h_res.update(hmi_res) + return result + + +def fill_summary_result(rpc_name, area, value, summary_result): + """Function filling summary comparison result""" + if rpc_name not in summary_result: + summary_result[rpc_name] = {} + rpc = summary_result[rpc_name] + if type(value) is not dict: + rpc[area] = value + elif type(value) is dict: + if area not in rpc: + rpc[area] = {} + rpc[area].update(value) + + +def get_common_params(rpc_name, mob_api_functions, hmi_api_functions): + """Function calculates common parameters from mobile and hmi apis + for specified rpc + """ + hmi_params = hmi_api_functions[rpc_name] + mob_params = mob_api_functions[rpc_name] + mob_keys = mob_params.keys() + hmi_keys = hmi_params.keys() + return list(set(mob_keys).intersection(set(hmi_keys))) + + +def get_diff(common_params, rpc_name, hmi_params, mob_params, summary_result): + """Function which gets difference between parameters + and writes to summary result + """ + for param in common_params: + mob_items = sorted(mob_params[param].items()) + hmi_items = sorted(hmi_params[param].items()) + diff_res = compare_params(param, mob_items, hmi_items) + area = "Attributes difference:" + if len(diff_res) > 0: + fill_summary_result(rpc_name, area, + diff_res, summary_result + ) + + +def print_parameters(common_params, hmi_params, mob_params): + """Function which prints parameters in mobile, hmi api + and common parameters + """ + print "Parameters to check: ", common_params, "\n" + for param in common_params: + mob_items = sorted(mob_params[param].items()) + hmi_items = sorted(hmi_params[param].items()) + print colors.UNDERLINE + colors.BOLD + param + colors.ENDC, ":" + print "In Mobile API :\t", dict(mob_items) + print "In HMI API :\t", dict(hmi_items) + + +def print_full_info(hmi_absent_params, hmi_params, + mob_absent_params, mob_params, rpc_name): + """Function prints full detailed info about every rpc""" + print "\n" + "---" * 60 + "\n" + rpc_color = colors.BOLD + colors.HEADER + print rpc_color + rpc_name + colors.ENDC + print colors.BOLD + "\nMobile API: " + colors.ENDC + print "Parameters quantity: ", len(mob_params) + print "Parameters list: ", sorted(mob_params.keys()) + print colors.BOLD + "HMI API: " + colors.ENDC + print "Parameters quantity: ", len(hmi_params) + print "Parameters list: ", sorted(hmi_params.keys()) + print "\n" + print("{}Parameters absent in Mobile APIs: {}{}". + format(colors.WARN, mob_absent_params, colors.ENDC)) + print("{}Parameters absent in HMI APIs: {}{}". + format(colors.WARN, hmi_absent_params, colors.ENDC)) + print "\n" + + +def console_print(summary_result): + """Function which prints summary result to console""" + for rpc_name in sorted(summary_result.keys()): + print "\n" + "---" * 60 + print colors.HEADER + rpc_name + colors.ENDC + for problematic_item in summary_result[rpc_name]: + item = summary_result[rpc_name][problematic_item] + if len(item) > 0: + print colors.UNDERLINE + problematic_item + colors.ENDC + if type(item) is not dict: + print("{}{}{}".format(colors.WARN, item, colors.ENDC)) + elif type(item) is dict: + for param in item.keys(): + item_print = colors.UNDERLINE + param + colors.ENDC + print "{} {}".format("Parameter name: ", item_print) + res_val = item[param] + for key in res_val: + print key, ":", colors.FAIL, res_val[key], colors.ENDC + + +def print_summary_info(summary_result, args): + """Function which prints summary comparison info(if any). + Output type depends on command line args + """ + summary_color = colors.UNDERLINE + colors.BOLD + colors.BLUE + print "\n" + print summary_color, "SUMMARY COMPARISON RESULT:\n", colors.ENDC + if len(summary_result) == 0: + print colors.BOLD + " === NO PROBLEMS FOUND ===" + colors.ENDC + return + if args.output == "console": + console_print(summary_result) + if args.output == "json": + json_summary_result = dict_to_json(summary_result) + print json_summary_result + if args.output == "xml": + json_summary_result = dict_to_json(summary_result) + temp = json.loads(json_summary_result) + xml_summary_result = json_to_xml(temp) + print xml_summary_result + + +def handle_absent_params(area, absent_params, rpc_name, summary_result): + """Function which writes absent parameters(if any) + to summary result + """ + if len(absent_params) > 0: + fill_summary_result( + rpc_name, area, + absent_params, + summary_result + ) + + +def get_absent_hmi_params(hmi_params, mob_params, rpc): + """Function caculates absent parameters in hmi api""" + hmi_absent_params = set(mob_params.keys()) - set(hmi_params.keys()) + hmi_absent_params = filter_params( + rpc, hmi_absent_params, exclude_redundant_from_hmi_rpc_filter) + return hmi_absent_params + + +def get_absent_mob_params(hmi_params, mob_params, rpc): + """Function caculates absent parameters in mobile api""" + mob_absent_params = set(hmi_params.keys()) - set(mob_params.keys()) + mob_absent_params = filter_params( + rpc, mob_absent_params, exclude_params_from_mob_rpc) + return mob_absent_params + + +def get_rpc_for_handle(rpc_name, hmi_params, mob_params): + """Function creates rpc with all parameters to check""" + rpc = type('', (), {})() # empty object + rpc.mobile_params = mob_params + rpc.hmi_params = hmi_params + rpc.rpc_name = rpc_name.rpc_name + rpc.rpc_type = rpc_name.rpc_type + return rpc + + +def check_array_mandatory_param(attributes): + """Function checks presence of "array" mandatory parameters""" + result = {} + minsize_exists = "minsize" in attributes + if not minsize_exists: + attributes["minsize"] = None + result["array"] = attributes["array"] + result["minsize"] = attributes["minsize"] + maxsize_exists = "maxsize" in attributes + if not maxsize_exists: + attributes["maxsize"] = None + result["array"] = attributes["array"] + result["maxsize"] = attributes["maxsize"] + return result + + +def array_compare_rule(mob_param_attributes, hmi_param_attributes): + """Function checks presence of necessary parameters + if "array"="true" field presents + """ + attr = "array" + mobile_result = {} + if attr in mob_param_attributes and mob_param_attributes[attr] == "true": + mobile_result = check_array_mandatory_param(mob_param_attributes) + hmi_result = {} + if attr in hmi_param_attributes and hmi_param_attributes[attr] == "true": + hmi_result = check_array_mandatory_param(hmi_param_attributes) + return mobile_result, hmi_result + + +def string_compare_rule(mob_param_attributes, hmi_param_attributes): + """Function checks presence of "minlength"="1" in HMI_API if + "minlength" is omitted in MobileAPI. + Should be checked only for "type"="String" + """ + attr = "minlength" + if attr not in mob_param_attributes: + if attr not in hmi_param_attributes: + return {attr: None}, {attr: None} + elif hmi_param_attributes[attr] != "1": + return {attr: None}, {attr: hmi_param_attributes[attr]} + else: + mob_param_attributes[attr] = "1" + return {}, {} + + +def all_compare_rule(mob_param_attributes, hmi_param_attributes): + """Function used for all common arrtibutes comparison""" + mobile_result = {} + hmi_result = {} + attr_names = mob_param_attributes.keys() + hmi_param_attributes.keys() + attr_names = set(attr_names) + for attr_name in attr_names: + mobile_attribute_value = None + hmi_attribute_value = None + compare_func = simple_values_comparison + if attr_name in attributes_comparison_rules: + # Get appropriate comparison function from attributes comparison + # rules + compare_func = attributes_comparison_rules[attr_name] + if attr_name in mob_param_attributes: + mobile_attribute_value = mob_param_attributes[attr_name] + if attr_name in hmi_param_attributes: + hmi_attribute_value = hmi_param_attributes[attr_name] + values_equal = compare_func( + mobile_attribute_value, hmi_attribute_value) + if not values_equal: + hmi_result[attr_name] = hmi_attribute_value + mobile_result[attr_name] = mobile_attribute_value + return mobile_result, hmi_result + + +global_compare_rules = [ + # Comparison rule when attribute "type" = "String" + (lambda mob_param_attributes, hmi_param_attributes: + mob_param_attributes["type"] == "String", string_compare_rule), + # Comparison rule when attribute "array" = "true" + (lambda mob_param_attributes, hmi_param_attributes: + 'array' in mob_param_attributes.keys() + + hmi_param_attributes.keys(), array_compare_rule), + # Common comparison function for all attributes + (lambda mob_param_attributes, hmi_param_attributes: + True, all_compare_rule) +] + +attributes_comparison_rules = { + # If "mandatory" field is omitted i MobileApi + # it must be present in HMI_API as "mandatory"="true" by default + 'mandatory': lambda mobile_attribute_value, hmi_attribute_value: + True if mobile_attribute_value is None and hmi_attribute_value == "true" + else mobile_attribute_value == hmi_attribute_value, + # type <Common.<Struct/Enum> at HMI_API (MOBILE_APi has no <Common.>) + 'type': lambda mobile_attribute_value, hmi_attribute_value: + True if ("Common." + mobile_attribute_value) == hmi_attribute_value + else mobile_attribute_value == hmi_attribute_value +} + +# Parameters in HMI_API which should be excluded from comparison +exclude_redundant_from_hmi_rpc_filter = { + 'resultCode': lambda rpc: rpc.rpc_type != "response", + 'info': lambda rpc: rpc.rpc_type != "response", + 'success': lambda rpc: rpc.rpc_type != "response" +} + +# Parameters in MOBILE_API which should be excluded from comparison +exclude_params_from_mob_rpc = { + 'type': (lambda rpc: rpc.rpc_name not in ["AddCommand", "DeleteCommand"]), + 'appID': (lambda rpc: False), + 'grammarID': (lambda rpc: False)} + + +def main(): + args = parse_command_line_args() + mobile_api_tree = ElementTree.parse(args.mobile_api_file) + mob_api_functions = {} + extract_functions(mobile_api_tree.getroot(), mob_api_functions) + + hmi_api_tree = ElementTree.parse(args.hmi_api_file) + hmi_api_functions = {} + for interface in hmi_api_tree.getroot(): + extract_functions(interface, hmi_api_functions) + summary_result = {} + for rpc_name in sorted(mob_api_functions.keys()): + if rpc_name in hmi_api_functions: + hmi_params = hmi_api_functions[rpc_name] + mob_params = mob_api_functions[rpc_name] + rpc = get_rpc_for_handle(rpc_name, hmi_params, mob_params) + mob_absent_params = get_absent_mob_params( + hmi_params, mob_params, rpc) + hmi_absent_params = get_absent_hmi_params( + hmi_params, mob_params, rpc) + common_params = get_common_params( + rpc_name, mob_api_functions, hmi_api_functions) + + rpc_name = str(rpc_name.rpc_name + " " + rpc_name.rpc_type) + if args.full_info: + print_full_info(hmi_absent_params, hmi_params, + mob_absent_params, mob_params, rpc_name) + print_parameters(common_params, hmi_params, mob_params) + handle_absent_params("Missed in Mobile APIs:", mob_absent_params, + rpc_name, summary_result) + handle_absent_params("Missed in HMI APIs:", hmi_absent_params, + rpc_name, summary_result) + get_diff(common_params, rpc_name, hmi_params, + mob_params, summary_result) + print_summary_info(summary_result, args) + set_build_status(summary_result) + + +if __name__ == '__main__': + main() diff --git a/tools/infrastructure/check_style.sh b/tools/infrastructure/check_style.sh index f42a048b34..647427e793 100755 --- a/tools/infrastructure/check_style.sh +++ b/tools/infrastructure/check_style.sh @@ -27,15 +27,31 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +FORMATER=clang-format-3.6 +INSTALL_CMD="sudo apt-get install -f $FORMATER" + +if [ "$1" = "--help" ] +then + echo "" + echo "Script checks c++ code style in all .h .cc and .cpp files" + echo "Uses $FORMATER as base tool. Install it with : $INSTALL_CMD" + echo "Usage: `basename $0` [option]" + echo " --fix Fix files format indirectly" + echo " --help Display this information" + exit 0 +fi + +command -v $FORMATER >/dev/null 2>&1 || { echo >&2 "$FORMATER is not installed. Use following: $INSTALL_CMD"; exit 1; } + FILE_NAMES=$(find src -name \*.h -print -o -name \*.cpp -print -o -name \*.cc -print | grep -v 3rd_party) check_style() { - clang-format-3.6 -style=file $1 | diff $1 - + $FORMATER -style=file $1 | diff $1 - } fix_style() { - clang-format-3.6 -style=file -i $1 + $FORMATER -style=file -i $1 } if [ "$1" = "--fix" ] diff --git a/tools/infrastructure/show_disabled.sh b/tools/infrastructure/show_disabled.sh new file mode 100755 index 0000000000..7444755017 --- /dev/null +++ b/tools/infrastructure/show_disabled.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# Variable to store total amount of disabled unit tests +total_disabled=0 + +echo "" +echo "===== DISABLED Unit-tests amount ===== " +echo "" + +# Getting the list of all UT executables +for test_file in $(ctest -N | awk '{print $3}'); do + full_path=`find . -name $test_file -type f 2>/dev/null` + if [ $full_path ] ; then + # Count amount of disabled tests cases + count_of_disabled=$(${full_path} --gtest_list_tests | grep DISABLED | wc -l) + if [ 0 != $count_of_disabled ] ; then + let "total_disabled = $total_disabled + $count_of_disabled" + echo $count_of_disabled " : " $test_file; + fi + fi +done +echo "" +echo "TOTAL AMOUNT OF DISABLED TESTS : " $total_disabled; + +exit 0 + + diff --git a/tools/intergen/test/CMakeLists.txt b/tools/intergen/test/CMakeLists.txt index f8af75c3bf..27d506443e 100644 --- a/tools/intergen/test/CMakeLists.txt +++ b/tools/intergen/test/CMakeLists.txt @@ -76,10 +76,10 @@ if (${HMI_DBUS_API}) ${CMAKE_SOURCE_DIR}/src/components/dbus/include ${DBUS_INCLUDE_DIRS} ) - set (LIBRARIES ${LIBRARIES} DBus) + set (LIBRARIES ${LIBRARIES} dbus) set (SOURCES ${SOURCES} generated_interface_dbus_tests.cc) endif () create_test(test_generated_interface "${SOURCES}" "${LIBRARIES}") -endif()
\ No newline at end of file +endif() |