diff --git a/.github/workflows/beta_artifacts.yml b/.github/workflows/beta_artifacts.yml index c930326176..4f88d957ac 100644 --- a/.github/workflows/beta_artifacts.yml +++ b/.github/workflows/beta_artifacts.yml @@ -118,4 +118,4 @@ jobs: env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: us-east-2 \ No newline at end of file + AWS_DEFAULT_REGION: us-east-2 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000000..18d2d3aeca --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,56 @@ +name: Coverage Reports + +on: + workflow_dispatch: + inputs: + label: + description: "label to append to run" + default: "Scheduled" + required: true + schedule: + - cron: "0 1 * * 0" +jobs: + coverage_test: + name: Coverage Test [TEST_USE_ROCKSDB=${{ matrix.TEST_USE_ROCKSDB }}] + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository + env: + LCOV: 1 + COMPILER: gcc + BOOST_ROOT: /tmp/boost + runs-on: ubuntu-18.04 + strategy: + matrix: + TEST_USE_ROCKSDB: [0, 1] + fail-fast: false + continue-on-error: true + timeout-minutes: 60 + steps: + - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f + with: + submodules: "recursive" + - name: Fetch Deps + run: | + sudo apt-get update -qq && sudo apt-get install -yqq build-essential g++ wget python zlib1g-dev qt5-default \ + valgrind xorg xvfb xauth xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic ocl-icd-opencl-dev \ + git lcov python3-pip + util/build_prep/fetch_boost.sh + wget -O cmake_install.sh https://github.com/Kitware/CMake/releases/download/v3.15.4/cmake-3.15.4-Linux-x86_64.sh + chmod +x cmake_install.sh + sudo ./cmake_install.sh --prefix=/usr --exclude-subdir --skip-license + - name: Build and Test + env: + TEST_USE_ROCKSDB: ${{ matrix.TEST_USE_ROCKSDB }} + run: ./ci/build-travis.sh /usr/lib/x86_64-linux=gnu/cmake/Qt5 + - uses: coverallsapp/github-action@8cbef1dea373ebce56de0a14c68d6267baa10b44 + with: + github-token: ${{ secrets.github_token }} + flag-name: rocksdb-${{ matrix.TEST_USE_ROCKSDB }},${{ github.event.inputs.label }} + parallel: true + finish: + needs: coverage_test + runs-on: ubuntu-18.04 + steps: + - uses: coverallsapp/github-action@8cbef1dea373ebce56de0a14c68d6267baa10b44 + with: + github-token: ${{ secrets.github_token }} + parallel-finished: true \ No newline at end of file diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 4a42219576..0350abf8fa 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -3,7 +3,7 @@ name: Develop on: push: branches: - - develop + - develop jobs: linux_job: runs-on: ubuntu-18.04 @@ -24,4 +24,4 @@ jobs: - name: Deploy Docker (nanocurrency/nano-env) run: ci/actions/linux/deploy-docker.sh env: - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} \ No newline at end of file + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/live_artifacts.yml b/.github/workflows/live_artifacts.yml index 3cca372e8e..3fd7b24106 100644 --- a/.github/workflows/live_artifacts.yml +++ b/.github/workflows/live_artifacts.yml @@ -117,4 +117,4 @@ jobs: env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: us-east-2 \ No newline at end of file + AWS_DEFAULT_REGION: us-east-2 diff --git a/.github/workflows/release_tests.yml b/.github/workflows/release_tests.yml deleted file mode 100644 index e6cb9d3270..0000000000 --- a/.github/workflows/release_tests.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Release Tests - -on: - push: - tags: '*' - -env: - RELEASE: 1 - artifact: 0 - -jobs: - osx_test: - runs-on: macos-latest - env: - BOOST_ROOT: /tmp/boost - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - - name: Fetch Deps - run: TEST=1 ci/actions/osx/install_deps.sh - - name: Run Tests - run: ci/build-travis.sh "/tmp/qt/lib/cmake/Qt5"; - - gcc_test: - runs-on: ubuntu-18.04 - timeout-minutes: 60 - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - - name: Fetch Deps - run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -v ${PWD}:/workspace nanocurrency/nano-env:gcc /bin/bash -c "cd /workspace && RELEASE=1 ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" - - clang_test: - runs-on: ubuntu-18.04 - timeout-minutes: 60 - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - - name: Fetch Deps - run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -v ${PWD}:/workspace nanocurrency/nano-env:clang-6 /bin/bash -c "cd /workspace && RELEASE=1 ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" - - windows_test: - runs-on: windows-latest - timeout-minutes: 60 - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: ci/actions/windows/install_deps.ps1 - - name: Run Tests - run: ci/actions/windows/build.ps1 diff --git a/.github/workflows/rocksdb_release_tests.yml b/.github/workflows/rocksdb_release_tests.yml deleted file mode 100644 index de2fbe34e7..0000000000 --- a/.github/workflows/rocksdb_release_tests.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: RocksDB Release Tests - -on: - push: - tags: '*' - -env: - RELEASE: 1 - artifact: 0 - TEST_USE_ROCKSDB: 1 - -jobs: - osx_test: - runs-on: macos-latest - env: - BOOST_ROOT: /tmp/boost - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: TEST=1 ci/actions/osx/install_deps.sh - - name: Run Tests - run: ci/build-travis.sh "/tmp/qt/lib/cmake/Qt5"; - - gcc_test: - runs-on: ubuntu-18.04 - timeout-minutes: 60 - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -e TEST_USE_ROCKSDB -v ${PWD}:/workspace nanocurrency/nano-env:gcc /bin/bash -c "cd /workspace && RELEASE=1 ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" - - clang_test: - runs-on: ubuntu-18.04 - timeout-minutes: 60 - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -e TEST_USE_ROCKSDB -v ${PWD}:/workspace nanocurrency/nano-env:clang-6 /bin/bash -c "cd /workspace && RELEASE=1 ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" diff --git a/.github/workflows/rocksdb_tests.yml b/.github/workflows/rocksdb_tests.yml deleted file mode 100644 index 94b52d0425..0000000000 --- a/.github/workflows/rocksdb_tests.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: RocksDB Tests - -on: [push, pull_request] - -env: - RELEASE: 0 - artifact: 0 - TEST_USE_ROCKSDB: 1 - -jobs: - osx_test: - runs-on: macos-latest - env: - BOOST_ROOT: /tmp/boost - DEADLINE_SCALE_FACTOR: 2 - if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: TEST=1 ci/actions/osx/install_deps.sh - - name: Run Tests - run: ci/build-travis.sh "/tmp/qt/lib/cmake/Qt5"; - - gcc_test: - runs-on: ubuntu-18.04 - timeout-minutes: 60 - if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -e TEST_USE_ROCKSDB -v ${PWD}:/workspace nanocurrency/nano-env:gcc /bin/bash -c "cd /workspace && ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" - - clang_test: - runs-on: ubuntu-18.04 - timeout-minutes: 60 - if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -e TEST_USE_ROCKSDB -v ${PWD}:/workspace nanocurrency/nano-env:clang-6 /bin/bash -c "cd /workspace && ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" - - windows_test: - runs-on: windows-latest - timeout-minutes: 60 - env: - RELEASE: 1 - DEADLINE_SCALE_FACTOR: 2 - if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Windows Defender - run: ci/actions/windows/disable_windows_defender.ps1 - - name: Fetch Deps - run: ci/actions/windows/install_deps.ps1 - - name: Run Tests - run: ci/actions/windows/build.ps1 diff --git a/.github/workflows/test_network_artifacts.yml b/.github/workflows/test_network_artifacts.yml index 479b8efba0..ce473cb96b 100644 --- a/.github/workflows/test_network_artifacts.yml +++ b/.github/workflows/test_network_artifacts.yml @@ -118,4 +118,4 @@ jobs: env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: us-east-2 \ No newline at end of file + AWS_DEFAULT_REGION: us-east-2 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c429d6779a..15d0702938 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,12 +5,21 @@ on: [push, pull_request] env: RELEASE: 0 artifact: 0 - + jobs: osx_test: - runs-on: macos-latest + name: OSX unit tests [TEST_USE_ROCKSDB=${{ matrix.TEST_USE_ROCKSDB }}] + strategy: + fail-fast: false + matrix: + TEST_USE_ROCKSDB: [0, 1] + RELEASE: + - ${{ startsWith(github.ref, 'refs/tags/') }} env: BOOST_ROOT: /tmp/boost + TEST_USE_ROCKSDB: ${{ matrix.TEST_USE_ROCKSDB }} + RELEASE: ${{ matrix.RELEASE }} + runs-on: macos-latest if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository steps: - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f @@ -18,25 +27,32 @@ jobs: submodules: "recursive" - name: Fetch Deps run: TEST=1 ci/actions/osx/install_deps.sh - - name: Run Tests + - name: Build Tests run: ci/build-travis.sh "/tmp/qt/lib/cmake/Qt5"; + - name: Run Tests lmdb + if: ${{ matrix.TEST_USE_ROCKSDB == 0 }} + run: cd build && sudo TEST_USE_ROCKSDB=$TEST_USE_ROCKSDB ../ci/test.sh . + - name: Run Tests rocksdb + env: + DEADLINE_SCALE_FACTOR: 2 + if: ${{ matrix.TEST_USE_ROCKSDB == 1 }} + run: cd build && sudo TEST_USE_ROCKSDB=$TEST_USE_ROCKSDB ../ci/test.sh . - gcc_test: + linux_test: + name: Linux Unit Tests [TEST_USE_ROCKSDB=${{ matrix.TEST_USE_ROCKSDB }} - COMPILER=${{ matrix.COMPILER }}] + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + TEST_USE_ROCKSDB: [0, 1] + COMPILER: [gcc, clang-6] + RELEASE: + - ${{ startsWith(github.ref, 'refs/tags/') }} runs-on: ubuntu-18.04 - timeout-minutes: 60 - if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository - steps: - - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - with: - submodules: "recursive" - - name: Fetch Deps - run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -v ${PWD}:/workspace nanocurrency/nano-env:gcc /bin/bash -c "cd /workspace && ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" - - clang_test: - runs-on: ubuntu-18.04 - timeout-minutes: 60 + env: + COMPILER: ${{ matrix.COMPILER }} + TEST_USE_ROCKSDB: ${{ matrix.TEST_USE_ROCKSDB }} + RELEASE: ${{ matrix.RELEASE }} if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository steps: - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f @@ -44,12 +60,31 @@ jobs: submodules: "recursive" - name: Fetch Deps run: ci/actions/linux/install_deps.sh - - name: Run Tests - run: docker run -v ${PWD}:/workspace nanocurrency/nano-env:clang-6 /bin/bash -c "cd /workspace && ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5 ${PWD}" + - name: Build Tests + run: docker run -e TEST_USE_ROCKSDB -e RELEASE -v ${PWD}:/workspace nanocurrency/nano-env:${{ matrix.COMPILER }} /bin/bash -c "cd /workspace && ./ci/build-travis.sh /usr/lib/x86_64-linux-gnu/cmake/Qt5" + - name: Run Tests lmdb + if: ${{ matrix.TEST_USE_ROCKSDB == 0 }} + run: docker run -e RELEASE -v ${PWD}:/workspace nanocurrency/nano-env:${{ matrix.COMPILER }} /bin/bash -c "cd /workspace/build && ../ci/test.sh ." + - name: Run Tests rocksdb + if: ${{ matrix.TEST_USE_ROCKSDB == 1 }} + run: docker run -e TEST_USE_ROCKSDB -e DEADLINE_SCALE_FACTOR=2 -e RELEASE -v ${PWD}:/workspace nanocurrency/nano-env:${{ matrix.COMPILER }} /bin/bash -c "cd /workspace/build && ../ci/test.sh ." windows_test: + name: Windows Unit Tests [TEST_USE_ROCKSDB=${{ matrix.TEST_USE_ROCKSDB }}] + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + TEST_USE_ROCKSDB: [0, 1] + RELEASE: + - ${{ startsWith(github.ref, 'refs/tags/') }} + exclude: + - RELEASE: true + TEST_USE_ROCKSDB: 1 runs-on: windows-latest - timeout-minutes: 60 + env: + TEST_USE_ROCKSDB: ${{ matrix.TEST_USE_ROCKSDB }} + RELEASE: ${{ matrix.RELEASE }} if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository steps: - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f @@ -57,8 +92,13 @@ jobs: submodules: "recursive" - name: Windows Defender run: ci/actions/windows/disable_windows_defender.ps1 - - name: Fetch Deps run: ci/actions/windows/install_deps.ps1 - - name: Run Tests + - name: Run Tests lmdb + if: ${{ matrix.TEST_USE_ROCKSDB == 0 }} + run: ci/actions/windows/build.ps1 + - name: Run Tests rocksdb + if: ${{ matrix.TEST_USE_ROCKSDB == 1 }} + env: + DEADLINE_SCALE_FACTOR: 2 run: ci/actions/windows/build.ps1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 3683c55158..7db5c61ad6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,15 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE) option(CI_BUILD false) + +set(COVERAGE + OFF + CACHE BOOL "Code Coverage Targets") +if(COVERAGE) + list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules") + include(CoverageTest) +endif() + set(CI_TEST 0 CACHE STRING "") @@ -600,6 +609,17 @@ if(NANO_TEST OR RAIBLOCKS_TEST) add_subdirectory(nano/core_test) add_subdirectory(nano/rpc_test) add_subdirectory(nano/slow_test) + add_custom_target( + build_tests + COMMAND echo "BATCH BUILDING TESTS" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS core_test load_test rpc_test nano_node nano_rpc) + + add_custom_target( + run_tests + COMMAND ${PROJECT_SOURCE_DIR}/ci/test.sh ${CMAKE_BINARY_DIR} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + DEPENDS build_tests) endif() if(NANO_GUI OR RAIBLOCKS_GUI) install(FILES ${PROJECT_BINARY_DIR}/config-node.toml.sample DESTINATION .) @@ -690,6 +710,7 @@ if(NANO_GUI OR RAIBLOCKS_GUI) set_target_properties( qt_test PROPERTIES COMPILE_FLAGS "-DQT_NO_KEYWORDS -DBOOST_ASIO_HAS_STD_ARRAY=1") + add_dependencies(build_tests qt_test) endif() if(APPLE) @@ -839,5 +860,9 @@ if(NANO_GUI OR RAIBLOCKS_GUI) endif() endif() +if(COVERAGE) + add_subdirectory(coverage) +endif() + set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE) include(CPack) diff --git a/README.md b/README.md index e2bea00584..ae0f4f13d8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@
+ Logo +

