From 2f76ce9593dcee662e0c920f4ac4c461cf8ffba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Korina=20=C5=A0imi=C4=8Devi=C4=87?= Date: Wed, 10 Jan 2024 12:37:55 +0100 Subject: [PATCH] Run test coverage Summary: related to T13434 - boost is installed as header only (binaries do not work with the coroutine code) - added test coverage, final results: https://app.codecov.io/github/ksimicevic/async-mqtt5/commit/d9ef85a89b9361f916c747c928fa9303a2a0df2f/tree - finally can compile coroutine code Reviewers: ivica Reviewed By: ivica Subscribers: miljen, iljazovic Differential Revision: https://repo.mireo.local/D27287 --- .github/workflows/ci.yml | 49 ++++++++----------- .github/workflows/coverage.yml | 84 +++++++++++++++++++++++++++++++++ test/unit/CMakeLists.txt | 1 - test/unit/test/cancellation.cpp | 2 +- test/unit/test/coroutine.cpp | 50 ++++---------------- 5 files changed, 113 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/coverage.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee47c25..6b2d898 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,16 +28,6 @@ jobs: cxxflags: '' ldflags: '' - - toolset: g++-12 - compiler: g++-12 - install: g++-12 - os: ubuntu-latest - container: ubuntu:22.04 - build-type: 'Release' - cxxstd: 17 - cxxflags: '' - ldflags: '' - - toolset: clang++-12 compiler: clang++-12 install: clang++-12 @@ -64,14 +54,14 @@ jobs: os: ubuntu-latest container: ubuntu:22.04 build-type: 'Release' - cxxstd: 17 - cxxflags: '-fdeclspec' + cxxstd: 20 + cxxflags: '' ldflags: '' runs-on: ${{ matrix.os }} container: ${{ matrix.container }} env: - CXXFLAGS: ${{ matrix.cxxflags }} -Wall -Wextra -std=c++17 + CXXFLAGS: ${{ matrix.cxxflags }} -Wall -Wextra LDFLAGS: ${{ matrix.ldflags }} CMAKE_BUILD_PARALLEL_LEVEL: 4 @@ -83,33 +73,32 @@ jobs: if: matrix.container run: | apt-get update - apt-get -y install sudo wget tar cmake git openssl libssl-dev pkg-config + apt-get -y install sudo wget tar cmake openssl libssl-dev pkg-config - name: Install compiler run: sudo apt-get install -y ${{ matrix.install }} - - name: Install Boost - uses: MarkusJx/install-boost@v2.4.4 - id: install-boost - with: - boost_version: 1.82.0 - platform_version: 22.04 + - name: Setup Boost + run: | + wget https://archives.boost.io/release/${{ env.BOOST_VERSION }}/source/boost_${{ env.BOOST_DIR_VER_NAME }}.tar.gz + tar xzf boost_${{ env.BOOST_DIR_VER_NAME }}.tar.gz + mkdir /usr/local/boost_${{ env.BOOST_DIR_VER_NAME }} + mv boost_${{ env.BOOST_DIR_VER_NAME }}/boost /usr/local/boost_${{ env.BOOST_DIR_VER_NAME }} + rm boost_${{ env.BOOST_DIR_VER_NAME }}.tar.gz - name: Setup library run: | - cmake -S . -B build/${{ matrix.compiler }} -DCMAKE_CXX_COMPILER="${{ matrix.compiler }}" - sudo cmake --install build/${{ matrix.compiler }} - env: - BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }} + cmake -S . -B build -DCMAKE_CXX_COMPILER="${{ matrix.compiler }}" \ + -DBoost_INCLUDE_DIR="/usr/local/boost_${{ env.BOOST_DIR_VER_NAME }}" + sudo cmake --install build - name: Build tests run: | - cmake -S test/unit -B test/unit/build/${{ matrix.compiler }} \ + cmake -S test/unit -B test/unit/build \ -DCMAKE_CXX_COMPILER="${{ matrix.compiler }}" -DCMAKE_CXX_FLAGS="${{ env.CXXFLAGS }}" \ - -DCMAKE_EXE_LINKER_FLAGS="${{ env.LDFLAGS }}" -DCMAKE_BUILD_TYPE="${{ matrix.build-type }}" - cmake --build test/unit/build/${{ matrix.compiler }} - env: - BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }} + -DCMAKE_CXX_STANDARD="${{ matrix.cxxstd }}" -DCMAKE_EXE_LINKER_FLAGS="${{ env.LDFLAGS }}" -DCMAKE_BUILD_TYPE="${{ matrix.build-type }}" \ + -DBoost_INCLUDE_DIR="/usr/local/boost_${{ env.BOOST_DIR_VER_NAME }}" + cmake --build test/unit/build -j 4 - name: Run tests - run: ./test/unit/build/${{ matrix.compiler }}/mqtt-test --log_level=test_suite + run: ./test/unit/build/mqtt-test --log_level=test_suite diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..62ee522 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,84 @@ +name: coverage + +on: [push, pull_request] + +env: + BOOST_VERSION: 1.82.0 + BOOST_DIR_VER_NAME: 1_82_0 + +jobs: + posix: + name: "coverage ${{matrix.compiler}} -std=c++${{matrix.cxxstd}}" + defaults: + run: + shell: bash + + strategy: + fail-fast: false + matrix: + include: + - toolset: coverage + compiler: g++-11 + install: g++-11 + os: ubuntu-latest + container: ubuntu:22.04 + cxxstd: 20 + cxxflags: '-g -O0 -std=c++20 --coverage -fkeep-inline-functions -fkeep-static-functions' + ldflags: '--coverage' + + runs-on: ${{ matrix.os }} + container: ${{ matrix.container }} + env: + CMAKE_BUILD_PARALLEL_LEVEL: 4 + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup container environment + if: matrix.container + run: | + apt-get update + apt-get -y install sudo wget tar cmake openssl libssl-dev pkg-config lcov + + - name: Install compiler + run: sudo apt-get install -y ${{ matrix.install }} + + - name: Setup Boost + run: | + wget https://archives.boost.io/release/${{ env.BOOST_VERSION }}/source/boost_${{ env.BOOST_DIR_VER_NAME }}.tar.gz + tar xzf boost_${{ env.BOOST_DIR_VER_NAME }}.tar.gz + mkdir /usr/local/boost_${{ env.BOOST_DIR_VER_NAME }} + mv boost_${{ env.BOOST_DIR_VER_NAME }}/boost /usr/local/boost_${{ env.BOOST_DIR_VER_NAME }} + rm boost_${{ env.BOOST_DIR_VER_NAME }}.tar.gz + + - name: Setup library + run: | + cmake -S . -B build -DCMAKE_CXX_COMPILER="${{ matrix.compiler }}" \ + -DBoost_INCLUDE_DIR="/usr/local/boost_${{ env.BOOST_DIR_VER_NAME }}" + sudo cmake --install build + + - name: Build tests + run: | + cmake -S test/unit -B test/unit/build -DCMAKE_CXX_COMPILER="${{ matrix.compiler }}" -DCMAKE_CXX_FLAGS="${{ matrix.cxxflags }}" \ + -DCMAKE_EXE_LINKER_FLAGS="${{ matrix.ldflags }}" -DCMAKE_BUILD_TYPE="Coverage" \ + -DBoost_INCLUDE_DIR="/usr/local/boost_${{ env.BOOST_DIR_VER_NAME }}" + cmake --build test/unit/build -j 4 + + - name: Run tests + run: ./test/unit/build/mqtt-test --log_level=test_suite + + - name: Generate Coverage Report + run: | + lcov --capture --output-file coverage.info --directory test/unit/build + lcov --remove coverage.info '/usr/include/*' --output-file coverage.info + lcov --remove coverage.info '**/test/*' --output-file coverage.info + lcov --remove coverage.info '**/boost/*' --output-file coverage.info + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + with: + files: coverage.info + fail_ci_if_error: true + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index c09c20e..f0d8789 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -24,7 +24,6 @@ add_executable( ) target_include_directories(mqtt-test PRIVATE include) -target_compile_features(mqtt-test PRIVATE cxx_std_17) target_compile_definitions(mqtt-test PRIVATE BOOST_TEST_NO_MAIN=1) find_package(OpenSSL REQUIRED) diff --git a/test/unit/test/cancellation.cpp b/test/unit/test/cancellation.cpp index c3c7280..4d50ad0 100644 --- a/test/unit/test/cancellation.cpp +++ b/test/unit/test/cancellation.cpp @@ -190,7 +190,7 @@ BOOST_AUTO_TEST_CASE(rerunning_the_client) { using client_type = mqtt_client; client_type c(ioc, ""); - c.brokers("mqtt.mireo.local", 1883) + c.brokers("broker.hivemq.com", 1883) .credentials("test-cli", "", "") .run(); diff --git a/test/unit/test/coroutine.cpp b/test/unit/test/coroutine.cpp index 91e95de..48a969e 100644 --- a/test/unit/test/coroutine.cpp +++ b/test/unit/test/coroutine.cpp @@ -27,30 +27,6 @@ void async_teardown( } // end namespace boost::beast::websocket -constexpr char mireo_ca[] = - "-----BEGIN CERTIFICATE-----\n" - "MIIDUTCCAjmgAwIBAgIUAzV59EhZA5MXluHNqRi9cBP0x9swDQYJKoZIhvcNAQEL\n" - "BQAwGDEWMBQGA1UEAwwNTWlyZW8gUm9vdCBDQTAeFw0yMjA0MDcxMzM1MjlaFw0z\n" - "MjA0MDQxMzM1MjlaMBgxFjAUBgNVBAMMDU1pcmVvIFJvb3QgQ0EwggEiMA0GCSqG\n" - "SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCin/qsHpdxT3iW0SEHhAcTfESyQcfwGtJE\n" - "jcRrGEj36X6eahyY4AF+4Mlz2vWFeW52ayGXpQKn/z4tChdN80txdY77YmEX7XE0\n" - "HHZYY6toNq/+mNX9h2HvB0GW+8+E0YfNN/HloTxDo3RT8+IovY9OSXt44vY4YtQK\n" - "JbvZIm2Q8Iuv3vfNR05uFa4HcNqFhELh10jss0xG/54Y2NvB6xdKOZ8LRQuIX+Fu\n" - "QRzMiqRFQPUJzWxbKF5I/MFiKWmAG0QNPDnlb8XtPmFTFCWY9X96wOpQOczrxT2+\n" - "+vnTxPA3aTAkz7M4yUuocZQqTlbdfdGOSAENXavewdMCyy5bQsSLAgMBAAGjgZIw\n" - "gY8wHQYDVR0OBBYEFLdUGYfJRf9mbM/fTav9U2vFI+TRMFMGA1UdIwRMMEqAFLdU\n" - "GYfJRf9mbM/fTav9U2vFI+TRoRykGjAYMRYwFAYDVQQDDA1NaXJlbyBSb290IENB\n" - "ghQDNXn0SFkDkxeW4c2pGL1wE/TH2zAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB\n" - "BjANBgkqhkiG9w0BAQsFAAOCAQEAHm5d4YUP8BYcks10UCdswLtxbMUN99fNbnYo\n" - "RMxx4EapwhEZFSNbIZvf1INJd5Po+hH5jteBeFVP+4zKqrhg3I8pjdC4josHmrhS\n" - "28OjOFWp6xNJC43BHnLpc84bH0+XIEBbk7YA6H3GjpsZ7aJkhj/JPjjNq7bmyYN7\n" - "1I9RK4PtIrNtUFbSsHZCZhf8Amtl8PrpktITECjfqCq+8uOAqP4McTIQ1JKwYy6f\n" - "O6iu0eybJCFhWYENTUQyPi1VtEwOpWNLzaXBYdj69Xg8wA/J9RZIoqXWvtHv4rPF\n" - "HGudMEIVB3y2vVLmujvQCqYPZWwbgpy5mN3F4uBNuZhTIwWRFg==\n" - "-----END CERTIFICATE-----\n" -; - - namespace async_mqtt5 { template @@ -101,25 +77,24 @@ asio::awaitable sanity_check(mqtt_client& c) { BOOST_CHECK(!ec_2); BOOST_CHECK(!pubcomp_rc); - std::vector topics; - topics.push_back(subscribe_topic{ - "test/mqtt-test", { + subscribe_topic sub_topic = subscribe_topic { + "test/mqtt-test", async_mqtt5::subscribe_options { qos_e::exactly_once, subscribe_options::no_local_e::no, subscribe_options::retain_as_published_e::retain, subscribe_options::retain_handling_e::send } - }); + }; auto [sub_ec, sub_codes, sub_props] = co_await c.async_subscribe( - topics, subscribe_props {}, use_nothrow_awaitable + sub_topic, subscribe_props {}, use_nothrow_awaitable ); BOOST_CHECK(!sub_ec); BOOST_CHECK(!sub_codes[0]); auto [rec, topic, payload, publish_props] = co_await c.async_receive(use_nothrow_awaitable); auto [unsub_ec, unsub_codes, unsub_props] = co_await c.async_unsubscribe( - std::vector{"test/mqtt-test"}, unsubscribe_props {}, + "test/mqtt-test", unsubscribe_props {}, use_nothrow_awaitable ); BOOST_CHECK(!unsub_ec); @@ -138,7 +113,7 @@ BOOST_AUTO_TEST_CASE(tcp_client_check) { client_type c(ioc, ""); c.credentials("tcp-tester", "", "") - .brokers("emqtt.mireo.local", 1883) + .brokers("broker.hivemq.com", 1883) .will({ "test/mqtt-test", "Client disconnected!", qos_e::at_least_once }) .run(); @@ -175,7 +150,7 @@ BOOST_AUTO_TEST_CASE(websocket_tcp_client_check) { client_type c(ioc, ""); c.credentials("websocket-tcp-tester", "", "") - .brokers("emqtt.mireo.local/mqtt", 8083) + .brokers("broker.hivemq.com/mqtt", 8000) .will({ "test/mqtt-test", "Client disconnected!", qos_e::at_least_once }) .run(); @@ -208,15 +183,11 @@ BOOST_AUTO_TEST_CASE(openssl_tls_client_check) { using stream_type = asio::ssl::stream; asio::ssl::context tls_context(asio::ssl::context::tls_client); - error_code ec; - tls_context.add_certificate_authority(asio::buffer(mireo_ca), ec); - tls_context.set_verify_mode(asio::ssl::verify_peer); - using client_type = mqtt_client; client_type c(ioc, "", std::move(tls_context)); c.credentials("openssl-tls-tester", "", "") - .brokers("emqtt.mireo.local", 8883) + .brokers("broker.hivemq.com", 8883) .will({ "test/mqtt-test", "Client disconnected!", qos_e::at_least_once }) .run(); @@ -249,16 +220,13 @@ BOOST_AUTO_TEST_CASE(websocket_tls_client_check) { asio::ssl::stream >; - error_code ec; asio::ssl::context tls_context(asio::ssl::context::tls_client); - tls_context.add_certificate_authority(asio::buffer(mireo_ca), ec); - tls_context.set_verify_mode(asio::ssl::verify_peer); using client_type = mqtt_client; client_type c(ioc, "", std::move(tls_context)); c.credentials("websocket-tls-tester", "", "") - .brokers("emqtt.mireo.local/mqtt", 8884) + .brokers("broker.hivemq.com/mqtt", 8884) .will({ "test/mqtt-test", "Client disconnected!", qos_e::at_least_once }) .run();