Skip to content

Commit

Permalink
Merge pull request #736 from redboltz/add_message_expiry_for_inflight
Browse files Browse the repository at this point in the history
Added message expiry interval support for inflight messages.
  • Loading branch information
redboltz authored Nov 28, 2020
2 parents c2f4180 + f48ff4b commit 2627573
Show file tree
Hide file tree
Showing 16 changed files with 633 additions and 132 deletions.
34 changes: 15 additions & 19 deletions .github/workflows/gha.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,18 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- name: Configure
env:
S_CFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer -fsanitize=address
S_CXXFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer -fsanitize=address -pedantic -Wno-noexcept-type -DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
S_LDFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer -fsanitize=address
NS_CFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion
NS_CXXFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -pedantic -Wno-noexcept-type -DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
NS_LDFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion
run: |
[ ${{ matrix.pattern }} == 1 ] || [ ${{ matrix.pattern }} == 2 ] || [ ${{ matrix.pattern }} == 3 ] && \
export CFLAGS=${S_CFLAGS} && export CXXFLAGS=${S_CXXFLAGS} && export LDFLAGS=${S_LDFLAGS}
[ ${{ matrix.pattern }} == 0 ] || [ ${{ matrix.pattern }} == 4 ] || [ ${{ matrix.pattern }} == 5 ] || [ ${{ matrix.pattern }} == 6 ] || [ ${{ matrix.pattern }} == 7 ] && \
export CFLAGS=${NS_CFLAGS} && export CXXFLAGS=${NS_CXXFLAGS} && export LDFLAGS=${NS_LDFLAGS}
[ ${{ matrix.pattern }} == 0 ] && FLAGS="-DCMAKE_CXX_COMPILER=clang++ -DMQTT_TEST_1=ON -DMQTT_TEST_2=ON -DMQTT_TEST_3=OFF -DMQTT_TEST_4=OFF -DMQTT_TEST_5=OFF -DMQTT_TEST_6=OFF -DMQTT_TEST_7=OFF -DMQTT_BUILD_EXAMPLES=OFF -DMQTT_USE_TLS=OFF -DMQTT_USE_WS=ON -DMQTT_USE_STR_CHECK=ON -DMQTT_USE_LOG=ON -DMQTT_STD_ANY=OFF -DMQTT_STD_OPTIONAL=OFF -DMQTT_STD_VARIANT=OFF -DMQTT_STD_STRING_VIEW=OFF -DMQTT_STD_SHARED_PTR_ARRAY=OFF"
[ ${{ matrix.pattern }} == 1 ] && FLAGS="-DCMAKE_CXX_COMPILER=clang++ -DMQTT_TEST_1=ON -DMQTT_TEST_2=ON -DMQTT_TEST_3=ON -DMQTT_TEST_4=OFF -DMQTT_TEST_5=OFF -DMQTT_TEST_6=OFF -DMQTT_TEST_7=OFF -DMQTT_BUILD_EXAMPLES=OFF -DMQTT_USE_TLS=ON -DMQTT_USE_WS=ON -DMQTT_USE_STR_CHECK=ON -DMQTT_USE_LOG=OFF -DMQTT_STD_ANY=OFF -DMQTT_STD_OPTIONAL=OFF -DMQTT_STD_VARIANT=OFF -DMQTT_STD_STRING_VIEW=OFF -DMQTT_STD_SHARED_PTR_ARRAY=OFF"
[ ${{ matrix.pattern }} == 2 ] && FLAGS="-DCMAKE_CXX_COMPILER=clang++ -DMQTT_TEST_1=OFF -DMQTT_TEST_2=OFF -DMQTT_TEST_3=OFF -DMQTT_TEST_4=ON -DMQTT_TEST_5=ON -DMQTT_TEST_6=ON -DMQTT_TEST_7=OFF -DMQTT_BUILD_EXAMPLES=OFF -DMQTT_USE_TLS=ON -DMQTT_USE_WS=ON -DMQTT_USE_STR_CHECK=ON -DMQTT_USE_LOG=OFF -DMQTT_STD_ANY=ON -DMQTT_STD_OPTIONAL=ON -DMQTT_STD_VARIANT=ON -DMQTT_STD_STRING_VIEW=ON -DMQTT_STD_SHARED_PTR_ARRAY=OFF"
Expand All @@ -62,32 +73,17 @@ jobs:
[ ${{ matrix.pattern }} == 6 ] && FLAGS="-DCMAKE_CXX_COMPILER=g++ -DMQTT_CODECOV=ON -DMQTT_TEST_1=OFF -DMQTT_TEST_2=OFF -DMQTT_TEST_3=OFF -DMQTT_TEST_4=OFF -DMQTT_TEST_5=ON -DMQTT_TEST_6=ON -DMQTT_TEST_7=OFF -DMQTT_BUILD_EXAMPLES=OFF -DMQTT_USE_TLS=ON -DMQTT_USE_WS=ON -DMQTT_USE_STR_CHECK=ON -DMQTT_USE_LOG=OFF -DMQTT_STD_ANY=ON -DMQTT_STD_OPTIONAL=ON -DMQTT_STD_VARIANT=ON -DMQTT_STD_STRING_VIEW=ON -DMQTT_STD_SHARED_PTR_ARRAY=OFF"
[ ${{ matrix.pattern }} == 7 ] && FLAGS="-DCMAKE_CXX_COMPILER=g++ -DMQTT_CODECOV=ON -DMQTT_TEST_1=OFF -DMQTT_TEST_2=OFF -DMQTT_TEST_3=OFF -DMQTT_TEST_4=OFF -DMQTT_TEST_5=OFF -DMQTT_TEST_6=OFF -DMQTT_TEST_7=ON -DMQTT_BUILD_EXAMPLES=ON -DMQTT_USE_TLS=ON -DMQTT_USE_WS=OFF -DMQTT_USE_STR_CHECK=OFF -DMQTT_USE_LOG=ON -DMQTT_STD_ANY=OFF -DMQTT_STD_OPTIONAL=OFF -DMQTT_STD_VARIANT=OFF -DMQTT_STD_STRING_VIEW=OFF -DMQTT_STD_SHARED_PTR_ARRAY=OFF"
BOOST_ROOT=$BOOST_ROOT_1_72_0 cmake -S ${{ github.workspace }} -B ${{ runner.temp }} ${FLAGS}
BOOST_ROOT=$BOOST_ROOT_1_72_0 cmake -S ${{ github.workspace }} -B ${{ runner.temp }} ${FLAGS} -DCMAKE_C_FLAGS="${CFLAGS}" -DCMAKE_CXX_FLAGS="${CXXFLAGS}" -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}"
- name: Check Header Dependencies
run: |
cmake --build ${{ runner.temp }} --parallel $(nproc) --clean-first --target check_deps
- name: Compile with Sanitizer
if: (matrix.pattern == 1) || (matrix.pattern == 2) || (matrix.pattern == 3)
env:
CFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer -fsanitize=address
CXXFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer -fsanitize=address
LDFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer -fsanitize=address
run: |
CXXFLAGS="${CXXFLAGS} -pedantic -DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING"
cmake --build ${{ runner.temp }} --clean-first
- name: Compile without Sanitizer
if: (matrix.pattern == 0) || (matrix.pattern == 4) || (matrix.pattern == 5) || (matrix.pattern == 6) || (matrix.pattern == 7)
env:
CFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer
CXXFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer
LDFLAGS: -Werror -g -Wall -Wextra -Wno-ignored-qualifiers -Wconversion -fno-omit-frame-pointer
- name: Compile
run: |
CXXFLAGS="${CXXFLAGS} -pedantic -DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING"
cmake --build ${{ runner.temp }} --clean-first
VERBOSE=1 cmake --build ${{ runner.temp }} --clean-first
- name: Test
working-directory: ${{ runner.temp }}
run: |
ctest -VV
CTEST_ARGS="--log_level=all" ctest -VV
- name: Code Coverage
if: (matrix.pattern == 4) || (matrix.pattern == 5) || (matrix.pattern == 6) || (matrix.pattern == 7)
run: |
Expand Down
6 changes: 5 additions & 1 deletion azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,11 @@ steps:
return Write-Error "cmake --build failed"
}
cd test
ctest -VV
# If you want to debug a specific test file with logs, do as follows instead of execute ctest
# Release\resend.exe --log_level=all
ctest -VV -C Release
if (!$?) {
return Write-Error "ctest -VV failed"
}
Expand Down
3 changes: 1 addition & 2 deletions include/mqtt/endpoint.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -783,8 +783,7 @@ class endpoint : public std::enable_shared_from_this<endpoint<Mutex, LockGuard,
* This handler is called when the current mqtt message has been processed.
* @param func A callback function that is called when async operation will finish.
*/
MQTT_ALWAYS_INLINE virtual void on_mqtt_message_processed(any session_life_keeper) noexcept
{
MQTT_ALWAYS_INLINE virtual void on_mqtt_message_processed(any session_life_keeper) {
if (async_read_on_message_processed_) {
async_read_control_packet_type(force_move(session_life_keeper));
}
Expand Down
2 changes: 1 addition & 1 deletion include/mqtt/log.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ inline constexpr null_log const& operator<<(null_log const& o, T const&) { retur
// template arguments are defined in MQTT_NS
// filter and formatter can distinguish mqtt_cpp's channel and severity by their types
using global_logger_t = log::sources::severity_channel_logger_mt<severity_level, channel>;
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(logger, global_logger_t);
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(logger, global_logger_t)

// Normal attributes
BOOST_LOG_ATTRIBUTE_KEYWORD(file, "MqttFile", std::string)
Expand Down
4 changes: 2 additions & 2 deletions include/mqtt/topic_alias_recv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace MQTT_NS {
using topic_alias_recv_map_t = std::map<topic_alias_t, std::string>;

inline void register_topic_alias(topic_alias_recv_map_t& m, string_view topic, topic_alias_t alias) {
BOOST_ASSERT(alias > 0 && alias <= topic_alias_max);
BOOST_ASSERT(alias > 0); //alias <= topic_alias_max is always true

MQTT_LOG("mqtt_impl", info)
<< MQTT_ADD_VALUE(address, &m)
Expand All @@ -43,7 +43,7 @@ inline void register_topic_alias(topic_alias_recv_map_t& m, string_view topic,
}

inline std::string find_topic_by_alias(topic_alias_recv_map_t const& m, topic_alias_t alias) {
BOOST_ASSERT(alias > 0 && alias <= topic_alias_max);
BOOST_ASSERT(alias > 0); //alias <= topic_alias_max is always true

std::string topic;
auto it = m.find(alias);
Expand Down
8 changes: 8 additions & 0 deletions include/mqtt/v5_message.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -886,6 +886,14 @@ class basic_publish_message {
return props_;
}

/**
* @brief Get properties
* @return properties
*/
properties& props() {
return props_;
}

/**
* @brief Set dup flag
* @param dup flag value to set
Expand Down
8 changes: 7 additions & 1 deletion test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,13 @@ FOREACH (source_file ${check_PROGRAMS})
ENDIF ()
ENDIF ()

ADD_TEST (${source_file_we} ${source_file_we})
# Running test with arguments
# CTEST_ARGS="--log_level=all" ctest -V
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
ADD_TEST (NAME ${source_file_we} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${source_file_we})
ELSE ()
ADD_TEST (NAME ${source_file_we} COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/args_provider.sh ${CMAKE_CURRENT_BINARY_DIR}/${source_file_we})
ENDIF ()
set_tests_properties(${source_file_we} PROPERTIES TIMEOUT 300)
ENDFOREACH ()

Expand Down
2 changes: 2 additions & 0 deletions test/args_provider.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Param( $command )
Start-Process -FilePath $command -ArgumentList $env:CTEST_ARGS -Wait
3 changes: 3 additions & 0 deletions test/args_provider.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

$1 $(echo ${CTEST_ARGS})
20 changes: 8 additions & 12 deletions test/broker_offline_message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ BOOST_AUTO_TEST_CASE( offline_pubsub_v5 ) {
}
);
c2->set_v5_connack_handler(
[&chk, &c1, &c2]
[&chk, &c2]
(bool sp, MQTT_NS::v5::connect_reason_code connack_reason_code, MQTT_NS::v5::properties /*props*/) {
auto ret = chk.match(
"c1_h_connack",
Expand Down Expand Up @@ -454,7 +454,7 @@ BOOST_AUTO_TEST_CASE( offline_pubsub_v5 ) {
BOOST_TEST(t.val() == "content type");
},
[&](MQTT_NS::v5::property::message_expiry_interval const& t) {
BOOST_TEST(t.val() == 0x12345678UL);
BOOST_TEST(t.val() <= 0x12345678UL);
},
[&](MQTT_NS::v5::property::response_topic const& t) {
BOOST_TEST(t.val() == "response topic");
Expand Down Expand Up @@ -645,9 +645,6 @@ BOOST_AUTO_TEST_CASE( offline_pubsub_v5_timeout ) {
MQTT_NS::v5::property::user_property("key2"_mb, "val2"_mb),
};

auto prop_size = ps.size();
std::size_t user_prop_count = 0;

c1->set_v5_connack_handler(
[&chk, &c2]
(bool sp, MQTT_NS::v5::connect_reason_code connack_reason_code, MQTT_NS::v5::properties /*props*/) {
Expand Down Expand Up @@ -767,13 +764,12 @@ BOOST_AUTO_TEST_CASE( offline_pubsub_v5_timeout ) {
}
);
c2->set_v5_publish_handler(
[&chk, &c1]
(MQTT_NS::optional<packet_id_t> packet_id,
MQTT_NS::publish_options pubopts,
MQTT_NS::buffer topic,
MQTT_NS::buffer contents,
MQTT_NS::v5::properties props) {

[]
(MQTT_NS::optional<packet_id_t>,
MQTT_NS::publish_options,
MQTT_NS::buffer,
MQTT_NS::buffer,
MQTT_NS::v5::properties) {
// We should not received any published message when offline messages timeout
BOOST_TEST(false);
return true;
Expand Down
Loading

0 comments on commit 2627573

Please sign in to comment.