2
* Copyright © 2013 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 3 as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
19
#include "mir/asio_main_loop.h"
21
#include <gtest/gtest.h>
26
#include <sys/types.h>
29
TEST(AsioMainLoopTest, signal_handled)
31
int const signum{SIGUSR1};
32
int handled_signum{0};
36
ml.register_signal_handler(
38
[&handled_signum, &ml](int sig)
44
kill(getpid(), signum);
48
ASSERT_EQ(signum, handled_signum);
52
TEST(AsioMainLoopTest, multiple_signals_handled)
54
std::vector<int> const signals{SIGUSR1, SIGUSR2};
55
size_t const num_signals_to_send{10};
56
std::vector<int> handled_signals;
57
std::atomic<unsigned int> num_handled_signals{0};
61
ml.register_signal_handler(
62
{signals[0], signals[1]},
63
[&handled_signals, &num_handled_signals](int sig)
65
handled_signals.push_back(sig);
66
++num_handled_signals;
70
std::thread signal_sending_thread(
71
[&ml, num_signals_to_send, &signals, &num_handled_signals]
73
for (size_t i = 0; i < num_signals_to_send; i++)
75
kill(getpid(), signals[i % signals.size()]);
76
while (num_handled_signals <= i) std::this_thread::yield();
83
signal_sending_thread.join();
85
ASSERT_EQ(num_signals_to_send, handled_signals.size());
87
for (size_t i = 0; i < num_signals_to_send; i++)
88
ASSERT_EQ(signals[i % signals.size()], handled_signals[i]) << " index " << i;
91
TEST(AsioMainLoopTest, all_registered_handlers_are_called)
93
int const signum{SIGUSR1};
94
std::vector<int> handled_signum{0,0,0};
98
ml.register_signal_handler(
100
[&handled_signum, &ml](int sig)
102
handled_signum[0] = sig;
103
if (handled_signum[0] != 0 &&
104
handled_signum[1] != 0 &&
105
handled_signum[2] != 0)
111
ml.register_signal_handler(
113
[&handled_signum, &ml](int sig)
115
handled_signum[1] = sig;
116
if (handled_signum[0] != 0 &&
117
handled_signum[1] != 0 &&
118
handled_signum[2] != 0)
124
ml.register_signal_handler(
126
[&handled_signum, &ml](int sig)
128
handled_signum[2] = sig;
129
if (handled_signum[0] != 0 &&
130
handled_signum[1] != 0 &&
131
handled_signum[2] != 0)
137
kill(getpid(), signum);
141
ASSERT_EQ(signum, handled_signum[0]);
142
ASSERT_EQ(signum, handled_signum[1]);
143
ASSERT_EQ(signum, handled_signum[2]);