200
201
ASSERT_EQ(signum, handled_signum[1]);
201
202
ASSERT_EQ(signum, handled_signum[2]);
205
TEST_F(GLibMainLoopTest, handles_fd)
208
char const data_to_write{'a'};
212
ml.register_fd_handler(
215
[&handled_fd, &data_read, this](int fd)
218
EXPECT_EQ(1, read(fd, &data_read, 1));
222
EXPECT_EQ(1, write(p.write_fd(), &data_to_write, 1));
226
EXPECT_EQ(data_to_write, data_read);
229
TEST_F(GLibMainLoopTest, multiple_fds_with_single_handler_handled)
231
std::vector<mt::Pipe> const pipes(2);
232
size_t const num_elems_to_send{10};
233
std::vector<int> handled_fds;
234
std::vector<size_t> elems_read;
235
std::atomic<unsigned int> num_handled_fds{0};
237
ml.register_fd_handler(
238
{pipes[0].read_fd(), pipes[1].read_fd()},
240
[&handled_fds, &elems_read, &num_handled_fds](int fd)
242
handled_fds.push_back(fd);
245
EXPECT_EQ(static_cast<ssize_t>(sizeof(i)),
246
read(fd, &i, sizeof(i)));
247
elems_read.push_back(i);
252
std::thread fd_writing_thread{
253
[this, num_elems_to_send, &pipes, &num_handled_fds]
255
for (size_t i = 0; i < num_elems_to_send; i++)
257
EXPECT_EQ(static_cast<ssize_t>(sizeof(i)),
258
write(pipes[i % pipes.size()].write_fd(), &i, sizeof(i)));
259
while (num_handled_fds <= i) std::this_thread::yield();
266
fd_writing_thread.join();
268
ASSERT_EQ(num_elems_to_send, handled_fds.size());
269
ASSERT_EQ(num_elems_to_send, elems_read.size());
271
for (size_t i = 0; i < num_elems_to_send; i++)
273
EXPECT_EQ(pipes[i % pipes.size()].read_fd(), handled_fds[i]) << " index " << i;
274
EXPECT_EQ(i, elems_read[i]) << " index " << i;
278
TEST_F(GLibMainLoopTest, multiple_fd_handlers_are_called)
280
std::vector<mt::Pipe> const pipes(3);
281
std::vector<int> const elems_to_send{10,11,12};
282
std::vector<int> handled_fds{0,0,0};
283
std::vector<int> elems_read{0,0,0};
285
ml.register_fd_handler(
286
{pipes[0].read_fd()},
288
[&handled_fds, &elems_read, this](int fd)
290
EXPECT_EQ(static_cast<ssize_t>(sizeof(elems_read[0])),
291
read(fd, &elems_read[0], sizeof(elems_read[0])));
293
if (handled_fds[0] != 0 &&
294
handled_fds[1] != 0 &&
301
ml.register_fd_handler(
302
{pipes[1].read_fd()},
304
[&handled_fds, &elems_read, this](int fd)
306
EXPECT_EQ(static_cast<ssize_t>(sizeof(elems_read[1])),
307
read(fd, &elems_read[1], sizeof(elems_read[1])));
309
if (handled_fds[0] != 0 &&
310
handled_fds[1] != 0 &&
317
ml.register_fd_handler(
318
{pipes[2].read_fd()},
320
[&handled_fds, &elems_read, this](int fd)
322
EXPECT_EQ(static_cast<ssize_t>(sizeof(elems_read[2])),
323
read(fd, &elems_read[2], sizeof(elems_read[2])));
325
if (handled_fds[0] != 0 &&
326
handled_fds[1] != 0 &&
333
EXPECT_EQ(static_cast<ssize_t>(sizeof(elems_to_send[0])),
334
write(pipes[0].write_fd(), &elems_to_send[0], sizeof(elems_to_send[0])));
335
EXPECT_EQ(static_cast<ssize_t>(sizeof(elems_to_send[1])),
336
write(pipes[1].write_fd(), &elems_to_send[1], sizeof(elems_to_send[1])));
337
EXPECT_EQ(static_cast<ssize_t>(sizeof(elems_to_send[2])),
338
write(pipes[2].write_fd(), &elems_to_send[2], sizeof(elems_to_send[2])));
342
EXPECT_EQ(pipes[0].read_fd(), handled_fds[0]);
343
EXPECT_EQ(pipes[1].read_fd(), handled_fds[1]);
344
EXPECT_EQ(pipes[2].read_fd(), handled_fds[2]);
346
EXPECT_EQ(elems_to_send[0], elems_read[0]);
347
EXPECT_EQ(elems_to_send[1], elems_read[1]);
348
EXPECT_EQ(elems_to_send[2], elems_read[2]);
351
TEST_F(GLibMainLoopTest,
352
unregister_prevents_callback_and_does_not_harm_other_callbacks)
355
char const data_to_write{'a'};
356
int p2_handler_executes{-1};
359
ml.register_fd_handler(
364
FAIL() << "unregistered handler called";
368
ml.register_fd_handler(
371
[&p2_handler_executes,&data_read,this](int fd)
373
p2_handler_executes = fd;
374
EXPECT_EQ(1, read(fd, &data_read, 1));
378
ml.unregister_fd_handler(this);
380
EXPECT_EQ(1, write(p1.write_fd(), &data_to_write, 1));
381
EXPECT_EQ(1, write(p2.write_fd(), &data_to_write, 1));
385
EXPECT_EQ(data_to_write, data_read);
386
EXPECT_EQ(p2.read_fd(), p2_handler_executes);
389
TEST_F(GLibMainLoopTest, unregister_does_not_close_fds)
392
char const data_to_write{'b'};
395
ml.register_fd_handler(
400
FAIL() << "unregistered handler called";
404
ml.unregister_fd_handler(this);
406
ml.register_fd_handler(
409
[this,&data_read](int fd)
411
EXPECT_EQ(1, read(fd, &data_read, 1));
415
EXPECT_EQ(1, write(p1.write_fd(), &data_to_write, 1));
419
EXPECT_EQ(data_to_write, data_read);