|
|
@@ -0,0 +1,196 @@
|
|
|
+#[=======================================================================[.rst:
|
|
|
+FindXCTest
|
|
|
+----------
|
|
|
+
|
|
|
+Functions to help creating and executing XCTest bundles.
|
|
|
+
|
|
|
+An XCTest bundle is a CFBundle with a special product-type
|
|
|
+and bundle extension. The Mac Developer Library provides more
|
|
|
+information in the `Testing with Xcode`_ document.
|
|
|
+
|
|
|
+.. _Testing with Xcode: http://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/
|
|
|
+
|
|
|
+Module Functions
|
|
|
+^^^^^^^^^^^^^^^^
|
|
|
+
|
|
|
+.. command:: xctest_add_bundle
|
|
|
+
|
|
|
+ The ``xctest_add_bundle`` function creates a XCTest bundle named
|
|
|
+ <target> which will test the target <testee>. Supported target types
|
|
|
+ for testee are Frameworks and App Bundles::
|
|
|
+
|
|
|
+ xctest_add_bundle(
|
|
|
+ <target> # Name of the XCTest bundle
|
|
|
+ <testee> # Target name of the testee
|
|
|
+ )
|
|
|
+
|
|
|
+.. command:: xctest_add_test
|
|
|
+
|
|
|
+ The ``xctest_add_test`` function adds an XCTest bundle to the
|
|
|
+ project to be run by :manual:`ctest(1)`. The test will be named
|
|
|
+ <name> and tests <bundle>::
|
|
|
+
|
|
|
+ xctest_add_test(
|
|
|
+ <name> # Test name
|
|
|
+ <bundle> # Target name of XCTest bundle
|
|
|
+ )
|
|
|
+
|
|
|
+Module Variables
|
|
|
+^^^^^^^^^^^^^^^^
|
|
|
+
|
|
|
+The following variables are set by including this module:
|
|
|
+
|
|
|
+.. variable:: XCTest_FOUND
|
|
|
+
|
|
|
+ True if the XCTest Framework and executable were found.
|
|
|
+
|
|
|
+.. variable:: XCTest_EXECUTABLE
|
|
|
+
|
|
|
+ The path to the xctest command line tool used to execute XCTest bundles.
|
|
|
+
|
|
|
+.. variable:: XCTest_INCLUDE_DIRS
|
|
|
+
|
|
|
+ The directory containing the XCTest Framework headers.
|
|
|
+
|
|
|
+.. variable:: XCTest_LIBRARIES
|
|
|
+
|
|
|
+ The location of the XCTest Framework.
|
|
|
+
|
|
|
+#]=======================================================================]
|
|
|
+
|
|
|
+#=============================================================================
|
|
|
+# Copyright 2015 Gregor Jasny
|
|
|
+#
|
|
|
+# Distributed under the OSI-approved BSD License (the "License");
|
|
|
+# see accompanying file Copyright.txt for details.
|
|
|
+#
|
|
|
+# This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
|
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
+# See the License for more information.
|
|
|
+#=============================================================================
|
|
|
+# (To distribute this file outside of CMake, substitute the full
|
|
|
+# License text for the above reference.)
|
|
|
+
|
|
|
+find_path(XCTest_INCLUDE_DIR
|
|
|
+ NAMES "XCTest/XCTest.h"
|
|
|
+ DOC "XCTest include directory")
|
|
|
+mark_as_advanced(XCTest_INCLUDE_DIR)
|
|
|
+
|
|
|
+find_library(XCTest_LIBRARY
|
|
|
+ NAMES XCTest
|
|
|
+ DOC "XCTest Framework library")
|
|
|
+mark_as_advanced(XCTest_LIBRARY)
|
|
|
+
|
|
|
+execute_process(
|
|
|
+ COMMAND xcrun --find xctest
|
|
|
+ OUTPUT_VARIABLE _xcrun_out OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
+ ERROR_VARIABLE _xcrun_err)
|
|
|
+if(_xcrun_out)
|
|
|
+ set(XCTest_EXECUTABLE "${_xcrun_out}" CACHE FILEPATH "XCTest executable")
|
|
|
+ mark_as_advanced(XCTest_EXECUTABLE)
|
|
|
+endif()
|
|
|
+
|
|
|
+include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
|
|
|
+find_package_handle_standard_args(XCTest
|
|
|
+ FOUND_VAR XCTest_FOUND
|
|
|
+ REQUIRED_VARS XCTest_LIBRARY XCTest_INCLUDE_DIR XCTest_EXECUTABLE)
|
|
|
+
|
|
|
+if(XCTest_FOUND)
|
|
|
+ set(XCTest_INCLUDE_DIRS "${XCTest_INCLUDE_DIR}")
|
|
|
+ set(XCTest_LIBRARIES "${XCTest_LIBRARY}")
|
|
|
+endif(XCTest_FOUND)
|
|
|
+
|
|
|
+
|
|
|
+function(xctest_add_bundle target testee)
|
|
|
+ if(NOT XCTest_FOUND)
|
|
|
+ message(FATAL_ERROR "XCTest is required to create a XCTest Bundle.")
|
|
|
+ endif(NOT XCTest_FOUND)
|
|
|
+
|
|
|
+ if(NOT CMAKE_OSX_SYSROOT)
|
|
|
+ message(FATAL_ERROR "Adding XCTest bundles requires CMAKE_OSX_SYSROOT to be set.")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ add_library(${target} MODULE ${ARGN})
|
|
|
+
|
|
|
+ set_target_properties(${target} PROPERTIES
|
|
|
+ BUNDLE TRUE
|
|
|
+ XCTEST TRUE
|
|
|
+ XCTEST_TESTEE ${testee})
|
|
|
+
|
|
|
+ target_link_libraries(${target} PRIVATE "-framework Foundation")
|
|
|
+ target_link_libraries(${target} PRIVATE ${XCTest_LIBRARIES})
|
|
|
+ target_include_directories(${target} PRIVATE ${XCTest_INCLUDE_DIRS})
|
|
|
+
|
|
|
+ # retrieve testee target type
|
|
|
+ if(NOT TARGET ${testee})
|
|
|
+ message(FATAL_ERROR "${testee} is not a target.")
|
|
|
+ endif()
|
|
|
+ get_property(_testee_type TARGET ${testee} PROPERTY TYPE)
|
|
|
+ get_property(_testee_framework TARGET ${testee} PROPERTY FRAMEWORK)
|
|
|
+ get_property(_testee_macosx_bundle TARGET ${testee} PROPERTY MACOSX_BUNDLE)
|
|
|
+
|
|
|
+ if(_testee_type STREQUAL "SHARED_LIBRARY" AND _testee_framework)
|
|
|
+ # testee is a Framework
|
|
|
+ target_link_libraries(${target} PRIVATE ${testee})
|
|
|
+
|
|
|
+ elseif(_testee_type STREQUAL "EXECUTABLE" AND _testee_macosx_bundle)
|
|
|
+ # testee is an App Bundle
|
|
|
+ add_dependencies(${target} ${testee})
|
|
|
+ if(XCODE)
|
|
|
+ set_target_properties(${target} PROPERTIES
|
|
|
+ XCODE_ATTRIBUTE_BUNDLE_LOADER "$(TEST_HOST)"
|
|
|
+ XCODE_ATTRIBUTE_TEST_HOST "$<TARGET_FILE:${testee}>")
|
|
|
+ else(XCODE)
|
|
|
+ target_link_libraries(${target}
|
|
|
+ PRIVATE -bundle_loader $<TARGET_FILE:${testee}>)
|
|
|
+ endif(XCODE)
|
|
|
+
|
|
|
+ else()
|
|
|
+ message(FATAL_ERROR "Testee ${testee} is of unsupported type.")
|
|
|
+ endif()
|
|
|
+endfunction(xctest_add_bundle)
|
|
|
+
|
|
|
+
|
|
|
+function(xctest_add_test name bundle)
|
|
|
+ if(NOT XCTest_EXECUTABLE)
|
|
|
+ message(FATAL_ERROR "XCTest executable is required to register a test.")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ # check that bundle is a XCTest Bundle
|
|
|
+
|
|
|
+ if(NOT TARGET ${bundle})
|
|
|
+ message(FATAL_ERROR "${bundle} is not a target.")
|
|
|
+ endif(NOT TARGET ${bundle})
|
|
|
+
|
|
|
+ get_property(_test_type TARGET ${bundle} PROPERTY TYPE)
|
|
|
+ get_property(_test_bundle TARGET ${bundle} PROPERTY BUNDLE)
|
|
|
+ get_property(_test_xctest TARGET ${bundle} PROPERTY XCTEST)
|
|
|
+
|
|
|
+ if(NOT _test_type STREQUAL "MODULE_LIBRARY"
|
|
|
+ OR NOT _test_xctest OR NOT _test_bundle)
|
|
|
+ message(FATAL_ERROR "Test ${bundle} is not an XCTest Bundle")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ # get and check testee properties
|
|
|
+
|
|
|
+ get_property(_testee TARGET ${bundle} PROPERTY XCTEST_TESTEE)
|
|
|
+ if(NOT TARGET ${_testee})
|
|
|
+ message(FATAL_ERROR "${_testee} is not a target.")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ get_property(_testee_type TARGET ${_testee} PROPERTY TYPE)
|
|
|
+ get_property(_testee_framework TARGET ${_testee} PROPERTY FRAMEWORK)
|
|
|
+
|
|
|
+ # register test
|
|
|
+
|
|
|
+ add_test(
|
|
|
+ NAME ${name}
|
|
|
+ COMMAND ${XCTest_EXECUTABLE} $<TARGET_LINKER_FILE_DIR:${bundle}>/../..)
|
|
|
+
|
|
|
+ # point loader to testee in case rpath is disabled
|
|
|
+
|
|
|
+ if(_testee_type STREQUAL "SHARED_LIBRARY" AND _testee_framework)
|
|
|
+ set_property(TEST ${name} APPEND PROPERTY
|
|
|
+ ENVIRONMENT DYLD_FRAMEWORK_PATH=$<TARGET_LINKER_FILE_DIR:${_testee}>/..)
|
|
|
+ endif()
|
|
|
+endfunction(xctest_add_test)
|