| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 // Copyright 2016 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 | 
|  | 5 #include "mojo/edk/test/mojo_test_base.h" | 
|  | 6 | 
|  | 7 #include "base/message_loop/message_loop.h" | 
|  | 8 #include "base/run_loop.h" | 
|  | 9 #include "mojo/edk/embedder/embedder.h" | 
|  | 10 #include "mojo/edk/system/handle_signals_state.h" | 
|  | 11 #include "mojo/public/c/system/buffer.h" | 
|  | 12 #include "mojo/public/c/system/functions.h" | 
|  | 13 #include "testing/gtest/include/gtest/gtest.h" | 
|  | 14 | 
|  | 15 namespace mojo { | 
|  | 16 namespace edk { | 
|  | 17 namespace test { | 
|  | 18 | 
|  | 19 MojoTestBase::MojoTestBase() { | 
|  | 20 } | 
|  | 21 | 
|  | 22 MojoTestBase::~MojoTestBase() {} | 
|  | 23 | 
|  | 24 MojoTestBase::ClientController& MojoTestBase::StartClient( | 
|  | 25     const std::string& client_name, | 
|  | 26     const HandlerCallback& callback) { | 
|  | 27   clients_.push_back( | 
|  | 28       make_scoped_ptr(new ClientController(client_name, this, callback))); | 
|  | 29   return *clients_.back(); | 
|  | 30 } | 
|  | 31 | 
|  | 32 MojoTestBase::ClientController::ClientController( | 
|  | 33     const std::string& client_name, | 
|  | 34     MojoTestBase* test, | 
|  | 35     const HandlerCallback& callback) | 
|  | 36     : test_(test) { | 
|  | 37   helper_.StartChild(client_name, callback); | 
|  | 38 } | 
|  | 39 | 
|  | 40 MojoTestBase::ClientController::~ClientController() { | 
|  | 41   CHECK(was_shutdown_) | 
|  | 42       << "Test clients should be waited on explicitly with WaitForShutdown()."; | 
|  | 43 } | 
|  | 44 | 
|  | 45 int MojoTestBase::ClientController::WaitForShutdown() { | 
|  | 46   was_shutdown_ = true; | 
|  | 47   return helper_.WaitForChildShutdown(); | 
|  | 48 } | 
|  | 49 | 
|  | 50 // static | 
|  | 51 void MojoTestBase::CloseHandle(MojoHandle h) { | 
|  | 52   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h)); | 
|  | 53 } | 
|  | 54 | 
|  | 55 // static | 
|  | 56 void MojoTestBase::CreateMessagePipe(MojoHandle *p0, MojoHandle* p1) { | 
|  | 57   MojoCreateMessagePipe(nullptr, p0, p1); | 
|  | 58   CHECK_NE(*p0, MOJO_HANDLE_INVALID); | 
|  | 59   CHECK_NE(*p1, MOJO_HANDLE_INVALID); | 
|  | 60 } | 
|  | 61 | 
|  | 62 // static | 
|  | 63 void MojoTestBase::WriteMessageWithHandles(MojoHandle mp, | 
|  | 64                                            const std::string& message, | 
|  | 65                                            const MojoHandle *handles, | 
|  | 66                                            uint32_t num_handles) { | 
|  | 67   CHECK_EQ(MojoWriteMessage(mp, message.data(), | 
|  | 68                             static_cast<uint32_t>(message.size()), | 
|  | 69                             handles, num_handles, MOJO_WRITE_MESSAGE_FLAG_NONE), | 
|  | 70            MOJO_RESULT_OK); | 
|  | 71 } | 
|  | 72 | 
|  | 73 // static | 
|  | 74 void MojoTestBase::WriteMessage(MojoHandle mp, const std::string& message) { | 
|  | 75   WriteMessageWithHandles(mp, message, nullptr, 0); | 
|  | 76 } | 
|  | 77 | 
|  | 78 // static | 
|  | 79 std::string MojoTestBase::ReadMessageWithHandles( | 
|  | 80     MojoHandle mp, | 
|  | 81     MojoHandle* handles, | 
|  | 82     uint32_t expected_num_handles) { | 
|  | 83   CHECK_EQ(MojoWait(mp, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, | 
|  | 84                     nullptr), | 
|  | 85            MOJO_RESULT_OK); | 
|  | 86 | 
|  | 87   uint32_t message_size = 0; | 
|  | 88   uint32_t num_handles = 0; | 
|  | 89   CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles, | 
|  | 90                            MOJO_READ_MESSAGE_FLAG_NONE), | 
|  | 91            MOJO_RESULT_RESOURCE_EXHAUSTED); | 
|  | 92   CHECK_EQ(expected_num_handles, num_handles); | 
|  | 93 | 
|  | 94   std::string message(message_size, 'x'); | 
|  | 95   CHECK_EQ(MojoReadMessage(mp, &message[0], &message_size, handles, | 
|  | 96                            &num_handles, MOJO_READ_MESSAGE_FLAG_NONE), | 
|  | 97            MOJO_RESULT_OK); | 
|  | 98   CHECK_EQ(message_size, message.size()); | 
|  | 99   CHECK_EQ(num_handles, expected_num_handles); | 
|  | 100 | 
|  | 101   return message; | 
|  | 102 } | 
|  | 103 | 
|  | 104 // static | 
|  | 105 std::string MojoTestBase::ReadMessageWithOptionalHandle(MojoHandle mp, | 
|  | 106                                                         MojoHandle* handle) { | 
|  | 107   CHECK_EQ(MojoWait(mp, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, | 
|  | 108                     nullptr), | 
|  | 109            MOJO_RESULT_OK); | 
|  | 110 | 
|  | 111   uint32_t message_size = 0; | 
|  | 112   uint32_t num_handles = 0; | 
|  | 113   CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles, | 
|  | 114                            MOJO_READ_MESSAGE_FLAG_NONE), | 
|  | 115            MOJO_RESULT_RESOURCE_EXHAUSTED); | 
|  | 116   CHECK(num_handles == 0 || num_handles == 1); | 
|  | 117 | 
|  | 118   CHECK(handle); | 
|  | 119 | 
|  | 120   std::string message(message_size, 'x'); | 
|  | 121   CHECK_EQ(MojoReadMessage(mp, &message[0], &message_size, handle, | 
|  | 122                            &num_handles, MOJO_READ_MESSAGE_FLAG_NONE), | 
|  | 123            MOJO_RESULT_OK); | 
|  | 124   CHECK_EQ(message_size, message.size()); | 
|  | 125   CHECK(num_handles == 0 || num_handles == 1); | 
|  | 126 | 
|  | 127   if (num_handles) | 
|  | 128     CHECK_NE(*handle, MOJO_HANDLE_INVALID); | 
|  | 129   else | 
|  | 130     *handle = MOJO_HANDLE_INVALID; | 
|  | 131 | 
|  | 132   return message; | 
|  | 133 } | 
|  | 134 | 
|  | 135 // static | 
|  | 136 std::string MojoTestBase::ReadMessage(MojoHandle mp) { | 
|  | 137   return ReadMessageWithHandles(mp, nullptr, 0); | 
|  | 138 } | 
|  | 139 | 
|  | 140 // static | 
|  | 141 void MojoTestBase::ReadMessage(MojoHandle mp, | 
|  | 142                                char* data, | 
|  | 143                                size_t num_bytes) { | 
|  | 144   CHECK_EQ(MojoWait(mp, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, | 
|  | 145                     nullptr), | 
|  | 146            MOJO_RESULT_OK); | 
|  | 147 | 
|  | 148   uint32_t message_size = 0; | 
|  | 149   uint32_t num_handles = 0; | 
|  | 150   CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles, | 
|  | 151                            MOJO_READ_MESSAGE_FLAG_NONE), | 
|  | 152            MOJO_RESULT_RESOURCE_EXHAUSTED); | 
|  | 153   CHECK_EQ(num_handles, 0u); | 
|  | 154   CHECK_EQ(message_size, num_bytes); | 
|  | 155 | 
|  | 156   CHECK_EQ(MojoReadMessage(mp, data, &message_size, nullptr, &num_handles, | 
|  | 157                            MOJO_READ_MESSAGE_FLAG_NONE), | 
|  | 158            MOJO_RESULT_OK); | 
|  | 159   CHECK_EQ(num_handles, 0u); | 
|  | 160   CHECK_EQ(message_size, num_bytes); | 
|  | 161 } | 
|  | 162 | 
|  | 163 // static | 
|  | 164 void MojoTestBase::VerifyTransmission(MojoHandle source, | 
|  | 165                                       MojoHandle dest, | 
|  | 166                                       const std::string& message) { | 
|  | 167   WriteMessage(source, message); | 
|  | 168 | 
|  | 169   // We don't use EXPECT_EQ; failures on really long messages make life hard. | 
|  | 170   EXPECT_TRUE(message == ReadMessage(dest)); | 
|  | 171 } | 
|  | 172 | 
|  | 173 // static | 
|  | 174 void MojoTestBase::VerifyEcho(MojoHandle mp, | 
|  | 175                               const std::string& message) { | 
|  | 176   VerifyTransmission(mp, mp, message); | 
|  | 177 } | 
|  | 178 | 
|  | 179 // static | 
|  | 180 MojoHandle MojoTestBase::CreateBuffer(uint64_t size) { | 
|  | 181   MojoHandle h; | 
|  | 182   EXPECT_EQ(MojoCreateSharedBuffer(nullptr, size, &h), MOJO_RESULT_OK); | 
|  | 183   return h; | 
|  | 184 } | 
|  | 185 | 
|  | 186 // static | 
|  | 187 MojoHandle MojoTestBase::DuplicateBuffer(MojoHandle h) { | 
|  | 188   MojoHandle new_handle; | 
|  | 189   EXPECT_EQ(MOJO_RESULT_OK, | 
|  | 190             MojoDuplicateBufferHandle(h, nullptr, &new_handle)); | 
|  | 191   return new_handle; | 
|  | 192 } | 
|  | 193 | 
|  | 194 // static | 
|  | 195 void MojoTestBase::WriteToBuffer(MojoHandle h, | 
|  | 196                                  size_t offset, | 
|  | 197                                  const base::StringPiece& s) { | 
|  | 198   char* data; | 
|  | 199   EXPECT_EQ(MOJO_RESULT_OK, | 
|  | 200             MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data), | 
|  | 201                           MOJO_MAP_BUFFER_FLAG_NONE)); | 
|  | 202   memcpy(data, s.data(), s.size()); | 
|  | 203   EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data))); | 
|  | 204 } | 
|  | 205 | 
|  | 206 // static | 
|  | 207 void MojoTestBase::ExpectBufferContents(MojoHandle h, | 
|  | 208                                         size_t offset, | 
|  | 209                                         const base::StringPiece& s) { | 
|  | 210   char* data; | 
|  | 211   EXPECT_EQ(MOJO_RESULT_OK, | 
|  | 212             MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data), | 
|  | 213                           MOJO_MAP_BUFFER_FLAG_NONE)); | 
|  | 214   EXPECT_EQ(s, base::StringPiece(data, s.size())); | 
|  | 215   EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data))); | 
|  | 216 } | 
|  | 217 | 
|  | 218 }  // namespace test | 
|  | 219 }  // namespace edk | 
|  | 220 }  // namespace mojo | 
| OLD | NEW | 
|---|