Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add an exhaustive test for point to point communications
[simgrid.git] / teshsuite / s4u / comm-pt2pt / comm-pt2pt.cpp
1 /* Copyright (c) 2010-2017. 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 "simgrid/s4u.hpp"
7
8 #include <cstring>
9
10 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
11
12 using namespace simgrid::s4u;
13
14 static void usage(const char* binaryName, const char* defaultSend, const char* defaultRecv)
15 {
16   std::fprintf(stderr, "Usage: %s examples/platforms/cluster.xml <send_spec> <recv_spec>\n"
17                        "where spec is a list of letters giving the kind of tests you want to see.\n"
18                        "Existing sender spec:\n"
19                        " r regular send\n"
20                        " R regular send (after a little delay)\n"
21                        " i asynchronous isend\n"
22                        " I asynchronous isend (after a little delay)\n"
23                        " d detached send\n"
24                        " D detached send (after a little delay)\n"
25                        "Existing receiver spec:\n"
26                        " r regular receive\n"
27                        " R regular receive (after a little delay)\n"
28                        " i asynchronous irecv\n"
29                        " I asynchronous irecv (after a little delay)\n"
30                        " p regular receive on permanent mailbox (after a little delay)\n"
31                        " P regular receive on permanent mailbox (after a little delay)\n"
32                        " j irecv on permanent mailbox (after a little delay)\n"
33                        " J irecv on permanent mailbox (after a little delay)\n"
34                        "\n"
35                        "Example 1: %s examples/platforms/cluster.xml ripd rrrr # testing fancy functions\n"
36                        "Default specs: %s %s (all possible pair)",
37                binaryName, binaryName, defaultSend, defaultRecv);
38   exit(1);
39 }
40
41 static void receiver(std::vector<std::string> args)
42 {
43   XBT_INFO("Receiver spec: %s", args[0].c_str());
44   for (unsigned int test = 0; test < args[0].size(); test++) {
45     this_actor::sleep_until(test * 5);
46     char* mboxName                = bprintf("Test #%u", test);
47     simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName);
48
49     switch (args[0][test]) {
50       case 'r':
51         XBT_INFO("Test %d: r (regular send)", test);
52         simgrid::s4u::this_actor::send(mbox, (void*)mboxName, 42.0);
53         break;
54       case 'R':
55         XBT_INFO("Test %d: R (sleep + regular send)", test);
56         simgrid::s4u::this_actor::sleep_for(0.5);
57         simgrid::s4u::this_actor::send(mbox, (void*)mboxName, 42.0);
58         break;
59
60       case 'i':
61         XBT_INFO("Test %d: i (asynchronous isend)", test);
62         simgrid::s4u::this_actor::isend(mbox, (void*)mboxName, 42.0)->wait();
63         break;
64       case 'I':
65         XBT_INFO("Test %d: I (sleep + isend)", test);
66         simgrid::s4u::this_actor::sleep_for(0.5);
67         simgrid::s4u::this_actor::isend(mbox, (void*)mboxName, 42.0)->wait();
68         break;
69
70       case 'd':
71         XBT_INFO("Test %d: d (detached send)", test);
72         simgrid::s4u::this_actor::dsend(mbox, (void*)mboxName, 42.0);
73         break;
74       case 'D':
75         XBT_INFO("Test %d: D (sleep + detached send)", test);
76         simgrid::s4u::this_actor::sleep_for(0.5);
77         simgrid::s4u::this_actor::dsend(mbox, (void*)mboxName, 42.0);
78         break;
79       default:
80         xbt_die("Unknown sender spec for test %d: '%c'", test, args[0][test]);
81     }
82     XBT_INFO("Test %d OK", test);
83   }
84 }
85
86 static void sender(std::vector<std::string> args)
87 {
88   XBT_INFO("Sender spec: %s", args[0].c_str());
89   for (unsigned int test = 0; test < args[0].size(); test++) {
90     this_actor::sleep_until(test * 5);
91     char* mboxName                = bprintf("Test #%u", test);
92     simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName);
93     void* received                = nullptr;
94
95     switch (args[0][test]) {
96       case 'r':
97         XBT_INFO("Test %d: r (regular receive)", test);
98         received = simgrid::s4u::this_actor::recv(mbox);
99         break;
100       case 'R':
101         XBT_INFO("Test %d: R (sleep + regular receive)", test);
102         simgrid::s4u::this_actor::sleep_for(0.5);
103         received = simgrid::s4u::this_actor::recv(mbox);
104         break;
105
106       case 'i':
107         XBT_INFO("Test %d: i (asynchronous irecv)", test);
108         simgrid::s4u::this_actor::irecv(mbox, &received)->wait();
109         break;
110       case 'I':
111         XBT_INFO("Test %d: I (sleep + asynchronous irecv)", test);
112         simgrid::s4u::this_actor::sleep_for(0.5);
113         simgrid::s4u::this_actor::irecv(mbox, &received)->wait();
114         break;
115       case 'p':
116         XBT_INFO("Test %d: p (regular receive on permanent mailbox)", test);
117         mbox->setReceiver(Actor::self());
118         received = simgrid::s4u::this_actor::recv(mbox);
119         break;
120       case 'P':
121         XBT_INFO("Test %d: P (sleep + regular receive on permanent mailbox)", test);
122         simgrid::s4u::this_actor::sleep_for(0.5);
123         mbox->setReceiver(Actor::self());
124         received = simgrid::s4u::this_actor::recv(mbox);
125         break;
126       case 'j':
127         XBT_INFO("Test %d: j (irecv on permanent mailbox)", test);
128         mbox->setReceiver(Actor::self());
129         simgrid::s4u::this_actor::irecv(mbox, &received)->wait();
130         break;
131       case 'J':
132         XBT_INFO("Test %d: J (sleep + irecv on permanent mailbox)", test);
133         simgrid::s4u::this_actor::sleep_for(0.5);
134         mbox->setReceiver(Actor::self());
135         simgrid::s4u::this_actor::irecv(mbox, &received)->wait();
136         break;
137       default:
138         xbt_die("Unknown receiver spec for test %d: '%c'", test, args[0][test]);
139     }
140
141     xbt_assert(strcmp(static_cast<char*>(received), mboxName) == 0);
142     xbt_free(received);
143     xbt_free(mboxName);
144     XBT_INFO("Test %d OK", test);
145   }
146 }
147
148 int main(int argc, char* argv[])
149 {
150   std::string specSend;
151   std::string specRecv;
152   for (char s : {'r', 'R', 'i', 'I', 'p', 'P', 'j', 'J'})
153     for (char r : {'r', 'R', 'i', 'I', 'd', 'D'}) {
154       specSend += s;
155       specRecv += r;
156     }
157   std::vector<std::string> argSend{specSend.c_str()};
158   std::vector<std::string> argRecv{specRecv.c_str()};
159
160   simgrid::s4u::Engine* e = new simgrid::s4u::Engine(&argc, argv);
161   if (argc < 2)
162     usage(argv[0], specSend.c_str(), specRecv.c_str());
163
164   e->loadPlatform(argv[1]);
165
166   if (argc >= 3) {
167     argSend.clear();
168     argSend.push_back(argv[2]);
169   }
170   if (argc >= 4) {
171     argRecv.clear();
172     argRecv.push_back(argv[3]);
173   }
174   xbt_assert(argSend.front().size() == argRecv.front().size(), "Sender and receiver spec must be of the same size");
175
176   simgrid::s4u::Host** hosts = sg_host_list();
177   simgrid::s4u::Actor::createActor("sender", hosts[0], sender, argSend);
178   simgrid::s4u::Actor::createActor("recver", hosts[1], receiver, argRecv);
179   xbt_free(hosts);
180
181   e->run();
182   XBT_INFO("Simulation time %g", e->getClock());
183
184   return 0;
185 }