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

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 nits. Created 7 years, 9 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
33 virtual bool IsConnected() OVERRIDE {
34 return connected_;
35 }
36
29 virtual bool Connect(const GURL& url) OVERRIDE { 37 virtual bool Connect(const GURL& url) OVERRIDE {
30 EXPECT_STREQ("http://url/", url.possibly_invalid_spec().c_str()); 38 EXPECT_STREQ("http://url/", url.possibly_invalid_spec().c_str());
31 connected_ = true; 39 connected_ = true;
32 return true; 40 return true;
33 } 41 }
34 42
35 virtual bool Send(const std::string& message) OVERRIDE { 43 virtual bool Send(const std::string& message) OVERRIDE {
36 EXPECT_TRUE(connected_); 44 EXPECT_TRUE(connected_);
37 scoped_ptr<base::Value> value(base::JSONReader::Read(message)); 45 scoped_ptr<base::Value> value(base::JSONReader::Read(message));
38 base::DictionaryValue* dict = NULL; 46 base::DictionaryValue* dict = NULL;
(...skipping 22 matching lines...) Expand all
61 response.Set("result", result.DeepCopy()); 69 response.Set("result", result.DeepCopy());
62 base::JSONWriter::Write(&response, message); 70 base::JSONWriter::Write(&response, message);
63 --queued_messages_; 71 --queued_messages_;
64 return true; 72 return true;
65 } 73 }
66 74
67 virtual bool HasNextMessage() OVERRIDE { 75 virtual bool HasNextMessage() OVERRIDE {
68 return queued_messages_ > 0; 76 return queued_messages_ > 0;
69 } 77 }
70 78
71 private: 79 protected:
72 bool connected_; 80 bool connected_;
73 int id_; 81 int id_;
74 int queued_messages_; 82 int queued_messages_;
75 }; 83 };
76 84
77 template <typename T> 85 template <typename T>
78 scoped_ptr<SyncWebSocket> CreateMockSyncWebSocket() { 86 scoped_ptr<SyncWebSocket> CreateMockSyncWebSocket() {
79 return scoped_ptr<SyncWebSocket>(new T()); 87 return scoped_ptr<SyncWebSocket>(new T());
80 } 88 }
81 89
82 } // namespace 90 } // namespace
83 91
84 TEST(DevToolsClientImpl, SendCommand) { 92 TEST(DevToolsClientImpl, SendCommand) {
85 SyncWebSocketFactory factory = 93 SyncWebSocketFactory factory =
86 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); 94 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
87 DevToolsClientImpl client(factory, "http://url"); 95 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
96 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
88 base::DictionaryValue params; 97 base::DictionaryValue params;
89 params.SetInteger("param", 1); 98 params.SetInteger("param", 1);
90 ASSERT_EQ(kOk, client.SendCommand("method", params).code()); 99 ASSERT_EQ(kOk, client.SendCommand("method", params).code());
91 } 100 }
92 101
93 TEST(DevToolsClientImpl, SendCommandAndGetResult) { 102 TEST(DevToolsClientImpl, SendCommandAndGetResult) {
94 SyncWebSocketFactory factory = 103 SyncWebSocketFactory factory =
95 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); 104 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
96 DevToolsClientImpl client(factory, "http://url"); 105 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
106 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
97 base::DictionaryValue params; 107 base::DictionaryValue params;
98 params.SetInteger("param", 1); 108 params.SetInteger("param", 1);
99 scoped_ptr<base::DictionaryValue> result; 109 scoped_ptr<base::DictionaryValue> result;
100 Status status = client.SendCommandAndGetResult("method", params, &result); 110 Status status = client.SendCommandAndGetResult("method", params, &result);
101 ASSERT_EQ(kOk, status.code()); 111 ASSERT_EQ(kOk, status.code());
102 std::string json; 112 std::string json;
103 base::JSONWriter::Write(result.get(), &json); 113 base::JSONWriter::Write(result.get(), &json);
104 ASSERT_STREQ("{\"param\":1}", json.c_str()); 114 ASSERT_STREQ("{\"param\":1}", json.c_str());
105 } 115 }
106 116
107 namespace { 117 namespace {
108 118
109 class MockSyncWebSocket2 : public SyncWebSocket { 119 class MockSyncWebSocket2 : public SyncWebSocket {
110 public: 120 public:
111 MockSyncWebSocket2() {} 121 MockSyncWebSocket2() {}
112 virtual ~MockSyncWebSocket2() {} 122 virtual ~MockSyncWebSocket2() {}
113 123
124 virtual bool IsConnected() OVERRIDE {
125 return false;
126 }
127
114 virtual bool Connect(const GURL& url) OVERRIDE { 128 virtual bool Connect(const GURL& url) OVERRIDE {
115 return false; 129 return false;
116 } 130 }
117 131
118 virtual bool Send(const std::string& message) OVERRIDE { 132 virtual bool Send(const std::string& message) OVERRIDE {
119 EXPECT_TRUE(false); 133 EXPECT_TRUE(false);
120 return false; 134 return false;
121 } 135 }
122 136
123 virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { 137 virtual bool ReceiveNextMessage(std::string* message) OVERRIDE {
124 EXPECT_TRUE(false); 138 EXPECT_TRUE(false);
125 return false; 139 return false;
126 } 140 }
127 141
128 virtual bool HasNextMessage() OVERRIDE { 142 virtual bool HasNextMessage() OVERRIDE {
129 return true; 143 return true;
130 } 144 }
131 }; 145 };
132 146
133 } // namespace 147 } // namespace
134 148
135 TEST(DevToolsClientImpl, SendCommandConnectFails) { 149 TEST(DevToolsClientImpl, ConnectIfNecessaryConnectFails) {
136 SyncWebSocketFactory factory = 150 SyncWebSocketFactory factory =
137 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket2>); 151 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket2>);
138 DevToolsClientImpl client(factory, "http://url"); 152 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
139 base::DictionaryValue params; 153 ASSERT_EQ(kDisconnected, client.ConnectIfNecessary().code());
140 ASSERT_TRUE(client.SendCommand("method", params).IsError());
141 } 154 }
142 155
143 namespace { 156 namespace {
144 157
145 class MockSyncWebSocket3 : public SyncWebSocket { 158 class MockSyncWebSocket3 : public SyncWebSocket {
146 public: 159 public:
147 MockSyncWebSocket3() {} 160 MockSyncWebSocket3() : connected_(false) {}
148 virtual ~MockSyncWebSocket3() {} 161 virtual ~MockSyncWebSocket3() {}
149 162
163 virtual bool IsConnected() OVERRIDE {
164 return connected_;
165 }
166
150 virtual bool Connect(const GURL& url) OVERRIDE { 167 virtual bool Connect(const GURL& url) OVERRIDE {
168 connected_ = true;
151 return true; 169 return true;
152 } 170 }
153 171
154 virtual bool Send(const std::string& message) OVERRIDE { 172 virtual bool Send(const std::string& message) OVERRIDE {
155 return false; 173 return false;
156 } 174 }
157 175
158 virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { 176 virtual bool ReceiveNextMessage(std::string* message) OVERRIDE {
159 EXPECT_TRUE(false); 177 EXPECT_TRUE(false);
160 return false; 178 return false;
161 } 179 }
162 180
163 virtual bool HasNextMessage() OVERRIDE { 181 virtual bool HasNextMessage() OVERRIDE {
164 return true; 182 return true;
165 } 183 }
184
185 private:
186 bool connected_;
166 }; 187 };
167 188
168 } // namespace 189 } // namespace
169 190
170 TEST(DevToolsClientImpl, SendCommandSendFails) { 191 TEST(DevToolsClientImpl, SendCommandSendFails) {
171 SyncWebSocketFactory factory = 192 SyncWebSocketFactory factory =
172 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket3>); 193 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket3>);
173 DevToolsClientImpl client(factory, "http://url"); 194 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
195 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
174 base::DictionaryValue params; 196 base::DictionaryValue params;
175 ASSERT_TRUE(client.SendCommand("method", params).IsError()); 197 ASSERT_TRUE(client.SendCommand("method", params).IsError());
176 } 198 }
177 199
178 namespace { 200 namespace {
179 201
180 class MockSyncWebSocket4 : public SyncWebSocket { 202 class MockSyncWebSocket4 : public SyncWebSocket {
181 public: 203 public:
182 MockSyncWebSocket4() {} 204 MockSyncWebSocket4() : connected_(false) {}
183 virtual ~MockSyncWebSocket4() {} 205 virtual ~MockSyncWebSocket4() {}
184 206
207 virtual bool IsConnected() OVERRIDE {
208 return connected_;
209 }
210
185 virtual bool Connect(const GURL& url) OVERRIDE { 211 virtual bool Connect(const GURL& url) OVERRIDE {
212 connected_ = true;
186 return true; 213 return true;
187 } 214 }
188 215
189 virtual bool Send(const std::string& message) OVERRIDE { 216 virtual bool Send(const std::string& message) OVERRIDE {
190 return true; 217 return true;
191 } 218 }
192 219
193 virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { 220 virtual bool ReceiveNextMessage(std::string* message) OVERRIDE {
194 return false; 221 return false;
195 } 222 }
196 223
197 virtual bool HasNextMessage() OVERRIDE { 224 virtual bool HasNextMessage() OVERRIDE {
198 return true; 225 return true;
199 } 226 }
227
228 private:
229 bool connected_;
200 }; 230 };
201 231
202 } // namespace 232 } // namespace
203 233
204 TEST(DevToolsClientImpl, SendCommandReceiveNextMessageFails) { 234 TEST(DevToolsClientImpl, SendCommandReceiveNextMessageFails) {
205 SyncWebSocketFactory factory = 235 SyncWebSocketFactory factory =
206 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket4>); 236 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket4>);
207 DevToolsClientImpl client(factory, "http://url"); 237 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
238 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
208 base::DictionaryValue params; 239 base::DictionaryValue params;
209 ASSERT_TRUE(client.SendCommand("method", params).IsError()); 240 ASSERT_TRUE(client.SendCommand("method", params).IsError());
210 } 241 }
211 242
212 namespace { 243 namespace {
213 244
214 class FakeSyncWebSocket : public SyncWebSocket { 245 class FakeSyncWebSocket : public SyncWebSocket {
215 public: 246 public:
216 FakeSyncWebSocket() : connected_(false) {} 247 FakeSyncWebSocket() : connected_(false) {}
217 virtual ~FakeSyncWebSocket() {} 248 virtual ~FakeSyncWebSocket() {}
218 249
250 virtual bool IsConnected() OVERRIDE {
251 return connected_;
252 }
253
219 virtual bool Connect(const GURL& url) OVERRIDE { 254 virtual bool Connect(const GURL& url) OVERRIDE {
220 EXPECT_FALSE(connected_); 255 EXPECT_FALSE(connected_);
221 connected_ = true; 256 connected_ = true;
222 return true; 257 return true;
223 } 258 }
224 259
225 virtual bool Send(const std::string& message) OVERRIDE { 260 virtual bool Send(const std::string& message) OVERRIDE {
226 return true; 261 return true;
227 } 262 }
228 263
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 424
390 bool AlwaysTrue() { 425 bool AlwaysTrue() {
391 return true; 426 return true;
392 } 427 }
393 428
394 } // namespace 429 } // namespace
395 430
396 TEST(DevToolsClientImpl, SendCommandOnlyConnectsOnce) { 431 TEST(DevToolsClientImpl, SendCommandOnlyConnectsOnce) {
397 SyncWebSocketFactory factory = 432 SyncWebSocketFactory factory =
398 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); 433 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
399 DevToolsClientImpl client(factory, "http://url", base::Bind( 434 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
400 &ReturnCommand)); 435 base::Bind(&ReturnCommand));
436 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
401 base::DictionaryValue params; 437 base::DictionaryValue params;
402 ASSERT_TRUE(client.SendCommand("method", params).IsOk()); 438 ASSERT_TRUE(client.SendCommand("method", params).IsOk());
403 ASSERT_TRUE(client.SendCommand("method", params).IsOk()); 439 ASSERT_TRUE(client.SendCommand("method", params).IsOk());
404 } 440 }
405 441
406 TEST(DevToolsClientImpl, SendCommandBadResponse) { 442 TEST(DevToolsClientImpl, SendCommandBadResponse) {
407 SyncWebSocketFactory factory = 443 SyncWebSocketFactory factory =
408 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); 444 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
409 DevToolsClientImpl client(factory, "http://url", base::Bind( 445 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
410 &ReturnBadResponse)); 446 base::Bind(&ReturnBadResponse));
447 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
411 base::DictionaryValue params; 448 base::DictionaryValue params;
412 ASSERT_TRUE(client.SendCommand("method", params).IsError()); 449 ASSERT_TRUE(client.SendCommand("method", params).IsError());
413 } 450 }
414 451
415 TEST(DevToolsClientImpl, SendCommandBadId) { 452 TEST(DevToolsClientImpl, SendCommandBadId) {
416 SyncWebSocketFactory factory = 453 SyncWebSocketFactory factory =
417 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); 454 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
418 DevToolsClientImpl client(factory, "http://url", base::Bind( 455 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
419 &ReturnCommandBadId)); 456 base::Bind(&ReturnCommandBadId));
457 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
420 base::DictionaryValue params; 458 base::DictionaryValue params;
421 ASSERT_TRUE(client.SendCommand("method", params).IsError()); 459 ASSERT_TRUE(client.SendCommand("method", params).IsError());
422 } 460 }
423 461
424 TEST(DevToolsClientImpl, SendCommandResponseError) { 462 TEST(DevToolsClientImpl, SendCommandResponseError) {
425 SyncWebSocketFactory factory = 463 SyncWebSocketFactory factory =
426 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); 464 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
427 DevToolsClientImpl client(factory, "http://url", base::Bind( 465 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
428 &ReturnCommandError)); 466 base::Bind(&ReturnCommandError));
467 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
429 base::DictionaryValue params; 468 base::DictionaryValue params;
430 ASSERT_TRUE(client.SendCommand("method", params).IsError()); 469 ASSERT_TRUE(client.SendCommand("method", params).IsError());
431 } 470 }
432 471
433 TEST(DevToolsClientImpl, SendCommandEventBeforeResponse) { 472 TEST(DevToolsClientImpl, SendCommandEventBeforeResponse) {
434 SyncWebSocketFactory factory = 473 SyncWebSocketFactory factory =
435 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); 474 base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
436 MockListener listener; 475 MockListener listener;
437 bool first = true; 476 bool first = true;
438 DevToolsClientImpl client(factory, "http://url", base::Bind( 477 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
439 &ReturnEventThenResponse, &first)); 478 base::Bind(&ReturnEventThenResponse, &first));
440 client.AddListener(&listener); 479 client.AddListener(&listener);
480 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
441 base::DictionaryValue params; 481 base::DictionaryValue params;
442 scoped_ptr<base::DictionaryValue> result; 482 scoped_ptr<base::DictionaryValue> result;
443 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); 483 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk());
444 ASSERT_TRUE(result); 484 ASSERT_TRUE(result);
445 int key; 485 int key;
446 ASSERT_TRUE(result->GetInteger("key", &key)); 486 ASSERT_TRUE(result->GetInteger("key", &key));
447 ASSERT_EQ(2, key); 487 ASSERT_EQ(2, key);
448 } 488 }
449 489
450 TEST(ParseInspectorMessage, NonJson) { 490 TEST(ParseInspectorMessage, NonJson) {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 ASSERT_FALSE(response.error.length()); 559 ASSERT_FALSE(response.error.length());
520 int key; 560 int key;
521 ASSERT_TRUE(response.result->GetInteger("key", &key)); 561 ASSERT_TRUE(response.result->GetInteger("key", &key));
522 ASSERT_EQ(1, key); 562 ASSERT_EQ(1, key);
523 } 563 }
524 564
525 TEST(DevToolsClientImpl, HandleEventsUntil) { 565 TEST(DevToolsClientImpl, HandleEventsUntil) {
526 MockListener listener; 566 MockListener listener;
527 SyncWebSocketFactory factory = 567 SyncWebSocketFactory factory =
528 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); 568 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
529 DevToolsClientImpl client(factory, "http://url", base::Bind( 569 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
530 &ReturnEvent)); 570 base::Bind(&ReturnEvent));
531 client.AddListener(&listener); 571 client.AddListener(&listener);
572 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
532 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); 573 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue));
533 ASSERT_EQ(kOk, status.code()); 574 ASSERT_EQ(kOk, status.code());
534 } 575 }
535 576
536 TEST(DevToolsClientImpl, WaitForNextEventCommand) { 577 TEST(DevToolsClientImpl, WaitForNextEventCommand) {
537 SyncWebSocketFactory factory = 578 SyncWebSocketFactory factory =
538 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); 579 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
539 DevToolsClientImpl client(factory, "http://url", base::Bind( 580 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
540 &ReturnCommand)); 581 base::Bind(&ReturnCommand));
582 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
541 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); 583 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue));
542 ASSERT_EQ(kUnknownError, status.code()); 584 ASSERT_EQ(kUnknownError, status.code());
543 } 585 }
544 586
545 TEST(DevToolsClientImpl, WaitForNextEventError) { 587 TEST(DevToolsClientImpl, WaitForNextEventError) {
546 SyncWebSocketFactory factory = 588 SyncWebSocketFactory factory =
547 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); 589 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
548 DevToolsClientImpl client(factory, "http://url", base::Bind( 590 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
549 &ReturnError)); 591 base::Bind(&ReturnError));
592 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
550 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); 593 Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue));
551 ASSERT_EQ(kUnknownError, status.code()); 594 ASSERT_EQ(kUnknownError, status.code());
552 } 595 }
553 596
554 TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) { 597 TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) {
555 SyncWebSocketFactory factory = 598 SyncWebSocketFactory factory =
556 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); 599 base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
557 int recurse_count = 0; 600 int recurse_count = 0;
558 DevToolsClientImpl client(factory, "http://url"); 601 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
602 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
559 client.SetParserFuncForTesting( 603 client.SetParserFuncForTesting(
560 base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client)); 604 base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client));
561 base::DictionaryValue params; 605 base::DictionaryValue params;
562 params.SetInteger("param", 1); 606 params.SetInteger("param", 1);
563 scoped_ptr<base::DictionaryValue> result; 607 scoped_ptr<base::DictionaryValue> result;
564 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); 608 ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk());
565 ASSERT_TRUE(result); 609 ASSERT_TRUE(result);
566 int key; 610 int key;
567 ASSERT_TRUE(result->GetInteger("key", &key)); 611 ASSERT_TRUE(result->GetInteger("key", &key));
568 ASSERT_EQ(2, key); 612 ASSERT_EQ(2, key);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 DevToolsClient* client_; 649 DevToolsClient* client_;
606 bool on_connected_called_; 650 bool on_connected_called_;
607 bool on_event_called_; 651 bool on_event_called_;
608 }; 652 };
609 653
610 class OnConnectedSyncWebSocket : public SyncWebSocket { 654 class OnConnectedSyncWebSocket : public SyncWebSocket {
611 public: 655 public:
612 OnConnectedSyncWebSocket() : connected_(false) {} 656 OnConnectedSyncWebSocket() : connected_(false) {}
613 virtual ~OnConnectedSyncWebSocket() {} 657 virtual ~OnConnectedSyncWebSocket() {}
614 658
659 virtual bool IsConnected() OVERRIDE {
660 return connected_;
661 }
662
615 virtual bool Connect(const GURL& url) OVERRIDE { 663 virtual bool Connect(const GURL& url) OVERRIDE {
616 connected_ = true; 664 connected_ = true;
617 return true; 665 return true;
618 } 666 }
619 667
620 virtual bool Send(const std::string& message) OVERRIDE { 668 virtual bool Send(const std::string& message) OVERRIDE {
621 EXPECT_TRUE(connected_); 669 EXPECT_TRUE(connected_);
622 scoped_ptr<base::Value> value(base::JSONReader::Read(message)); 670 scoped_ptr<base::Value> value(base::JSONReader::Read(message));
623 base::DictionaryValue* dict = NULL; 671 base::DictionaryValue* dict = NULL;
624 EXPECT_TRUE(value->GetAsDictionary(&dict)); 672 EXPECT_TRUE(value->GetAsDictionary(&dict));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 private: 710 private:
663 bool connected_; 711 bool connected_;
664 std::list<std::string> queued_response_; 712 std::list<std::string> queued_response_;
665 }; 713 };
666 714
667 } // namespace 715 } // namespace
668 716
669 TEST(DevToolsClientImpl, ProcessOnConnectedBeforeOnEvent) { 717 TEST(DevToolsClientImpl, ProcessOnConnectedBeforeOnEvent) {
670 SyncWebSocketFactory factory = 718 SyncWebSocketFactory factory =
671 base::Bind(&CreateMockSyncWebSocket<OnConnectedSyncWebSocket>); 719 base::Bind(&CreateMockSyncWebSocket<OnConnectedSyncWebSocket>);
672 DevToolsClientImpl client(factory, "http://url"); 720 DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
673 OnConnectedListener listener1("DOM.getDocument", &client); 721 OnConnectedListener listener1("DOM.getDocument", &client);
674 OnConnectedListener listener2("Runtime.enable", &client); 722 OnConnectedListener listener2("Runtime.enable", &client);
675 OnConnectedListener listener3("Page.enable", &client); 723 OnConnectedListener listener3("Page.enable", &client);
724 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
676 base::DictionaryValue params; 725 base::DictionaryValue params;
677 EXPECT_EQ(kOk, client.SendCommand("Runtime.execute", params).code()); 726 EXPECT_EQ(kOk, client.SendCommand("Runtime.execute", params).code());
678 listener1.VerifyCalled(); 727 listener1.VerifyCalled();
679 listener2.VerifyCalled(); 728 listener2.VerifyCalled();
680 listener3.VerifyCalled(); 729 listener3.VerifyCalled();
681 } 730 }
731
732 namespace {
733
734 class DisconnectedSyncWebSocket : public MockSyncWebSocket {
735 public:
736 DisconnectedSyncWebSocket() : connection_count_(0), command_count_(0) {}
737 virtual ~DisconnectedSyncWebSocket() {}
738
739 virtual bool Connect(const GURL& url) OVERRIDE {
740 connection_count_++;
741 connected_ = connection_count_ != 2;
742 return connected_;
743 }
744
745 virtual bool Send(const std::string& message) OVERRIDE {
746 command_count_++;
747 if (command_count_ == 1) {
748 connected_ = false;
749 return false;
750 }
751 return MockSyncWebSocket::Send(message);
752 }
753
754 private:
755 int connection_count_;
756 int command_count_;
757 };
758
759 Status CheckCloserFuncCalled(bool* is_called) {
760 *is_called = true;
761 return Status(kOk);
762 }
763
764 } // namespace
765
766 TEST(DevToolsClientImpl, Reconnect) {
767 SyncWebSocketFactory factory =
768 base::Bind(&CreateMockSyncWebSocket<DisconnectedSyncWebSocket>);
769 bool is_called = false;
770 DevToolsClientImpl client(factory, "http://url",
771 base::Bind(&CheckCloserFuncCalled, &is_called));
772 ASSERT_FALSE(is_called);
773 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
774 ASSERT_FALSE(is_called);
775 base::DictionaryValue params;
776 params.SetInteger("param", 1);
777 is_called = false;
778 ASSERT_EQ(kDisconnected, client.SendCommand("method", params).code());
779 ASSERT_FALSE(is_called);
780 ASSERT_EQ(kOk, client.ConnectIfNecessary().code());
781 ASSERT_TRUE(is_called);
782 is_called = false;
783 ASSERT_EQ(kOk, client.SendCommand("method", params).code());
784 ASSERT_FALSE(is_called);
785 }
OLDNEW
« no previous file with comments | « chrome/test/chromedriver/devtools_client_impl.cc ('k') | chrome/test/chromedriver/net/sync_websocket.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698