GoogleTest - Google Testing and Mocking Framework (grpc protobuff依赖)
https://google.github.io/googletest/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
351 lines
14 KiB
351 lines
14 KiB
#!/usr/bin/python2.4 |
|
# |
|
# Copyright 2008 Google Inc. All Rights Reserved. |
|
# |
|
# Redistribution and use in source and binary forms, with or without |
|
# modification, are permitted provided that the following conditions are |
|
# met: |
|
# |
|
# * Redistributions of source code must retain the above copyright |
|
# notice, this list of conditions and the following disclaimer. |
|
# * Redistributions in binary form must reproduce the above |
|
# copyright notice, this list of conditions and the following disclaimer |
|
# in the documentation and/or other materials provided with the |
|
# distribution. |
|
# * Neither the name of Google Inc. nor the names of its |
|
# contributors may be used to endorse or promote products derived from |
|
# this software without specific prior written permission. |
|
# |
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
|
|
"""Builds the Google Test (gtest) lib; this is for Windows projects |
|
using SCons and can probably be easily extended for cross-platform |
|
SCons builds. The compilation settings from your project will be used, |
|
with some specific flags required for gtest added. |
|
|
|
You should be able to call this file from more or less any SConscript |
|
file. |
|
|
|
You can optionally set a variable on the construction environment to |
|
have the unit test executables copied to your output directory. The |
|
variable should be env['EXE_OUTPUT']. |
|
|
|
Another optional variable is env['LIB_OUTPUT']. If set, the generated |
|
libraries are copied to the folder indicated by the variable. |
|
|
|
If you place the gtest sources within your own project's source |
|
directory, you should be able to call this SConscript file simply as |
|
follows: |
|
|
|
# -- cut here -- |
|
# Build gtest library; first tell it where to copy executables. |
|
env['EXE_OUTPUT'] = '#/mybuilddir/mybuildmode' # example, optional |
|
env['LIB_OUTPUT'] = '#/mybuilddir/mybuildmode/lib' |
|
env.SConscript('whateverpath/gtest/scons/SConscript') |
|
# -- cut here -- |
|
|
|
If on the other hand you place the gtest sources in a directory |
|
outside of your project's source tree, you would use a snippet similar |
|
to the following: |
|
|
|
# -- cut here -- |
|
|
|
# The following assumes that $BUILD_DIR refers to the root of the |
|
# directory for your current build mode, e.g. "#/mybuilddir/mybuildmode" |
|
|
|
# Build gtest library; as it is outside of our source root, we need to |
|
# tell SCons that the directory it will refer to as |
|
# e.g. $BUILD_DIR/gtest is actually on disk in original form as |
|
# ../../gtest (relative to your project root directory). Recall that |
|
# SCons by default copies all source files into the build directory |
|
# before building. |
|
gtest_dir = env.Dir('$BUILD_DIR/gtest') |
|
|
|
# Modify this part to point to gtest relative to the current |
|
# SConscript or SConstruct file's directory. The ../.. path would |
|
# be different per project, to locate the base directory for gtest. |
|
gtest_dir.addRepository(env.Dir('../../gtest')) |
|
|
|
# Tell the gtest SCons file where to copy executables. |
|
env['EXE_OUTPUT'] = '$BUILD_DIR' # example, optional |
|
|
|
# Call the gtest SConscript to build gtest.lib and unit tests. The |
|
# location of the library should end up as |
|
# '$BUILD_DIR/gtest/scons/gtest.lib' |
|
env.SConscript(env.File('scons/SConscript', gtest_dir)) |
|
|
|
# -- cut here -- |
|
""" |
|
|
|
|
|
__author__ = 'joi@google.com (Joi Sigurdsson)' |
|
|
|
|
|
import os |
|
|
|
############################################################ |
|
# Environments for building the targets, sorted by name. |
|
|
|
Import('env') |
|
env = env.Clone() |
|
|
|
# Include paths to gtest headers are relative to either the gtest |
|
# directory or the 'include' subdirectory of it, and this SConscript |
|
# file is one directory deeper than the gtest directory. |
|
env.Prepend(CPPPATH = ['#/..', |
|
'#/../include']) |
|
|
|
env_use_own_tuple = env.Clone() |
|
env_use_own_tuple.Append(CPPDEFINES = 'GTEST_USE_OWN_TR1_TUPLE=1') |
|
|
|
env_with_exceptions = env.Clone() |
|
if env_with_exceptions['PLATFORM'] == 'win32': |
|
env_with_exceptions.Append(CCFLAGS=['/EHsc']) |
|
env_with_exceptions.Append(CPPDEFINES='_HAS_EXCEPTIONS=1') |
|
cppdefines = env_with_exceptions['CPPDEFINES'] |
|
# Undoes the _TYPEINFO_ hack, which is unnecessary and only creates |
|
# trouble when exceptions are enabled. |
|
if '_TYPEINFO_' in cppdefines: |
|
cppdefines.remove('_TYPEINFO_') |
|
if '_HAS_EXCEPTIONS=0' in cppdefines: |
|
cppdefines.remove('_HAS_EXCEPTIONS=0') |
|
else: |
|
env_with_exceptions.Append(CCFLAGS='-fexceptions') |
|
ccflags = env_with_exceptions['CCFLAGS'] |
|
if '-fno-exceptions' in ccflags: |
|
ccflags.remove('-fno-exceptions') |
|
|
|
# We need to disable some optimization flags for some tests on |
|
# Windows; otherwise the redirection of stdout does not work |
|
# (apparently because of a compiler bug). |
|
env_with_less_optimization = env.Clone() |
|
if env_with_less_optimization['PLATFORM'] == 'win32': |
|
linker_flags = env_with_less_optimization['LINKFLAGS'] |
|
for flag in ['/O1', '/Os', '/Og', '/Oy']: |
|
if flag in linker_flags: |
|
linker_flags.remove(flag) |
|
|
|
# Assuming POSIX-like environment with GCC. |
|
# TODO(vladl@google.com): sniff presence of pthread_atfork instead of |
|
# selecting on a platform. |
|
env_with_threads = env.Clone() |
|
if env_with_threads['PLATFORM'] != 'win32': |
|
env_with_threads.Append(CCFLAGS=['-pthread']) |
|
env_with_threads.Append(LINKFLAGS=['-pthread']) |
|
|
|
env_without_rtti = env.Clone() |
|
if env_without_rtti['PLATFORM'] == 'win32': |
|
env_without_rtti.Append(CCFLAGS=['/GR-']) |
|
else: |
|
env_without_rtti.Append(CCFLAGS=['-fno-rtti']) |
|
env_without_rtti.Append(CPPDEFINES='GTEST_HAS_RTTI=0') |
|
|
|
############################################################ |
|
# Helpers for creating build targets. |
|
|
|
|
|
def GtestObject(build_env, source, obj_suffix=None): |
|
"""Returns a target to build an object file from the given .cc source file. |
|
|
|
When obj_suffix is provided, appends it to the end of the object |
|
file base name. |
|
""" |
|
if obj_suffix: |
|
obj_suffix = '_' + obj_suffix |
|
else: |
|
obj_suffix = '' |
|
|
|
return build_env.Object( |
|
target=os.path.basename(source).rstrip('.cc') + obj_suffix, |
|
source=source) |
|
|
|
|
|
def GtestStaticLibrary(build_env, lib_target, sources, obj_suffix=None): |
|
"""Returns a target to build the given static library from sources.""" |
|
if obj_suffix: |
|
srcs = [GtestObject(build_env, src, obj_suffix) for src in sources] |
|
else: |
|
srcs = sources |
|
return build_env.StaticLibrary(target=lib_target, source=srcs) |
|
|
|
|
|
def GtestBinary(build_env, target, gtest_lib, sources, obj_suffix=None): |
|
"""Creates a target to build a binary (either test or sample). |
|
|
|
Args: |
|
build_env: The SCons construction environment to use to build. |
|
target: The basename of the target's main source file, also used as the |
|
target name. |
|
gtest_lib: The gtest library to use. |
|
sources: A list of source files in the target. |
|
obj_suffix: A suffix to append to all object file's basenames. |
|
""" |
|
if obj_suffix: |
|
srcs = [] # The object targets corresponding to sources. |
|
for src in sources: |
|
if type(src) is str: |
|
srcs.append(GtestObject(build_env, src, obj_suffix)) |
|
else: |
|
srcs.append(src) |
|
else: |
|
srcs = sources |
|
|
|
if gtest_lib: |
|
gtest_libs=[gtest_lib] |
|
else: |
|
gtest_libs=[] |
|
binary = build_env.Program(target=target, source=srcs, LIBS=gtest_libs) |
|
if 'EXE_OUTPUT' in build_env.Dictionary(): |
|
build_env.Install('$EXE_OUTPUT', source=[binary]) |
|
|
|
|
|
def GtestTest(build_env, target, gtest_lib, additional_sources=None): |
|
"""Creates a target to build the given test. |
|
|
|
Args: |
|
build_env: The SCons construction environment to use to build. |
|
target: The basename of the target test .cc file. |
|
gtest_lib: The gtest lib to use. |
|
additional_sources: A list of additional source files in the target. |
|
""" |
|
GtestBinary(build_env, target, gtest_lib, |
|
['../test/%s.cc' % target] + (additional_sources or [])) |
|
|
|
|
|
def GtestSample(build_env, target, gtest_lib, additional_sources=None): |
|
"""Creates a target to build the given sample. |
|
|
|
Args: |
|
build_env: The SCons construction environment to use to build. |
|
target: The basename of the target sample .cc file. |
|
gtest_lib: The gtest lib to use. |
|
additional_sources: A list of additional source files in the target. |
|
""" |
|
GtestBinary(build_env, target, gtest_lib, |
|
['../samples/%s.cc' % target] + (additional_sources or [])) |
|
|
|
############################################################ |
|
# Object and library targets. |
|
|
|
# Sources used by base library and library that includes main. |
|
gtest_source = '../src/gtest-all.cc' |
|
gtest_main_source = '../src/gtest_main.cc' |
|
|
|
gtest_main_obj = GtestObject(env, gtest_main_source) |
|
gtest_unittest_obj = GtestObject(env, '../test/gtest_unittest.cc') |
|
|
|
# gtest.lib to be used by most apps (if you have your own main |
|
# function). |
|
gtest = env.StaticLibrary(target='gtest', |
|
source=[gtest_source]) |
|
|
|
# gtest_main.lib can be used if you just want a basic main function; |
|
# it is also used by some tests for Google Test itself. |
|
gtest_main = env.StaticLibrary(target='gtest_main', |
|
source=[gtest_source, gtest_main_obj]) |
|
|
|
gtest_ex = GtestStaticLibrary( |
|
env_with_exceptions, 'gtest_ex', [gtest_source], obj_suffix='ex') |
|
gtest_ex_main = GtestStaticLibrary( |
|
env_with_exceptions, 'gtest_ex_main', [gtest_source, gtest_main_source], |
|
obj_suffix='ex') |
|
|
|
gtest_use_own_tuple_main = GtestStaticLibrary( |
|
env_use_own_tuple, 'gtest_use_own_tuple_main', |
|
[gtest_source, gtest_main_source], |
|
obj_suffix='use_own_tuple') |
|
|
|
# Install the libraries if needed. |
|
if 'LIB_OUTPUT' in env.Dictionary(): |
|
env.Install('$LIB_OUTPUT', source=[gtest, gtest_main, gtest_ex_main]) |
|
|
|
############################################################ |
|
# Test targets using the standard environment. |
|
|
|
GtestTest(env, 'gtest-filepath_test', gtest_main) |
|
GtestTest(env, 'gtest-message_test', gtest_main) |
|
GtestTest(env, 'gtest-options_test', gtest_main) |
|
GtestTest(env, 'gtest_environment_test', gtest) |
|
GtestTest(env, 'gtest_main_unittest', gtest_main) |
|
GtestTest(env, 'gtest_no_test_unittest', gtest) |
|
GtestTest(env, 'gtest_pred_impl_unittest', gtest_main) |
|
GtestTest(env, 'gtest_prod_test', gtest_main, |
|
additional_sources=['../test/production.cc']) |
|
GtestTest(env, 'gtest_repeat_test', gtest) |
|
GtestTest(env, 'gtest_sole_header_test', gtest_main) |
|
GtestTest(env, 'gtest-test-part_test', gtest_main) |
|
GtestTest(env, 'gtest-typed-test_test', gtest_main, |
|
additional_sources=['../test/gtest-typed-test2_test.cc']) |
|
GtestTest(env, 'gtest-param-test_test', gtest, |
|
additional_sources=['../test/gtest-param-test2_test.cc']) |
|
GtestTest(env, 'gtest_color_test_', gtest) |
|
GtestTest(env, 'gtest-linked_ptr_test', gtest_main) |
|
GtestTest(env, 'gtest-port_test', gtest_main) |
|
GtestTest(env, 'gtest_break_on_failure_unittest_', gtest) |
|
GtestTest(env, 'gtest_filter_unittest_', gtest) |
|
GtestTest(env, 'gtest_help_test_', gtest_main) |
|
GtestTest(env, 'gtest_list_tests_unittest_', gtest) |
|
GtestTest(env, 'gtest_throw_on_failure_test_', gtest) |
|
GtestTest(env, 'gtest_xml_outfile1_test_', gtest_main) |
|
GtestTest(env, 'gtest_xml_outfile2_test_', gtest_main) |
|
GtestTest(env, 'gtest_xml_output_unittest_', gtest_main) |
|
|
|
GtestBinary(env, 'gtest_unittest', gtest_main, [gtest_unittest_obj]) |
|
|
|
############################################################ |
|
# Tests targets using custom environments. |
|
|
|
GtestTest(env_with_exceptions, 'gtest_output_test_', gtest_ex) |
|
GtestTest(env_with_exceptions, 'gtest_throw_on_failure_ex_test', gtest_ex) |
|
GtestTest(env_with_threads, 'gtest-death-test_test', gtest_main) |
|
GtestTest(env_with_less_optimization, 'gtest_env_var_test_', gtest) |
|
GtestTest(env_with_less_optimization, 'gtest_uninitialized_test_', gtest) |
|
|
|
GtestBinary(env_use_own_tuple, 'gtest-tuple_test', gtest_use_own_tuple_main, |
|
['../test/gtest-tuple_test.cc'], |
|
obj_suffix='use_own_tuple') |
|
GtestBinary(env_use_own_tuple, 'gtest_use_own_tuple_test', |
|
gtest_use_own_tuple_main, |
|
['../test/gtest-param-test_test.cc', |
|
'../test/gtest-param-test2_test.cc'], |
|
obj_suffix='use_own_tuple') |
|
GtestBinary(env_with_exceptions, 'gtest_ex_unittest', gtest_ex_main, |
|
['../test/gtest_unittest.cc'], obj_suffix='ex') |
|
GtestBinary(env_without_rtti, 'gtest_no_rtti_test', None, |
|
['../test/gtest_unittest.cc', gtest_source, gtest_main_source], |
|
obj_suffix='no_rtti') |
|
|
|
############################################################ |
|
# Sample targets. |
|
|
|
# Use the GTEST_BUILD_SAMPLES build variable to control building of samples. |
|
# In your SConstruct file, add |
|
# vars = Variables() |
|
# vars.Add(BoolVariable('GTEST_BUILD_SAMPLES', 'Build samples', True)) |
|
# my_environment = Environment(variables = vars, ...) |
|
# Then, in the command line use GTEST_BUILD_SAMPLES=true to enable them. |
|
if env.get('GTEST_BUILD_SAMPLES', False): |
|
sample1_obj = env.Object('../samples/sample1.cc') |
|
GtestSample(env, 'sample1_unittest', gtest_main, |
|
additional_sources=[sample1_obj]) |
|
GtestSample(env, 'sample2_unittest', gtest_main, |
|
additional_sources=['../samples/sample2.cc']) |
|
GtestSample(env, 'sample3_unittest', gtest_main) |
|
GtestSample(env, 'sample4_unittest', gtest_main, |
|
additional_sources=['../samples/sample4.cc']) |
|
GtestSample(env, 'sample5_unittest', gtest_main, |
|
additional_sources=[sample1_obj]) |
|
GtestSample(env, 'sample6_unittest', gtest_main) |
|
GtestSample(env, 'sample7_unittest', gtest_main) |
|
GtestSample(env, 'sample8_unittest', gtest_main)
|
|
|