Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
New netzone: Star Zone
[simgrid.git] / src / kernel / routing / StarZone_test.cpp
1 /* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.               */
2
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. */
5
6 #include "catch.hpp"
7
8 #include "simgrid/kernel/routing/NetPoint.hpp"
9 #include "simgrid/kernel/routing/StarZone.hpp"
10 #include "simgrid/s4u/Engine.hpp"
11 #include "simgrid/s4u/Host.hpp"
12 #include "simgrid/s4u/NetZone.hpp"
13 #include "src/surf/network_interface.hpp"
14 #include "src/surf/surf_interface.hpp"    // create models
15 #include "src/surf/xml/platf_private.hpp" // RouteCreationArgs and friends
16
17 TEST_CASE("kernel::routing::StarZone: Creating Zone", "[creation]")
18 {
19   int argc           = 1;
20   const char* argv[] = {"test"};
21
22   simgrid::s4u::Engine e(&argc, const_cast<char**>(argv));
23
24   REQUIRE(simgrid::s4u::create_star_zone("test"));
25 }
26
27 // One day we may be able to test contracts and asserts with catch2
28 // https://github.com/catchorg/Catch2/issues/853
29 TEST_CASE("kernel::routing::StarZone: Adding routes: assert", "[.][assert]")
30 {
31   int argc           = 1;
32   const char* argv[] = {"test"};
33   simgrid::s4u::Engine e(&argc, const_cast<char**>(argv));
34   auto* zone      = new simgrid::kernel::routing::StarZone("test");
35   auto* netpoint1 = new simgrid::kernel::routing::NetPoint("netpoint1", simgrid::kernel::routing::NetPoint::Type::Host);
36   auto* netpoint2 = new simgrid::kernel::routing::NetPoint("netpoint2", simgrid::kernel::routing::NetPoint::Type::Host);
37
38   SECTION("Source and destination hosts: nullptr") { zone->add_route(nullptr, nullptr, nullptr, nullptr, {}, false); }
39
40   SECTION("Source nullptr and symmetrical true") { zone->add_route(nullptr, netpoint2, nullptr, nullptr, {}, true); }
41
42   SECTION("Source and destination set") { zone->add_route(netpoint1, netpoint2, nullptr, nullptr, {}, false); }
43 }
44
45 TEST_CASE("kernel::routing::StarZone: Get routes: assert", "[.][assert]")
46 {
47   /* workaround to initialize things, they must be done in this particular order */
48   int argc           = 1;
49   const char* argv[] = {"test"};
50   simgrid::s4u::Engine e(&argc, const_cast<char**>(argv));
51   auto* zone = new simgrid::kernel::routing::StarZone("test");
52   surf_network_model_init_LegrandVelho();
53   surf_cpu_model_init_Cas01();
54
55   auto* host1 = zone->create_host("netpoint1", {100});
56   auto* host2 = zone->create_host("netpoint2", {100});
57   std::vector<simgrid::kernel::resource::LinkImpl*> links;
58   links.push_back(zone->create_link("link1", {100})->get_impl());
59   std::vector<simgrid::kernel::resource::LinkImpl*> links2;
60   links2.push_back(zone->create_link("link2", {100})->get_impl());
61
62   SECTION("Get route: no UP link")
63   {
64     zone->add_route(host1->get_netpoint(), nullptr, nullptr, nullptr, links, true);
65     zone->add_route(nullptr, host2->get_netpoint(), nullptr, nullptr, links2, false);
66     double lat;
67     simgrid::kernel::routing::RouteCreationArgs route;
68     zone->get_local_route(host2->get_netpoint(), host1->get_netpoint(), &route, &lat);
69   }
70
71   SECTION("Get route: no DOWN link")
72   {
73     zone->add_route(host1->get_netpoint(), nullptr, nullptr, nullptr, links, false);
74     zone->add_route(host2->get_netpoint(), nullptr, nullptr, nullptr, links2, true);
75     double lat;
76     simgrid::kernel::routing::RouteCreationArgs route;
77     zone->get_local_route(host2->get_netpoint(), host1->get_netpoint(), &route, &lat);
78   }
79 }
80
81 TEST_CASE("kernel::routing::StarZone: Adding routes: valid", "")
82 {
83   int argc           = 1;
84   const char* argv[] = {"test"};
85   simgrid::s4u::Engine e(&argc, const_cast<char**>(argv));
86   auto* zone     = new simgrid::kernel::routing::StarZone("test");
87   auto* netpoint = new simgrid::kernel::routing::NetPoint("netpoint1", simgrid::kernel::routing::NetPoint::Type::Host);
88
89   SECTION("Source set, destination nullptr, symmetrical true")
90   {
91     zone->add_route(netpoint, nullptr, nullptr, nullptr, {}, true);
92   }
93
94   SECTION("Source nullptr, destination set, symmetrical false")
95   {
96     zone->add_route(nullptr, netpoint, nullptr, nullptr, {}, false);
97   }
98
99   SECTION("Source set, destination nullptr, symmetrical false")
100   {
101     zone->add_route(netpoint, nullptr, nullptr, nullptr, {}, false);
102   }
103
104   SECTION("Source == destination") { zone->add_route(netpoint, netpoint, nullptr, nullptr, {}, false); }
105 }
106
107 TEST_CASE("kernel::routing::StarZone: Get routes", "")
108 {
109   /* workaround to initialize things, they must be done in this particular order */
110   int argc           = 1;
111   const char* argv[] = {"test"};
112   simgrid::s4u::Engine e(&argc, const_cast<char**>(argv));
113   auto* zone = new simgrid::kernel::routing::StarZone("test");
114   surf_network_model_init_LegrandVelho();
115   surf_cpu_model_init_Cas01();
116
117   auto* host1 = zone->create_host("netpoint1", {100});
118   auto* host2 = zone->create_host("netpoint2", {100});
119
120   SECTION("Get route: no shared link")
121   {
122     std::vector<simgrid::kernel::resource::LinkImpl*> links;
123     links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
124     std::vector<simgrid::kernel::resource::LinkImpl*> links2;
125     links2.push_back(zone->create_link("link2", {200})->set_latency(20)->get_impl());
126     zone->add_route(host1->get_netpoint(), nullptr, nullptr, nullptr, links, true);
127     zone->add_route(host2->get_netpoint(), nullptr, nullptr, nullptr, links2, true);
128     zone->seal();
129
130     double lat = 0.0;
131     simgrid::kernel::routing::RouteCreationArgs route;
132     zone->get_local_route(host1->get_netpoint(), host2->get_netpoint(), &route, &lat);
133     REQUIRE(lat == 30);
134     REQUIRE(route.link_list.size() == 2);
135     REQUIRE(route.link_list[0]->get_name() == "link1");
136     REQUIRE(route.link_list[1]->get_name() == "link2");
137   }
138
139   SECTION("Get route: shared link(backbone)")
140   {
141     auto* backbone = zone->create_link("backbone", {1000})->set_latency(100)->get_impl();
142     std::vector<simgrid::kernel::resource::LinkImpl*> links;
143     links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
144     links.push_back(backbone);
145     std::vector<simgrid::kernel::resource::LinkImpl*> links2;
146     links2.push_back(zone->create_link("link2", {200})->set_latency(20)->get_impl());
147     links2.push_back(backbone);
148
149     zone->add_route(host1->get_netpoint(), nullptr, nullptr, nullptr, links, true);
150     zone->add_route(host2->get_netpoint(), nullptr, nullptr, nullptr, links2, true);
151     zone->seal();
152
153     double lat = 0.0;
154     simgrid::kernel::routing::RouteCreationArgs route;
155     zone->get_local_route(host1->get_netpoint(), host2->get_netpoint(), &route, &lat);
156     REQUIRE(lat == 130);
157     REQUIRE(route.link_list.size() == 3);
158     REQUIRE(route.link_list[0]->get_name() == "link1");
159     REQUIRE(route.link_list[1]->get_name() == "backbone");
160     REQUIRE(route.link_list[2]->get_name() == "link2");
161   }
162
163   SECTION("Get route: shared link(backbone)")
164   {
165     auto* backbone = zone->create_link("backbone", {1000})->set_latency(100)->get_impl();
166     std::vector<simgrid::kernel::resource::LinkImpl*> links;
167     links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
168     links.push_back(backbone);
169     std::vector<simgrid::kernel::resource::LinkImpl*> links2;
170     links2.push_back(zone->create_link("link2", {200})->set_latency(20)->get_impl());
171     links2.push_back(backbone);
172
173     zone->add_route(host1->get_netpoint(), nullptr, nullptr, nullptr, links, true);
174     zone->add_route(host2->get_netpoint(), nullptr, nullptr, nullptr, links2, true);
175     zone->seal();
176
177     double lat = 0.0;
178     simgrid::kernel::routing::RouteCreationArgs route;
179     zone->get_local_route(host1->get_netpoint(), host2->get_netpoint(), &route, &lat);
180     REQUIRE(lat == 130);
181     REQUIRE(route.link_list.size() == 3);
182     REQUIRE(route.link_list[0]->get_name() == "link1");
183     REQUIRE(route.link_list[1]->get_name() == "backbone");
184     REQUIRE(route.link_list[2]->get_name() == "link2");
185   }
186
187   SECTION("Get route: loopback")
188   {
189     auto* backbone = zone->create_link("backbone", {1000})->set_latency(100)->get_impl();
190     std::vector<simgrid::kernel::resource::LinkImpl*> links;
191     links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
192     links.push_back(backbone);
193
194     zone->add_route(host1->get_netpoint(), host1->get_netpoint(), nullptr, nullptr, links, true);
195     zone->seal();
196
197     double lat = 0.0;
198     simgrid::kernel::routing::RouteCreationArgs route;
199     zone->get_local_route(host1->get_netpoint(), host1->get_netpoint(), &route, &lat);
200     REQUIRE(lat == 110);
201     REQUIRE(route.link_list.size() == 2);
202     REQUIRE(route.link_list[0]->get_name() == "link1");
203     REQUIRE(route.link_list[1]->get_name() == "backbone");
204   }
205 }