From: Arnaud Giersch Date: Wed, 26 Jun 2019 21:31:19 +0000 (+0200) Subject: Complete activity-lifecycle with test cases from simgrid/simgrid#26. X-Git-Tag: v3.23.2~67 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/56c99ffd85d4779d671c8c5ea913c4fd113519dd Complete activity-lifecycle with test cases from simgrid/simgrid#26. (plus minor cosmetical changes). --- diff --git a/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp b/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp index 75123acb59..1b78ad7eaf 100644 --- a/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp +++ b/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp @@ -134,8 +134,8 @@ static void test_sleep_restart_end() sleeper_done = true; }); simgrid::s4u::this_actor::sleep_for(10); - all_hosts[1]->turn_on(); xbt_assert(sleeper_done, "Not sure of how the actor survived the shutdown of its host."); + all_hosts[1]->turn_on(); } static void test_exec() { @@ -266,7 +266,6 @@ static void test_comm_dsend_and_quit_put_before_get() char* payload = xbt_strdup("toto"); simgrid::s4u::Mailbox::by_name("mb")->put_init(payload, 1000)->detach(); dsend_done = true; - return; }); simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { @@ -275,7 +274,6 @@ static void test_comm_dsend_and_quit_put_before_get() void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); xbt_free(payload); recv_done = true; - return; }); // Sleep long enough to let the test ends by itself. 3 + surf_precision should be enough. @@ -296,7 +294,6 @@ static void test_comm_dsend_and_quit_get_before_put() simgrid::s4u::this_actor::sleep_for(2); simgrid::s4u::Mailbox::by_name("mb")->put_init(payload, 1000)->detach(); dsend_done = true; - return; }); simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { @@ -304,7 +301,6 @@ static void test_comm_dsend_and_quit_get_before_put() void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); xbt_free(payload); recv_done = true; - return; }); // Sleep long enough to let the test ends by itself. 3 + surf_precision should be enough. @@ -394,7 +390,6 @@ static void test_host_off_while_receive() // Note: If we don't sleep here, we don't "see" the bug simgrid::s4u::this_actor::sleep_for(1); - receiver->get_host()->turn_on(); // switch host on again xbt_assert(in_on_exit, "Receiver's on_exit function was never called"); @@ -405,73 +400,82 @@ static void test_host_off_while_receive() xbt_assert(not returned_from_main, "Receiver returned from main normally even though its host was killed"); xbt_assert(send_done, "Sender killed somehow. It shouldn't"); + receiver->get_host()->turn_on(); } -static void test_link_off() +static void test_link_off_helper(double delay) { - XBT_INFO("%s: Launch an actor that waits on a recv, turn communicating link off", __func__); - bool sender_got_exception = false; - bool receiver_got_exception = false; - - simgrid::s4u::ActorPtr receiver = simgrid::s4u::Actor::create("receiver", all_hosts[1], [&receiver_got_exception]() { - assert_exit(false, 1); - try { - simgrid::s4u::Mailbox::by_name("mb")->get(); - } catch (simgrid::NetworkFailureException const&) { - receiver_got_exception = true; + const double start = simgrid::s4u::Engine::get_clock(); + + simgrid::s4u::ActorPtr receiver = simgrid::s4u::Actor::create("receiver", all_hosts[1], [&start]() { + assert_exit(false, 9); + double milestone[5] = {0.5, 3.5, 4.5, 7.5, 9.0}; + for (int i = 0; i < 5; i++) + milestone[i] += start; + for (int i = 0; i < 4; i++) { + simgrid::s4u::this_actor::sleep_until(milestone[i]); + try { + XBT_VERB("get(%c)", 'A' + i); + simgrid::s4u::Mailbox::by_name("mb")->get(); + return; + } catch (simgrid::NetworkFailureException const&) { + XBT_VERB("got expected NetworkFailureException"); + } } + simgrid::s4u::this_actor::sleep_until(milestone[4]); }); - simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[2], [&sender_got_exception]() { - assert_exit(false, 1); - try { - int data = 42; - simgrid::s4u::Mailbox::by_name("mb")->put(&data, 100000); - } catch (simgrid::NetworkFailureException const&) { - sender_got_exception = true; + simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[2], [&start]() { + assert_exit(false, 9); + int data = 42; + double milestone[5] = {1.5, 2.5, 5.5, 6.5, 9.0}; + for (int i = 0; i < 5; i++) + milestone[i] += start; + for (int i = 0; i < 2; i++) { + simgrid::s4u::this_actor::sleep_until(milestone[i]); + XBT_VERB("dsend(%c)", 'A' + i); + simgrid::s4u::Mailbox::by_name("mb")->put_init(&data, 100000)->detach(); + } + for (int i = 2; i < 4; i++) { + simgrid::s4u::this_actor::sleep_until(milestone[i]); + try { + XBT_VERB("put(%c)", 'A' + i); + simgrid::s4u::Mailbox::by_name("mb")->put(&data, 100000); + return; + } catch (simgrid::NetworkFailureException const&) { + XBT_VERB("got expected NetworkFailureException"); + } } + simgrid::s4u::this_actor::sleep_until(milestone[4]); }); - simgrid::s4u::this_actor::sleep_for(1); - simgrid::s4u::Link::by_name("link1")->turn_off(); - simgrid::s4u::Link::by_name("link1")->turn_on(); - xbt_assert(receiver_got_exception, "Receiver should have caught a NetworkFailureException"); - xbt_assert(sender_got_exception, "Sender should have caught a NetworkFailureException"); + for (int i = 0; i < 4; i++) { + XBT_VERB("##### %d / 4 #####", i + 1); + simgrid::s4u::this_actor::sleep_for(delay); + XBT_VERB("link off"); + simgrid::s4u::Link::by_name("link1")->turn_off(); + simgrid::s4u::this_actor::sleep_for(2.0 - delay); + XBT_VERB("link on"); + simgrid::s4u::Link::by_name("link1")->turn_on(); + } + simgrid::s4u::this_actor::sleep_for(1.5); } -static void test_link_off_before_detached_send() +static void test_link_off_before_send_recv() { - XBT_INFO("%s: Launch an actor that waits on a recv, turn communicating link off, and a sender then places a detached send", __func__); - bool sender_got_exception = false; - bool receiver_got_exception = false; - - simgrid::s4u::ActorPtr receiver = simgrid::s4u::Actor::create("receiver", all_hosts[1], [&receiver_got_exception]() { - assert_exit(false, 2); - try { - simgrid::s4u::Mailbox::by_name("mb")->get(); - } catch (simgrid::NetworkFailureException const&) { - receiver_got_exception = true; - } - }); - - simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[2], [&sender_got_exception]() { - assert_exit(false, 2); - simgrid::s4u::this_actor::sleep_for(2); - try { - int data = 42; - simgrid::s4u::Mailbox::by_name("mb")->put_init(&data, 100000)->detach(); - //This works: simgrid::s4u::Mailbox::by_name("mb")->put(&data, 100000); - } catch (simgrid::NetworkFailureException const&) { - sender_got_exception = true; - } - }); - - simgrid::s4u::this_actor::sleep_for(1); - simgrid::s4u::Link::by_name("link1")->turn_off(); - simgrid::s4u::this_actor::sleep_for(2); - xbt_assert(receiver_got_exception, "Receiver should have caught a NetworkFailureException"); + XBT_INFO("%s: try to communicate with communicating link turned off before start", __func__); + test_link_off_helper(0.0); +} +static void test_link_off_between_send_recv() +{ + XBT_INFO("%s: try to communicate with communicating link turned off between send and receive", __func__); + test_link_off_helper(1.0); +} +static void test_link_off_during_transfer() +{ + XBT_INFO("%s: try to communicate with communicating link turned off during transfer", __func__); + test_link_off_helper(2.0); } - /* We need an extra actor here, so that it can sleep until the end of each test */ static void main_dispatcher() @@ -498,9 +502,9 @@ static void main_dispatcher() run_test("comm kill sender", test_comm_killsend); run_test("comm recv and kill", test_host_off_while_receive); - run_test("comm turn link off", test_link_off); - // The following test is broken: https://framagit.org/simgrid/simgrid/issues/26 - // run_test("comm turn link off before detached send", test_link_off_before_detached_send); + run_test("comm turn link off before send/recv", test_link_off_before_send_recv); + run_test("comm turn link off between send/recv", test_link_off_between_send_recv); + run_test("comm turn link off during transfer", test_link_off_during_transfer); } int main(int argc, char* argv[])