ipc_message_protobuf_utils_unittest.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "build/build_config.h"
  5. #include "ipc/ipc_message_protobuf_utils.h"
  6. #include <initializer_list>
  7. #include "ipc/test_proto.pb.h"
  8. #include "ipc/ipc_message.h"
  9. #include "ipc/ipc_message_utils.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace IPC {
  12. template <>
  13. struct ParamTraits<ipc_message_utils_test::TestMessage1> {
  14. typedef ipc_message_utils_test::TestMessage1 param_type;
  15. static void Write(base::Pickle* m, const param_type& p) {
  16. WriteParam(m, p.number());
  17. }
  18. static bool Read(const base::Pickle* m,
  19. base::PickleIterator* iter,
  20. param_type* r) {
  21. int number;
  22. if (!iter->ReadInt(&number))
  23. return false;
  24. r->set_number(number);
  25. return true;
  26. }
  27. };
  28. template <>
  29. struct ParamTraits<ipc_message_utils_test::TestMessage2> {
  30. typedef ipc_message_utils_test::TestMessage2 param_type;
  31. static void Write(base::Pickle* m, const param_type& p) {
  32. WriteParam(m, p.numbers());
  33. WriteParam(m, p.strings());
  34. WriteParam(m, p.messages());
  35. }
  36. static bool Read(const base::Pickle* m,
  37. base::PickleIterator* iter,
  38. param_type* r) {
  39. return ReadParam(m, iter, r->mutable_numbers()) &&
  40. ReadParam(m, iter, r->mutable_strings()) &&
  41. ReadParam(m, iter, r->mutable_messages());
  42. }
  43. };
  44. namespace {
  45. template <class P1, class P2>
  46. void AssertEqual(const P1& left, const P2& right) {
  47. ASSERT_EQ(left, right);
  48. }
  49. template<>
  50. void AssertEqual(const int& left,
  51. const ipc_message_utils_test::TestMessage1& right) {
  52. ASSERT_EQ(left, right.number());
  53. }
  54. template <template<class> class RepeatedFieldLike, class P1, class P2>
  55. void AssertRepeatedFieldEquals(std::initializer_list<P1> expected,
  56. const RepeatedFieldLike<P2>& fields) {
  57. ASSERT_EQ(static_cast<int>(expected.size()), fields.size());
  58. auto it = expected.begin();
  59. int i = 0;
  60. for (; it != expected.end(); it++, i++) {
  61. AssertEqual(*it, fields.Get(i));
  62. }
  63. }
  64. TEST(IPCMessageRepeatedFieldUtilsTest, RepeatedFieldShouldBeSerialized) {
  65. ipc_message_utils_test::TestMessage2 message;
  66. message.add_numbers(1);
  67. message.add_numbers(100);
  68. message.add_strings("abc");
  69. message.add_strings("def");
  70. message.add_messages()->set_number(1000);
  71. message.add_messages()->set_number(10000);
  72. base::Pickle pickle;
  73. IPC::WriteParam(&pickle, message);
  74. base::PickleIterator iter(pickle);
  75. ipc_message_utils_test::TestMessage2 output;
  76. ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
  77. AssertRepeatedFieldEquals({1, 100}, output.numbers());
  78. AssertRepeatedFieldEquals({"abc", "def"}, output.strings());
  79. AssertRepeatedFieldEquals({1000, 10000}, output.messages());
  80. }
  81. TEST(IPCMessageRepeatedFieldUtilsTest,
  82. PartialEmptyRepeatedFieldShouldBeSerialized) {
  83. ipc_message_utils_test::TestMessage2 message;
  84. message.add_numbers(1);
  85. message.add_numbers(100);
  86. message.add_messages()->set_number(1000);
  87. message.add_messages()->set_number(10000);
  88. base::Pickle pickle;
  89. IPC::WriteParam(&pickle, message);
  90. base::PickleIterator iter(pickle);
  91. ipc_message_utils_test::TestMessage2 output;
  92. ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
  93. AssertRepeatedFieldEquals({1, 100}, output.numbers());
  94. ASSERT_EQ(0, output.strings_size());
  95. AssertRepeatedFieldEquals({1000, 10000}, output.messages());
  96. }
  97. TEST(IPCMessageRepeatedFieldUtilsTest, EmptyRepeatedFieldShouldBeSerialized) {
  98. ipc_message_utils_test::TestMessage2 message;
  99. base::Pickle pickle;
  100. IPC::WriteParam(&pickle, message);
  101. base::PickleIterator iter(pickle);
  102. ipc_message_utils_test::TestMessage2 output;
  103. ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
  104. ASSERT_EQ(0, output.numbers_size());
  105. ASSERT_EQ(0, output.strings_size());
  106. ASSERT_EQ(0, output.messages_size());
  107. }
  108. TEST(IPCMessageRepeatedFieldUtilsTest,
  109. InvalidPickleShouldNotCrashRepeatedFieldDeserialization) {
  110. base::Pickle pickle;
  111. IPC::WriteParam(&pickle, INT_MAX);
  112. IPC::WriteParam(&pickle, 0);
  113. IPC::WriteParam(&pickle, INT_MAX);
  114. IPC::WriteParam(&pickle, std::string());
  115. IPC::WriteParam(&pickle, 0);
  116. base::PickleIterator iter(pickle);
  117. ipc_message_utils_test::TestMessage2 output;
  118. ASSERT_FALSE(IPC::ReadParam(&pickle, &iter, &output));
  119. }
  120. // This test needs ~20 seconds in Debug mode, or ~4 seconds in Release mode.
  121. // See http://crbug.com/741866 for details.
  122. TEST(IPCMessageRepeatedFieldUtilsTest,
  123. DISABLED_InvalidPickleShouldNotCrashRepeatedFieldDeserialization2) {
  124. base::Pickle pickle;
  125. IPC::WriteParam(&pickle, 256 * 1024 * 1024);
  126. IPC::WriteParam(&pickle, 0);
  127. IPC::WriteParam(&pickle, INT_MAX);
  128. IPC::WriteParam(&pickle, std::string());
  129. IPC::WriteParam(&pickle, 0);
  130. base::PickleIterator iter(pickle);
  131. ipc_message_utils_test::TestMessage2 output;
  132. ASSERT_FALSE(IPC::ReadParam(&pickle, &iter, &output));
  133. }
  134. } // namespace
  135. } // namespace IPC