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 <list> | 5 #include <list> |
6 #include <string> | 6 #include <string> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 internal::InspectorCommandResponse* command_response) { | 313 internal::InspectorCommandResponse* command_response) { |
314 if (*first) { | 314 if (*first) { |
315 *type = internal::kEventMessageType; | 315 *type = internal::kEventMessageType; |
316 event->method = "method"; | 316 event->method = "method"; |
317 event->params.reset(new base::DictionaryValue()); | 317 event->params.reset(new base::DictionaryValue()); |
318 event->params->SetInteger("key", 1); | 318 event->params->SetInteger("key", 1); |
319 } else { | 319 } else { |
320 *type = internal::kCommandResponseMessageType; | 320 *type = internal::kCommandResponseMessageType; |
321 command_response->id = expected_id; | 321 command_response->id = expected_id; |
322 base::DictionaryValue params; | 322 base::DictionaryValue params; |
323 params.SetInteger("key", 2); | 323 command_response->result.reset(new base::DictionaryValue()); |
324 command_response->result.reset(params.DeepCopy()); | 324 command_response->result->SetInteger("key", 2); |
325 } | 325 } |
326 *first = false; | 326 *first = false; |
327 return true; | 327 return true; |
328 } | 328 } |
329 | 329 |
330 bool ReturnEvent( | 330 bool ReturnEvent( |
331 const std::string& message, | 331 const std::string& message, |
332 int expected_id, | 332 int expected_id, |
333 internal::InspectorMessageType* type, | 333 internal::InspectorMessageType* type, |
334 internal::InspectorEvent* event, | 334 internal::InspectorEvent* event, |
335 internal::InspectorCommandResponse* command_response) { | 335 internal::InspectorCommandResponse* command_response) { |
336 *type = internal::kEventMessageType; | 336 *type = internal::kEventMessageType; |
337 event->method = "method"; | 337 event->method = "method"; |
338 event->params.reset(new base::DictionaryValue()); | 338 event->params.reset(new base::DictionaryValue()); |
339 event->params->SetInteger("key", 1); | 339 event->params->SetInteger("key", 1); |
340 return true; | 340 return true; |
341 } | 341 } |
342 | 342 |
| 343 bool ReturnOutOfOrderResponses( |
| 344 int* recurse_count, |
| 345 DevToolsClient* client, |
| 346 const std::string& message, |
| 347 int expected_id, |
| 348 internal::InspectorMessageType* type, |
| 349 internal::InspectorEvent* event, |
| 350 internal::InspectorCommandResponse* command_response) { |
| 351 int key = 0; |
| 352 base::DictionaryValue params; |
| 353 params.SetInteger("param", 1); |
| 354 switch ((*recurse_count)++) { |
| 355 case 0: |
| 356 client->SendCommand("method", params); |
| 357 *type = internal::kEventMessageType; |
| 358 event->method = "method"; |
| 359 event->params.reset(new base::DictionaryValue()); |
| 360 event->params->SetInteger("key", 1); |
| 361 return true; |
| 362 case 1: |
| 363 command_response->id = expected_id - 1; |
| 364 key = 2; |
| 365 break; |
| 366 case 2: |
| 367 command_response->id = expected_id; |
| 368 key = 3; |
| 369 break; |
| 370 } |
| 371 *type = internal::kCommandResponseMessageType; |
| 372 command_response->result.reset(new base::DictionaryValue()); |
| 373 command_response->result->SetInteger("key", key); |
| 374 return true; |
| 375 } |
| 376 |
343 bool ReturnError( | 377 bool ReturnError( |
344 const std::string& message, | 378 const std::string& message, |
345 int expected_id, | 379 int expected_id, |
346 internal::InspectorMessageType* type, | 380 internal::InspectorMessageType* type, |
347 internal::InspectorEvent* event, | 381 internal::InspectorEvent* event, |
348 internal::InspectorCommandResponse* command_response) { | 382 internal::InspectorCommandResponse* command_response) { |
349 return false; | 383 return false; |
350 } | 384 } |
351 | 385 |
352 bool AlwaysTrue() { | 386 bool AlwaysTrue() { |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 } | 539 } |
506 | 540 |
507 TEST(DevToolsClientImpl, WaitForNextEventError) { | 541 TEST(DevToolsClientImpl, WaitForNextEventError) { |
508 SyncWebSocketFactory factory = | 542 SyncWebSocketFactory factory = |
509 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); | 543 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
510 DevToolsClientImpl client(factory, "http://url", base::Bind( | 544 DevToolsClientImpl client(factory, "http://url", base::Bind( |
511 &ReturnError)); | 545 &ReturnError)); |
512 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); | 546 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
513 ASSERT_EQ(kUnknownError, status.code()); | 547 ASSERT_EQ(kUnknownError, status.code()); |
514 } | 548 } |
| 549 |
| 550 TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) { |
| 551 SyncWebSocketFactory factory = |
| 552 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
| 553 int recurse_count = 0; |
| 554 DevToolsClientImpl client(factory, "http://url"); |
| 555 client.SetParserFuncForTesting( |
| 556 base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client)); |
| 557 base::DictionaryValue params; |
| 558 params.SetInteger("param", 1); |
| 559 scoped_ptr<base::DictionaryValue> result; |
| 560 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); |
| 561 ASSERT_TRUE(result); |
| 562 int key; |
| 563 ASSERT_TRUE(result->GetInteger("key", &key)); |
| 564 ASSERT_EQ(2, key); |
| 565 } |
OLD | NEW |