include_directories(${DEPS_INCLUDE_DIRS}
                    ${Boost_INCLUDE_DIR}
                    ${GTEST_INCLUDE_DIR}
                    ${CMAKE_CURRENT_SOURCE_DIR}
                    ${CMAKE_SOURCE_DIR}/src)

# =============================================================================
# Prepare a Grilo plugin directory for testing
# =============================================================================

set(grilo_plugin_dir "${CMAKE_CURRENT_BINARY_DIR}/plugins")
get_target_property(mediascanner_LOCATION mediascanner-service LOCATION)

add_definitions(-DGRILO_PLUGIN_DIR="${grilo_plugin_dir}"
                -DMEDIASCANNER_SERVICE="${mediascanner_LOCATION}"
                -DGUDEV_VERSION=${GUDEV_VERSION})

get_target_property(grlmediascanner_LOCATION grlmediascanner LOCATION)

add_custom_target(
  griloplugindir DEPENDS grlmediascanner
  COMMAND mkdir -p ${grilo_plugin_dir}
  COMMAND ln -sf ${grlmediascanner_LOCATION} ${grilo_plugin_dir}/libgrlmediascanner.so
  COMMAND ln -sf ${CMAKE_SOURCE_DIR}/src/grlmediascanner/*.xml ${grilo_plugin_dir}
  COMMAND ln -sf ${GRILO_PLUGIN_DIR}/libgrltmdb.so ${grilo_plugin_dir}
  COMMAND ln -sf ${GRILO_PLUGIN_DIR}/grl-tmdb.xml ${grilo_plugin_dir}
  COMMAND ln -sf ${GRILO_PLUGIN_DIR}/libgrllastfm-albumart.so ${grilo_plugin_dir}
  COMMAND ln -sf ${GRILO_PLUGIN_DIR}/grl-lastfm-albumart.xml ${grilo_plugin_dir}
)

# =============================================================================
# Prepare a directory with test media
# =============================================================================

set(media_dir "${CMAKE_CURRENT_SOURCE_DIR}/media")
add_definitions(-DMEDIA_DIR="${media_dir}")

# =============================================================================
# Prepare a directory with test settings
# =============================================================================

set(user_data_dir "${CMAKE_CURRENT_BINARY_DIR}/data")
set(schema_dir "${user_data_dir}/glib-2.0/schemas")
add_definitions(-DUSER_DATA_DIR="${user_data_dir}")

add_custom_target(settingsdir
                  COMMAND mkdir -p ${schema_dir}
                  COMMAND ln -sf ${MEDIASCANNER_SETTINGS_FILE} ${schema_dir}
                  COMMAND ${GLIB_COMPILE_SCHEMAS} ${schema_dir}
                  DEPENDS checksettings)

# =============================================================================
# Enable coverage testing
# =============================================================================

if(CMAKE_BUILD_TYPE_LOWER STREQUAL "coverage")
  add_custom_target(coverage DEPENDS lcov-report gcovr-xml)
  add_custom_target(coverage-exec COMMAND ${CMAKE_BUILD_TOOL} test)

  if(LCOV_FOUND)
    set(LCOV_DATAFILE ${CMAKE_BINARY_DIR}/lcov.info)
    set(LCOV_REPORT_HTML ${CMAKE_BINARY_DIR}/docs/coverage)

    add_custom_target(lcov-reset
                      COMMAND ${LCOV} ${LCOV_ARGS} --zerocounters --directory ${CMAKE_BINARY_DIR})
    add_custom_target(lcov-capture DEPENDS coverage-exec
                      COMMAND ${LCOV} ${LCOV_ARGS} --capture --directory ${CMAKE_BINARY_DIR} --output-file ${LCOV_DATAFILE})
    add_custom_target(lcov-extract DEPENDS lcov-capture
                      COMMAND ${LCOV} ${LCOV_ARGS} --extract ${LCOV_DATAFILE} ${CMAKE_SOURCE_DIR}/* --output-file ${LCOV_DATAFILE} VERBATIM)
    add_custom_target(lcov-cleanup DEPENDS lcov-extract
                      COMMAND ${CMAKE_SOURCE_DIR}/tools/lcov-cleanup.py ${LCOV_DATAFILE})
    add_custom_target(lcov-report DEPENDS lcov-cleanup
                      COMMAND ${GENHTML} --output-directory ${LCOV_REPORT_HTML} ${LCOV_DATAFILE} --demangle-cpp --show-details)

    set_property(TARGET coverage-exec APPEND PROPERTY DEPENDS lcov-reset)
  else(LCOV_FOUND)
    add_custom_target(lcov-report
                      COMMAND echo "WARNING: Could not find lcov, HTML coverage reports are not generated.")
  endif(LCOV_FOUND)

  if(GCOVR_FOUND)
    set(GCOV_REPORT_XML ${CMAKE_BINARY_DIR}/gcovr.xml)

    add_custom_target(gcovr-xml DEPENDS coverage-exec
                      COMMAND LANG=C gcovr --xml --root=${CMAKE_SOURCE_DIR} --output=${GCOV_REPORT_XML})
  else(GCOVR_FOUND)
    add_custom_target(gcovr-xml
                      COMMAND echo "WARNING: Could not find gcovr, XML coverage reports are not generated.")
  endif(GCOVR_FOUND)

endif(CMAKE_BUILD_TYPE_LOWER STREQUAL "coverage")

# =============================================================================
# Build static library with common test facilities
# =============================================================================

add_library(testlib STATIC
            testlib/environments.cpp
            testlib/environments.h
            testlib/loggingsink.cpp
            testlib/loggingsink.h
            testlib/testutils.cpp
            testlib/testutils.h)

# =============================================================================
# Setup rules for the actual tests
# =============================================================================

enable_testing()

set(taskmanagertest_args --gtest_repeat=250)

add_definitions(-DREQUEST_FILE="${CMAKE_CURRENT_SOURCE_DIR}/grl-mock-data.ini")

add_custom_target(testdirs
                  COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/auto
                  COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/manual)

foreach(test
        filesystemscannertest
        griloplugintest
        localetest
        loggingtest
        glibutilstest
        mediaartcachetest
        mediaindextest
        propertytest
        taskmanagertest
        metadataresolvertest)

  add_executable(auto/${test} auto/${test}.cpp)
  add_dependencies(auto/${test} testdirs)
  target_link_libraries(auto/${test} testlib mediascanner gtest)

  add_test(NAME build/${test} COMMAND ${CMAKE_BUILD_TOOL} auto/${test})
  add_test(NAME auto/${test} COMMAND auto/${test} ${${test}_args})
  set_property(TEST auto/${test} PROPERTY DEPENDS build/${test})
endforeach(test)

set_tests_properties(auto/mediaartcachetest PROPERTIES 
ENVIRONMENT "XDG_CACHE_HOME=${CMAKE_CURRENT_BINARY_DIR}")

add_dependencies(auto/filesystemscannertest griloplugindir)

add_dependencies(auto/griloplugintest griloplugindir mediascanner-service)
target_link_libraries(auto/griloplugintest ${DEPS_LIBRARIES})

add_dependencies(auto/propertytest griloplugindir mediascanner-service)

add_dependencies(auto/metadataresolvertest griloplugindir)

add_executable(manual/dbustest manual/dbustest.cpp)
target_link_libraries(manual/dbustest mediascanner)
add_dependencies(manual/dbustest settingsdir)

add_executable(manual/settingstest manual/settingstest.cpp)
target_link_libraries(manual/settingstest mediascanner testlib gtest)
add_dependencies(manual/settingstest testdirs settingsdir)
