You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by uw...@apache.org on 2019/02/01 09:04:35 UTC
[arrow] branch master updated: ARROW-4277: [C++] Add gmock to the
toolchain
This is an automated email from the ASF dual-hosted git repository.
uwe pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new 8ab0212 ARROW-4277: [C++] Add gmock to the toolchain
8ab0212 is described below
commit 8ab0212de91d4b2179e14a6d451c1aa3a440c296
Author: Micah Kornfield <em...@gmail.com>
AuthorDate: Fri Feb 1 10:03:36 2019 +0100
ARROW-4277: [C++] Add gmock to the toolchain
To some extent this was an educated guess on CMake settings (with a lot of copy and pasting, so I expect things could be done slightly better).
Author: Micah Kornfield <em...@gmail.com>
Closes #3416 from emkornfield/gmock and squashes the following commits:
d6b143fe <Micah Kornfield> try to fix mac
9f8854eb <Micah Kornfield> revert version bump for gtest and append GMOCK directory before other includes
e3b3a32c <Micah Kornfield> try to use vendored gmock on trusty
4c2425bf <Micah Kornfield> reorder gtest library for trusty?
367abc9f <Micah Kornfield> Can more typos
2cf4a268 <Micah Kornfield> Remove force found and add more messaging
43f47af2 <Micah Kornfield> remove unused GMOCK_HOME
0a738b9e <Micah Kornfield> remove prefix
7c78244a <Micah Kornfield> force gmock true
218506e3 <Micah Kornfield> fix condition
84bab120 <Micah Kornfield> fix environment variable
f7f23a0d <Micah Kornfield> remove duplicate gmock
0c0ff927 <Micah Kornfield> fix some typos
812f4142 <Micah Kornfield> update gmock output description in gmock modules
626621a1 <Micah Kornfield> cleanup bad suffixes and use gtest_roots
4d69be85 <Micah Kornfield> fix cmake gmock message and format
7c05e73d <Micah Kornfield> update cmake recipe with copy/paste bug fixes
be8020a4 <Micah Kornfield> add gmock to conda package list
e4d081ab <Micah Kornfield> add mock
f2c47681 <Micah Kornfield> replace DummyBinaryKernel
3c51702c <Micah Kornfield> add many linux build
911f093a <Micah Kornfield> Add gmock (mostly guesswork and copy/paste)
---
ci/conda_env_cpp.yml | 1 +
cpp/CMakeLists.txt | 10 ++--
cpp/cmake_modules/FindGTest.cmake | 93 ++++++++++++++++++++++++++++-
cpp/cmake_modules/ThirdpartyToolchain.cmake | 47 ++++++++++++++-
cpp/src/arrow/compute/compute-test.cc | 9 +--
cpp/src/arrow/compute/test-util.h | 13 ++++
python/manylinux1/scripts/build_gtest.sh | 4 +-
7 files changed, 158 insertions(+), 19 deletions(-)
diff --git a/ci/conda_env_cpp.yml b/ci/conda_env_cpp.yml
index 87523b3..3d50b21 100644
--- a/ci/conda_env_cpp.yml
+++ b/ci/conda_env_cpp.yml
@@ -25,6 +25,7 @@ double-conversion
flatbuffers
gflags
glog
+gmock
gtest
libprotobuf
lz4-c
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 9cdbe7d..e0dbcd3 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -800,8 +800,9 @@ set(ARROW_TEST_STATIC_LINK_LIBS
arrow_testing_static
arrow_static
${ARROW_LINK_LIBS}
- ${GTEST_MAIN_LIBRARY}
- ${GTEST_LIBRARY})
+ ${GTEST_LIBRARY}
+ ${GMOCK_MAIN_LIBRARY}
+ ${GMOCK_LIBRARY})
set(ARROW_TEST_SHARED_LINK_LIBS
arrow_testing_shared
@@ -811,8 +812,9 @@ set(ARROW_TEST_SHARED_LINK_LIBS
${BOOST_SYSTEM_LIBRARY}
${BOOST_FILESYSTEM_LIBRARY}
${BOOST_REGEX_LIBRARY}
- ${GTEST_MAIN_LIBRARY}
- ${GTEST_LIBRARY})
+ ${GTEST_LIBRARY}
+ ${GMOCK_MAIN_LIBRARY}
+ ${GMOCK_LIBRARY})
if(NOT MSVC)
set(ARROW_TEST_SHARED_LINK_LIBS
diff --git a/cpp/cmake_modules/FindGTest.cmake b/cpp/cmake_modules/FindGTest.cmake
index c7496c6..6ddb14a 100644
--- a/cpp/cmake_modules/FindGTest.cmake
+++ b/cpp/cmake_modules/FindGTest.cmake
@@ -21,8 +21,8 @@
# to be set before calling find_package:
#
# GTest_HOME - When set, this path is inspected instead of standard library
-# locations as the root of the GTest installation.
-# The environment variable GTEST_HOME overrides this veriable.
+# locations as the root of the GTest/Gmock installation.
+# The environment variable GTEST_HOME overrides this variable.
#
# This module defines
# GTEST_INCLUDE_DIR, directory containing headers
@@ -32,6 +32,14 @@
# GTEST_SHARED_LIB, path to libgtest's shared library
# GTEST_SHARED_MAIN_LIB, path to libgtest_main's shared library
# GTEST_FOUND, whether gtest has been found
+#
+# GMOCK_INCLUDE_DIR, directory containing headers
+# GMOCK_LIBS, directory containing gmock libraries
+# GMOCK_STATIC_LIB, path to libgmock.a
+# GMOCK_STATIC_MAIN_LIB, path to libgmock_main.a
+# GMOCK_SHARED_LIB, path to libgmock's shared library
+# GMOCK_SHARED_MAIN_LIB, path to libgmock_main's shared library
+# GMOCK_FOUND, whether gmock has been found
if( NOT "${GTEST_HOME}" STREQUAL "")
file( TO_CMAKE_PATH "${GTEST_HOME}" _native_path )
@@ -48,6 +56,15 @@ set(GTEST_SHARED_LIB_NAME
${CMAKE_SHARED_LIBRARY_PREFIX}gtest${CMAKE_SHARED_LIBRARY_SUFFIX})
set(GTEST_MAIN_SHARED_LIB_NAME
${CMAKE_SHARED_LIBRARY_PREFIX}gtest_main${CMAKE_SHARED_LIBRARY_SUFFIX})
+set(GMOCK_STATIC_LIB_NAME
+ ${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX})
+set(GMOCK_MAIN_STATIC_LIB_NAME
+ ${CMAKE_STATIC_LIBRARY_PREFIX}gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX})
+set(GMOCK_SHARED_LIB_NAME
+ ${CMAKE_SHARED_LIBRARY_PREFIX}gmock${CMAKE_SHARED_LIBRARY_SUFFIX})
+set(GMOCK_MAIN_SHARED_LIB_NAME
+ ${CMAKE_SHARED_LIBRARY_PREFIX}gmock_main${CMAKE_SHARED_LIBRARY_SUFFIX})
+
# Try the parameterized roots, if they exist
if(_gtest_roots)
@@ -78,6 +95,36 @@ else()
find_library(GTEST_MAIN_SHARED_LIB NAMES ${GTEST_MAIN_SHARED_LIB_NAME})
endif()
+# gmock
+# Try the parameterized roots, if they exist (reuse gtest because the
+# libraries should be built together).
+if(_gtest_roots)
+ find_path(GMOCK_INCLUDE_DIR NAMES gmock/gmock.h
+ PATHS ${_gtest_roots} NO_DEFAULT_PATH
+ PATH_SUFFIXES "include")
+ set(lib_dirs
+ "lib/${CMAKE_LIBRARY_ARCHITECTURE}"
+ "lib64"
+ "lib")
+ find_library(GMOCK_STATIC_LIB NAMES ${GMOCK_STATIC_LIB_NAME}
+ PATHS ${_gtest_roots} NO_DEFAULT_PATH
+ PATH_SUFFIXES ${lib_dirs})
+ find_library(GMOCK_MAIN_STATIC_LIB NAMES ${GMOCK_MAIN_STATIC_LIB_NAME}
+ PATHS ${_gtest_roots} NO_DEFAULT_PATH
+ PATH_SUFFIXES ${lib_dirs})
+ find_library(GMOCK_SHARED_LIB NAMES ${GMOCK_SHARED_LIB_NAME}
+ PATHS ${_gtest_roots} NO_DEFAULT_PATH
+ PATH_SUFFIXES ${lib_dirs})
+ find_library(GMOCK_MAIN_SHARED_LIB NAMES ${GMOCK_MAIN_SHARED_LIB_NAME}
+ PATHS ${_gtest_roots} NO_DEFAULT_PATH
+ PATH_SUFFIXES ${lib_dirs})
+else()
+ find_path(GMOCK_INCLUDE_DIR NAMES gmock/gmock.h)
+ find_library(GMOCK_STATIC_LIB NAMES ${GMOCK_STATIC_LIB_NAME})
+ find_library(GMOCK_MAIN_STATIC_LIB NAMES ${GMOCK_MAIN_STATIC_LIB_NAME})
+ find_library(GMOCK_SHARED_LIB NAMES ${GMOCK_SHARED_LIB_NAME})
+ find_library(GMOCK_MAIN_SHARED_LIB NAMES ${GMOCK_MAIN_SHARED_LIB_NAME})
+endif()
if(GTEST_INCLUDE_DIR AND
(GTEST_STATIC_LIB AND GTEST_MAIN_STATIC_LIB) OR
@@ -87,6 +134,14 @@ else()
set(GTEST_FOUND FALSE)
endif()
+if(GMOCK_INCLUDE_DIR AND
+ (GMOCK_STATIC_LIB AND GMOCK_MAIN_STATIC_LIB) OR
+ (GMOCK_SHARED_LIB AND GMOCK_MAIN_SHARED_LIB))
+ set(GMOCK_FOUND TRUE)
+else()
+ set(GMOCK_FOUND FALSE)
+endif()
+
if (GTEST_FOUND)
if (NOT GTest_FIND_QUIETLY)
message(STATUS "Found the GTest library:")
@@ -111,6 +166,33 @@ else ()
endif ()
endif ()
+if (GMOCK_FOUND)
+ if (NOT GTest_FIND_QUIETLY)
+ message(STATUS "Found the Gmock library:")
+ message(STATUS "GMOCK_STATIC_LIB: ${GMOCK_STATIC_LIB}")
+ message(STATUS "GMOCK_MAIN_STATIC_LIB: ${GMOCK_MAIN_STATIC_LIB}")
+ message(STATUS "GMOCK_SHARED_LIB: ${GMOCK_SHARED_LIB}")
+ message(STATUS "GMOCK_MAIN_SHARED_LIB: ${GMOCK_MAIN_SHARED_LIB}")
+ endif ()
+else ()
+ # Reuse Gtest quietly and required flags because they should be found
+ # in tandem.
+ if (NOT GTest_FIND_QUIETLY)
+ set(GMOCK_ERR_MSG "Could not find the GMock library. Looked in ")
+ if ( _gtest_roots )
+ set(GTEST_ERR_MSG "${GMOCK_ERR_MSG} in ${_gtest_roots}.")
+ else ()
+ set(GTEST_ERR_MSG "${GMOCK_ERR_MSG} system search paths.")
+ endif ()
+ if (GTest_FIND_REQUIRED)
+ message(FATAL_ERROR "${GMOCK_ERR_MSG}")
+ else (GTest_FIND_REQUIRED)
+ message(STATUS "${GMOCK_ERR_MSG}")
+ endif (GTest_FIND_REQUIRED)
+ endif ()
+endif ()
+
+
mark_as_advanced(
GTEST_INCLUDE_DIR
GTEST_LIBS
@@ -118,4 +200,11 @@ mark_as_advanced(
GTEST_MAIN_STATIC_LIB
GTEST_SHARED_LIB
GTEST_MAIN_SHARED_LIB
+
+ GMOCK_INCLUDE_DIR
+ GMOCK_LIBS
+ GMOCK_STATIC_LIB
+ GMOCK_MAIN_STATIC_LIB
+ GMOCK_SHARED_LIB
+ GMOCK_MAIN_SHARED_LIB
)
diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index fedeed4..ff22525 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake
+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake
@@ -30,6 +30,7 @@ set(ARROW_RE2_LINKAGE "static" CACHE STRING
set(THIRDPARTY_DIR "${arrow_SOURCE_DIR}/thirdparty")
+
if (NOT "$ENV{ARROW_BUILD_TOOLCHAIN}" STREQUAL "")
set(BROTLI_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
set(BZ2_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
@@ -39,9 +40,21 @@ if (NOT "$ENV{ARROW_BUILD_TOOLCHAIN}" STREQUAL "")
set(GFLAGS_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
set(GLOG_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
set(GRPC_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
- # Using gtest from the toolchain breaks AppVeyor builds
+ # Using gtest from the toolchain breaks AppVeyor and
+ # trusty builds
if (NOT MSVC)
- set(GTEST_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
+ if (APPLE)
+ set(GTEST_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
+ else()
+ #linux
+ execute_process(COMMAND lsb_release -cs
+ OUTPUT_VARIABLE RELEASE_CODENAME
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ if (NOT RELEASE_CODENAME STREQUAL "trusty")
+ set(GTEST_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
+ endif()
+ endif()
endif()
set(JEMALLOC_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
set(LZ4_HOME "$ENV{ARROW_BUILD_TOOLCHAIN}")
@@ -653,13 +666,19 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_BENCHMARKS)
set(GTEST_CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS}
"-DCMAKE_INSTALL_PREFIX=${GTEST_PREFIX}"
-DCMAKE_CXX_FLAGS=${GTEST_CMAKE_CXX_FLAGS})
+ set(GMOCK_INCLUDE_DIR "${GTEST_PREFIX}/include")
+ set(GMOCK_STATIC_LIB
+ "${GTEST_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ set(GMOCK_MAIN_STATIC_LIB
+ "${GTEST_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX}")
+
if (MSVC AND NOT ARROW_USE_STATIC_CRT)
set(GTEST_CMAKE_ARGS ${GTEST_CMAKE_ARGS} -Dgtest_force_shared_crt=ON)
endif()
ExternalProject_Add(googletest_ep
URL ${GTEST_SOURCE_URL}
- BUILD_BYPRODUCTS ${GTEST_STATIC_LIB} ${GTEST_MAIN_STATIC_LIB}
+ BUILD_BYPRODUCTS ${GTEST_STATIC_LIB} ${GTEST_MAIN_STATIC_LIB} ${GMOCK_STATIC_LIB} ${GMOCK_MAIN_STATIC_LIB}
CMAKE_ARGS ${GTEST_CMAKE_ARGS}
${EP_LOG_OPTIONS})
else()
@@ -668,28 +687,50 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_BENCHMARKS)
endif()
message(STATUS "GTest include dir: ${GTEST_INCLUDE_DIR}")
+ message(STATUS "GMock include dir: ${GMOCK_INCLUDE_DIR}")
include_directories(SYSTEM ${GTEST_INCLUDE_DIR})
+ # Conflicts in header files seem to either cause apple to have
+ # a bad boost symbol, or trusty to use CPP_TOOLCHAIN's header
+ # file for gmock (and the vendored version is 1.8.0 and conda is
+ # 1.8.1)
+ if (APPLE)
+ include_directories(SYSTEM ${GMOCK_INCLUDE_DIR})
+ else()
+ include_directories(BEFORE SYSTEM ${GMOCK_INCLUDE_DIR})
+ endif()
if(GTEST_STATIC_LIB)
message(STATUS "GTest static library: ${GTEST_STATIC_LIB}")
+ message(STATUS "GMock static library: ${GMOCK_STATIC_LIB}")
ADD_THIRDPARTY_LIB(gtest
STATIC_LIB ${GTEST_STATIC_LIB})
ADD_THIRDPARTY_LIB(gtest_main
STATIC_LIB ${GTEST_MAIN_STATIC_LIB})
+ ADD_THIRDPARTY_LIB(gmock
+ STATIC_LIB ${GMOCK_STATIC_LIB})
+ ADD_THIRDPARTY_LIB(gmock_main
+ STATIC_LIB ${GMOCK_MAIN_STATIC_LIB})
set(GTEST_LIBRARY gtest_static)
set(GTEST_MAIN_LIBRARY gtest_main_static)
+ set(GMOCK_LIBRARY gmock_static)
+ set(GMOCK_MAIN_LIBRARY gmock_main_static)
else()
message(STATUS "GTest shared library: ${GTEST_SHARED_LIB}")
+ message(STATUS "GMock shared library: ${GMOCK_SHARED_LIB}")
ADD_THIRDPARTY_LIB(gtest
SHARED_LIB ${GTEST_SHARED_LIB})
ADD_THIRDPARTY_LIB(gtest_main
SHARED_LIB ${GTEST_MAIN_SHARED_LIB})
set(GTEST_LIBRARY gtest_shared)
set(GTEST_MAIN_LIBRARY gtest_main_shared)
+ set(GMOCK_LIBRARY gmock_shared)
+ set(GMOCK_MAIN_LIBRARY gmock_main_shared)
endif()
if(GTEST_VENDORED)
add_dependencies(${GTEST_LIBRARY} googletest_ep)
add_dependencies(${GTEST_MAIN_LIBRARY} googletest_ep)
+ add_dependencies(${GMOCK_LIBRARY} googletest_ep)
+ add_dependencies(${GMOCK_MAIN_LIBRARY} googletest_ep)
endif()
endif()
diff --git a/cpp/src/arrow/compute/compute-test.cc b/cpp/src/arrow/compute/compute-test.cc
index 8129441..f850a29 100644
--- a/cpp/src/arrow/compute/compute-test.cc
+++ b/cpp/src/arrow/compute/compute-test.cc
@@ -71,15 +71,8 @@ TEST(TestDatum, ImplicitConstructors) {
class TestInvokeBinaryKernel : public ComputeFixture, public TestBase {};
-class DummyBinaryKernel : public BinaryKernel {
- Status Call(FunctionContext* ctx, const Datum& left, const Datum& right,
- Datum* out) override {
- return Status::OK();
- }
-};
-
TEST_F(TestInvokeBinaryKernel, Exceptions) {
- DummyBinaryKernel kernel;
+ MockBinaryKernel kernel;
std::vector<Datum> outputs;
std::shared_ptr<Table> table;
vector<bool> values1 = {true, false, true};
diff --git a/cpp/src/arrow/compute/test-util.h b/cpp/src/arrow/compute/test-util.h
index e2bda69..b406a71 100644
--- a/cpp/src/arrow/compute/test-util.h
+++ b/cpp/src/arrow/compute/test-util.h
@@ -21,11 +21,14 @@
#include <memory>
#include <vector>
+#include <gmock/gmock.h>
+
#include "arrow/array.h"
#include "arrow/memory_pool.h"
#include "arrow/type.h"
#include "arrow/compute/context.h"
+#include "arrow/compute/kernel.h"
namespace arrow {
namespace compute {
@@ -38,6 +41,16 @@ class ComputeFixture {
FunctionContext ctx_;
};
+class MockUnaryKernel : public UnaryKernel {
+ public:
+ MOCK_METHOD3(Call, Status(FunctionContext* ctx, const Datum& input, Datum* out));
+};
+
+class MockBinaryKernel : public BinaryKernel {
+ MOCK_METHOD4(Call, Status(FunctionContext* ctx, const Datum& left, const Datum& right,
+ Datum* out));
+};
+
template <typename Type, typename T>
std::shared_ptr<Array> _MakeArray(const std::shared_ptr<DataType>& type,
const std::vector<T>& values,
diff --git a/python/manylinux1/scripts/build_gtest.sh b/python/manylinux1/scripts/build_gtest.sh
index 5b29f5e..723b59b 100755
--- a/python/manylinux1/scripts/build_gtest.sh
+++ b/python/manylinux1/scripts/build_gtest.sh
@@ -25,13 +25,13 @@ pushd googletest-release-${GTEST_VERSION}
mkdir build_so
pushd build_so
-cmake -DCMAKE_CXX_FLAGS='-fPIC' -Dgtest_force_shared_crt=ON -DBUILD_SHARED_LIBS=ON -DBUILD_GMOCK=OFF -GNinja -DCMAKE_INSTALL_PREFIX=/usr ..
+cmake -DCMAKE_CXX_FLAGS='-fPIC' -Dgtest_force_shared_crt=ON -DBUILD_SHARED_LIBS=ON -DBUILD_GMOCK=ON -GNinja -DCMAKE_INSTALL_PREFIX=/usr ..
ninja install
popd
mkdir build_a
pushd build_a
-cmake -DCMAKE_CXX_FLAGS='-fPIC' -Dgtest_force_shared_crt=ON -DBUILD_SHARED_LIBS=OFF -DBUILD_GMOCK=OFF -GNinja -DCMAKE_INSTALL_PREFIX=/usr ..
+cmake -DCMAKE_CXX_FLAGS='-fPIC' -Dgtest_force_shared_crt=ON -DBUILD_SHARED_LIBS=OFF -DBUILD_GMOCK=ON -GNinja -DCMAKE_INSTALL_PREFIX=/usr ..
ninja install
popd