1 /* Copyright (c) 2017-2023. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #include "src/3rd-party/catch.hpp"
8 #include <simgrid/s4u/Engine.hpp>
9 #include <simgrid/s4u/Link.hpp>
11 #include "src/kernel/resource/SplitDuplexLinkImpl.hpp"
13 TEST_CASE("SplitDuplexLink: create", "")
15 simgrid::s4u::Engine e("test");
16 auto* zone = simgrid::s4u::create_star_zone("test");
18 SECTION("create string")
20 simgrid::s4u::Link* link_up;
21 simgrid::s4u::Link* link_down;
22 simgrid::s4u::SplitDuplexLink* link;
23 REQUIRE_NOTHROW(link = zone->create_split_duplex_link("link", "100GBps"));
24 REQUIRE(e.split_duplex_link_by_name("link") == link);
25 REQUIRE_NOTHROW(link_up = e.link_by_name("link_UP"));
26 REQUIRE_NOTHROW(link_down = e.link_by_name("link_DOWN"));
27 REQUIRE(link_up->get_bandwidth() == 100e9);
28 REQUIRE(link_down->get_bandwidth() == 100e9);
29 REQUIRE(link_up == link->get_link_up());
30 REQUIRE(link_down == link->get_link_down());
33 SECTION("create double") { REQUIRE_NOTHROW(zone->create_split_duplex_link("link", 10e6)); }
36 TEST_CASE("SplitDuplexLink: sets", "")
38 simgrid::s4u::Engine e("test");
39 auto* zone = simgrid::s4u::create_star_zone("test");
40 auto* link = zone->create_split_duplex_link("link", 100e6);
41 auto const* link_up = link->get_link_up();
42 auto const* link_down = link->get_link_down();
47 link->set_bandwidth(bw);
48 REQUIRE(link_up->get_bandwidth() == bw);
49 REQUIRE(link_down->get_bandwidth() == bw);
55 link->set_latency(lat);
56 REQUIRE(link_up->get_latency() == lat);
57 REQUIRE(link_down->get_latency() == lat);
60 SECTION("turn on/off")
63 REQUIRE(not link_up->is_on());
64 REQUIRE(not link_down->is_on());
66 REQUIRE(link_up->is_on());
67 REQUIRE(link_down->is_on());
70 SECTION("concurrency_limit")
72 link->set_concurrency_limit(3);
73 REQUIRE(link_up->get_impl()->get_constraint()->get_concurrency_limit() == 3);
74 REQUIRE(link_down->get_impl()->get_constraint()->get_concurrency_limit() == 3);
77 SECTION("sharing_policy: invalid")
79 REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::WIFI), std::invalid_argument);
80 REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX), std::invalid_argument);
83 SECTION("sharing_policy: fatpipe/shared")
85 for (const auto& policy : {simgrid::s4u::Link::SharingPolicy::FATPIPE, simgrid::s4u::Link::SharingPolicy::SHARED}) {
86 link->set_sharing_policy(policy);
87 REQUIRE(link_up->get_sharing_policy() == policy);
88 REQUIRE(link_down->get_sharing_policy() == policy);
92 SECTION("sharing_policy: nonlinear")
94 link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::NONLINEAR,
95 [](double c, int /*n*/) -> double { return c; });
96 REQUIRE(link_up->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);
97 REQUIRE(link_down->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);