diff --git a/dev/test/so_5/message_limits/CMakeLists.txt b/dev/test/so_5/message_limits/CMakeLists.txt index 3d378e41..cec5beb2 100644 --- a/dev/test/so_5/message_limits/CMakeLists.txt +++ b/dev/test/so_5/message_limits/CMakeLists.txt @@ -8,6 +8,8 @@ add_subdirectory(redirect_msg_too_deep) add_subdirectory(subscr_without_limit) add_subdirectory(transform_msg) add_subdirectory(transform_msg_too_deep) +add_subdirectory(transform_to_mutable_msg) +add_subdirectory(transform_to_mutable_msg_2) add_subdirectory(another_direct_mbox) add_subdirectory(redirect_from_timer_to_full_mchain) add_subdirectory(transform_from_timer_to_full_mchain) diff --git a/dev/test/so_5/message_limits/build_tests.rb b/dev/test/so_5/message_limits/build_tests.rb index 196df235..c85ec956 100644 --- a/dev/test/so_5/message_limits/build_tests.rb +++ b/dev/test/so_5/message_limits/build_tests.rb @@ -28,6 +28,8 @@ required_prj "#{path}/transform_msg/sc_mbox/prj.ut.rb" required_prj "#{path}/transform_msg_too_deep/mc_mbox/prj.ut.rb" required_prj "#{path}/transform_msg_too_deep/sc_mbox/prj.ut.rb" + required_prj "#{path}/transform_to_mutable_msg/prj.ut.rb" + required_prj "#{path}/transform_to_mutable_msg_2/prj.ut.rb" required_prj "#{path}/another_direct_mbox/prj.ut.rb" diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg/CMakeLists.txt b/dev/test/so_5/message_limits/transform_to_mutable_msg/CMakeLists.txt new file mode 100644 index 00000000..e826da4d --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg/CMakeLists.txt @@ -0,0 +1,2 @@ +set(UNITTEST _unit.test.message_limits.transform_to_mutable_msg) +include(${CMAKE_SOURCE_DIR}/cmake/unittest.cmake) diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg/main.cpp b/dev/test/so_5/message_limits/transform_to_mutable_msg/main.cpp new file mode 100644 index 00000000..ea1ab687 --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg/main.cpp @@ -0,0 +1,115 @@ +/* + * A test for trasformation of an immutable message into a mutable message. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +struct msg_initial_message final : public so_5::message_t +{ + const std::string m_msg; + + msg_initial_message( std::string msg ) : m_msg{ std::move(msg) } + {} +}; + +struct msg_transformed_message final : public so_5::message_t +{ + std::string m_msg; + + msg_transformed_message( std::string msg ) : m_msg{ std::move(msg) } + {} +}; + +class agent_with_limit_t final : public so_5::agent_t +{ +public : + agent_with_limit_t( + context_t ctx ) + : so_5::agent_t{ ctx + + limit_then_transform( 1u, + [this]( const msg_initial_message & msg ) { + return make_transformed< + so_5::mutable_msg< msg_transformed_message > >( + so_direct_mbox(), + "<" + msg.m_msg + ">" ); + } ) + + limit_then_abort< so_5::mutable_msg< msg_transformed_message > >( 1u ) + } + {} + + void + so_define_agent() override + { + so_subscribe_self() + .event( [this]( mhood_t cmd ) { + m_received += "[initial:" + cmd->m_msg + "]"; + } ) + .event( [this]( mutable_mhood_t cmd ) { + m_received += "[transformed:" + cmd->m_msg + "]"; + + const std::string expected = + "[initial:hello][transformed:]"; + + if( expected != m_received ) + throw std::runtime_error( expected + " != " + m_received ); + else + so_deregister_agent_coop_normally(); + } ) + ; + } + + virtual void + so_evt_start() override + { + so_5::send< msg_initial_message >( *this, "hello" ); + so_5::send< msg_initial_message >( *this, "bye" ); + } + +private : + std::string m_received; +}; + +void +init( so_5::environment_t & env ) +{ + env.introduce_coop( + []( so_5::coop_t & coop ) { + coop.make_agent< agent_with_limit_t >(); + } ); +} + +int +main() +{ + try + { + run_with_time_limit( + []() + { + so_5::launch( &init, + [](so_5::environment_params_t & params) { + params.message_delivery_tracer( + so_5::msg_tracing::std_cout_tracer() ); + } ); + }, + 5 ); + } + catch( const std::exception & ex ) + { + std::cerr << "Error: " << ex.what() << std::endl; + return 1; + } + + return 0; +} + diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg/prj.rb b/dev/test/so_5/message_limits/transform_to_mutable_msg/prj.rb new file mode 100644 index 00000000..72a61dee --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg/prj.rb @@ -0,0 +1,11 @@ +require 'mxx_ru/cpp' + +MxxRu::Cpp::exe_target { + + required_prj 'so_5/prj.rb' + + target '_unit.test.message_limits.transform_to_mutable_msg' + + cpp_source 'main.cpp' +} + diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg/prj.ut.rb b/dev/test/so_5/message_limits/transform_to_mutable_msg/prj.ut.rb new file mode 100644 index 00000000..b271b4ed --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg/prj.ut.rb @@ -0,0 +1,9 @@ +require 'mxx_ru/binary_unittest' + +path = 'test/so_5/message_limits/transform_to_mutable_msg' + +MxxRu::setup_target( + MxxRu::BinaryUnittestTarget.new( + "#{path}/prj.ut.rb", + "#{path}/prj.rb" ) +) diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg_2/CMakeLists.txt b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/CMakeLists.txt new file mode 100644 index 00000000..b423ae02 --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/CMakeLists.txt @@ -0,0 +1,2 @@ +set(UNITTEST _unit.test.message_limits.transform_to_mutable_msg_2) +include(${CMAKE_SOURCE_DIR}/cmake/unittest.cmake) diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg_2/main.cpp b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/main.cpp new file mode 100644 index 00000000..39b85886 --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/main.cpp @@ -0,0 +1,116 @@ +/* + * A test for trasformation of an immutable message into a mutable message. + * Messages that not derived from so_5::message_t are used. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +struct msg_initial_message +{ + const std::string m_msg; + + msg_initial_message( std::string msg ) : m_msg{ std::move(msg) } + {} +}; + +struct msg_transformed_message +{ + std::string m_msg; + + msg_transformed_message( std::string msg ) : m_msg{ std::move(msg) } + {} +}; + +class agent_with_limit_t final : public so_5::agent_t +{ +public : + agent_with_limit_t( + context_t ctx ) + : so_5::agent_t{ ctx + + limit_then_transform( 1u, + [this]( const msg_initial_message & msg ) { + return make_transformed< + so_5::mutable_msg< msg_transformed_message > >( + so_direct_mbox(), + "<" + msg.m_msg + ">" ); + } ) + + limit_then_abort< so_5::mutable_msg< msg_transformed_message > >( 1u ) + } + {} + + void + so_define_agent() override + { + so_subscribe_self() + .event( [this]( mhood_t cmd ) { + m_received += "[initial:" + cmd->m_msg + "]"; + } ) + .event( [this]( mutable_mhood_t cmd ) { + m_received += "[transformed:" + cmd->m_msg + "]"; + + const std::string expected = + "[initial:hello][transformed:]"; + + if( expected != m_received ) + throw std::runtime_error( expected + " != " + m_received ); + else + so_deregister_agent_coop_normally(); + } ) + ; + } + + virtual void + so_evt_start() override + { + so_5::send< msg_initial_message >( *this, "hello" ); + so_5::send< msg_initial_message >( *this, "bye" ); + } + +private : + std::string m_received; +}; + +void +init( so_5::environment_t & env ) +{ + env.introduce_coop( + []( so_5::coop_t & coop ) { + coop.make_agent< agent_with_limit_t >(); + } ); +} + +int +main() +{ + try + { + run_with_time_limit( + []() + { + so_5::launch( &init, + [](so_5::environment_params_t & params) { + params.message_delivery_tracer( + so_5::msg_tracing::std_cout_tracer() ); + } ); + }, + 5 ); + } + catch( const std::exception & ex ) + { + std::cerr << "Error: " << ex.what() << std::endl; + return 1; + } + + return 0; +} + diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg_2/prj.rb b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/prj.rb new file mode 100644 index 00000000..80c6703c --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/prj.rb @@ -0,0 +1,11 @@ +require 'mxx_ru/cpp' + +MxxRu::Cpp::exe_target { + + required_prj 'so_5/prj.rb' + + target '_unit.test.message_limits.transform_to_mutable_msg_2' + + cpp_source 'main.cpp' +} + diff --git a/dev/test/so_5/message_limits/transform_to_mutable_msg_2/prj.ut.rb b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/prj.ut.rb new file mode 100644 index 00000000..691e78c5 --- /dev/null +++ b/dev/test/so_5/message_limits/transform_to_mutable_msg_2/prj.ut.rb @@ -0,0 +1,9 @@ +require 'mxx_ru/binary_unittest' + +path = 'test/so_5/message_limits/transform_to_mutable_msg_2' + +MxxRu::setup_target( + MxxRu::BinaryUnittestTarget.new( + "#{path}/prj.ut.rb", + "#{path}/prj.rb" ) +)