Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: mojo/public/cpp/bindings/tests/connector_unittest.cc

Issue 1535943002: Convert Pass()→std::move() in //mojo/public/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove self-move checks to avoid triggering clang warning. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <stdlib.h> 5 #include <stdlib.h>
6 #include <string.h> 6 #include <string.h>
7 #include <utility>
7 8
8 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
9 #include "mojo/message_pump/message_pump_mojo.h" 10 #include "mojo/message_pump/message_pump_mojo.h"
10 #include "mojo/public/cpp/bindings/lib/connector.h" 11 #include "mojo/public/cpp/bindings/lib/connector.h"
11 #include "mojo/public/cpp/bindings/lib/message_builder.h" 12 #include "mojo/public/cpp/bindings/lib/message_builder.h"
12 #include "mojo/public/cpp/bindings/tests/message_queue.h" 13 #include "mojo/public/cpp/bindings/tests/message_queue.h"
13 #include "mojo/public/cpp/system/macros.h" 14 #include "mojo/public/cpp/system/macros.h"
14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
15 16
16 namespace mojo { 17 namespace mojo {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 94
94 protected: 95 protected:
95 ScopedMessagePipeHandle handle0_; 96 ScopedMessagePipeHandle handle0_;
96 ScopedMessagePipeHandle handle1_; 97 ScopedMessagePipeHandle handle1_;
97 98
98 private: 99 private:
99 base::MessageLoop loop_; 100 base::MessageLoop loop_;
100 }; 101 };
101 102
102 TEST_F(ConnectorTest, Basic) { 103 TEST_F(ConnectorTest, Basic) {
103 internal::Connector connector0(handle0_.Pass(), 104 internal::Connector connector0(std::move(handle0_),
104 internal::Connector::SINGLE_THREADED_SEND); 105 internal::Connector::SINGLE_THREADED_SEND);
105 internal::Connector connector1(handle1_.Pass(), 106 internal::Connector connector1(std::move(handle1_),
106 internal::Connector::SINGLE_THREADED_SEND); 107 internal::Connector::SINGLE_THREADED_SEND);
107 108
108 const char kText[] = "hello world"; 109 const char kText[] = "hello world";
109 110
110 Message message; 111 Message message;
111 AllocMessage(kText, &message); 112 AllocMessage(kText, &message);
112 113
113 connector0.Accept(&message); 114 connector0.Accept(&message);
114 115
115 MessageAccumulator accumulator; 116 MessageAccumulator accumulator;
116 connector1.set_incoming_receiver(&accumulator); 117 connector1.set_incoming_receiver(&accumulator);
117 118
118 PumpMessages(); 119 PumpMessages();
119 120
120 ASSERT_FALSE(accumulator.IsEmpty()); 121 ASSERT_FALSE(accumulator.IsEmpty());
121 122
122 Message message_received; 123 Message message_received;
123 accumulator.Pop(&message_received); 124 accumulator.Pop(&message_received);
124 125
125 EXPECT_EQ( 126 EXPECT_EQ(
126 std::string(kText), 127 std::string(kText),
127 std::string(reinterpret_cast<const char*>(message_received.payload()))); 128 std::string(reinterpret_cast<const char*>(message_received.payload())));
128 } 129 }
129 130
130 TEST_F(ConnectorTest, Basic_Synchronous) { 131 TEST_F(ConnectorTest, Basic_Synchronous) {
131 internal::Connector connector0(handle0_.Pass(), 132 internal::Connector connector0(std::move(handle0_),
132 internal::Connector::SINGLE_THREADED_SEND); 133 internal::Connector::SINGLE_THREADED_SEND);
133 internal::Connector connector1(handle1_.Pass(), 134 internal::Connector connector1(std::move(handle1_),
134 internal::Connector::SINGLE_THREADED_SEND); 135 internal::Connector::SINGLE_THREADED_SEND);
135 136
136 const char kText[] = "hello world"; 137 const char kText[] = "hello world";
137 138
138 Message message; 139 Message message;
139 AllocMessage(kText, &message); 140 AllocMessage(kText, &message);
140 141
141 connector0.Accept(&message); 142 connector0.Accept(&message);
142 143
143 MessageAccumulator accumulator; 144 MessageAccumulator accumulator;
144 connector1.set_incoming_receiver(&accumulator); 145 connector1.set_incoming_receiver(&accumulator);
145 146
146 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 147 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
147 148
148 ASSERT_FALSE(accumulator.IsEmpty()); 149 ASSERT_FALSE(accumulator.IsEmpty());
149 150
150 Message message_received; 151 Message message_received;
151 accumulator.Pop(&message_received); 152 accumulator.Pop(&message_received);
152 153
153 EXPECT_EQ( 154 EXPECT_EQ(
154 std::string(kText), 155 std::string(kText),
155 std::string(reinterpret_cast<const char*>(message_received.payload()))); 156 std::string(reinterpret_cast<const char*>(message_received.payload())));
156 } 157 }
157 158
158 TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) { 159 TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) {
159 internal::Connector connector0(handle0_.Pass(), 160 internal::Connector connector0(std::move(handle0_),
160 internal::Connector::SINGLE_THREADED_SEND); 161 internal::Connector::SINGLE_THREADED_SEND);
161 internal::Connector connector1(handle1_.Pass(), 162 internal::Connector connector1(std::move(handle1_),
162 internal::Connector::SINGLE_THREADED_SEND); 163 internal::Connector::SINGLE_THREADED_SEND);
163 164
164 MessageAccumulator accumulator; 165 MessageAccumulator accumulator;
165 connector1.set_incoming_receiver(&accumulator); 166 connector1.set_incoming_receiver(&accumulator);
166 167
167 const char kText[] = "hello world"; 168 const char kText[] = "hello world";
168 169
169 Message message; 170 Message message;
170 AllocMessage(kText, &message); 171 AllocMessage(kText, &message);
171 172
172 connector0.Accept(&message); 173 connector0.Accept(&message);
173 174
174 PumpMessages(); 175 PumpMessages();
175 176
176 ASSERT_FALSE(accumulator.IsEmpty()); 177 ASSERT_FALSE(accumulator.IsEmpty());
177 178
178 Message message_received; 179 Message message_received;
179 accumulator.Pop(&message_received); 180 accumulator.Pop(&message_received);
180 181
181 EXPECT_EQ( 182 EXPECT_EQ(
182 std::string(kText), 183 std::string(kText),
183 std::string(reinterpret_cast<const char*>(message_received.payload()))); 184 std::string(reinterpret_cast<const char*>(message_received.payload())));
184 } 185 }
185 186
186 TEST_F(ConnectorTest, Basic_TwoMessages) { 187 TEST_F(ConnectorTest, Basic_TwoMessages) {
187 internal::Connector connector0(handle0_.Pass(), 188 internal::Connector connector0(std::move(handle0_),
188 internal::Connector::SINGLE_THREADED_SEND); 189 internal::Connector::SINGLE_THREADED_SEND);
189 internal::Connector connector1(handle1_.Pass(), 190 internal::Connector connector1(std::move(handle1_),
190 internal::Connector::SINGLE_THREADED_SEND); 191 internal::Connector::SINGLE_THREADED_SEND);
191 192
192 const char* kText[] = {"hello", "world"}; 193 const char* kText[] = {"hello", "world"};
193 194
194 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { 195 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) {
195 Message message; 196 Message message;
196 AllocMessage(kText[i], &message); 197 AllocMessage(kText[i], &message);
197 198
198 connector0.Accept(&message); 199 connector0.Accept(&message);
199 } 200 }
200 201
201 MessageAccumulator accumulator; 202 MessageAccumulator accumulator;
202 connector1.set_incoming_receiver(&accumulator); 203 connector1.set_incoming_receiver(&accumulator);
203 204
204 PumpMessages(); 205 PumpMessages();
205 206
206 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { 207 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) {
207 ASSERT_FALSE(accumulator.IsEmpty()); 208 ASSERT_FALSE(accumulator.IsEmpty());
208 209
209 Message message_received; 210 Message message_received;
210 accumulator.Pop(&message_received); 211 accumulator.Pop(&message_received);
211 212
212 EXPECT_EQ( 213 EXPECT_EQ(
213 std::string(kText[i]), 214 std::string(kText[i]),
214 std::string(reinterpret_cast<const char*>(message_received.payload()))); 215 std::string(reinterpret_cast<const char*>(message_received.payload())));
215 } 216 }
216 } 217 }
217 218
218 TEST_F(ConnectorTest, Basic_TwoMessages_Synchronous) { 219 TEST_F(ConnectorTest, Basic_TwoMessages_Synchronous) {
219 internal::Connector connector0(handle0_.Pass(), 220 internal::Connector connector0(std::move(handle0_),
220 internal::Connector::SINGLE_THREADED_SEND); 221 internal::Connector::SINGLE_THREADED_SEND);
221 internal::Connector connector1(handle1_.Pass(), 222 internal::Connector connector1(std::move(handle1_),
222 internal::Connector::SINGLE_THREADED_SEND); 223 internal::Connector::SINGLE_THREADED_SEND);
223 224
224 const char* kText[] = {"hello", "world"}; 225 const char* kText[] = {"hello", "world"};
225 226
226 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { 227 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) {
227 Message message; 228 Message message;
228 AllocMessage(kText[i], &message); 229 AllocMessage(kText[i], &message);
229 230
230 connector0.Accept(&message); 231 connector0.Accept(&message);
231 } 232 }
232 233
233 MessageAccumulator accumulator; 234 MessageAccumulator accumulator;
234 connector1.set_incoming_receiver(&accumulator); 235 connector1.set_incoming_receiver(&accumulator);
235 236
236 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 237 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
237 238
238 ASSERT_FALSE(accumulator.IsEmpty()); 239 ASSERT_FALSE(accumulator.IsEmpty());
239 240
240 Message message_received; 241 Message message_received;
241 accumulator.Pop(&message_received); 242 accumulator.Pop(&message_received);
242 243
243 EXPECT_EQ( 244 EXPECT_EQ(
244 std::string(kText[0]), 245 std::string(kText[0]),
245 std::string(reinterpret_cast<const char*>(message_received.payload()))); 246 std::string(reinterpret_cast<const char*>(message_received.payload())));
246 247
247 ASSERT_TRUE(accumulator.IsEmpty()); 248 ASSERT_TRUE(accumulator.IsEmpty());
248 } 249 }
249 250
250 TEST_F(ConnectorTest, WriteToClosedPipe) { 251 TEST_F(ConnectorTest, WriteToClosedPipe) {
251 internal::Connector connector0(handle0_.Pass(), 252 internal::Connector connector0(std::move(handle0_),
252 internal::Connector::SINGLE_THREADED_SEND); 253 internal::Connector::SINGLE_THREADED_SEND);
253 254
254 const char kText[] = "hello world"; 255 const char kText[] = "hello world";
255 256
256 Message message; 257 Message message;
257 AllocMessage(kText, &message); 258 AllocMessage(kText, &message);
258 259
259 // Close the other end of the pipe. 260 // Close the other end of the pipe.
260 handle1_.reset(); 261 handle1_.reset();
261 262
262 // Not observed yet because we haven't spun the message loop yet. 263 // Not observed yet because we haven't spun the message loop yet.
263 EXPECT_FALSE(connector0.encountered_error()); 264 EXPECT_FALSE(connector0.encountered_error());
264 265
265 // Write failures are not reported. 266 // Write failures are not reported.
266 bool ok = connector0.Accept(&message); 267 bool ok = connector0.Accept(&message);
267 EXPECT_TRUE(ok); 268 EXPECT_TRUE(ok);
268 269
269 // Still not observed. 270 // Still not observed.
270 EXPECT_FALSE(connector0.encountered_error()); 271 EXPECT_FALSE(connector0.encountered_error());
271 272
272 // Spin the message loop, and then we should start observing the closed pipe. 273 // Spin the message loop, and then we should start observing the closed pipe.
273 PumpMessages(); 274 PumpMessages();
274 275
275 EXPECT_TRUE(connector0.encountered_error()); 276 EXPECT_TRUE(connector0.encountered_error());
276 } 277 }
277 278
278 TEST_F(ConnectorTest, MessageWithHandles) { 279 TEST_F(ConnectorTest, MessageWithHandles) {
279 internal::Connector connector0(handle0_.Pass(), 280 internal::Connector connector0(std::move(handle0_),
280 internal::Connector::SINGLE_THREADED_SEND); 281 internal::Connector::SINGLE_THREADED_SEND);
281 internal::Connector connector1(handle1_.Pass(), 282 internal::Connector connector1(std::move(handle1_),
282 internal::Connector::SINGLE_THREADED_SEND); 283 internal::Connector::SINGLE_THREADED_SEND);
283 284
284 const char kText[] = "hello world"; 285 const char kText[] = "hello world";
285 286
286 Message message1; 287 Message message1;
287 AllocMessage(kText, &message1); 288 AllocMessage(kText, &message1);
288 289
289 MessagePipe pipe; 290 MessagePipe pipe;
290 message1.mutable_handles()->push_back(pipe.handle0.release()); 291 message1.mutable_handles()->push_back(pipe.handle0.release());
291 292
(...skipping 19 matching lines...) Expand all
311 312
312 // Now send a message to the transferred handle and confirm it's sent through 313 // Now send a message to the transferred handle and confirm it's sent through
313 // to the orginal pipe. 314 // to the orginal pipe.
314 // TODO(vtl): Do we need a better way of "downcasting" the handle types? 315 // TODO(vtl): Do we need a better way of "downcasting" the handle types?
315 ScopedMessagePipeHandle smph; 316 ScopedMessagePipeHandle smph;
316 smph.reset(MessagePipeHandle(message_received.handles()->front().value())); 317 smph.reset(MessagePipeHandle(message_received.handles()->front().value()));
317 message_received.mutable_handles()->front() = Handle(); 318 message_received.mutable_handles()->front() = Handle();
318 // |smph| now owns this handle. 319 // |smph| now owns this handle.
319 320
320 internal::Connector connector_received( 321 internal::Connector connector_received(
321 smph.Pass(), internal::Connector::SINGLE_THREADED_SEND); 322 std::move(smph), internal::Connector::SINGLE_THREADED_SEND);
322 internal::Connector connector_original( 323 internal::Connector connector_original(
323 pipe.handle1.Pass(), internal::Connector::SINGLE_THREADED_SEND); 324 std::move(pipe.handle1), internal::Connector::SINGLE_THREADED_SEND);
324 325
325 Message message2; 326 Message message2;
326 AllocMessage(kText, &message2); 327 AllocMessage(kText, &message2);
327 328
328 connector_received.Accept(&message2); 329 connector_received.Accept(&message2);
329 connector_original.set_incoming_receiver(&accumulator); 330 connector_original.set_incoming_receiver(&accumulator);
330 PumpMessages(); 331 PumpMessages();
331 332
332 ASSERT_FALSE(accumulator.IsEmpty()); 333 ASSERT_FALSE(accumulator.IsEmpty());
333 334
334 accumulator.Pop(&message_received); 335 accumulator.Pop(&message_received);
335 336
336 EXPECT_EQ( 337 EXPECT_EQ(
337 std::string(kText), 338 std::string(kText),
338 std::string(reinterpret_cast<const char*>(message_received.payload()))); 339 std::string(reinterpret_cast<const char*>(message_received.payload())));
339 } 340 }
340 341
341 TEST_F(ConnectorTest, WaitForIncomingMessageWithError) { 342 TEST_F(ConnectorTest, WaitForIncomingMessageWithError) {
342 internal::Connector connector0(handle0_.Pass(), 343 internal::Connector connector0(std::move(handle0_),
343 internal::Connector::SINGLE_THREADED_SEND); 344 internal::Connector::SINGLE_THREADED_SEND);
344 // Close the other end of the pipe. 345 // Close the other end of the pipe.
345 handle1_.reset(); 346 handle1_.reset();
346 ASSERT_FALSE(connector0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE)); 347 ASSERT_FALSE(connector0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE));
347 } 348 }
348 349
349 TEST_F(ConnectorTest, WaitForIncomingMessageWithDeletion) { 350 TEST_F(ConnectorTest, WaitForIncomingMessageWithDeletion) {
350 internal::Connector connector0(handle0_.Pass(), 351 internal::Connector connector0(std::move(handle0_),
351 internal::Connector::SINGLE_THREADED_SEND); 352 internal::Connector::SINGLE_THREADED_SEND);
352 internal::Connector* connector1 = new internal::Connector( 353 internal::Connector* connector1 = new internal::Connector(
353 handle1_.Pass(), internal::Connector::SINGLE_THREADED_SEND); 354 std::move(handle1_), internal::Connector::SINGLE_THREADED_SEND);
354 355
355 const char kText[] = "hello world"; 356 const char kText[] = "hello world";
356 357
357 Message message; 358 Message message;
358 AllocMessage(kText, &message); 359 AllocMessage(kText, &message);
359 360
360 connector0.Accept(&message); 361 connector0.Accept(&message);
361 362
362 ConnectorDeletingMessageAccumulator accumulator(&connector1); 363 ConnectorDeletingMessageAccumulator accumulator(&connector1);
363 connector1->set_incoming_receiver(&accumulator); 364 connector1->set_incoming_receiver(&accumulator);
364 365
365 connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 366 connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
366 367
367 ASSERT_FALSE(connector1); 368 ASSERT_FALSE(connector1);
368 ASSERT_FALSE(accumulator.IsEmpty()); 369 ASSERT_FALSE(accumulator.IsEmpty());
369 370
370 Message message_received; 371 Message message_received;
371 accumulator.Pop(&message_received); 372 accumulator.Pop(&message_received);
372 373
373 EXPECT_EQ( 374 EXPECT_EQ(
374 std::string(kText), 375 std::string(kText),
375 std::string(reinterpret_cast<const char*>(message_received.payload()))); 376 std::string(reinterpret_cast<const char*>(message_received.payload())));
376 } 377 }
377 378
378 TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) { 379 TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) {
379 internal::Connector connector0(handle0_.Pass(), 380 internal::Connector connector0(std::move(handle0_),
380 internal::Connector::SINGLE_THREADED_SEND); 381 internal::Connector::SINGLE_THREADED_SEND);
381 internal::Connector connector1(handle1_.Pass(), 382 internal::Connector connector1(std::move(handle1_),
382 internal::Connector::SINGLE_THREADED_SEND); 383 internal::Connector::SINGLE_THREADED_SEND);
383 384
384 const char* kText[] = {"hello", "world"}; 385 const char* kText[] = {"hello", "world"};
385 386
386 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { 387 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) {
387 Message message; 388 Message message;
388 AllocMessage(kText[i], &message); 389 AllocMessage(kText[i], &message);
389 390
390 connector0.Accept(&message); 391 connector0.Accept(&message);
391 } 392 }
(...skipping 11 matching lines...) Expand all
403 404
404 EXPECT_EQ( 405 EXPECT_EQ(
405 std::string(kText[i]), 406 std::string(kText[i]),
406 std::string(reinterpret_cast<const char*>(message_received.payload()))); 407 std::string(reinterpret_cast<const char*>(message_received.payload())));
407 } 408 }
408 409
409 ASSERT_EQ(2, accumulator.number_of_calls()); 410 ASSERT_EQ(2, accumulator.number_of_calls());
410 } 411 }
411 412
412 TEST_F(ConnectorTest, RaiseError) { 413 TEST_F(ConnectorTest, RaiseError) {
413 internal::Connector connector0(handle0_.Pass(), 414 internal::Connector connector0(std::move(handle0_),
414 internal::Connector::SINGLE_THREADED_SEND); 415 internal::Connector::SINGLE_THREADED_SEND);
415 bool error_handler_called0 = false; 416 bool error_handler_called0 = false;
416 connector0.set_connection_error_handler( 417 connector0.set_connection_error_handler(
417 [&error_handler_called0]() { error_handler_called0 = true; }); 418 [&error_handler_called0]() { error_handler_called0 = true; });
418 419
419 internal::Connector connector1(handle1_.Pass(), 420 internal::Connector connector1(std::move(handle1_),
420 internal::Connector::SINGLE_THREADED_SEND); 421 internal::Connector::SINGLE_THREADED_SEND);
421 bool error_handler_called1 = false; 422 bool error_handler_called1 = false;
422 connector1.set_connection_error_handler( 423 connector1.set_connection_error_handler(
423 [&error_handler_called1]() { error_handler_called1 = true; }); 424 [&error_handler_called1]() { error_handler_called1 = true; });
424 425
425 const char kText[] = "hello world"; 426 const char kText[] = "hello world";
426 427
427 Message message; 428 Message message;
428 AllocMessage(kText, &message); 429 AllocMessage(kText, &message);
429 430
(...skipping 26 matching lines...) Expand all
456 EXPECT_TRUE(connector1.encountered_error()); 457 EXPECT_TRUE(connector1.encountered_error());
457 458
458 // The message pipe handle is valid at both sides. 459 // The message pipe handle is valid at both sides.
459 EXPECT_TRUE(connector0.is_valid()); 460 EXPECT_TRUE(connector0.is_valid());
460 EXPECT_TRUE(connector1.is_valid()); 461 EXPECT_TRUE(connector1.is_valid());
461 } 462 }
462 463
463 } // namespace 464 } // namespace
464 } // namespace test 465 } // namespace test
465 } // namespace mojo 466 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698