Files

150 lines
5.5 KiB
C++
Raw Permalink Normal View History

2024-05-27 10:35:06 +02:00
//
2025-02-14 13:42:23 +01:00
// Copyright (c) 2023-2025 Ivica Siladic, Bruno Iljazovic, Korina Simicevic
2024-05-27 10:35:06 +02:00
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
//
2025-01-13 16:11:41 +01:00
#include <boost/mqtt5/mqtt_client.hpp>
2023-12-07 09:32:34 +01:00
2025-01-13 16:11:41 +01:00
#include <boost/mqtt5/detail/any_authenticator.hpp>
#include <boost/mqtt5/detail/async_traits.hpp>
#include <boost/asio/async_result.hpp>
2023-12-07 09:32:34 +01:00
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/system_executor.hpp>
2025-01-13 16:11:41 +01:00
#include <boost/test/unit_test.hpp>
#include <boost/type_traits/remove_cv_ref.hpp>
2025-01-13 16:11:41 +01:00
#include <string>
#include <string_view>
#include <type_traits>
2023-12-07 09:32:34 +01:00
#include "test_common/extra_deps.hpp"
2025-01-13 16:11:41 +01:00
using namespace boost::mqtt5;
2023-12-07 09:32:34 +01:00
2024-01-18 10:37:13 +01:00
struct good_authenticator {
2025-01-13 16:11:41 +01:00
good_authenticator() = default;
2023-12-07 09:32:34 +01:00
2025-01-13 16:11:41 +01:00
template <typename CompletionToken>
decltype(auto) async_auth(
auth_step_e step, std::string data,
CompletionToken&& token
) {
using error_code = boost::system::error_code;
using Signature = void (error_code, std::string);
2023-12-07 09:32:34 +01:00
2025-01-13 16:11:41 +01:00
auto initiate = [](auto, auth_step_e, std::string) {};
2023-12-07 09:32:34 +01:00
2025-01-13 16:11:41 +01:00
return asio::async_initiate<CompletionToken, Signature>(
initiate, token, step, std::move(data)
);
}
2023-12-07 09:32:34 +01:00
2025-01-13 16:11:41 +01:00
std::string_view method() const {
return "method";
}
2023-12-07 09:32:34 +01:00
};
2024-01-18 10:37:13 +01:00
struct bad_authenticator {
2025-01-13 16:11:41 +01:00
bad_authenticator() = default;
2023-12-07 09:32:34 +01:00
2025-01-13 16:11:41 +01:00
void async_auth(std::string /* data */) {}
2023-12-07 09:32:34 +01:00
2025-01-13 16:11:41 +01:00
std::string_view method() const {
return "method";
}
2023-12-07 09:32:34 +01:00
};
BOOST_STATIC_ASSERT(detail::is_authenticator<good_authenticator>);
BOOST_STATIC_ASSERT(!detail::is_authenticator<bad_authenticator>);
2023-12-07 09:32:34 +01:00
namespace asio = boost::asio;
using tcp_layer = asio::ip::tcp::socket;
BOOST_STATIC_ASSERT(!detail::has_next_layer<tcp_layer>);
BOOST_STATIC_ASSERT(!detail::has_tls_layer<tcp_layer>);
BOOST_STATIC_ASSERT(!detail::has_tls_handshake<tcp_layer>);
BOOST_STATIC_ASSERT(!detail::has_ws_handshake<tcp_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::next_layer_type<tcp_layer>, tcp_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::lowest_layer_type<tcp_layer>, tcp_layer>);
void tcp_layers_test() {
2025-01-13 16:11:41 +01:00
asio::system_executor ex;
tcp_layer layer(ex);
2025-01-13 16:11:41 +01:00
detail::next_layer_type<tcp_layer>& nlayer = detail::next_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(nlayer)>, tcp_layer>);
2025-01-13 16:11:41 +01:00
detail::lowest_layer_type<tcp_layer>& llayer = detail::lowest_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(llayer)>, tcp_layer>);
}
#ifdef BOOST_MQTT5_EXTRA_DEPS
namespace beast = boost::beast;
using tls_layer = asio::ssl::stream<asio::ip::tcp::socket>;
using websocket_tcp_layer = beast::websocket::stream<tcp_layer>;
using websocket_tls_layer = beast::websocket::stream<tls_layer>;
BOOST_STATIC_ASSERT(detail::has_next_layer<tls_layer>);
BOOST_STATIC_ASSERT(detail::has_tls_layer<tls_layer>);
BOOST_STATIC_ASSERT(detail::has_tls_handshake<tls_layer>);
BOOST_STATIC_ASSERT(!detail::has_ws_handshake<tls_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::next_layer_type<tls_layer>, tcp_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::lowest_layer_type<tls_layer>, tcp_layer>);
BOOST_STATIC_ASSERT(detail::has_next_layer<websocket_tcp_layer>);
BOOST_STATIC_ASSERT(!detail::has_tls_layer<websocket_tcp_layer>);
BOOST_STATIC_ASSERT(!detail::has_tls_handshake<websocket_tcp_layer>);
BOOST_STATIC_ASSERT(detail::has_ws_handshake<websocket_tcp_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::next_layer_type<websocket_tcp_layer>, tcp_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::lowest_layer_type<websocket_tcp_layer>, tcp_layer>);
BOOST_STATIC_ASSERT(detail::has_next_layer<websocket_tls_layer>);
BOOST_STATIC_ASSERT(detail::has_tls_layer<websocket_tls_layer>);
BOOST_STATIC_ASSERT(!detail::has_tls_handshake<websocket_tls_layer>);
BOOST_STATIC_ASSERT(detail::has_ws_handshake<websocket_tls_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::next_layer_type<websocket_tls_layer>, tls_layer>);
BOOST_STATIC_ASSERT(std::is_same_v<detail::lowest_layer_type<websocket_tls_layer>, tcp_layer>);
void tls_layers_test() {
2025-01-13 16:11:41 +01:00
asio::system_executor ex;
asio::ssl::context ctx(asio::ssl::context::tls_client);
tls_layer layer(ex, ctx);
2025-01-13 16:11:41 +01:00
detail::next_layer_type<tls_layer>& nlayer = detail::next_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(nlayer)>, tcp_layer>);
2025-01-13 16:11:41 +01:00
detail::lowest_layer_type<tls_layer>& llayer = detail::lowest_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(llayer)>, tcp_layer>);
}
void websocket_tcp_layers_test() {
2025-01-13 16:11:41 +01:00
asio::system_executor ex;
websocket_tcp_layer layer(ex);
2025-01-13 16:11:41 +01:00
detail::next_layer_type<websocket_tcp_layer>& nlayer = detail::next_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(nlayer)>, tcp_layer>);
2025-01-13 16:11:41 +01:00
detail::lowest_layer_type<websocket_tcp_layer>& llayer = detail::lowest_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(llayer)>, tcp_layer>);
}
void websocket_tls_layers_test() {
2025-01-13 16:11:41 +01:00
asio::system_executor ex;
asio::ssl::context ctx(asio::ssl::context::tls_client);
websocket_tls_layer layer(ex, ctx);
2025-01-13 16:11:41 +01:00
detail::next_layer_type<websocket_tls_layer>& nlayer = detail::next_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(nlayer)>, tls_layer>);
2025-01-13 16:11:41 +01:00
detail::lowest_layer_type<websocket_tls_layer>& llayer = detail::lowest_layer(layer);
BOOST_STATIC_ASSERT(std::is_same_v<boost::remove_cv_ref_t<decltype(llayer)>, tcp_layer>);
}
#endif // BOOST_MQTT5_EXTRA_DEPS