blob: 611bfe835a7f09dcf594c40f15a9469ede89d97b [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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 {
// 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);
base::RunLoop::QuitCurrentWhenIdleDeprecated();
}
void TestChannelListener::SendNextMessage() {
if (--messages_left_ <= 0)
base::RunLoop::QuitCurrentWhenIdleDeprecated();
else
SendOneMessage(sender_, "Foo");
}
}