Commit bdf26bcd1016dbf146015c2e942d5cc51d5960ad

Authored by Patric Stout
1 parent 26e28ae0

feat(pubstress): example application to punish your broker

CMakeLists.txt
... ... @@ -52,4 +52,5 @@ target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic -Werror)
52 52 install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
53 53 install(FILES ${CMAKE_BINARY_DIR}/truemqtt.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
54 54  
  55 +add_subdirectory(example/pubstress)
55 56 add_subdirectory(example/pubsub)
... ...
example/pubstress/CMakeLists.txt 0 → 100644
  1 +#
  2 +# Copyright (c) TrueBrain
  3 +#
  4 +# This source code is licensed under the MIT license found in the
  5 +# LICENSE file in the root directory of this source tree.
  6 +#
  7 +
  8 +cmake_minimum_required(VERSION 3.16)
  9 +
  10 +project(truemqtt_pubstress)
  11 +
  12 +set(CMAKE_CXX_STANDARD 17)
  13 +set(CMAKE_CXX_STANDARD_REQUIRED ON)
  14 +
  15 +include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/../../include)
  16 +
  17 +add_executable(${PROJECT_NAME} main.cpp)
  18 +target_link_libraries(${PROJECT_NAME} truemqtt)
... ...
example/pubstress/main.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) TrueBrain
  3 + *
  4 + * This source code is licensed under the MIT license found in the
  5 + * LICENSE file in the root directory of this source tree.
  6 + */
  7 +
  8 +#include <TrueMQTT.h>
  9 +#include <iostream>
  10 +#include <thread>
  11 +
  12 +int main()
  13 +{
  14 + // Create a connection to the local broker.
  15 + TrueMQTT::Client client("localhost", 1883, "test");
  16 +
  17 + client.setLogger(TrueMQTT::Client::LogLevel::WARNING, [](TrueMQTT::Client::LogLevel level, std::string message)
  18 + { std::cout << "Log " << level << ": " << message << std::endl; });
  19 + client.setPublishQueue(TrueMQTT::Client::PublishQueueType::FIFO, 100);
  20 + client.setErrorCallback([](TrueMQTT::Client::Error error, std::string message)
  21 + { std::cout << "Error " << error << ": " << message << std::endl; });
  22 + client.setLastWill("test/lastwill", "example pubsub finished", true);
  23 +
  24 + client.connect();
  25 + std::this_thread::sleep_for(std::chrono::milliseconds(100));
  26 +
  27 + int stop = 0;
  28 +
  29 + // Subscribe to the topic we are going to stress test.
  30 + client.subscribe("test/test/test", [&stop](const std::string topic, const std::string payload) {});
  31 +
  32 + // Send a lot of packets constantly, while telling us when publishing is failing.
  33 + // The expected behaviour is that this goes okay for a while, till the broker
  34 + // backs up, after which it starts to fail intermittently. To push the broker
  35 + // to its breaking point, it helps to add additional subscriptions by other
  36 + // means.
  37 + bool is_failing = true;
  38 + while (true)
  39 + {
  40 + if (!client.publish("test/test/test", "Hello World!", false))
  41 + {
  42 + if (!is_failing)
  43 + {
  44 + is_failing = true;
  45 + std::cout << "Failed to publish message" << std::endl;
  46 + }
  47 + }
  48 + else
  49 + {
  50 + if (is_failing)
  51 + {
  52 + is_failing = false;
  53 + std::cout << "Succeeded to publish message" << std::endl;
  54 + }
  55 + }
  56 + }
  57 +
  58 + // This application never ends, but for good measure, a disconnect.
  59 + client.disconnect();
  60 +
  61 + return 0;
  62 +}
... ...