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