feature(testing-automation): unit tests with Google Framework (#3273)

This commit is contained in:
Francesco Borzì
2020-08-15 22:34:45 +02:00
committed by GitHub
parent 4d11f5c921
commit c2b40b126d
13 changed files with 132 additions and 11 deletions

View File

@@ -42,6 +42,8 @@ jobs:
run: source ./apps/ci/ci-worldserver-dry-run.sh run: source ./apps/ci/ci-worldserver-dry-run.sh
- name: Check startup errors - name: Check startup errors
run: source ./apps/ci/ci-error-check.sh run: source ./apps/ci/ci-error-check.sh
- name: Run unit tests
run: source ./apps/ci/ci-run-unit-tests.sh
docker-build: docker-build:
strategy: strategy:

1
.gitignore vendored
View File

@@ -61,6 +61,7 @@ nbproject/
.vscode .vscode
.idea .idea
cmake-build-debug/* cmake-build-debug/*
cmake-build-debug-coverage/*
# #
# Eclipse # Eclipse

View File

@@ -33,8 +33,8 @@ set(AC_PATH_ROOT "${CMAKE_SOURCE_DIR}")
# set macro-directory # set macro-directory
list(APPEND CMAKE_MODULE_PATH list(APPEND CMAKE_MODULE_PATH
"${CMAKE_SOURCE_DIR}/src/cmake/macros" "${CMAKE_SOURCE_DIR}/src/cmake/macros"
"${CMAKE_SOURCE_DIR}/deps/cotire/CMake") "${CMAKE_SOURCE_DIR}/deps/cotire/CMake")
include(CheckCXXSourceRuns) include(CheckCXXSourceRuns)
include(CheckIncludeFiles) include(CheckIncludeFiles)
@@ -49,7 +49,7 @@ include(conf/dist/config.cmake)
# load custom configurations for cmake if exists # load custom configurations for cmake if exists
if(EXISTS "${CMAKE_SOURCE_DIR}/conf/config.cmake") if(EXISTS "${CMAKE_SOURCE_DIR}/conf/config.cmake")
include(conf/config.cmake) include(conf/config.cmake)
endif() endif()
# #
@@ -63,7 +63,7 @@ FOREACH(subdir ${sub_DIRS})
get_filename_component(MODULENAME ${subdir} NAME) get_filename_component(MODULENAME ${subdir} NAME)
if (";${DISABLED_AC_MODULES};" MATCHES ";${MODULENAME};") if (";${DISABLED_AC_MODULES};" MATCHES ";${MODULENAME};")
continue() continue()
endif() endif()
STRING(REGEX REPLACE "^${CMAKE_SOURCE_DIR}/" "" subdir_rel ${subdir}) STRING(REGEX REPLACE "^${CMAKE_SOURCE_DIR}/" "" subdir_rel ${subdir})
@@ -77,13 +77,13 @@ CU_RUN_HOOK("AFTER_LOAD_CONF")
# build in Release-mode by default if not explicitly set # build in Release-mode by default if not explicitly set
if( NOT CMAKE_BUILD_TYPE ) if( NOT CMAKE_BUILD_TYPE )
set(CMAKE_BUILD_TYPE "Release") set(CMAKE_BUILD_TYPE "Release")
endif() endif()
# turn off PCH totally if enabled (hidden setting, mainly for devs) # turn off PCH totally if enabled (hidden setting, mainly for devs)
if( NOPCH ) if( NOPCH )
set(USE_COREPCH 0) set(USE_COREPCH 0)
set(USE_SCRIPTPCH 0) set(USE_SCRIPTPCH 0)
endif() endif()
include(ConfigureBaseTargets) include(ConfigureBaseTargets)
@@ -101,11 +101,11 @@ find_package(ACE REQUIRED)
find_package(MySQL REQUIRED) find_package(MySQL REQUIRED)
if(UNIX AND WITH_PERFTOOLS) if(UNIX AND WITH_PERFTOOLS)
find_package(Gperftools) find_package(Gperftools)
endif() endif()
if(NOT WITHOUT_GIT) if(NOT WITHOUT_GIT)
find_package(Git) find_package(Git)
endif() endif()
# Find revision ID and hash of the sourcetree # Find revision ID and hash of the sourcetree
@@ -121,11 +121,11 @@ include(src/cmake/showoptions.cmake)
add_subdirectory(deps) add_subdirectory(deps)
if( SERVERS OR TOOLS) if( SERVERS OR TOOLS)
add_subdirectory(src/common) add_subdirectory(src/common)
endif() endif()
if( TOOLS ) if( TOOLS )
add_subdirectory(src/tools) add_subdirectory(src/tools)
endif() endif()
# #
@@ -138,3 +138,19 @@ CU_RUN_HOOK("BEFORE_SRC_LOAD")
add_subdirectory(src) add_subdirectory(src)
CU_RUN_HOOK("AFTER_SRC_LOAD") CU_RUN_HOOK("AFTER_SRC_LOAD")
if( UNIT_TESTS )
# we use this to get code coverage
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
endif()
include(src/cmake/googletest.cmake)
fetch_googletest(
${PROJECT_SOURCE_DIR}/src/cmake
${PROJECT_BINARY_DIR}/googletest
)
enable_testing()
add_subdirectory(src/test)
endif()

View File

@@ -8,6 +8,7 @@ CWARNINGS=ON
CDEBUG=OFF CDEBUG=OFF
CTYPE=Release CTYPE=Release
CSCRIPTS=ON CSCRIPTS=ON
CUNIT_TESTS=ON
CSERVERS=ON CSERVERS=ON
CTOOLS=ON CTOOLS=ON
CSCRIPTPCH=OFF CSCRIPTPCH=OFF

3
apps/ci/ci-run-unit-tests.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
time /home/runner/work/azerothcore-wotlk/azerothcore-wotlk/var/build/obj/src/test/unit_tests

View File

@@ -35,6 +35,7 @@ function comp_configure() {
cmake $SRCPATH -DCMAKE_INSTALL_PREFIX=$BINPATH $DCONF -DSERVERS=$CSERVERS \ cmake $SRCPATH -DCMAKE_INSTALL_PREFIX=$BINPATH $DCONF -DSERVERS=$CSERVERS \
-DSCRIPTS=$CSCRIPTS \ -DSCRIPTS=$CSCRIPTS \
-DUNIT_TESTS=$CUNIT_TESTS \
-DTOOLS=$CTOOLS -DUSE_SCRIPTPCH=$CSCRIPTPCH -DUSE_COREPCH=$CCOREPCH -DWITH_COREDEBUG=$CDEBUG -DCMAKE_BUILD_TYPE=$CTYPE -DWITH_WARNINGS=$CWARNINGS \ -DTOOLS=$CTOOLS -DUSE_SCRIPTPCH=$CSCRIPTPCH -DUSE_COREPCH=$CCOREPCH -DWITH_COREDEBUG=$CDEBUG -DCMAKE_BUILD_TYPE=$CTYPE -DWITH_WARNINGS=$CWARNINGS \
-DCMAKE_C_COMPILER=$CCOMPILERC -DCMAKE_CXX_COMPILER=$CCOMPILERCXX "-DDISABLED_AC_MODULES=$CDISABLED_AC_MODULES" $CCUSTOMOPTIONS -DCMAKE_C_COMPILER=$CCOMPILERC -DCMAKE_CXX_COMPILER=$CCOMPILERCXX "-DDISABLED_AC_MODULES=$CDISABLED_AC_MODULES" $CCUSTOMOPTIONS

View File

@@ -1,5 +1,6 @@
option(SERVERS "Build worldserver and authserver" 1) option(SERVERS "Build worldserver and authserver" 1)
option(SCRIPTS "Build core with scripts included" 1) option(SCRIPTS "Build core with scripts included" 1)
option(UNIT_TESTS "Build unit tests" 0)
option(TOOLS "Build map/vmap/mmap extraction/assembler tools" 0) option(TOOLS "Build map/vmap/mmap extraction/assembler tools" 0)
option(USE_SCRIPTPCH "Use precompiled headers when compiling scripts" 1) option(USE_SCRIPTPCH "Use precompiled headers when compiling scripts" 1)
option(USE_COREPCH "Use precompiled headers when compiling servers" 1) option(USE_COREPCH "Use precompiled headers when compiling servers" 1)

2
conf/dist/config.sh vendored
View File

@@ -47,6 +47,8 @@ CDEBUG=OFF
CTYPE=Release CTYPE=Release
# compile scripts # compile scripts
CSCRIPTS=ON CSCRIPTS=ON
# compile unit tests
CUNIT_TESTS=OFF
# compile server # compile server
CSERVERS=ON CSERVERS=ON
# compile tools # compile tools

View File

@@ -0,0 +1,20 @@
# code copied from https://crascit.com/2015/07/25/cmake-gtest/
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(googletest-download NONE)
include(ExternalProject)
ExternalProject_Add(
googletest
SOURCE_DIR "@GOOGLETEST_DOWNLOAD_ROOT@/googletest-src"
BINARY_DIR "@GOOGLETEST_DOWNLOAD_ROOT@/googletest-build"
GIT_REPOSITORY
https://github.com/google/googletest.git
GIT_TAG
release-1.10.0
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)

View File

@@ -0,0 +1,32 @@
# the following code to fetch googletest
# is inspired by and adapted after https://crascit.com/2015/07/25/cmake-gtest/
# download and unpack googletest at configure time
macro(fetch_googletest _download_module_path _download_root)
set(GOOGLETEST_DOWNLOAD_ROOT ${_download_root})
configure_file(
${_download_module_path}/googletest-download.cmake
${_download_root}/CMakeLists.txt
@ONLY
)
unset(GOOGLETEST_DOWNLOAD_ROOT)
execute_process(
COMMAND
"${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
WORKING_DIRECTORY
${_download_root}
)
execute_process(
COMMAND
"${CMAKE_COMMAND}" --build .
WORKING_DIRECTORY
${_download_root}
)
# adds the targers: gtest, gtest_main, gmock, gmock_main
add_subdirectory(
${_download_root}/googletest-src
${_download_root}/googletest-build
)
endmacro()

View File

@@ -40,6 +40,12 @@ else()
message("* Build map/vmap tools : No (default)") message("* Build map/vmap tools : No (default)")
endif() endif()
if( UNIT_TESTS )
message("* Build unit tests : Yes")
else()
message("* Build unit tests : No (default)")
endif()
if( USE_COREPCH ) if( USE_COREPCH )
message("* Build core w/PCH : Yes (default)") message("* Build core w/PCH : Yes (default)")
else() else()

23
src/test/CMakeLists.txt Normal file
View File

@@ -0,0 +1,23 @@
CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE_SOURCES
)
add_executable(
unit_tests
${PRIVATE_SOURCES}
)
target_link_libraries(
unit_tests
gtest_main
game
game-interface
)
add_test(
NAME
unit
COMMAND
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/unit_tests
)

View File

@@ -0,0 +1,13 @@
#include "gtest/gtest.h"
#include "Formulas.h"
TEST(FormulasTest, hk_honor_at_level)
{
EXPECT_EQ(acore::Honor::hk_honor_at_level(80), 124);
EXPECT_EQ(acore::Honor::hk_honor_at_level(80, 2), 248);
EXPECT_EQ(acore::Honor::hk_honor_at_level(80, 0.5), 62);
EXPECT_EQ(acore::Honor::hk_honor_at_level(1), 2);
EXPECT_EQ(acore::Honor::hk_honor_at_level(1, 10), 16);
EXPECT_EQ(acore::Honor::hk_honor_at_level(2), 4);
EXPECT_EQ(acore::Honor::hk_honor_at_level(3), 5);
}