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

Side by Side Diff: chrome/test/chromedriver/devtools_client_impl_unittest.cc

Issue 12321057: [chromedriver] Implement reconnection to DevTools. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix some nits and add one unit test. Created 7 years, 10 months 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698