From d24457f9a15f5ad4470d55bc69fbece22ce97bfc Mon Sep 17 00:00:00 2001 From: Noel Eck Date: Thu, 26 Jul 2018 15:37:10 -0700 Subject: [PATCH] ioinit: Update to build/test C++ ioinit Multiple changes necessary to enable this. The main goal is to build and run the C++ ioinit unit tests (which require c++11) * Updated mraa required CMake version to 2.8.11 (this is needed for the target_xxx_xxx CMake syntax. * Added function for adding the c++11 flag give a CMake target. * Updated unit tests for range of CMake versions (tested on 2.8.11, 3.8.2, 3.9.6, and 3.12.0). * Added C++ unit test file (more needed here).) Signed-off-by: Noel Eck --- CMakeLists.txt | 13 ++++++- tests/unit/CMakeLists.txt | 30 +++++++++++----- tests/unit/api/mraa_initio_hpp_unit.cxx | 47 +++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 tests/unit/api/mraa_initio_hpp_unit.cxx diff --git a/CMakeLists.txt b/CMakeLists.txt index e98534b..e6e5d90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 2.8) +cmake_minimum_required (VERSION 2.8.11) project (mraa C CXX) FIND_PACKAGE (Threads REQUIRED) @@ -74,6 +74,17 @@ foreach (flag ${MRAA_BOTH_WARNING_FLAGS} ${MRAA_CXX_WARNING_FLAGS}) endif () endforeach () +# This function adds the c++11 flag to a c++ target (if supported) +function(use_cxx_11 targetname) + include(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) + if (COMPILER_SUPPORTS_CXX11) + set_target_properties(${targetname} PROPERTIES COMPILE_FLAGS "-std=c++11") + else() + message(FATAL_ERROR "Target '${targetname}' requires c++11 which is not supported by this compiler") + endif() +endfunction() + # Set CMAKE_INSTALL_LIBDIR if not defined include(GNUInstallDirs) diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index d326a49..e6b1d90 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -1,3 +1,8 @@ +# Use the IN_LIST operator if available (for gtest) +if(POLICY CMP0057) + cmake_policy(SET CMP0057 NEW) +endif() + # For now, Google Test is NOT required */ find_package(GTest) @@ -9,37 +14,46 @@ endif() # Unit tests - C common header methods add_executable(test_unit_common_h api/api_common_h_unit.cxx) -target_link_libraries(test_unit_common_h GTest::GTest GTest::Main mraa) +target_link_libraries(test_unit_common_h ${GTEST_BOTH_LIBRARIES} mraa) target_include_directories(test_unit_common_h PRIVATE "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/api" "${CMAKE_SOURCE_DIR}/api/mraa") -gtest_add_tests(test_unit_common_h "" AUTO) +gtest_add_tests(test_unit_common_h "" api/api_common_h_unit.cxx) list(APPEND GTEST_UNIT_TEST_TARGETS test_unit_common_h) # Unit tests - C++ common header methods add_executable(test_unit_common_hpp api/api_common_hpp_unit.cxx) -target_link_libraries(test_unit_common_hpp GTest::GTest GTest::Main mraa) +target_link_libraries(test_unit_common_hpp ${GTEST_BOTH_LIBRARIES} mraa) target_include_directories(test_unit_common_hpp PRIVATE "${CMAKE_SOURCE_DIR}/api") -gtest_add_tests(test_unit_common_hpp "" AUTO) +gtest_add_tests(test_unit_common_hpp "" api/api_common_hpp_unit.cxx) list(APPEND GTEST_UNIT_TEST_TARGETS test_unit_common_hpp) if (FTDI4222 AND USBPLAT) # Unit tests - Test platform extenders (as much as possible) add_executable(test_unit_ftdi4222 platform_extender/platform_extender.cxx) - target_link_libraries(test_unit_ftdi4222 GTest::GTest GTest::Main mraa-platform-ft4222 dl) + target_link_libraries(test_unit_ftdi4222 ${GTEST_BOTH_LIBRARIES} mraa-platform-ft4222 dl) target_include_directories(test_unit_ftdi4222 PRIVATE "${PROJECT_SOURCE_DIR}/api" "${PROJECT_SOURCE_DIR}/api/mraa" "${PROJECT_SOURCE_DIR}/include") - gtest_add_tests(test_unit_ftdi4222 "" AUTO) + gtest_add_tests(test_unit_ftdi4222 "" platform_extender/platform_extender.cxx) list(APPEND GTEST_UNIT_TEST_TARGETS test_unit_ftdi4222) endif () # Unit tests - test C initio header methods on MOCK platform only if (DETECTED_ARCH STREQUAL "MOCK") add_executable(test_unit_ioinit_h api/mraa_initio_h_unit.cxx) - target_link_libraries(test_unit_ioinit_h GTest::GTest GTest::Main mraa) + target_link_libraries(test_unit_ioinit_h ${GTEST_BOTH_LIBRARIES} mraa) target_include_directories(test_unit_ioinit_h PRIVATE "${CMAKE_SOURCE_DIR}/api") - gtest_add_tests(test_unit_ioinit_h "" AUTO) + gtest_add_tests(test_unit_ioinit_h "" api/mraa_initio_h_unit.cxx) list(APPEND GTEST_UNIT_TEST_TARGETS test_unit_ioinit_h) + + add_executable(test_unit_ioinit_hpp api/mraa_initio_hpp_unit.cxx) + target_link_libraries(test_unit_ioinit_hpp ${GTEST_BOTH_LIBRARIES} mraa) + target_include_directories(test_unit_ioinit_hpp PRIVATE "${CMAKE_SOURCE_DIR}/api") + gtest_add_tests(test_unit_ioinit_hpp "" api/mraa_initio_hpp_unit.cxx) + list(APPEND GTEST_UNIT_TEST_TARGETS test_unit_ioinit_hpp) + + # The initio C++ header requires c++11 + use_cxx_11(test_unit_ioinit_hpp) endif() # Add a target for all unit tests diff --git a/tests/unit/api/mraa_initio_hpp_unit.cxx b/tests/unit/api/mraa_initio_hpp_unit.cxx new file mode 100644 index 0000000..9d21589 --- /dev/null +++ b/tests/unit/api/mraa_initio_hpp_unit.cxx @@ -0,0 +1,47 @@ +/* + * Author: Mihai Stefanescu + * Copyright (c) 2018 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mraa/initio.hpp" +#include "gtest/gtest.h" +#include +#include + + +/* MRAA IO INIT hpp test fixture */ +class mraa_initio_hpp_unit : public ::testing::Test +{ +}; + +/* Test for an invalid AIO init. */ +TEST_F(mraa_initio_hpp_unit, test_aio_init_invalid) +{ + ASSERT_THROW(mraa::MraaIo io("a:bogus:10"), std::runtime_error); +} + +/* Test for a valid AIO init. */ +TEST_F(mraa_initio_hpp_unit, test_aio_init_valid) +{ + mraa::MraaIo io("a:0:10"); + ASSERT_EQ(1, io.aios.size()); +}