| 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" |
| 11 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "chrome/test/chromedriver/devtools_client_impl.h" | 14 #include "chrome/test/chromedriver/devtools_client_impl.h" |
| 15 #include "chrome/test/chromedriver/devtools_event_listener.h" | 15 #include "chrome/test/chromedriver/devtools_event_listener.h" |
| 16 #include "chrome/test/chromedriver/net/sync_websocket.h" | 16 #include "chrome/test/chromedriver/net/sync_websocket.h" |
| 17 #include "chrome/test/chromedriver/net/sync_websocket_factory.h" | 17 #include "chrome/test/chromedriver/net/sync_websocket_factory.h" |
| 18 #include "chrome/test/chromedriver/status.h" | 18 #include "chrome/test/chromedriver/status.h" |
| 19 #include "googleurl/src/gurl.h" | 19 #include "googleurl/src/gurl.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 Status CloserFunc() { |
| 25 return Status(kOk); |
| 26 } |
| 27 |
| 24 class MockSyncWebSocket : public SyncWebSocket { | 28 class MockSyncWebSocket : public SyncWebSocket { |
| 25 public: | 29 public: |
| 26 MockSyncWebSocket() : connected_(false), id_(-1), queued_messages_(1) {} | 30 MockSyncWebSocket() : connected_(false), id_(-1), queued_messages_(1) {} |
| 27 virtual ~MockSyncWebSocket() {} | 31 virtual ~MockSyncWebSocket() {} |
| 28 | 32 |
| 29 virtual bool Connect(const GURL& url) OVERRIDE { | 33 virtual bool Connect(const GURL& url) OVERRIDE { |
| 30 EXPECT_STREQ("http://url/", url.possibly_invalid_spec().c_str()); | 34 EXPECT_STREQ("http://url/", url.possibly_invalid_spec().c_str()); |
| 31 connected_ = true; | 35 connected_ = true; |
| 32 return true; | 36 return true; |
| 33 } | 37 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 template <typename T> | 81 template <typename T> |
| 78 scoped_ptr<SyncWebSocket> CreateMockSyncWebSocket() { | 82 scoped_ptr<SyncWebSocket> CreateMockSyncWebSocket() { |
| 79 return scoped_ptr<SyncWebSocket>(new T()); | 83 return scoped_ptr<SyncWebSocket>(new T()); |
| 80 } | 84 } |
| 81 | 85 |
| 82 } // namespace | 86 } // namespace |
| 83 | 87 |
| 84 TEST(DevToolsClientImpl, SendCommand) { | 88 TEST(DevToolsClientImpl, SendCommand) { |
| 85 SyncWebSocketFactory factory = | 89 SyncWebSocketFactory factory = |
| 86 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); | 90 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
| 87 DevToolsClientImpl client(factory, "http://url"); | 91 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
| 88 base::DictionaryValue params; | 92 base::DictionaryValue params; |
| 89 params.SetInteger("param", 1); | 93 params.SetInteger("param", 1); |
| 90 ASSERT_EQ(kOk, client.SendCommand("method", params).code()); | 94 ASSERT_EQ(kOk, client.SendCommand("method", params).code()); |
| 91 } | 95 } |
| 92 | 96 |
| 93 TEST(DevToolsClientImpl, SendCommandAndGetResult) { | 97 TEST(DevToolsClientImpl, SendCommandAndGetResult) { |
| 94 SyncWebSocketFactory factory = | 98 SyncWebSocketFactory factory = |
| 95 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); | 99 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
| 96 DevToolsClientImpl client(factory, "http://url"); | 100 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
| 97 base::DictionaryValue params; | 101 base::DictionaryValue params; |
| 98 params.SetInteger("param", 1); | 102 params.SetInteger("param", 1); |
| 99 scoped_ptr<base::DictionaryValue> result; | 103 scoped_ptr<base::DictionaryValue> result; |
| 100 Status status = client.SendCommandAndGetResult("method", params, &result); | 104 Status status = client.SendCommandAndGetResult("method", params, &result); |
| 101 ASSERT_EQ(kOk, status.code()); | 105 ASSERT_EQ(kOk, status.code()); |
| 102 std::string json; | 106 std::string json; |
| 103 base::JSONWriter::Write(result.get(), &json); | 107 base::JSONWriter::Write(result.get(), &json); |
| 104 ASSERT_STREQ("{\"param\":1}", json.c_str()); | 108 ASSERT_STREQ("{\"param\":1}", json.c_str()); |
| 105 } | 109 } |
| 106 | 110 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 128 virtual bool HasNextMessage() OVERRIDE { | 132 virtual bool HasNextMessage() OVERRIDE { |
| 129 return true; | 133 return true; |
| 130 } | 134 } |
| 131 }; | 135 }; |
| 132 | 136 |
| 133 } // namespace | 137 } // namespace |
| 134 | 138 |
| 135 TEST(DevToolsClientImpl, SendCommandConnectFails) { | 139 TEST(DevToolsClientImpl, SendCommandConnectFails) { |
| 136 SyncWebSocketFactory factory = | 140 SyncWebSocketFactory factory = |
| 137 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket2>); | 141 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket2>); |
| 138 DevToolsClientImpl client(factory, "http://url"); | 142 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
| 139 base::DictionaryValue params; | 143 base::DictionaryValue params; |
| 140 ASSERT_TRUE(client.SendCommand("method", params).IsError()); | 144 ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
| 141 } | 145 } |
| 142 | 146 |
| 143 namespace { | 147 namespace { |
| 144 | 148 |
| 145 class MockSyncWebSocket3 : public SyncWebSocket { | 149 class MockSyncWebSocket3 : public SyncWebSocket { |
| 146 public: | 150 public: |
| 147 MockSyncWebSocket3() {} | 151 MockSyncWebSocket3() {} |
| 148 virtual ~MockSyncWebSocket3() {} | 152 virtual ~MockSyncWebSocket3() {} |
| (...skipping 14 matching lines...) Expand all Loading... |
| 163 virtual bool HasNextMessage() OVERRIDE { | 167 virtual bool HasNextMessage() OVERRIDE { |
| 164 return true; | 168 return true; |
| 165 } | 169 } |
| 166 }; | 170 }; |
| 167 | 171 |
| 168 } // namespace | 172 } // namespace |
| 169 | 173 |
| 170 TEST(DevToolsClientImpl, SendCommandSendFails) { | 174 TEST(DevToolsClientImpl, SendCommandSendFails) { |
| 171 SyncWebSocketFactory factory = | 175 SyncWebSocketFactory factory = |
| 172 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket3>); | 176 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket3>); |
| 173 DevToolsClientImpl client(factory, "http://url"); | 177 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
| 174 base::DictionaryValue params; | 178 base::DictionaryValue params; |
| 175 ASSERT_TRUE(client.SendCommand("method", params).IsError()); | 179 ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
| 176 } | 180 } |
| 177 | 181 |
| 178 namespace { | 182 namespace { |
| 179 | 183 |
| 180 class MockSyncWebSocket4 : public SyncWebSocket { | 184 class MockSyncWebSocket4 : public SyncWebSocket { |
| 181 public: | 185 public: |
| 182 MockSyncWebSocket4() {} | 186 MockSyncWebSocket4() {} |
| 183 virtual ~MockSyncWebSocket4() {} | 187 virtual ~MockSyncWebSocket4() {} |
| (...skipping 13 matching lines...) Expand all Loading... |
| 197 virtual bool HasNextMessage() OVERRIDE { | 201 virtual bool HasNextMessage() OVERRIDE { |
| 198 return true; | 202 return true; |
| 199 } | 203 } |
| 200 }; | 204 }; |
| 201 | 205 |
| 202 } // namespace | 206 } // namespace |
| 203 | 207 |
| 204 TEST(DevToolsClientImpl, SendCommandReceiveNextMessageFails) { | 208 TEST(DevToolsClientImpl, SendCommandReceiveNextMessageFails) { |
| 205 SyncWebSocketFactory factory = | 209 SyncWebSocketFactory factory = |
| 206 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket4>); | 210 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket4>); |
| 207 DevToolsClientImpl client(factory, "http://url"); | 211 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
| 208 base::DictionaryValue params; | 212 base::DictionaryValue params; |
| 209 ASSERT_TRUE(client.SendCommand("method", params).IsError()); | 213 ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
| 210 } | 214 } |
| 211 | 215 |
| 212 namespace { | 216 namespace { |
| 213 | 217 |
| 214 class FakeSyncWebSocket : public SyncWebSocket { | 218 class FakeSyncWebSocket : public SyncWebSocket { |
| 215 public: | 219 public: |
| 216 FakeSyncWebSocket() : connected_(false) {} | 220 FakeSyncWebSocket() : connected_(false) {} |
| 217 virtual ~FakeSyncWebSocket() {} | 221 virtual ~FakeSyncWebSocket() {} |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 | 393 |
| 390 bool AlwaysTrue() { | 394 bool AlwaysTrue() { |
| 391 return true; | 395 return true; |
| 392 } | 396 } |
| 393 | 397 |
| 394 } // namespace | 398 } // namespace |
| 395 | 399 |
| 396 TEST(DevToolsClientImpl, SendCommandOnlyConnectsOnce) { | 400 TEST(DevToolsClientImpl, SendCommandOnlyConnectsOnce) { |
| 397 SyncWebSocketFactory factory = | 401 SyncWebSocketFactory factory = |
| 398 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); | 402 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
| 399 DevToolsClientImpl client(factory, "http://url", base::Bind( | 403 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 400 &ReturnCommand)); | 404 base::Bind(&ReturnCommand)); |
| 401 base::DictionaryValue params; | 405 base::DictionaryValue params; |
| 402 ASSERT_TRUE(client.SendCommand("method", params).IsOk()); | 406 ASSERT_TRUE(client.SendCommand("method", params).IsOk()); |
| 403 ASSERT_TRUE(client.SendCommand("method", params).IsOk()); | 407 ASSERT_TRUE(client.SendCommand("method", params).IsOk()); |
| 404 } | 408 } |
| 405 | 409 |
| 406 TEST(DevToolsClientImpl, SendCommandBadResponse) { | 410 TEST(DevToolsClientImpl, SendCommandBadResponse) { |
| 407 SyncWebSocketFactory factory = | 411 SyncWebSocketFactory factory = |
| 408 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); | 412 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
| 409 DevToolsClientImpl client(factory, "http://url", base::Bind( | 413 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 410 &ReturnBadResponse)); | 414 base::Bind(&ReturnBadResponse)); |
| 411 base::DictionaryValue params; | 415 base::DictionaryValue params; |
| 412 ASSERT_TRUE(client.SendCommand("method", params).IsError()); | 416 ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
| 413 } | 417 } |
| 414 | 418 |
| 415 TEST(DevToolsClientImpl, SendCommandBadId) { | 419 TEST(DevToolsClientImpl, SendCommandBadId) { |
| 416 SyncWebSocketFactory factory = | 420 SyncWebSocketFactory factory = |
| 417 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); | 421 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
| 418 DevToolsClientImpl client(factory, "http://url", base::Bind( | 422 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 419 &ReturnCommandBadId)); | 423 base::Bind(&ReturnCommandBadId)); |
| 420 base::DictionaryValue params; | 424 base::DictionaryValue params; |
| 421 ASSERT_TRUE(client.SendCommand("method", params).IsError()); | 425 ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
| 422 } | 426 } |
| 423 | 427 |
| 424 TEST(DevToolsClientImpl, SendCommandResponseError) { | 428 TEST(DevToolsClientImpl, SendCommandResponseError) { |
| 425 SyncWebSocketFactory factory = | 429 SyncWebSocketFactory factory = |
| 426 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); | 430 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
| 427 DevToolsClientImpl client(factory, "http://url", base::Bind( | 431 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 428 &ReturnCommandError)); | 432 base::Bind(&ReturnCommandError)); |
| 429 base::DictionaryValue params; | 433 base::DictionaryValue params; |
| 430 ASSERT_TRUE(client.SendCommand("method", params).IsError()); | 434 ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
| 431 } | 435 } |
| 432 | 436 |
| 433 TEST(DevToolsClientImpl, SendCommandEventBeforeResponse) { | 437 TEST(DevToolsClientImpl, SendCommandEventBeforeResponse) { |
| 434 SyncWebSocketFactory factory = | 438 SyncWebSocketFactory factory = |
| 435 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); | 439 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
| 436 MockListener listener; | 440 MockListener listener; |
| 437 bool first = true; | 441 bool first = true; |
| 438 DevToolsClientImpl client(factory, "http://url", base::Bind( | 442 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 439 &ReturnEventThenResponse, &first)); | 443 base::Bind(&ReturnEventThenResponse, &first)); |
| 440 client.AddListener(&listener); | 444 client.AddListener(&listener); |
| 441 base::DictionaryValue params; | 445 base::DictionaryValue params; |
| 442 scoped_ptr<base::DictionaryValue> result; | 446 scoped_ptr<base::DictionaryValue> result; |
| 443 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); | 447 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); |
| 444 ASSERT_TRUE(result); | 448 ASSERT_TRUE(result); |
| 445 int key; | 449 int key; |
| 446 ASSERT_TRUE(result->GetInteger("key", &key)); | 450 ASSERT_TRUE(result->GetInteger("key", &key)); |
| 447 ASSERT_EQ(2, key); | 451 ASSERT_EQ(2, key); |
| 448 } | 452 } |
| 449 | 453 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 ASSERT_FALSE(response.error.length()); | 523 ASSERT_FALSE(response.error.length()); |
| 520 int key; | 524 int key; |
| 521 ASSERT_TRUE(response.result->GetInteger("key", &key)); | 525 ASSERT_TRUE(response.result->GetInteger("key", &key)); |
| 522 ASSERT_EQ(1, key); | 526 ASSERT_EQ(1, key); |
| 523 } | 527 } |
| 524 | 528 |
| 525 TEST(DevToolsClientImpl, HandleEventsUntil) { | 529 TEST(DevToolsClientImpl, HandleEventsUntil) { |
| 526 MockListener listener; | 530 MockListener listener; |
| 527 SyncWebSocketFactory factory = | 531 SyncWebSocketFactory factory = |
| 528 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); | 532 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
| 529 DevToolsClientImpl client(factory, "http://url", base::Bind( | 533 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 530 &ReturnEvent)); | 534 base::Bind(&ReturnEvent)); |
| 531 client.AddListener(&listener); | 535 client.AddListener(&listener); |
| 532 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); | 536 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
| 533 ASSERT_EQ(kOk, status.code()); | 537 ASSERT_EQ(kOk, status.code()); |
| 534 } | 538 } |
| 535 | 539 |
| 536 TEST(DevToolsClientImpl, WaitForNextEventCommand) { | 540 TEST(DevToolsClientImpl, WaitForNextEventCommand) { |
| 537 SyncWebSocketFactory factory = | 541 SyncWebSocketFactory factory = |
| 538 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); | 542 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
| 539 DevToolsClientImpl client(factory, "http://url", base::Bind( | 543 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 540 &ReturnCommand)); | 544 base::Bind(&ReturnCommand)); |
| 541 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); | 545 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
| 542 ASSERT_EQ(kUnknownError, status.code()); | 546 ASSERT_EQ(kUnknownError, status.code()); |
| 543 } | 547 } |
| 544 | 548 |
| 545 TEST(DevToolsClientImpl, WaitForNextEventError) { | 549 TEST(DevToolsClientImpl, WaitForNextEventError) { |
| 546 SyncWebSocketFactory factory = | 550 SyncWebSocketFactory factory = |
| 547 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); | 551 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
| 548 DevToolsClientImpl client(factory, "http://url", base::Bind( | 552 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
| 549 &ReturnError)); | 553 base::Bind(&ReturnError)); |
| 550 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); | 554 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
| 551 ASSERT_EQ(kUnknownError, status.code()); | 555 ASSERT_EQ(kUnknownError, status.code()); |
| 552 } | 556 } |
| 553 | 557 |
| 554 TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) { | 558 TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) { |
| 555 SyncWebSocketFactory factory = | 559 SyncWebSocketFactory factory = |
| 556 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); | 560 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
| 557 int recurse_count = 0; | 561 int recurse_count = 0; |
| 558 DevToolsClientImpl client(factory, "http://url"); | 562 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
| 559 client.SetParserFuncForTesting( | 563 client.SetParserFuncForTesting( |
| 560 base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client)); | 564 base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client)); |
| 561 base::DictionaryValue params; | 565 base::DictionaryValue params; |
| 562 params.SetInteger("param", 1); | 566 params.SetInteger("param", 1); |
| 563 scoped_ptr<base::DictionaryValue> result; | 567 scoped_ptr<base::DictionaryValue> result; |
| 564 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); | 568 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); |
| 565 ASSERT_TRUE(result); | 569 ASSERT_TRUE(result); |
| 566 int key; | 570 int key; |
| 567 ASSERT_TRUE(result->GetInteger("key", &key)); | 571 ASSERT_TRUE(result->GetInteger("key", &key)); |
| 568 ASSERT_EQ(2, key); | 572 ASSERT_EQ(2, key); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 private: | 666 private: |
| 663 bool connected_; | 667 bool connected_; |
| 664 std::list<std::string> queued_response_; | 668 std::list<std::string> queued_response_; |
| 665 }; | 669 }; |
| 666 | 670 |
| 667 } // namespace | 671 } // namespace |
| 668 | 672 |
| 669 TEST(DevToolsClientImpl, ProcessOnConnectedBeforeOnEvent) { | 673 TEST(DevToolsClientImpl, ProcessOnConnectedBeforeOnEvent) { |
| 670 SyncWebSocketFactory factory = | 674 SyncWebSocketFactory factory = |
| 671 base::Bind(&CreateMockSyncWebSocket<OnConnectedSyncWebSocket>); | 675 base::Bind(&CreateMockSyncWebSocket<OnConnectedSyncWebSocket>); |
| 672 DevToolsClientImpl client(factory, "http://url"); | 676 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
| 673 OnConnectedListener listener1("DOM.getDocument", &client); | 677 OnConnectedListener listener1("DOM.getDocument", &client); |
| 674 OnConnectedListener listener2("Runtime.enable", &client); | 678 OnConnectedListener listener2("Runtime.enable", &client); |
| 675 OnConnectedListener listener3("Page.enable", &client); | 679 OnConnectedListener listener3("Page.enable", &client); |
| 676 base::DictionaryValue params; | 680 base::DictionaryValue params; |
| 677 EXPECT_EQ(kOk, client.SendCommand("Runtime.execute", params).code()); | 681 EXPECT_EQ(kOk, client.SendCommand("Runtime.execute", params).code()); |
| 678 listener1.VerifyCalled(); | 682 listener1.VerifyCalled(); |
| 679 listener2.VerifyCalled(); | 683 listener2.VerifyCalled(); |
| 680 listener3.VerifyCalled(); | 684 listener3.VerifyCalled(); |
| 681 } | 685 } |
| 686 |
| 687 namespace { |
| 688 |
| 689 class DisconnectedSyncWebSocket : public MockSyncWebSocket { |
| 690 public: |
| 691 DisconnectedSyncWebSocket() : command_count_(0) {} |
| 692 virtual ~DisconnectedSyncWebSocket() {} |
| 693 |
| 694 virtual bool Send(const std::string& message) OVERRIDE { |
| 695 command_count_++; |
| 696 if (command_count_ == 2) |
| 697 return false; |
| 698 return MockSyncWebSocket::Send(message); |
| 699 } |
| 700 |
| 701 private: |
| 702 int command_count_; |
| 703 }; |
| 704 |
| 705 Status CheckCloserFuncCalled(bool* is_called) { |
| 706 *is_called = true; |
| 707 return Status(kOk); |
| 708 } |
| 709 |
| 710 } // namespace |
| 711 |
| 712 TEST(DevToolsClientImpl, Reconnect) { |
| 713 SyncWebSocketFactory factory = |
| 714 base::Bind(&CreateMockSyncWebSocket<DisconnectedSyncWebSocket>); |
| 715 bool is_called = false; |
| 716 DevToolsClientImpl client(factory, "http://url", |
| 717 base::Bind(&CheckCloserFuncCalled, &is_called)); |
| 718 base::DictionaryValue params; |
| 719 params.SetInteger("param", 1); |
| 720 EXPECT_EQ(kOk, client.SendCommand("method", params).code()); |
| 721 EXPECT_FALSE(is_called); |
| 722 EXPECT_EQ(kOk, client.SendCommand("method", params).code()); |
| 723 EXPECT_TRUE(is_called); |
| 724 } |
| OLD | NEW |