Chromium Code Reviews| Index: ipc/ipc_message_unittest.cc |
| diff --git a/ipc/ipc_message_unittest.cc b/ipc/ipc_message_unittest.cc |
| index aea705449cce9c0daa7a094b86504df94c5e92a8..a4f9af07244c6491fdc303f565aafc67e081f0bc 100644 |
| --- a/ipc/ipc_message_unittest.cc |
| +++ b/ipc/ipc_message_unittest.cc |
| @@ -6,6 +6,8 @@ |
| #include <string.h> |
| +#include <limits> |
| + |
| #include "base/memory/scoped_ptr.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/values.h" |
| @@ -25,7 +27,7 @@ IPC_MESSAGE_CONTROL1(TestMsgClassI, int) |
| IPC_SYNC_MESSAGE_CONTROL1_1(TestMsgClassIS, int, std::string) |
| -namespace { |
| +namespace IPC { |
| TEST(IPCMessageTest, BasicMessageTest) { |
| int v1 = 10; |
| @@ -115,6 +117,101 @@ TEST(IPCMessageTest, DictionaryValue) { |
| EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output)); |
| } |
| +TEST(IPCMessageTest, FindNext) { |
| + IPC::Message message; |
| + EXPECT_TRUE(message.WriteString("Goooooooogle")); |
| + EXPECT_TRUE(message.WriteInt(111)); |
| + |
| + std::vector<char> message_data(message.size() + 7); |
| + memcpy(message_data.data(), message.data(), message.size()); |
| + |
| + const char* data_start = message_data.data(); |
| + const char* data_end = data_start + message.size(); |
| + |
| + IPC::Message::NextMessageInfo next; |
| + |
| + // Data range contains the entire message plus some extra bytes |
| + IPC::Message::FindNext(data_start, data_end + 1, &next); |
| + EXPECT_TRUE(next.message_found); |
| + EXPECT_EQ(next.message_size, message.size()); |
| + EXPECT_EQ(next.pickle_end, data_end); |
| + EXPECT_EQ(next.message_end, data_end); |
| + |
| + // Data range exactly contains the entire message |
| + IPC::Message::FindNext(data_start, data_end, &next); |
| + EXPECT_TRUE(next.message_found); |
| + EXPECT_EQ(next.message_size, message.size()); |
| + EXPECT_EQ(next.pickle_end, data_end); |
| + EXPECT_EQ(next.message_end, data_end); |
| + |
| + // Data range doesn't contain the entire message |
| + // (but contains the message header) |
| + IPC::Message::FindNext(data_start, data_end - 1, &next); |
| + EXPECT_FALSE(next.message_found); |
| +#if USE_ATTACHMENT_BROKER |
| + EXPECT_EQ(next.message_size, 0u); |
| +#else |
| + EXPECT_EQ(next.message_size, message.size()); |
| +#endif |
| + |
| + // Data range doesn't contain the message header |
| + // (but contains the pickle header) |
| + IPC::Message::FindNext(data_start, |
| + data_start + sizeof(IPC::Message::Header) - 1, |
| + &next); |
| + EXPECT_FALSE(next.message_found); |
| + EXPECT_EQ(next.message_size, 0u); |
| + |
| + // Data range doesn't contain the pickle header |
| + IPC::Message::FindNext(data_start, |
| + data_start + sizeof(base::Pickle::Header) - 1, |
| + &next); |
| + EXPECT_FALSE(next.message_found); |
| + EXPECT_EQ(next.message_size, 0u); |
| +} |
| + |
| +TEST(IPCMessageTest, FindNextOverflow) { |
| + IPC::Message message; |
| + EXPECT_TRUE(message.WriteString("Data")); |
| + EXPECT_TRUE(message.WriteInt(777)); |
| + |
| + const char* data_start = reinterpret_cast<const char*>(message.data()); |
| + const char* data_end = data_start + message.size(); |
| + |
| + IPC::Message::NextMessageInfo next; |
| + |
| + // Payload size is negative (defeats 'start + size > end' check) |
| + message.header()->payload_size = static_cast<uint32_t>(-1); |
| + IPC::Message::FindNext(data_start, data_end, &next); |
| + EXPECT_FALSE(next.message_found); |
| +#if USE_ATTACHMENT_BROKER |
| + EXPECT_EQ(next.message_size, 0u); |
| +#else |
| + if (sizeof(size_t) > sizeof(uint32_t)) { |
| + // No overflow, just insane message size |
| + EXPECT_EQ(next.message_size, |
| + message.header()->payload_size + sizeof(IPC::Message::Header)); |
| + } else { |
| + // Actual overflow, reported as max size_t |
| + EXPECT_EQ(next.message_size, std::numeric_limits<size_t>::max()); |
| + } |
| +#endif |
| + |
| + // Payload size is max positive integer (defeats size < 0 check, while |
| + // still potentially causing overflow down the road). |
| + message.header()->payload_size = std::numeric_limits<int32_t>::max(); |
| + IPC::Message::FindNext(data_start, data_end, &next); |
| + EXPECT_FALSE(next.message_found); |
| +#if USE_ATTACHMENT_BROKER |
| + EXPECT_EQ(next.message_size, 0u); |
| +#else |
| + EXPECT_EQ(next.message_size, |
| + message.header()->payload_size + sizeof(IPC::Message::Header)); |
| +#endif |
| +} |
| + |
| +namespace { |
| + |
| class IPCMessageParameterTest : public testing::Test { |
| public: |
| IPCMessageParameterTest() : extra_param_("extra_param"), called_(false) {} |
| @@ -160,6 +257,8 @@ class IPCMessageParameterTest : public testing::Test { |
| bool called_; |
| }; |
| +} // namespace |
|
Maria
2015/09/25 22:23:00
if we are putting this into an anonymous namespace
Dmitry Skiba
2015/09/28 17:37:18
I think the convention is that helpers are in unna
|
| + |
| TEST_F(IPCMessageParameterTest, EmptyDispatcherWithParam) { |
| TestMsgClassEmpty message; |
| EXPECT_TRUE(OnMessageReceived(message)); |
| @@ -186,4 +285,4 @@ TEST_F(IPCMessageParameterTest, Sync) { |
| EXPECT_EQ(output, std::string("out")); |
| }*/ |
| -} // namespace |
| +} // namespace IPC |