diff --git a/ament_cmake_auto/CMakeLists.txt b/ament_cmake_auto/CMakeLists.txt
index 822b5878..93fc0876 100644
--- a/ament_cmake_auto/CMakeLists.txt
+++ b/ament_cmake_auto/CMakeLists.txt
@@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.12)
project(ament_cmake_auto NONE)
find_package(ament_cmake REQUIRED)
+find_package(ament_cmake_gtest REQUIRED)
ament_package(
CONFIG_EXTRAS "ament_cmake_auto-extras.cmake"
diff --git a/ament_cmake_auto/ament_cmake_auto-extras.cmake b/ament_cmake_auto/ament_cmake_auto-extras.cmake
index f5b4bd3d..7d6055e3 100644
--- a/ament_cmake_auto/ament_cmake_auto-extras.cmake
+++ b/ament_cmake_auto/ament_cmake_auto-extras.cmake
@@ -17,7 +17,9 @@
find_package(ament_cmake QUIET REQUIRED)
include("${ament_cmake_auto_DIR}/ament_auto_add_executable.cmake")
+include("${ament_cmake_auto_DIR}/ament_auto_add_gtest.cmake")
include("${ament_cmake_auto_DIR}/ament_auto_add_library.cmake")
include("${ament_cmake_auto_DIR}/ament_auto_generate_code.cmake")
include("${ament_cmake_auto_DIR}/ament_auto_find_build_dependencies.cmake")
+include("${ament_cmake_auto_DIR}/ament_auto_find_test_dependencies.cmake")
include("${ament_cmake_auto_DIR}/ament_auto_package.cmake")
diff --git a/ament_cmake_auto/cmake/ament_auto_add_gtest.cmake b/ament_cmake_auto/cmake/ament_auto_add_gtest.cmake
new file mode 100644
index 00000000..2bb04828
--- /dev/null
+++ b/ament_cmake_auto/cmake/ament_auto_add_gtest.cmake
@@ -0,0 +1,112 @@
+# Copyright 2021 Whitley Software Services, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Add a gtest with all found test dependencies.
+#
+# Call add_executable(target ARGN), link it against the gtest libraries
+# and all found test dependencies, and then register the executable as a test.
+#
+# If gtest is not available the specified target is not being created and
+# therefore the target existence should be checked before being used.
+#
+# :param target: the target name which will also be used as the test name
+# :type target: string
+# :param ARGN: the list of source files
+# :type ARGN: list of strings
+# :param RUNNER: the path to the test runner script (default:
+# see ament_add_test).
+# :type RUNNER: string
+# :param TIMEOUT: the test timeout in seconds,
+# default defined by ``ament_add_test()``
+# :type TIMEOUT: integer
+# :param WORKING_DIRECTORY: the working directory for invoking the
+# executable in, default defined by ``ament_add_test()``
+# :type WORKING_DIRECTORY: string
+# :param SKIP_LINKING_MAIN_LIBRARIES: if set skip linking against the gtest
+# main libraries
+# :type SKIP_LINKING_MAIN_LIBRARIES: option
+# :param SKIP_TEST: if set mark the test as being skipped
+# :type SKIP_TEST: option
+# :param ENV: list of env vars to set; listed as ``VAR=value``
+# :type ENV: list of strings
+# :param APPEND_ENV: list of env vars to append if already set, otherwise set;
+# listed as ``VAR=value``
+# :type APPEND_ENV: list of strings
+# :param APPEND_LIBRARY_DIRS: list of library dirs to append to the appropriate
+# OS specific env var, a la LD_LIBRARY_PATH
+# :type APPEND_LIBRARY_DIRS: list of strings
+#
+# @public
+#
+macro(ament_auto_add_gtest target)
+ cmake_parse_arguments(_ARGN
+ "SKIP_LINKING_MAIN_LIBRARIES;SKIP_TEST"
+ "RUNNER;TIMEOUT;WORKING_DIRECTORY"
+ "APPEND_ENV;APPEND_LIBRARY_DIRS;ENV"
+ ${ARGN})
+ if(NOT _ARGN_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR
+ "ament_auto_add_gtest() must be invoked with at least one source file")
+ endif()
+
+ # add executable
+ set(_argn_executable ${_ARGN_UNPARSED_ARGUMENTS})
+ if(_ARG_SKIP_LINKING_MAIN_LIBRARIES)
+ list(APPEND _argn_executable "SKIP_LINKING_MAIN_LIBRARIES")
+ endif()
+ ament_add_gtest_executable("${target}" ${_argn_executable})
+
+ # add include directory of this package if it exists
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/include")
+ target_include_directories("${target}" PUBLIC
+ "${CMAKE_CURRENT_SOURCE_DIR}/include")
+ endif()
+
+ # link against other libraries of this package
+ if(NOT ${PROJECT_NAME}_LIBRARIES STREQUAL "")
+ target_link_libraries("${target}" ${${PROJECT_NAME}_LIBRARIES})
+ endif()
+
+ # add exported information from found dependencies
+ ament_target_dependencies(${target}
+ ${${PROJECT_NAME}_FOUND_BUILD_DEPENDS}
+ ${${PROJECT_NAME}_FOUND_TEST_DEPENDS}
+ )
+
+ # add test
+ set(_argn_test "")
+ if(_ARG_RUNNER)
+ list(APPEND _argn_test "RUNNER" "${_ARG_RUNNER}")
+ endif()
+ if(_ARG_TIMEOUT)
+ list(APPEND _argn_test "TIMEOUT" "${_ARG_TIMEOUT}")
+ endif()
+ if(_ARG_WORKING_DIRECTORY)
+ list(APPEND _argn_test "WORKING_DIRECTORY" "${_ARG_WORKING_DIRECTORY}")
+ endif()
+ if(_ARG_SKIP_TEST)
+ list(APPEND _argn_test "SKIP_TEST")
+ endif()
+ if(_ARG_ENV)
+ list(APPEND _argn_test "ENV" ${_ARG_ENV})
+ endif()
+ if(_ARG_APPEND_ENV)
+ list(APPEND _argn_test "APPEND_ENV" ${_ARG_APPEND_ENV})
+ endif()
+ if(_ARG_APPEND_LIBRARY_DIRS)
+ list(APPEND _argn_test "APPEND_LIBRARY_DIRS" ${_ARG_APPEND_LIBRARY_DIRS})
+ endif()
+ ament_add_gtest_test("${target}" ${_argn_test})
+endmacro()
diff --git a/ament_cmake_auto/cmake/ament_auto_find_build_dependencies.cmake b/ament_cmake_auto/cmake/ament_auto_find_build_dependencies.cmake
index 5a883035..956a09f3 100644
--- a/ament_cmake_auto/cmake/ament_auto_find_build_dependencies.cmake
+++ b/ament_cmake_auto/cmake/ament_auto_find_build_dependencies.cmake
@@ -54,8 +54,8 @@ macro(ament_auto_find_build_dependencies)
if(_unknown_packages)
string(REPLACE ";" ", " _unknown_packages_str "${_unknown_packages}")
message(FATAL_ERROR "ament_auto_find_build_dependencies() called with "
- "required packages that are not listed as a build/buildtool dependency in "
- "the package.xml: ${_unknown_packages_str}")
+ "required packages that are not listed as a build/buildtool dependency "
+ "in the package.xml: ${_unknown_packages_str}")
endif()
# try to find_package() all build dependencies
diff --git a/ament_cmake_auto/cmake/ament_auto_find_test_dependencies.cmake b/ament_cmake_auto/cmake/ament_auto_find_test_dependencies.cmake
new file mode 100644
index 00000000..fa64ce5c
--- /dev/null
+++ b/ament_cmake_auto/cmake/ament_auto_find_test_dependencies.cmake
@@ -0,0 +1,41 @@
+# Copyright 2021 Whitley Software Services, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Invoke find_package() for all test dependencies.
+#
+# All found package names are appended to the
+# ``${PROJECT_NAME}_FOUND_TEST_DEPENDS`` variables.
+#
+# @public
+#
+macro(ament_auto_find_test_dependencies)
+ set(_ARGN "${ARGN}")
+ if(_ARGN)
+ message(FATAL_ERROR "ament_lint_auto_find_test_dependencies() called with "
+ "unused arguments: ${_ARGN}")
+ endif()
+
+ if(NOT _AMENT_PACKAGE_NAME)
+ ament_package_xml()
+ endif()
+
+ # try to find_package() all test dependencies
+ foreach(_dep ${${PROJECT_NAME}_TEST_DEPENDS})
+ find_package(${_dep} QUIET)
+ if(${_dep}_FOUND)
+ list(APPEND ${PROJECT_NAME}_FOUND_TEST_DEPENDS ${_dep})
+ endif()
+ endforeach()
+endmacro()
diff --git a/ament_cmake_auto/package.xml b/ament_cmake_auto/package.xml
index 0ec924ae..438306fd 100644
--- a/ament_cmake_auto/package.xml
+++ b/ament_cmake_auto/package.xml
@@ -10,7 +10,9 @@
Dirk Thomas
ament_cmake
+ ament_cmake_gtest
ament_cmake
+ ament_cmake_gtest
ament_cmake