OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stdint.h> | 5 #include <stdint.h> |
6 #include <stdio.h> | 6 #include <stdio.h> |
7 | 7 |
8 #include <limits> | 8 #include <limits> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 if (FUZZER_ROUTING_ID != last_msg_->routing_id()) | 251 if (FUZZER_ROUTING_ID != last_msg_->routing_id()) |
252 return false; | 252 return false; |
253 return (type_id == last_msg_->type()); | 253 return (type_id == last_msg_->type()); |
254 } | 254 } |
255 | 255 |
256 IPC::Message* last_msg_; | 256 IPC::Message* last_msg_; |
257 }; | 257 }; |
258 | 258 |
259 // Runs the fuzzing server child mode. Returns when the preset number of | 259 // Runs the fuzzing server child mode. Returns when the preset number of |
260 // messages have been received. | 260 // messages have been received. |
261 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(FuzzServerClient) { | 261 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(FuzzServerClient) { |
262 base::MessageLoopForIO main_message_loop; | |
263 FuzzerServerListener listener; | 262 FuzzerServerListener listener; |
264 std::unique_ptr<IPC::Channel> channel(IPC::Channel::CreateClient( | 263 Connect(&listener); |
265 IPCTestBase::GetChannelName("FuzzServerClient"), &listener, | 264 listener.Init(channel()); |
266 main_message_loop.task_runner())); | |
267 CHECK(channel->Connect()); | |
268 listener.Init(channel.get()); | |
269 base::RunLoop().Run(); | 265 base::RunLoop().Run(); |
270 return 0; | 266 Close(); |
271 } | 267 } |
272 | 268 |
273 class IPCFuzzingTest : public IPCTestBase { | 269 using IPCFuzzingTest = IPCChannelMojoTestBase; |
274 }; | |
275 | 270 |
276 // This test makes sure that the FuzzerClientListener and FuzzerServerListener | 271 // This test makes sure that the FuzzerClientListener and FuzzerServerListener |
277 // are working properly by generating two well formed IPC calls. | 272 // are working properly by generating two well formed IPC calls. |
278 TEST_F(IPCFuzzingTest, SanityTest) { | 273 TEST_F(IPCFuzzingTest, SanityTest) { |
279 Init("FuzzServerClient"); | 274 Init("FuzzServerClient"); |
280 | 275 |
281 FuzzerClientListener listener; | 276 FuzzerClientListener listener; |
282 CreateChannel(&listener); | 277 CreateChannel(&listener); |
283 listener.Init(channel()); | 278 listener.Init(channel()); |
284 ASSERT_TRUE(ConnectChannel()); | 279 ASSERT_TRUE(ConnectChannel()); |
285 ASSERT_TRUE(StartClient()); | |
286 | 280 |
287 IPC::Message* msg = NULL; | 281 IPC::Message* msg = NULL; |
288 int value = 43; | 282 int value = 43; |
289 msg = new MsgClassIS(value, base::ASCIIToUTF16("expect 43")); | 283 msg = new MsgClassIS(value, base::ASCIIToUTF16("expect 43")); |
290 sender()->Send(msg); | 284 sender()->Send(msg); |
291 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassIS::ID)); | 285 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassIS::ID)); |
292 | 286 |
293 msg = new MsgClassSI(base::ASCIIToUTF16("expect 44"), ++value); | 287 msg = new MsgClassSI(base::ASCIIToUTF16("expect 44"), ++value); |
294 sender()->Send(msg); | 288 sender()->Send(msg); |
295 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassSI::ID)); | 289 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassSI::ID)); |
296 | 290 |
297 EXPECT_TRUE(WaitForClientShutdown()); | 291 EXPECT_TRUE(WaitForClientShutdown()); |
298 DestroyChannel(); | 292 DestroyChannel(); |
299 } | 293 } |
300 | 294 |
301 // This test uses a payload that is smaller than expected. This generates an | 295 // This test uses a payload that is smaller than expected. This generates an |
302 // error while unpacking the IPC buffer which in debug trigger an assertion and | 296 // error while unpacking the IPC buffer. Right after we generate another valid |
303 // in release is ignored (!). Right after we generate another valid IPC to make | 297 // IPC to make sure framing is working properly. |
304 // sure framing is working properly. | |
305 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) | |
306 TEST_F(IPCFuzzingTest, MsgBadPayloadShort) { | 298 TEST_F(IPCFuzzingTest, MsgBadPayloadShort) { |
307 Init("FuzzServerClient"); | 299 Init("FuzzServerClient"); |
308 | 300 |
309 FuzzerClientListener listener; | 301 FuzzerClientListener listener; |
310 CreateChannel(&listener); | 302 CreateChannel(&listener); |
311 listener.Init(channel()); | 303 listener.Init(channel()); |
312 ASSERT_TRUE(ConnectChannel()); | 304 ASSERT_TRUE(ConnectChannel()); |
313 ASSERT_TRUE(StartClient()); | |
314 | 305 |
315 IPC::Message* msg = new IPC::Message(MSG_ROUTING_CONTROL, MsgClassIS::ID, | 306 IPC::Message* msg = new IPC::Message(MSG_ROUTING_CONTROL, MsgClassIS::ID, |
316 IPC::Message::PRIORITY_NORMAL); | 307 IPC::Message::PRIORITY_NORMAL); |
317 msg->WriteInt(666); | 308 msg->WriteInt(666); |
318 sender()->Send(msg); | 309 sender()->Send(msg); |
319 EXPECT_TRUE(listener.ExpectMsgNotHandled(MsgClassIS::ID)); | 310 EXPECT_TRUE(listener.ExpectMsgNotHandled(MsgClassIS::ID)); |
320 | 311 |
321 msg = new MsgClassSI(base::ASCIIToUTF16("expect one"), 1); | 312 msg = new MsgClassSI(base::ASCIIToUTF16("expect one"), 1); |
322 sender()->Send(msg); | 313 sender()->Send(msg); |
323 EXPECT_TRUE(listener.ExpectMessage(1, MsgClassSI::ID)); | 314 EXPECT_TRUE(listener.ExpectMessage(1, MsgClassSI::ID)); |
324 | 315 |
325 EXPECT_TRUE(WaitForClientShutdown()); | 316 EXPECT_TRUE(WaitForClientShutdown()); |
326 DestroyChannel(); | 317 DestroyChannel(); |
327 } | 318 } |
328 #endif | |
329 | 319 |
330 // This test uses a payload that has too many arguments, but so the payload size | 320 // This test uses a payload that has too many arguments, but so the payload size |
331 // is big enough so the unpacking routine does not generate an error as in the | 321 // is big enough so the unpacking routine does not generate an error as in the |
332 // case of MsgBadPayloadShort test. This test does not pinpoint a flaw (per se) | 322 // case of MsgBadPayloadShort test. This test does not pinpoint a flaw (per se) |
333 // as by design we don't carry type information on the IPC message. | 323 // as by design we don't carry type information on the IPC message. |
334 TEST_F(IPCFuzzingTest, MsgBadPayloadArgs) { | 324 TEST_F(IPCFuzzingTest, MsgBadPayloadArgs) { |
335 Init("FuzzServerClient"); | 325 Init("FuzzServerClient"); |
336 | 326 |
337 FuzzerClientListener listener; | 327 FuzzerClientListener listener; |
338 CreateChannel(&listener); | 328 CreateChannel(&listener); |
339 listener.Init(channel()); | 329 listener.Init(channel()); |
340 ASSERT_TRUE(ConnectChannel()); | 330 ASSERT_TRUE(ConnectChannel()); |
341 ASSERT_TRUE(StartClient()); | |
342 | 331 |
343 IPC::Message* msg = new IPC::Message(MSG_ROUTING_CONTROL, MsgClassSI::ID, | 332 IPC::Message* msg = new IPC::Message(MSG_ROUTING_CONTROL, MsgClassSI::ID, |
344 IPC::Message::PRIORITY_NORMAL); | 333 IPC::Message::PRIORITY_NORMAL); |
345 msg->WriteString16(base::ASCIIToUTF16("d")); | 334 msg->WriteString16(base::ASCIIToUTF16("d")); |
346 msg->WriteInt(0); | 335 msg->WriteInt(0); |
347 msg->WriteInt(0x65); // Extra argument. | 336 msg->WriteInt(0x65); // Extra argument. |
348 | 337 |
349 sender()->Send(msg); | 338 sender()->Send(msg); |
350 EXPECT_TRUE(listener.ExpectMessage(0, MsgClassSI::ID)); | 339 EXPECT_TRUE(listener.ExpectMessage(0, MsgClassSI::ID)); |
351 | 340 |
352 // Now send a well formed message to make sure the receiver wasn't | 341 // Now send a well formed message to make sure the receiver wasn't |
353 // thrown out of sync by the extra argument. | 342 // thrown out of sync by the extra argument. |
354 msg = new MsgClassIS(3, base::ASCIIToUTF16("expect three")); | 343 msg = new MsgClassIS(3, base::ASCIIToUTF16("expect three")); |
355 sender()->Send(msg); | 344 sender()->Send(msg); |
356 EXPECT_TRUE(listener.ExpectMessage(3, MsgClassIS::ID)); | 345 EXPECT_TRUE(listener.ExpectMessage(3, MsgClassIS::ID)); |
357 | 346 |
358 EXPECT_TRUE(WaitForClientShutdown()); | 347 EXPECT_TRUE(WaitForClientShutdown()); |
359 DestroyChannel(); | 348 DestroyChannel(); |
360 } | 349 } |
361 | 350 |
362 } // namespace | 351 } // namespace |
OLD | NEW |