1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
ipc / ipc_test_channel_listener.cc [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
#pragma allow_unsafe_buffers
#endif
#include "ipc/ipc_test_channel_listener.h"
#include "base/run_loop.h"
#include "ipc/ipc_message.h"
#include "ipc/ipc_sender.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace IPC {
TestChannelListener::TestChannelListener()
: sender_(nullptr), messages_left_(50) {}
TestChannelListener::~TestChannelListener() {}
// static
void TestChannelListener::SendOneMessage(IPC::Sender* sender,
const char* text) {
static int message_index = 0;
IPC::Message* message = new IPC::Message(0,
2,
IPC::Message::PRIORITY_NORMAL);
message->WriteInt(message_index++);
message->WriteString(std::string(text));
// Make sure we can handle large messages.
char junk[kLongMessageStringNumBytes];
memset(junk, 'a', sizeof(junk)-1);
junk[sizeof(junk)-1] = 0;
message->WriteString(std::string(junk));
sender->Send(message);
}
bool TestChannelListener::OnMessageReceived(const IPC::Message& message) {
base::PickleIterator iter(message);
int ignored;
EXPECT_TRUE(iter.ReadInt(&ignored));
std::string data;
EXPECT_TRUE(iter.ReadString(&data));
std::string big_string;
EXPECT_TRUE(iter.ReadString(&big_string));
EXPECT_EQ(kLongMessageStringNumBytes - 1, big_string.length());
SendNextMessage();
return true;
}
void TestChannelListener::OnChannelError() {
// There is a race when closing the channel so the last message may be lost.
EXPECT_LE(messages_left_, 1);
if (!quit_closure_.is_null()) {
std::move(quit_closure_).Run();
}
}
void TestChannelListener::SendNextMessage() {
if (--messages_left_ <= 0) {
std::move(quit_closure_).Run();
} else {
SendOneMessage(sender_, "Foo");
}
}
}