Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Coverage #2

Open
wants to merge 28 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8eafe76
cmake: Add a coverage module
HaoZeke Feb 20, 2020
4064a37
nix: Add lcov
HaoZeke Feb 20, 2020
edfe2a9
prj: Init coverage
HaoZeke Mar 11, 2020
1de124c
nix: Update nix system
HaoZeke Mar 11, 2020
71733bb
Merge branch 'master' into coverage
HaoZeke Mar 11, 2020
c896360
coverage: Kill nix and tests
HaoZeke Mar 12, 2020
a370c11
travis: Run cachix only on master
HaoZeke Mar 12, 2020
253d9a1
cmake: Don't kill coverage files after generation
HaoZeke Mar 12, 2020
600df6a
travis: Upload coverage metrics
HaoZeke Mar 12, 2020
a97ac16
travis: Disable safelist for now
HaoZeke Mar 12, 2020
38f552e
travis: Cache nix
HaoZeke Mar 12, 2020
71b03ab
travis: Add local lcov and gcov
HaoZeke Mar 12, 2020
5af0b27
travis: Specialize doxygen to master only
HaoZeke Mar 12, 2020
1af919f
travis: More master only work
HaoZeke Mar 12, 2020
39ec6ca
travis: Use native nix specialize master builds
HaoZeke Mar 12, 2020
5e2fbf4
script: Make an executable script
HaoZeke Mar 12, 2020
aa24ec7
travis: Run shell script in a pure environment
HaoZeke Mar 12, 2020
5fa2b8a
travis: Get the path right
HaoZeke Mar 12, 2020
717dc6c
cmake: Gcov is there
HaoZeke Mar 12, 2020
767af1e
cmake: Refactor coverage
HaoZeke Mar 12, 2020
2cc9527
travis: Try without success
HaoZeke Mar 12, 2020
ea8bb88
travis: Refactor to run coverage everywhere
HaoZeke Mar 12, 2020
7b6bc0e
travis: Be explicit about caches
HaoZeke Mar 12, 2020
34c0bee
readme: Add codecov badge
HaoZeke Mar 12, 2020
d3f2da6
travis: Update caching as per the wiki
HaoZeke Mar 12, 2020
6a10e78
travis: Forcefully add the main cache
HaoZeke Mar 12, 2020
6d9d26a
travis: Fix typo
HaoZeke Mar 12, 2020
2057841
Revert "cmake: Refactor coverage"
HaoZeke Mar 12, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 31 additions & 6 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,42 @@
branches:
only:
- master
# branches:
# only:
# - master
jobs:
include:
- language: nix
- name: getCoverage
language: nix
install:
- nix-env -i lcov
script:
# - nix-build .
- nix-shell --pure --run ./scripts/mkCoverage.sh
- bash <(curl -s https://codecov.io/bash) -f shellBuild/coverage.info.cleaned || echo "Codecov did not collect coverage reports"
cache:
directories:
- $HOME/nix.store
- /nix/
before_install:
- sudo mkdir -p /etc/nix
- echo "substituters = https://cache.nixos.org/ file://$HOME/nix.store" | sudo tee -a /etc/nix/nix.conf > /dev/null
- echo 'require-sigs = false' | sudo tee -a /etc/nix/nix.conf > /dev/null
before_cache:
- mkdir -p $HOME/nix.store
- nix copy --to file://$HOME/nix.store -f default.nix buildInputs
- name: runCachix
if: branch = master
language: nix
install:
- nix-env -i lcov
- "nix-env -iA cachix -f https://cachix.org/api/v1/install"
script:
- cachix use dseams
- cachix push dseams --watch-store&
- then cachix push dseams --watch-store&
HaoZeke marked this conversation as resolved.
Show resolved Hide resolved
- nix-build .
- sleep 30s # wait for the cachix push to complete
- language: python
cache: nix
- name: docBuilder
if: branch = master
language: python
python: "3.6"
before_install:
- cp scripts/ci/texlive.profile $HOME/texlive.profile
Expand Down
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,8 @@ add_subdirectory(src)
# # Install runtime data
# install(DIRECTORY ${PROJECT_SOURCE_DIR}/data DESTINATION ${INSTALL_DATA} COMPONENT runtime)

set(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
set(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
Comment on lines +236 to +237
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps this should be only set for the Debug builds?

#
# Dependency Management
#
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

[![Build Status](https://travis-ci.org/d-SEAMS/seams-core.svg?branch=master)](https://travis-ci.org/d-SEAMS/seams-core)
[![built with nix](https://builtwithnix.org/badge.svg)](https://builtwithnix.org)
[![codecov](https://codecov.io/gh/d-SEAMS/seams-core/branch/master/graph/badge.svg)](https://codecov.io/gh/d-SEAMS/seams-core)

- Check our build status [here](https://travis-ci.org/d-SEAMS/seams-core).
- The docs themselves are [here](https://docs.dseams.info) and development is
Expand Down
204 changes: 204 additions & 0 deletions cmake/CodeCoverage.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
# Copyright (c) 2012 - 2015, Lars Bilke
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. 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.
#
# 3. Neither the name of the copyright holder 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 HOLDER 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.
#
#
#
# 2012-01-31, Lars Bilke
# - Enable Code Coverage
#
# 2013-09-17, Joakim Söderberg
# - Added support for Clang.
# - Some additional usage instructions.
#
# USAGE:

# 0. (Mac only) If you use Xcode 5.1 make sure to patch geninfo as described here:
# http://stackoverflow.com/a/22404544/80480
#
# 1. Copy this file into your cmake modules path.
#
# 2. Add the following line to your CMakeLists.txt:
# INCLUDE(CodeCoverage)
#
# 3. Set compiler flags to turn off optimization and enable coverage:
# SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
# SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
#
# 3. Use the function SETUP_TARGET_FOR_COVERAGE to create a custom make target
# which runs your test executable and produces a lcov code coverage report:
# Example:
# SETUP_TARGET_FOR_COVERAGE(
# my_coverage_target # Name for custom target.
# test_driver # Name of the test driver executable that runs the tests.
# # NOTE! This should always have a ZERO as exit code
# # otherwise the coverage generation will not complete.
# coverage # Name of output directory.
# )
#
# If you need to exclude additional directories from the report, specify them
# using the LCOV_REMOVE_EXTRA variable before calling SETUP_TARGET_FOR_COVERAGE.
# For example:
#
# set(LCOV_REMOVE_EXTRA "'thirdparty/*'")
#
# 4. Build a Debug build:
# cmake -DCMAKE_BUILD_TYPE=Debug ..
# make
# make my_coverage_target
#
#

# Check prereqs
FIND_PROGRAM( GCOV_PATH gcov )
FIND_PROGRAM( LCOV_PATH lcov )
FIND_PROGRAM( GENHTML_PATH genhtml )
FIND_PROGRAM( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/tests)

# IF(NOT GCOV_PATH)
# MESSAGE(FATAL_ERROR "gcov not found! Aborting...")
# ENDIF() # NOT GCOV_PATH

IF("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
IF("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
MESSAGE(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
ENDIF()
ELSEIF(NOT CMAKE_COMPILER_IS_GNUCXX)
MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
ENDIF() # CHECK VALID COMPILER

SET(CMAKE_CXX_FLAGS_COVERAGE
"-g -O0 --coverage -fprofile-arcs -ftest-coverage"
CACHE STRING "Flags used by the C++ compiler during coverage builds."
FORCE )
SET(CMAKE_C_FLAGS_COVERAGE
"-g -O0 --coverage -fprofile-arcs -ftest-coverage"
CACHE STRING "Flags used by the C compiler during coverage builds."
FORCE )
SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE
""
CACHE STRING "Flags used for linking binaries during coverage builds."
FORCE )
SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
""
CACHE STRING "Flags used by the shared libraries linker during coverage builds."
FORCE )
MARK_AS_ADVANCED(
CMAKE_CXX_FLAGS_COVERAGE
CMAKE_C_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE
CMAKE_SHARED_LINKER_FLAGS_COVERAGE )

IF ( NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "Coverage"))
MESSAGE( WARNING "Code coverage results with an optimized (non-Debug) build may be misleading" )
ENDIF() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"


# Param _targetname The name of new the custom make target
# Param _testrunner The name of the target which runs the tests.
# MUST return ZERO always, even on errors.
# If not, no coverage report will be created!
# Param _outputname lcov output is generated as _outputname.info
# HTML report is generated in _outputname/index.html
# Optional fourth parameter is passed as arguments to _testrunner
# Pass them in list form, e.g.: "-j;2" for -j 2
FUNCTION(SETUP_TARGET_FOR_COVERAGE _targetname _testrunner _outputname)

# IF(NOT LCOV_PATH)
# MESSAGE(FATAL_ERROR "lcov not found! Aborting...")
# ENDIF() # NOT LCOV_PATH

# IF(NOT GENHTML_PATH)
# MESSAGE(FATAL_ERROR "genhtml not found! Aborting...")
# ENDIF() # NOT GENHTML_PATH

SET(coverage_info "${CMAKE_BINARY_DIR}/${_outputname}.info")
SET(coverage_cleaned "${coverage_info}.cleaned")

SEPARATE_ARGUMENTS(test_command UNIX_COMMAND "${_testrunner}")

# Setup target
ADD_CUSTOM_TARGET(${_targetname}

# Cleanup lcov
lcov --directory . --zerocounters

# Run tests
COMMAND ${test_command} ${ARGV3}

# Capturing lcov counters and generating report
COMMAND lcov --directory . --capture --output-file ${coverage_info}
COMMAND lcov --remove ${coverage_info} 'tests/*' '**/tests/*' '**/boost/*' '/nix/*' '/usr/*' ${LCOV_REMOVE_EXTRA} --output-file ${coverage_cleaned}
COMMAND genhtml -o ${_outputname} ${coverage_cleaned}
# COMMAND ${CMAKE_COMMAND} -E remove ${coverage_info} ${coverage_cleaned}

WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)

# Show info where to find the report
ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
COMMAND ;
COMMENT "Open ./${_outputname}/index.html in your browser to view the coverage report."
)

ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE

# Param _targetname The name of new the custom make target
# Param _testrunner The name of the target which runs the tests
# Param _outputname cobertura output is generated as _outputname.xml
# Optional fourth parameter is passed as arguments to _testrunner
# Pass them in list form, e.g.: "-j;2" for -j 2
FUNCTION(SETUP_TARGET_FOR_COVERAGE_COBERTURA _targetname _testrunner _outputname)

IF(NOT PYTHON_EXECUTABLE)
MESSAGE(FATAL_ERROR "Python not found! Aborting...")
ENDIF() # NOT PYTHON_EXECUTABLE

IF(NOT GCOVR_PATH)
MESSAGE(FATAL_ERROR "gcovr not found! Aborting...")
ENDIF() # NOT GCOVR_PATH

ADD_CUSTOM_TARGET(${_targetname}

# Run tests
${_testrunner} ${ARGV3}

# Running gcovr
COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} -e '${CMAKE_SOURCE_DIR}/tests/' -o ${_outputname}.xml
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Running gcovr to produce Cobertura code coverage report."
)

# Show info where to find the report
ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
COMMAND ;
COMMENT "Cobertura code coverage report saved in ${_outputname}.xml."
)

ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE_COBERTURA

4 changes: 2 additions & 2 deletions nix/nixpkgs/default.src.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
"owner": "NixOS",
"repo": "nixpkgs-channels",
"branch": "nixos-unstable",
"rev": "ae002fe44e96b868c62581e8066d559ca2179e01",
"sha256": "1bawyz3ksw2sihv6vsgbvhdm4kn63xrrj5bavg6mz5mxml9rji89"
"rev": "8130f3c1c2bb0e533b5e150c39911d6e61dcecc2",
"sha256": "154nrhmm3dk5kmga2w5f7a2l6j79dvizrg4wzbrcwlbvdvapdgkb"
Comment on lines -5 to +6
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a breaking change and should be documented a bit more.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea, I'll update the PR description. Though the changes shouldn't affect general users much. A good practice is running nix-collect-garbage whenever the nix versions are updated.

}
1 change: 1 addition & 0 deletions nix/yodaStruct.nix
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
, liblapack
, blas
, lib
, lcov
, boost
, gsl
, rang
Expand Down
13 changes: 13 additions & 0 deletions scripts/mkCoverage.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env bash

topLevel=$(git rev-parse --show-toplevel)
cd $topLevel
if [[ "$PWD" =~ seams-core ]]; then
rm -rf shellBuild
mkdir shellBuild
cd shellBuild
# cmake .. -DCMAKE_CXX_FLAGS="-pg -fsanitize=address " -DCMAKE_EXE_LINKER_FLAGS=-pg -DCMAKE_SHARED_LINKER_FLAGS=-pg
cmake .. -DCMAKE_BUILD_TYPE=Debug
# cmake .. -DCMAKE_BUILD_TYPE=Release
make testCoverage -j4
fi
1 change: 1 addition & 0 deletions shell.nix
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pkgs.mkShell {
buildInputs = with pkgs; [
gdb
git
lcov
lua
luaPackages.luafilesystem
]
Expand Down
13 changes: 13 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ add_executable(yodaStruct_test
${PROJECT_SOURCE_DIR}/src/mol_sys.cpp
)

#
# Standard cmake stuff
# include(FindBLAS)
# include(FindLAPACK)
Expand Down Expand Up @@ -47,3 +48,15 @@ include_directories(
)
# Run unit tests
add_test(NAME yodaStruct-unit-tests COMMAND $<TARGET_FILE:yodaStruct_test>)

# Coverage
include(CodeCoverage)
setup_target_for_coverage(
testCoverage # Name for custom target.
yodaStruct_test # Name of the test driver executable that runs the tests.
# NOTE! This should always have a ZERO as exit code
# otherwise the coverage generation will not complete.
coverage # Name of output directory.
)
# target_compile_options(yodaStruct_test PRIVATE -g -O0 -fprofile-arcs -ftest-coverage)
# target_link_options(yodaStruct_test PRIVATE -lgcov --coverage)