Skip to content

Commit

Permalink
Added message expiry interval support for inflight messages.
Browse files Browse the repository at this point in the history
Fixed message expiry interval is 0 case.
The interval 0 is different from absent of the interval.
The absent interval means no expiration.
There is no specific notation about interval 0.
That means regard the interval 0 as 0 second.
So the timer will fire immediately.
I have another design option. If the interval is 0 then skip
sending/storing process. But I don't choose it. It requires additional
logic.
boost asio steady_timer accept 0 timer. So I use the same logic as the
intarval has seconds value.

NOTE:
session expiry interval is different. Absent means explicit set 0.

Updated as message expiry interval update based checking.

The function set_propery() didn't work well because the parameter was
const reference. I fixed it. Then I got some of comparison errors.
It means Message Expiry Interval is working as expected.

Fixed CI compiler flags.
Added test log output mechanism with ctest.
Fixed warnings.
Removed invalid disconnect() call.
  • Loading branch information
redboltz committed Nov 28, 2020
1 parent c2f4180 commit f48ff4b
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 f48ff4b

Please sign in to comment.