OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <utility> |
| 6 |
5 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
6 #include "mojo/message_pump/message_pump_mojo.h" | 8 #include "mojo/message_pump/message_pump_mojo.h" |
7 #include "mojo/public/cpp/bindings/binding.h" | 9 #include "mojo/public/cpp/bindings/binding.h" |
8 #include "mojo/public/cpp/bindings/strong_binding.h" | 10 #include "mojo/public/cpp/bindings/strong_binding.h" |
9 #include "mojo/public/cpp/test_support/test_utils.h" | 11 #include "mojo/public/cpp/test_support/test_utils.h" |
10 #include "mojo/public/interfaces/bindings/tests/sample_factory.mojom.h" | 12 #include "mojo/public/interfaces/bindings/tests/sample_factory.mojom.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
12 | 14 |
13 namespace mojo { | 15 namespace mojo { |
14 namespace test { | 16 namespace test { |
15 namespace { | 17 namespace { |
16 | 18 |
17 const char kText1[] = "hello"; | 19 const char kText1[] = "hello"; |
18 const char kText2[] = "world"; | 20 const char kText2[] = "world"; |
19 | 21 |
20 class StringRecorder { | 22 class StringRecorder { |
21 public: | 23 public: |
22 explicit StringRecorder(std::string* buf) : buf_(buf) {} | 24 explicit StringRecorder(std::string* buf) : buf_(buf) {} |
23 void Run(const String& a) const { *buf_ = a.To<std::string>(); } | 25 void Run(const String& a) const { *buf_ = a.To<std::string>(); } |
24 | 26 |
25 private: | 27 private: |
26 std::string* buf_; | 28 std::string* buf_; |
27 }; | 29 }; |
28 | 30 |
29 class ImportedInterfaceImpl : public imported::ImportedInterface { | 31 class ImportedInterfaceImpl : public imported::ImportedInterface { |
30 public: | 32 public: |
31 explicit ImportedInterfaceImpl( | 33 explicit ImportedInterfaceImpl( |
32 InterfaceRequest<imported::ImportedInterface> request) | 34 InterfaceRequest<imported::ImportedInterface> request) |
33 : binding_(this, request.Pass()) {} | 35 : binding_(this, std::move(request)) {} |
34 | 36 |
35 void DoSomething() override { do_something_count_++; } | 37 void DoSomething() override { do_something_count_++; } |
36 | 38 |
37 static int do_something_count() { return do_something_count_; } | 39 static int do_something_count() { return do_something_count_; } |
38 | 40 |
39 private: | 41 private: |
40 static int do_something_count_; | 42 static int do_something_count_; |
41 Binding<ImportedInterface> binding_; | 43 Binding<ImportedInterface> binding_; |
42 }; | 44 }; |
43 int ImportedInterfaceImpl::do_something_count_ = 0; | 45 int ImportedInterfaceImpl::do_something_count_ = 0; |
44 | 46 |
45 class SampleNamedObjectImpl : public sample::NamedObject { | 47 class SampleNamedObjectImpl : public sample::NamedObject { |
46 public: | 48 public: |
47 explicit SampleNamedObjectImpl(InterfaceRequest<sample::NamedObject> request) | 49 explicit SampleNamedObjectImpl(InterfaceRequest<sample::NamedObject> request) |
48 : binding_(this, request.Pass()) {} | 50 : binding_(this, std::move(request)) {} |
49 void SetName(const mojo::String& name) override { name_ = name; } | 51 void SetName(const mojo::String& name) override { name_ = name; } |
50 | 52 |
51 void GetName(const mojo::Callback<void(mojo::String)>& callback) override { | 53 void GetName(const mojo::Callback<void(mojo::String)>& callback) override { |
52 callback.Run(name_); | 54 callback.Run(name_); |
53 } | 55 } |
54 | 56 |
55 private: | 57 private: |
56 std::string name_; | 58 std::string name_; |
57 StrongBinding<sample::NamedObject> binding_; | 59 StrongBinding<sample::NamedObject> binding_; |
58 }; | 60 }; |
59 | 61 |
60 class SampleFactoryImpl : public sample::Factory { | 62 class SampleFactoryImpl : public sample::Factory { |
61 public: | 63 public: |
62 explicit SampleFactoryImpl(InterfaceRequest<sample::Factory> request) | 64 explicit SampleFactoryImpl(InterfaceRequest<sample::Factory> request) |
63 : binding_(this, request.Pass()) {} | 65 : binding_(this, std::move(request)) {} |
64 | 66 |
65 void DoStuff(sample::RequestPtr request, | 67 void DoStuff(sample::RequestPtr request, |
66 ScopedMessagePipeHandle pipe, | 68 ScopedMessagePipeHandle pipe, |
67 const DoStuffCallback& callback) override { | 69 const DoStuffCallback& callback) override { |
68 std::string text1; | 70 std::string text1; |
69 if (pipe.is_valid()) | 71 if (pipe.is_valid()) |
70 EXPECT_TRUE(ReadTextMessage(pipe.get(), &text1)); | 72 EXPECT_TRUE(ReadTextMessage(pipe.get(), &text1)); |
71 | 73 |
72 std::string text2; | 74 std::string text2; |
73 if (request->pipe.is_valid()) { | 75 if (request->pipe.is_valid()) { |
74 EXPECT_TRUE(ReadTextMessage(request->pipe.get(), &text2)); | 76 EXPECT_TRUE(ReadTextMessage(request->pipe.get(), &text2)); |
75 | 77 |
76 // Ensure that simply accessing request->pipe does not close it. | 78 // Ensure that simply accessing request->pipe does not close it. |
77 EXPECT_TRUE(request->pipe.is_valid()); | 79 EXPECT_TRUE(request->pipe.is_valid()); |
78 } | 80 } |
79 | 81 |
80 ScopedMessagePipeHandle pipe0; | 82 ScopedMessagePipeHandle pipe0; |
81 if (!text2.empty()) { | 83 if (!text2.empty()) { |
82 CreateMessagePipe(nullptr, &pipe0, &pipe1_); | 84 CreateMessagePipe(nullptr, &pipe0, &pipe1_); |
83 EXPECT_TRUE(WriteTextMessage(pipe1_.get(), text2)); | 85 EXPECT_TRUE(WriteTextMessage(pipe1_.get(), text2)); |
84 } | 86 } |
85 | 87 |
86 sample::ResponsePtr response(sample::Response::New()); | 88 sample::ResponsePtr response(sample::Response::New()); |
87 response->x = 2; | 89 response->x = 2; |
88 response->pipe = pipe0.Pass(); | 90 response->pipe = std::move(pipe0); |
89 callback.Run(response.Pass(), text1); | 91 callback.Run(std::move(response), text1); |
90 | 92 |
91 if (request->obj) | 93 if (request->obj) |
92 request->obj->DoSomething(); | 94 request->obj->DoSomething(); |
93 } | 95 } |
94 | 96 |
95 void DoStuff2(ScopedDataPipeConsumerHandle pipe, | 97 void DoStuff2(ScopedDataPipeConsumerHandle pipe, |
96 const DoStuff2Callback& callback) override { | 98 const DoStuff2Callback& callback) override { |
97 // Read the data from the pipe, writing the response (as a string) to | 99 // Read the data from the pipe, writing the response (as a string) to |
98 // DidStuff2(). | 100 // DidStuff2(). |
99 ASSERT_TRUE(pipe.is_valid()); | 101 ASSERT_TRUE(pipe.is_valid()); |
100 uint32_t data_size = 0; | 102 uint32_t data_size = 0; |
101 ASSERT_EQ(MOJO_RESULT_OK, | 103 ASSERT_EQ(MOJO_RESULT_OK, |
102 ReadDataRaw( | 104 ReadDataRaw( |
103 pipe.get(), nullptr, &data_size, MOJO_READ_DATA_FLAG_QUERY)); | 105 pipe.get(), nullptr, &data_size, MOJO_READ_DATA_FLAG_QUERY)); |
104 ASSERT_NE(0, static_cast<int>(data_size)); | 106 ASSERT_NE(0, static_cast<int>(data_size)); |
105 char data[64]; | 107 char data[64]; |
106 ASSERT_LT(static_cast<int>(data_size), 64); | 108 ASSERT_LT(static_cast<int>(data_size), 64); |
107 ASSERT_EQ( | 109 ASSERT_EQ( |
108 MOJO_RESULT_OK, | 110 MOJO_RESULT_OK, |
109 ReadDataRaw( | 111 ReadDataRaw( |
110 pipe.get(), data, &data_size, MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 112 pipe.get(), data, &data_size, MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
111 | 113 |
112 callback.Run(data); | 114 callback.Run(data); |
113 } | 115 } |
114 | 116 |
115 void CreateNamedObject( | 117 void CreateNamedObject( |
116 InterfaceRequest<sample::NamedObject> object_request) override { | 118 InterfaceRequest<sample::NamedObject> object_request) override { |
117 EXPECT_TRUE(object_request.is_pending()); | 119 EXPECT_TRUE(object_request.is_pending()); |
118 new SampleNamedObjectImpl(object_request.Pass()); | 120 new SampleNamedObjectImpl(std::move(object_request)); |
119 } | 121 } |
120 | 122 |
121 // These aren't called or implemented, but exist here to test that the | 123 // These aren't called or implemented, but exist here to test that the |
122 // methods are generated with the correct argument types for imported | 124 // methods are generated with the correct argument types for imported |
123 // interfaces. | 125 // interfaces. |
124 void RequestImportedInterface( | 126 void RequestImportedInterface( |
125 InterfaceRequest<imported::ImportedInterface> imported, | 127 InterfaceRequest<imported::ImportedInterface> imported, |
126 const mojo::Callback<void(InterfaceRequest<imported::ImportedInterface>)>& | 128 const mojo::Callback<void(InterfaceRequest<imported::ImportedInterface>)>& |
127 callback) override {} | 129 callback) override {} |
128 void TakeImportedInterface( | 130 void TakeImportedInterface( |
(...skipping 28 matching lines...) Expand all Loading... |
157 if (response->pipe.is_valid()) { | 159 if (response->pipe.is_valid()) { |
158 std::string text2; | 160 std::string text2; |
159 EXPECT_TRUE(ReadTextMessage(response->pipe.get(), &text2)); | 161 EXPECT_TRUE(ReadTextMessage(response->pipe.get(), &text2)); |
160 | 162 |
161 // Ensure that simply accessing response.pipe does not close it. | 163 // Ensure that simply accessing response.pipe does not close it. |
162 EXPECT_TRUE(response->pipe.is_valid()); | 164 EXPECT_TRUE(response->pipe.is_valid()); |
163 | 165 |
164 EXPECT_EQ(std::string(kText2), text2); | 166 EXPECT_EQ(std::string(kText2), text2); |
165 | 167 |
166 // Do some more tests of handle passing: | 168 // Do some more tests of handle passing: |
167 ScopedMessagePipeHandle p = response->pipe.Pass(); | 169 ScopedMessagePipeHandle p = std::move(response->pipe); |
168 EXPECT_TRUE(p.is_valid()); | 170 EXPECT_TRUE(p.is_valid()); |
169 EXPECT_FALSE(response->pipe.is_valid()); | 171 EXPECT_FALSE(response->pipe.is_valid()); |
170 } | 172 } |
171 | 173 |
172 *got_response = true; | 174 *got_response = true; |
173 } | 175 } |
174 | 176 |
175 bool* got_response; | 177 bool* got_response; |
176 std::string* got_text_reply; | 178 std::string* got_text_reply; |
177 }; | 179 }; |
178 | 180 |
179 TEST_F(HandlePassingTest, Basic) { | 181 TEST_F(HandlePassingTest, Basic) { |
180 sample::FactoryPtr factory; | 182 sample::FactoryPtr factory; |
181 SampleFactoryImpl factory_impl(GetProxy(&factory)); | 183 SampleFactoryImpl factory_impl(GetProxy(&factory)); |
182 | 184 |
183 MessagePipe pipe0; | 185 MessagePipe pipe0; |
184 EXPECT_TRUE(WriteTextMessage(pipe0.handle1.get(), kText1)); | 186 EXPECT_TRUE(WriteTextMessage(pipe0.handle1.get(), kText1)); |
185 | 187 |
186 MessagePipe pipe1; | 188 MessagePipe pipe1; |
187 EXPECT_TRUE(WriteTextMessage(pipe1.handle1.get(), kText2)); | 189 EXPECT_TRUE(WriteTextMessage(pipe1.handle1.get(), kText2)); |
188 | 190 |
189 imported::ImportedInterfacePtr imported; | 191 imported::ImportedInterfacePtr imported; |
190 ImportedInterfaceImpl imported_impl(GetProxy(&imported)); | 192 ImportedInterfaceImpl imported_impl(GetProxy(&imported)); |
191 | 193 |
192 sample::RequestPtr request(sample::Request::New()); | 194 sample::RequestPtr request(sample::Request::New()); |
193 request->x = 1; | 195 request->x = 1; |
194 request->pipe = pipe1.handle0.Pass(); | 196 request->pipe = std::move(pipe1.handle0); |
195 request->obj = imported.Pass(); | 197 request->obj = std::move(imported); |
196 bool got_response = false; | 198 bool got_response = false; |
197 std::string got_text_reply; | 199 std::string got_text_reply; |
198 DoStuffCallback cb(&got_response, &got_text_reply); | 200 DoStuffCallback cb(&got_response, &got_text_reply); |
199 factory->DoStuff(request.Pass(), pipe0.handle0.Pass(), cb); | 201 factory->DoStuff(std::move(request), std::move(pipe0.handle0), cb); |
200 | 202 |
201 EXPECT_FALSE(*cb.got_response); | 203 EXPECT_FALSE(*cb.got_response); |
202 int count_before = ImportedInterfaceImpl::do_something_count(); | 204 int count_before = ImportedInterfaceImpl::do_something_count(); |
203 | 205 |
204 PumpMessages(); | 206 PumpMessages(); |
205 | 207 |
206 EXPECT_TRUE(*cb.got_response); | 208 EXPECT_TRUE(*cb.got_response); |
207 EXPECT_EQ(kText1, *cb.got_text_reply); | 209 EXPECT_EQ(kText1, *cb.got_text_reply); |
208 EXPECT_EQ(1, ImportedInterfaceImpl::do_something_count() - count_before); | 210 EXPECT_EQ(1, ImportedInterfaceImpl::do_something_count() - count_before); |
209 } | 211 } |
210 | 212 |
211 TEST_F(HandlePassingTest, PassInvalid) { | 213 TEST_F(HandlePassingTest, PassInvalid) { |
212 sample::FactoryPtr factory; | 214 sample::FactoryPtr factory; |
213 SampleFactoryImpl factory_impl(GetProxy(&factory)); | 215 SampleFactoryImpl factory_impl(GetProxy(&factory)); |
214 | 216 |
215 sample::RequestPtr request(sample::Request::New()); | 217 sample::RequestPtr request(sample::Request::New()); |
216 request->x = 1; | 218 request->x = 1; |
217 bool got_response = false; | 219 bool got_response = false; |
218 std::string got_text_reply; | 220 std::string got_text_reply; |
219 DoStuffCallback cb(&got_response, &got_text_reply); | 221 DoStuffCallback cb(&got_response, &got_text_reply); |
220 factory->DoStuff(request.Pass(), ScopedMessagePipeHandle().Pass(), cb); | 222 factory->DoStuff(std::move(request), ScopedMessagePipeHandle(), cb); |
221 | 223 |
222 EXPECT_FALSE(*cb.got_response); | 224 EXPECT_FALSE(*cb.got_response); |
223 | 225 |
224 PumpMessages(); | 226 PumpMessages(); |
225 | 227 |
226 EXPECT_TRUE(*cb.got_response); | 228 EXPECT_TRUE(*cb.got_response); |
227 } | 229 } |
228 | 230 |
229 struct DoStuff2Callback { | 231 struct DoStuff2Callback { |
230 DoStuff2Callback(bool* got_response, std::string* got_text_reply) | 232 DoStuff2Callback(bool* got_response, std::string* got_text_reply) |
(...skipping 28 matching lines...) Expand all Loading... |
259 uint32_t data_size = static_cast<uint32_t>(expected_text_reply.size() + 1); | 261 uint32_t data_size = static_cast<uint32_t>(expected_text_reply.size() + 1); |
260 ASSERT_EQ(MOJO_RESULT_OK, | 262 ASSERT_EQ(MOJO_RESULT_OK, |
261 WriteDataRaw(producer_handle.get(), | 263 WriteDataRaw(producer_handle.get(), |
262 expected_text_reply.c_str(), | 264 expected_text_reply.c_str(), |
263 &data_size, | 265 &data_size, |
264 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); | 266 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); |
265 | 267 |
266 bool got_response = false; | 268 bool got_response = false; |
267 std::string got_text_reply; | 269 std::string got_text_reply; |
268 DoStuff2Callback cb(&got_response, &got_text_reply); | 270 DoStuff2Callback cb(&got_response, &got_text_reply); |
269 factory->DoStuff2(consumer_handle.Pass(), cb); | 271 factory->DoStuff2(std::move(consumer_handle), cb); |
270 | 272 |
271 EXPECT_FALSE(*cb.got_response); | 273 EXPECT_FALSE(*cb.got_response); |
272 | 274 |
273 PumpMessages(); | 275 PumpMessages(); |
274 | 276 |
275 EXPECT_TRUE(*cb.got_response); | 277 EXPECT_TRUE(*cb.got_response); |
276 EXPECT_EQ(expected_text_reply, *cb.got_text_reply); | 278 EXPECT_EQ(expected_text_reply, *cb.got_text_reply); |
277 } | 279 } |
278 | 280 |
279 TEST_F(HandlePassingTest, PipesAreClosed) { | 281 TEST_F(HandlePassingTest, PipesAreClosed) { |
280 sample::FactoryPtr factory; | 282 sample::FactoryPtr factory; |
281 SampleFactoryImpl factory_impl(GetProxy(&factory)); | 283 SampleFactoryImpl factory_impl(GetProxy(&factory)); |
282 | 284 |
283 MessagePipe extra_pipe; | 285 MessagePipe extra_pipe; |
284 | 286 |
285 MojoHandle handle0_value = extra_pipe.handle0.get().value(); | 287 MojoHandle handle0_value = extra_pipe.handle0.get().value(); |
286 MojoHandle handle1_value = extra_pipe.handle1.get().value(); | 288 MojoHandle handle1_value = extra_pipe.handle1.get().value(); |
287 | 289 |
288 { | 290 { |
289 Array<ScopedMessagePipeHandle> pipes(2); | 291 Array<ScopedMessagePipeHandle> pipes(2); |
290 pipes[0] = extra_pipe.handle0.Pass(); | 292 pipes[0] = std::move(extra_pipe.handle0); |
291 pipes[1] = extra_pipe.handle1.Pass(); | 293 pipes[1] = std::move(extra_pipe.handle1); |
292 | 294 |
293 sample::RequestPtr request(sample::Request::New()); | 295 sample::RequestPtr request(sample::Request::New()); |
294 request->more_pipes = pipes.Pass(); | 296 request->more_pipes = std::move(pipes); |
295 | 297 |
296 factory->DoStuff(request.Pass(), ScopedMessagePipeHandle(), | 298 factory->DoStuff(std::move(request), ScopedMessagePipeHandle(), |
297 sample::Factory::DoStuffCallback()); | 299 sample::Factory::DoStuffCallback()); |
298 } | 300 } |
299 | 301 |
300 // We expect the pipes to have been closed. | 302 // We expect the pipes to have been closed. |
301 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle0_value)); | 303 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle0_value)); |
302 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle1_value)); | 304 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle1_value)); |
303 } | 305 } |
304 | 306 |
305 TEST_F(HandlePassingTest, IsHandle) { | 307 TEST_F(HandlePassingTest, IsHandle) { |
306 // Validate that mojo::internal::IsHandle<> works as expected since this. | 308 // Validate that mojo::internal::IsHandle<> works as expected since this. |
(...skipping 12 matching lines...) Expand all Loading... |
319 | 321 |
320 TEST_F(HandlePassingTest, CreateNamedObject) { | 322 TEST_F(HandlePassingTest, CreateNamedObject) { |
321 sample::FactoryPtr factory; | 323 sample::FactoryPtr factory; |
322 SampleFactoryImpl factory_impl(GetProxy(&factory)); | 324 SampleFactoryImpl factory_impl(GetProxy(&factory)); |
323 | 325 |
324 sample::NamedObjectPtr object1; | 326 sample::NamedObjectPtr object1; |
325 EXPECT_FALSE(object1); | 327 EXPECT_FALSE(object1); |
326 | 328 |
327 InterfaceRequest<sample::NamedObject> object1_request = GetProxy(&object1); | 329 InterfaceRequest<sample::NamedObject> object1_request = GetProxy(&object1); |
328 EXPECT_TRUE(object1_request.is_pending()); | 330 EXPECT_TRUE(object1_request.is_pending()); |
329 factory->CreateNamedObject(object1_request.Pass()); | 331 factory->CreateNamedObject(std::move(object1_request)); |
330 EXPECT_FALSE(object1_request.is_pending()); // We've passed the request. | 332 EXPECT_FALSE(object1_request.is_pending()); // We've passed the request. |
331 | 333 |
332 ASSERT_TRUE(object1); | 334 ASSERT_TRUE(object1); |
333 object1->SetName("object1"); | 335 object1->SetName("object1"); |
334 | 336 |
335 sample::NamedObjectPtr object2; | 337 sample::NamedObjectPtr object2; |
336 factory->CreateNamedObject(GetProxy(&object2)); | 338 factory->CreateNamedObject(GetProxy(&object2)); |
337 object2->SetName("object2"); | 339 object2->SetName("object2"); |
338 | 340 |
339 std::string name1; | 341 std::string name1; |
340 object1->GetName(StringRecorder(&name1)); | 342 object1->GetName(StringRecorder(&name1)); |
341 | 343 |
342 std::string name2; | 344 std::string name2; |
343 object2->GetName(StringRecorder(&name2)); | 345 object2->GetName(StringRecorder(&name2)); |
344 | 346 |
345 PumpMessages(); // Yield for results. | 347 PumpMessages(); // Yield for results. |
346 | 348 |
347 EXPECT_EQ(std::string("object1"), name1); | 349 EXPECT_EQ(std::string("object1"), name1); |
348 EXPECT_EQ(std::string("object2"), name2); | 350 EXPECT_EQ(std::string("object2"), name2); |
349 } | 351 } |
350 | 352 |
351 } // namespace | 353 } // namespace |
352 } // namespace test | 354 } // namespace test |
353 } // namespace mojo | 355 } // namespace mojo |
OLD | NEW |