| 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 |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |