X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/78da1c00f59351748ceb0f957c7293b6bd71a31d..3c0a4cd82fe92f060595748b8e5ddc31e2e60637:/teshsuite/s4u/activity-lifecycle/testing_comm.cpp diff --git a/teshsuite/s4u/activity-lifecycle/testing_comm.cpp b/teshsuite/s4u/activity-lifecycle/testing_comm.cpp index bbcfbd7f0e..6c9326a5a1 100644 --- a/teshsuite/s4u/activity-lifecycle/testing_comm.cpp +++ b/teshsuite/s4u/activity-lifecycle/testing_comm.cpp @@ -1,23 +1,11 @@ -/* Copyright (c) 2010-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2022. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "activity-lifecycle.hpp" +#include "catch_simgrid.hpp" #include -// Normally, we should be able use Catch2's REQUIRE_THROWS_AS(...), but it generates errors with Address Sanitizer. -// They're certainly false positive. Nevermind and use this simpler replacement. -#define REQUIRE_NETWORK_FAILURE(...) \ - do { \ - try { \ - __VA_ARGS__; \ - FAIL("Expected exception NetworkFailureException not caught"); \ - } catch (simgrid::NetworkFailureException const&) { \ - XBT_VERB("got expected NetworkFailureException"); \ - } \ - } while (0) - static void test_link_off_helper(double delay) { const double start = simgrid::s4u::Engine::get_clock(); @@ -31,7 +19,7 @@ static void test_link_off_helper(double delay) simgrid::s4u::this_actor::sleep_until(milestone[i]); REQUIRE_NETWORK_FAILURE({ INFO("get(" << ('A' + i) << ")"); - simgrid::s4u::Mailbox::by_name("mb")->get(); + simgrid::s4u::Mailbox::by_name("mb")->get(); }); } simgrid::s4u::this_actor::sleep_until(milestone[4]); @@ -70,6 +58,55 @@ static void test_link_off_helper(double delay) simgrid::s4u::this_actor::sleep_for(1.5); }; +static simgrid::s4u::ActorPtr sender_basic(bool& ending_boolean, bool expected_success, double duration, + double delay = -1.0) +{ + return simgrid::s4u::Actor::create("sender", all_hosts[1], [&ending_boolean, expected_success, duration, delay]() { + assert_exit(expected_success, duration); + // Encapsulate the payload in a std::unique_ptr so that it is correctly free'd if/when the sender is killed during + // its communication (thanks to RAII). The pointer is then released when the communication is over. + std::unique_ptr payload(xbt_strdup("toto"), &xbt_free_f); + if (delay > 0.0) { + simgrid::s4u::this_actor::sleep_for(delay / 2.0); + auto comm = simgrid::s4u::Mailbox::by_name("mb")->put_init(payload.get(), 5000); + simgrid::s4u::this_actor::sleep_for(delay / 2.0); + comm->wait(); + } else { + simgrid::s4u::Mailbox::by_name("mb")->put(payload.get(), 5000); + } + payload.release(); + ending_boolean = true; + }); +} +static simgrid::s4u::ActorPtr receiver_basic(bool& ending_boolean, bool expected_success, double duration, + double delay = -1.0) +{ + return simgrid::s4u::Actor::create("receiver", all_hosts[2], [&ending_boolean, expected_success, duration, delay]() { + assert_exit(expected_success, duration); + char* payload; + if (delay > 0.0) { + simgrid::s4u::this_actor::sleep_for(delay / 2.0); + auto comm = simgrid::s4u::Mailbox::by_name("mb")->get_init()->set_dst_data(reinterpret_cast(&payload), + sizeof(void*)); + simgrid::s4u::this_actor::sleep_for(delay / 2.0); + comm->wait(); + } else { + payload = simgrid::s4u::Mailbox::by_name("mb")->get(); + } + xbt_free(payload); + ending_boolean = true; + }); +} +static simgrid::s4u::ActorPtr sender_dtach(bool& ending_boolean, bool expected_success, double duration) +{ + return simgrid::s4u::Actor::create("sender", all_hosts[1], [&ending_boolean, expected_success, duration]() { + assert_exit(expected_success, duration); + char* payload = xbt_strdup("toto"); + simgrid::s4u::Mailbox::by_name("mb")->put_init(payload, 1000)->detach(); + ending_boolean = true; + }); +} + TEST_CASE("Activity lifecycle: comm activities") { XBT_INFO("#####[ launch next \"comm\" test ]#####"); @@ -80,19 +117,42 @@ TEST_CASE("Activity lifecycle: comm activities") bool send_done = false; bool recv_done = false; - simgrid::s4u::Actor::create("sender", all_hosts[1], [&send_done]() { - assert_exit(true, 5); - char* payload = xbt_strdup("toto"); - simgrid::s4u::Mailbox::by_name("mb")->put(payload, 5000); - send_done = true; - }); + sender_basic(send_done, true, 5); + receiver_basic(recv_done, true, 5); - simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { - assert_exit(true, 5); - void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); - xbt_free(payload); - recv_done = true; - }); + simgrid::s4u::this_actor::sleep_for(9); + INFO("Sender or receiver killed somehow. It shouldn't"); + REQUIRE(send_done); + REQUIRE(recv_done); + + END_SECTION; + } + + BEGIN_SECTION("comm (delayed send)") + { + XBT_INFO("Launch a communication with a delay for the send"); + bool send_done = false; + bool recv_done = false; + + sender_basic(send_done, true, 6, 1); // cover Comm::send + receiver_basic(recv_done, true, 6); + + simgrid::s4u::this_actor::sleep_for(9); + INFO("Sender or receiver killed somehow. It shouldn't"); + REQUIRE(send_done); + REQUIRE(recv_done); + + END_SECTION; + } + + BEGIN_SECTION("comm (delayed recv)") + { + XBT_INFO("Launch a communication with a delay for the recv"); + bool send_done = false; + bool recv_done = false; + + sender_basic(send_done, true, 6); + receiver_basic(recv_done, true, 6, 1); // cover Comm::recv simgrid::s4u::this_actor::sleep_for(9); INFO("Sender or receiver killed somehow. It shouldn't"); @@ -108,22 +168,11 @@ TEST_CASE("Activity lifecycle: comm activities") bool dsend_done = false; bool recv_done = false; - simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[1], [&dsend_done]() { - assert_exit(true, 0); - char* payload = xbt_strdup("toto"); - simgrid::s4u::Mailbox::by_name("mb")->put_init(payload, 1000)->detach(); - dsend_done = true; - }); - - simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { - assert_exit(true, 3); - simgrid::s4u::this_actor::sleep_for(2); - void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); - xbt_free(payload); - recv_done = true; - }); + sender_dtach(dsend_done, true, 0); + simgrid::s4u::this_actor::sleep_for(2); + receiver_basic(recv_done, true, 1); - // Sleep long enough to let the test ends by itself. 3 + surf_precision should be enough. + // Sleep long enough to let the test ends by itself. 1 + surf_precision should be enough. simgrid::s4u::this_actor::sleep_for(4); INFO("Sender or receiver killed somehow. It shouldn't"); REQUIRE(dsend_done); @@ -138,20 +187,9 @@ TEST_CASE("Activity lifecycle: comm activities") bool dsend_done = false; bool recv_done = false; - simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[1], [&dsend_done]() { - assert_exit(true, 2); - char* payload = xbt_strdup("toto"); - simgrid::s4u::this_actor::sleep_for(2); - simgrid::s4u::Mailbox::by_name("mb")->put_init(payload, 1000)->detach(); - dsend_done = true; - }); - - simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { - assert_exit(true, 3); - void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); - xbt_free(payload); - recv_done = true; - }); + receiver_basic(recv_done, true, 3); + simgrid::s4u::this_actor::sleep_for(2); + sender_dtach(dsend_done, true, 0); // Sleep long enough to let the test ends by itself. 3 + surf_precision should be enough. simgrid::s4u::this_actor::sleep_for(4); @@ -181,7 +219,7 @@ TEST_CASE("Activity lifecycle: comm activities") simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { assert_exit(true, 2); REQUIRE_NETWORK_FAILURE({ - void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); + char* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); xbt_free(payload); }); recv_done = true; @@ -213,7 +251,7 @@ TEST_CASE("Activity lifecycle: comm activities") &in_catch_before_on_exit, &in_catch_after_on_exit]() { assert_exit(false, 1); try { - simgrid::s4u::Mailbox::by_name("mb")->get(); + simgrid::s4u::Mailbox::by_name("mb")->get(); } catch (simgrid::NetworkFailureException const&) { // Shouldn't get in here after the on_exit function in_catch_before_on_exit = not in_on_exit; @@ -282,9 +320,9 @@ TEST_CASE("Activity lifecycle: comm activities") simgrid::s4u::ActorPtr receiver = simgrid::s4u::Actor::create("receiver", all_hosts[1], []() { assert_exit(true, 2); int* data; - simgrid::s4u::CommPtr comm = simgrid::s4u::Mailbox::by_name("mb")->get_async((void**)&data); + simgrid::s4u::CommPtr comm = simgrid::s4u::Mailbox::by_name("mb")->get_async(&data); std::vector pending_comms = {comm}; - REQUIRE_NETWORK_FAILURE(simgrid::s4u::Comm::wait_any(&pending_comms)); + REQUIRE_NETWORK_FAILURE(simgrid::s4u::Comm::wait_any(pending_comms)); }); simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[2], []() {