@@ -8,6 +10,7 @@ [![Beta Artifacts](https://github.com/nanocurrency/nano-node/workflows/Beta/badge.svg)](https://github.com/nanocurrency/nano-node/actions?query=workflow%3ABeta) [![GitHub release (latest by date)](https://img.shields.io/github/v/release/nanocurrency/nano-node)](https://github.com/nanocurrency/nano-node/releases/latest) [![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/nanocurrency/nano-node?color=darkblue&label=beta)](https://github.com/nanocurrency/nano-node/tags) +[![Coverage Status](https://coveralls.io/repos/github/nanocurrency/nano-node/badge.svg?branch=develop)](https://coveralls.io/github/nanocurrency/nano-node?branch=develop) [![Tests](https://github.com/nanocurrency/nano-node/workflows/Tests/badge.svg)](https://github.com/nanocurrency/nano-node/actions?query=workflow%3ATests) [![RelWithDebug Tests](https://github.com/nanocurrency/nano-node/workflows/Release%20Tests/badge.svg)](https://github.com/nanocurrency/nano-node/actions?query=workflow%3A%22Release+Tests%22) [![Discord](https://img.shields.io/badge/discord-join%20chat-orange.svg)](https://chat.nano.org) diff --git a/ci/actions/deploy.sh b/ci/actions/deploy.sh index e305daf003..4aee6f1d6e 100755 --- a/ci/actions/deploy.sh +++ b/ci/actions/deploy.sh @@ -5,9 +5,9 @@ set -o nounset set -o xtrace OS=$(uname) -if [[ "${BETA-0}" -eq 1 ]]; then +if [[ "${BETA:-0}" -eq 1 ]]; then BUILD="beta" -elif [[ "${TEST-0}" -eq 1 ]]; then +elif [[ "${TEST:-0}" -eq 1 ]]; then BUILD="test" else BUILD="live" diff --git a/ci/actions/linux/install_deps.sh b/ci/actions/linux/install_deps.sh index 5fda44b8aa..fb421c441a 100755 --- a/ci/actions/linux/install_deps.sh +++ b/ci/actions/linux/install_deps.sh @@ -3,5 +3,9 @@ sudo mkdir -p /etc/docker && echo '{"ipv6":true,"fixed-cidr-v6":"2001:db8:1::/64"}' | sudo tee /etc/docker/daemon.json && sudo service docker restart ci/build-docker-image.sh docker/ci/Dockerfile-base nanocurrency/nano-env:base -ci/build-docker-image.sh docker/ci/Dockerfile-gcc nanocurrency/nano-env:gcc -ci/build-docker-image.sh docker/ci/Dockerfile-clang-6 nanocurrency/nano-env:clang-6 +if [[ "${COMPILER:-}" != "" ]]; then + ci/build-docker-image.sh docker/ci/Dockerfile-gcc nanocurrency/nano-env:${COMPILER} +else + ci/build-docker-image.sh docker/ci/Dockerfile-gcc nanocurrency/nano-env:gcc + ci/build-docker-image.sh docker/ci/Dockerfile-clang-6 nanocurrency/nano-env:clang-6 +fi diff --git a/ci/actions/windows/build.ps1 b/ci/actions/windows/build.ps1 index a2d65053d8..5001074184 100644 --- a/ci/actions/windows/build.ps1 +++ b/ci/actions/windows/build.ps1 @@ -20,7 +20,7 @@ if (${env:artifact} -eq 1) { $env:RUN = "artifact" } else { - if ( ${env:RELEASE} -eq 1 ) { + if ( ${env:RELEASE} -eq "true" -or ${env:TEST_USE_ROCKSDB} -eq 1 ) { $env:BUILD_TYPE = "RelWithDebInfo" } else { diff --git a/ci/build-centos.sh b/ci/build-centos.sh index e8962faa9f..19b6bee18a 100755 --- a/ci/build-centos.sh +++ b/ci/build-centos.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash TAGS=$(git describe --abbrev=0 --tags) -VERSIONS=$(echo $TAGS | sed 's/V//') +VERSIONS=${TAGS//V/} RELEASE=$(echo $CI_JOB_ID) run_source() { @@ -16,7 +16,7 @@ run_build() { run_update() { for file in ./nanocurrency*.in; do - outfile="$(echo "${file}" | sed 's@\.in$@@')" + outfile="${file//.in/}" echo "Updating \"${outfile}\"..." diff --git a/ci/build-travis.sh b/ci/build-travis.sh index 39fa935509..7b2f225678 100755 --- a/ci/build-travis.sh +++ b/ci/build-travis.sh @@ -28,26 +28,24 @@ fi mkdir build pushd build -if [[ ${RELEASE-0} -eq 1 ]]; then +if [[ "${RELEASE:-false}" == "true" ]]; then BUILD_TYPE="RelWithDebInfo" -else - BUILD_TYPE="Debug" fi -if [[ ${ASAN_INT-0} -eq 1 ]]; then +if [[ ${ASAN_INT:-0} -eq 1 ]]; then SANITIZERS="-DNANO_ASAN_INT=ON" -elif [[ ${ASAN-0} -eq 1 ]]; then +elif [[ ${ASAN:-0} -eq 1 ]]; then SANITIZERS="-DNANO_ASAN=ON" -elif [[ ${TSAN-0} -eq 1 ]]; then +elif [[ ${TSAN:-0} -eq 1 ]]; then SANITIZERS="-DNANO_TSAN=ON" -else - SANITIZERS="" +elif [[ ${LCOV:-0} -eq 1 ]]; then + SANITIZERS="-DCOVERAGE=ON" fi ulimit -S -n 8192 if [[ "$OS" == 'Linux' ]]; then - if clang --version; then + if clang --version && [ ${LCOV:-0} == 0 ]; then BACKTRACE="-DNANO_STACKTRACE_BACKTRACE=ON \ -DBACKTRACE_INCLUDE=" else @@ -64,22 +62,24 @@ cmake \ -DNANO_GUI=ON \ -DPORTABLE=1 \ -DNANO_WARN_TO_ERR=ON \ --DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ +-DCMAKE_BUILD_TYPE=${BUILD_TYPE:-Debug} \ -DCMAKE_VERBOSE_MAKEFILE=ON \ --DBOOST_ROOT=/tmp/boost/ \ +-DBOOST_ROOT=${BOOST_ROOT:-/tmp/boost/} \ -DNANO_SHARED_BOOST=ON \ -DQt5_DIR=${qt_dir} \ -DCI_TEST="1" \ -${BACKTRACE} \ -${SANITIZERS} \ +${BACKTRACE:-} \ +${SANITIZERS:-} \ .. if [[ "$OS" == 'Linux' ]]; then - cmake --build ${PWD} -- -j2 + if [[ ${LCOV:-0} == 1 ]]; then + cmake --build ${PWD} --target generate_coverage -- -j2 + else + cmake --build ${PWD} --target build_tests -k -- -j2 + fi else - sudo cmake --build ${PWD} -- -j2 + sudo cmake --build ${PWD} --target build_tests -- -j2 fi popd - -./ci/test.sh ./build diff --git a/ci/check-cmake-format.sh b/ci/check-cmake-format.sh old mode 100644 new mode 100755 index f0bbf478d5..633f818221 --- a/ci/check-cmake-format.sh +++ b/ci/check-cmake-format.sh @@ -6,7 +6,7 @@ if ! command -v cmake-format &>/dev/null; then fi REPO_ROOT=$(git rev-parse --show-toplevel) cd "${REPO_ROOT}" -find "${REPO_ROOT}" -iwholename "${REPO_ROOT}/nano/*/CMakeLists.txt" -o -iwholename "${REPO_ROOT}/CMakeLists.txt" | xargs cmake-format --check &>.cmake_format_check +find "${REPO_ROOT}" -iwholename "${REPO_ROOT}/nano/*/CMakeLists.txt" -o -iwholename "${REPO_ROOT}/CMakeLists.txt" -o -iwholename "${REPO_ROOT}/coverage/CMakeLists.txt" | xargs cmake-format --check &>.cmake_format_check if [[ $(wc -l .cmake_format_check | cut -f1 -d ' ') != 0 ]]; then echo echo "Code formatting differs from expected - please run \n\t'bash ci/cmake-format-all.sh'" diff --git a/ci/cmake-format-all.sh b/ci/cmake-format-all.sh index 784cf863ce..ea8199c08f 100755 --- a/ci/cmake-format-all.sh +++ b/ci/cmake-format-all.sh @@ -8,4 +8,4 @@ if ! command -v cmake-format &>/dev/null; then fi REPO_ROOT=$(git rev-parse --show-toplevel) cd "${REPO_ROOT}" -find "${REPO_ROOT}" -iwholename "${REPO_ROOT}/nano/*/CMakeLists.txt" -o -iwholename "${REPO_ROOT}/CMakeLists.txt" | xargs cmake-format -i +find "${REPO_ROOT}" -iwholename "${REPO_ROOT}/nano/*/CMakeLists.txt" -o -iwholename "${REPO_ROOT}/CMakeLists.txt" -o -iwholename "${REPO_ROOT}/coverage/CMakeLists.txt" | xargs cmake-format -i diff --git a/ci/test.sh b/ci/test.sh index 8319aaff27..817c6873ec 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -29,7 +29,7 @@ xvfb_run_() { Xvfb :2 -screen 0 1024x768x24 & xvfb_pid=$! sleep ${INIT_DELAY_SEC} - DISPLAY=:2 ${TIMEOUT_CMD} ${TIMEOUT_TIME_ARG} ${TIMEOUT_SEC-${TIMEOUT_DEFAULT}} $@ + DISPLAY=:2 ${TIMEOUT_CMD} ${TIMEOUT_TIME_ARG} ${TIMEOUT_DEFAULT} $@ res=${?} kill ${xvfb_pid} @@ -57,14 +57,14 @@ run_tests() { sleep $((30 + (RANDOM % 30))) fi - ${TIMEOUT_CMD} ${TIMEOUT_TIME_ARG} ${TIMEOUT_SEC-${TIMEOUT_DEFAULT}} ./core_test + ${TIMEOUT_CMD} ${TIMEOUT_TIME_ARG} ${TIMEOUT_DEFAULT} ./core_test core_test_res=${?} if [ "${core_test_res}" = '0' ]; then break fi done - xvfb_run_ ./rpc_test + ${TIMEOUT_CMD} ${TIMEOUT_TIME_ARG} ${TIMEOUT_DEFAULT} ./rpc_test rpc_test_res=${?} xvfb_run_ ./qt_test @@ -73,7 +73,11 @@ run_tests() { echo "Core Test return code: ${core_test_res}" echo "RPC Test return code: ${rpc_test_res}" echo "QT Test return code: ${qt_test_res}" - return ${core_test_res} + if [[ ${core_test_res} != 0 || ${rpc_test_res} != 0 || ${qt_test_res} != 0 ]]; then + return 1 + else + return 0 + fi } cd ${build_dir} diff --git a/cmake/Modules/CoverageTest.cmake b/cmake/Modules/CoverageTest.cmake new file mode 100644 index 0000000000..df15e1174c --- /dev/null +++ b/cmake/Modules/CoverageTest.cmake @@ -0,0 +1,23 @@ +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage -lgcov") +find_program(LCOV_PATH lcov) +message("lcov found: ${LCOV_PATH}") +find_program(GENHTML_PATH genhtml) +message("genhtml found: ${GENHTML_PATH}") +if(NOT CMAKE_COMPILER_IS_GNUCXX) + # Clang version 3.0.0 and greater now supports gcov as well. + message( + WARNING + "Compiler is not GNU gcc! Clang Version 3.0.0 and greater supports gcov as well, but older versions don't." + ) + if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...") + endif() +endif() +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() \ No newline at end of file diff --git a/coverage/CMakeLists.txt b/coverage/CMakeLists.txt new file mode 100644 index 0000000000..9a990097e0 --- /dev/null +++ b/coverage/CMakeLists.txt @@ -0,0 +1,52 @@ +add_custom_target( + clean_coverage + COMMAND echo "CLEANING COUNTERS" + COMMAND ${LCOV_PATH} --directory . --zerocounter -q + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS build_tests) + +add_custom_target( + coverage_tests + COMMAND echo "RUN TESTS FOR COVERAGE" + COMMAND ${PROJECT_SOURCE_DIR}/ci/test.sh ${CMAKE_BINARY_DIR} || true + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS clean_coverage) + +add_custom_target( + coveralls_upload + COMMAND echo "UPLOADING COVERALLS COVERAGE REPORT" + COMMAND coveralls -i nano -b build -r . --gcov-options '\\-lp' + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + DEPENDS coverage_tests) + +add_custom_target( + generate_coverage + COMMAND echo "CAPTURING COVERAGE DATA" + COMMAND ${LCOV_PATH} --directory . --capture --output-file lcov.info.raw -q + COMMAND echo "REMOVING FLUFF FROM REPORT" + COMMAND + ${LCOV_PATH} --remove lcov.info.raw '/usr/*' '/tmp/*' + '${PROJECT_SOURCE_DIR}/cpptoml/*' '${PROJECT_SOURCE_DIR}/crypto/*' + '${PROJECT_SOURCE_DIR}/flatbuffers/*' '${PROJECT_SOURCE_DIR}/gtest/*' + '${PROJECT_SOURCE_DIR}/rocksdb/*' '${PROJECT_SOURCE_DIR}/valgrind/*' + '${PROJECT_SOURCE_DIR}/nano/core_test/*' + '${PROJECT_SOURCE_DIR}/nano/load_test/*' + '${PROJECT_SOURCE_DIR}/nano/ipc_flatbuffers_test/*' + '${PROJECT_SOURCE_DIR}/nano/ipc_flatbuffers_lib/*' + '${PROJECT_SOURCE_DIR}/nano/nano_node/*' + '${PROJECT_SOURCE_DIR}/nano/nano_wallet/*' + '${PROJECT_SOURCE_DIR}/nano/nano_rpc/*' + '${PROJECT_SOURCE_DIR}/nano/rpc_test/*' + '${PROJECT_SOURCE_DIR}/nano/qt_test/*' '${PROJECT_SOURCE_DIR}/nano/qt/*' + '${PROJECT_SOURCE_DIR}/nano/test_common/*' + '${PROJECT_SOURCE_DIR}/nano/qt_system/*' --output-file + ${PROJECT_SOURCE_DIR}/coverage/lcov.info -q + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS coverage_tests) + +add_custom_target( + generate_html + COMMAND echo "GENERATING HTML COVERAGE REPORT" + COMMAND ${GENHTML_PATH} -o coverage ${PROJECT_SOURCE_DIR}/coverage/lcov.info + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + DEPENDS generate_coverage) diff --git a/docker/ci/Dockerfile-gcc b/docker/ci/Dockerfile-gcc index 2bad5b9ee5..65960198f7 100644 --- a/docker/ci/Dockerfile-gcc +++ b/docker/ci/Dockerfile-gcc @@ -1,6 +1,6 @@ FROM nanocurrency/nano-env:base -RUN apt-get install -yqq git +RUN apt update -qq && apt-get install -yqq git ENV BOOST_ROOT=/tmp/boost