Index: chrome/test/chromedriver/devtools_client_impl_unittest.cc |
diff --git a/chrome/test/chromedriver/devtools_client_impl_unittest.cc b/chrome/test/chromedriver/devtools_client_impl_unittest.cc |
deleted file mode 100644 |
index f9d30dc9b3b33ee7f06ae6ea5ffb4b940a3db766..0000000000000000000000000000000000000000 |
--- a/chrome/test/chromedriver/devtools_client_impl_unittest.cc |
+++ /dev/null |
@@ -1,816 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <list> |
-#include <string> |
- |
-#include "base/bind.h" |
-#include "base/compiler_specific.h" |
-#include "base/json/json_reader.h" |
-#include "base/json/json_writer.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/values.h" |
-#include "chrome/test/chromedriver/devtools_client_impl.h" |
-#include "chrome/test/chromedriver/devtools_event_listener.h" |
-#include "chrome/test/chromedriver/net/sync_websocket.h" |
-#include "chrome/test/chromedriver/net/sync_websocket_factory.h" |
-#include "chrome/test/chromedriver/status.h" |
-#include "googleurl/src/gurl.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace { |
- |
-Status CloserFunc() { |
- return Status(kOk); |
-} |
- |
-class MockSyncWebSocket : public SyncWebSocket { |
- public: |
- MockSyncWebSocket() : connected_(false), id_(-1), queued_messages_(1) {} |
- virtual ~MockSyncWebSocket() {} |
- |
- virtual bool IsConnected() OVERRIDE { |
- return connected_; |
- } |
- |
- virtual bool Connect(const GURL& url) OVERRIDE { |
- EXPECT_STREQ("http://url/", url.possibly_invalid_spec().c_str()); |
- connected_ = true; |
- return true; |
- } |
- |
- virtual bool Send(const std::string& message) OVERRIDE { |
- EXPECT_TRUE(connected_); |
- scoped_ptr<base::Value> value(base::JSONReader::Read(message)); |
- base::DictionaryValue* dict = NULL; |
- EXPECT_TRUE(value->GetAsDictionary(&dict)); |
- if (!dict) |
- return false; |
- EXPECT_TRUE(dict->GetInteger("id", &id_)); |
- std::string method; |
- EXPECT_TRUE(dict->GetString("method", &method)); |
- EXPECT_STREQ("method", method.c_str()); |
- base::DictionaryValue* params = NULL; |
- EXPECT_TRUE(dict->GetDictionary("params", ¶ms)); |
- if (!params) |
- return false; |
- int param = -1; |
- EXPECT_TRUE(params->GetInteger("param", ¶m)); |
- EXPECT_EQ(1, param); |
- return true; |
- } |
- |
- virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { |
- base::DictionaryValue response; |
- response.SetInteger("id", id_); |
- base::DictionaryValue result; |
- result.SetInteger("param", 1); |
- response.Set("result", result.DeepCopy()); |
- base::JSONWriter::Write(&response, message); |
- --queued_messages_; |
- return true; |
- } |
- |
- virtual bool HasNextMessage() OVERRIDE { |
- return queued_messages_ > 0; |
- } |
- |
- protected: |
- bool connected_; |
- int id_; |
- int queued_messages_; |
-}; |
- |
-template <typename T> |
-scoped_ptr<SyncWebSocket> CreateMockSyncWebSocket() { |
- return scoped_ptr<SyncWebSocket>(new T()); |
-} |
- |
-} // namespace |
- |
-TEST(DevToolsClientImpl, SendCommand) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- params.SetInteger("param", 1); |
- ASSERT_EQ(kOk, client.SendCommand("method", params).code()); |
-} |
- |
-TEST(DevToolsClientImpl, SendCommandAndGetResult) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- params.SetInteger("param", 1); |
- scoped_ptr<base::DictionaryValue> result; |
- Status status = client.SendCommandAndGetResult("method", params, &result); |
- ASSERT_EQ(kOk, status.code()); |
- std::string json; |
- base::JSONWriter::Write(result.get(), &json); |
- ASSERT_STREQ("{\"param\":1}", json.c_str()); |
-} |
- |
-namespace { |
- |
-class MockSyncWebSocket2 : public SyncWebSocket { |
- public: |
- MockSyncWebSocket2() {} |
- virtual ~MockSyncWebSocket2() {} |
- |
- virtual bool IsConnected() OVERRIDE { |
- return false; |
- } |
- |
- virtual bool Connect(const GURL& url) OVERRIDE { |
- return false; |
- } |
- |
- virtual bool Send(const std::string& message) OVERRIDE { |
- EXPECT_TRUE(false); |
- return false; |
- } |
- |
- virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { |
- EXPECT_TRUE(false); |
- return false; |
- } |
- |
- virtual bool HasNextMessage() OVERRIDE { |
- return true; |
- } |
-}; |
- |
-} // namespace |
- |
-TEST(DevToolsClientImpl, ConnectIfNecessaryConnectFails) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket2>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- ASSERT_EQ(kDisconnected, client.ConnectIfNecessary().code()); |
-} |
- |
-namespace { |
- |
-class MockSyncWebSocket3 : public SyncWebSocket { |
- public: |
- MockSyncWebSocket3() : connected_(false) {} |
- virtual ~MockSyncWebSocket3() {} |
- |
- virtual bool IsConnected() OVERRIDE { |
- return connected_; |
- } |
- |
- virtual bool Connect(const GURL& url) OVERRIDE { |
- connected_ = true; |
- return true; |
- } |
- |
- virtual bool Send(const std::string& message) OVERRIDE { |
- return false; |
- } |
- |
- virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { |
- EXPECT_TRUE(false); |
- return false; |
- } |
- |
- virtual bool HasNextMessage() OVERRIDE { |
- return true; |
- } |
- |
- private: |
- bool connected_; |
-}; |
- |
-} // namespace |
- |
-TEST(DevToolsClientImpl, SendCommandSendFails) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket3>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
-} |
- |
-namespace { |
- |
-class MockSyncWebSocket4 : public SyncWebSocket { |
- public: |
- MockSyncWebSocket4() : connected_(false) {} |
- virtual ~MockSyncWebSocket4() {} |
- |
- virtual bool IsConnected() OVERRIDE { |
- return connected_; |
- } |
- |
- virtual bool Connect(const GURL& url) OVERRIDE { |
- connected_ = true; |
- return true; |
- } |
- |
- virtual bool Send(const std::string& message) OVERRIDE { |
- return true; |
- } |
- |
- virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { |
- return false; |
- } |
- |
- virtual bool HasNextMessage() OVERRIDE { |
- return true; |
- } |
- |
- private: |
- bool connected_; |
-}; |
- |
-} // namespace |
- |
-TEST(DevToolsClientImpl, SendCommandReceiveNextMessageFails) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket4>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
-} |
- |
-namespace { |
- |
-class FakeSyncWebSocket : public SyncWebSocket { |
- public: |
- FakeSyncWebSocket() : connected_(false) {} |
- virtual ~FakeSyncWebSocket() {} |
- |
- virtual bool IsConnected() OVERRIDE { |
- return connected_; |
- } |
- |
- virtual bool Connect(const GURL& url) OVERRIDE { |
- EXPECT_FALSE(connected_); |
- connected_ = true; |
- return true; |
- } |
- |
- virtual bool Send(const std::string& message) OVERRIDE { |
- return true; |
- } |
- |
- virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { |
- return true; |
- } |
- |
- virtual bool HasNextMessage() OVERRIDE { |
- return true; |
- } |
- |
- private: |
- bool connected_; |
-}; |
- |
-bool ReturnCommand( |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- *type = internal::kCommandResponseMessageType; |
- command_response->id = expected_id; |
- command_response->result.reset(new base::DictionaryValue()); |
- return true; |
-} |
- |
-bool ReturnBadResponse( |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- *type = internal::kCommandResponseMessageType; |
- command_response->id = expected_id; |
- command_response->result.reset(new base::DictionaryValue()); |
- return false; |
-} |
- |
-bool ReturnCommandBadId( |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- *type = internal::kCommandResponseMessageType; |
- command_response->id = expected_id + 100; |
- command_response->result.reset(new base::DictionaryValue()); |
- return true; |
-} |
- |
-bool ReturnCommandError( |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- *type = internal::kCommandResponseMessageType; |
- command_response->id = expected_id; |
- command_response->error = "err"; |
- return true; |
-} |
- |
-class MockListener : public DevToolsEventListener { |
- public: |
- MockListener() : called_(false) {} |
- virtual ~MockListener() { |
- EXPECT_TRUE(called_); |
- } |
- |
- virtual Status OnConnected() OVERRIDE { |
- return Status(kOk); |
- } |
- |
- virtual void OnEvent(const std::string& method, |
- const base::DictionaryValue& params) OVERRIDE { |
- called_ = true; |
- EXPECT_STREQ("method", method.c_str()); |
- EXPECT_TRUE(params.HasKey("key")); |
- } |
- |
- private: |
- bool called_; |
-}; |
- |
-bool ReturnEventThenResponse( |
- bool* first, |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- if (*first) { |
- *type = internal::kEventMessageType; |
- event->method = "method"; |
- event->params.reset(new base::DictionaryValue()); |
- event->params->SetInteger("key", 1); |
- } else { |
- *type = internal::kCommandResponseMessageType; |
- command_response->id = expected_id; |
- base::DictionaryValue params; |
- command_response->result.reset(new base::DictionaryValue()); |
- command_response->result->SetInteger("key", 2); |
- } |
- *first = false; |
- return true; |
-} |
- |
-bool ReturnEvent( |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- *type = internal::kEventMessageType; |
- event->method = "method"; |
- event->params.reset(new base::DictionaryValue()); |
- event->params->SetInteger("key", 1); |
- return true; |
-} |
- |
-bool ReturnOutOfOrderResponses( |
- int* recurse_count, |
- DevToolsClient* client, |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- int key = 0; |
- base::DictionaryValue params; |
- params.SetInteger("param", 1); |
- switch ((*recurse_count)++) { |
- case 0: |
- client->SendCommand("method", params); |
- *type = internal::kEventMessageType; |
- event->method = "method"; |
- event->params.reset(new base::DictionaryValue()); |
- event->params->SetInteger("key", 1); |
- return true; |
- case 1: |
- command_response->id = expected_id - 1; |
- key = 2; |
- break; |
- case 2: |
- command_response->id = expected_id; |
- key = 3; |
- break; |
- } |
- *type = internal::kCommandResponseMessageType; |
- command_response->result.reset(new base::DictionaryValue()); |
- command_response->result->SetInteger("key", key); |
- return true; |
-} |
- |
-bool ReturnError( |
- const std::string& message, |
- int expected_id, |
- internal::InspectorMessageType* type, |
- internal::InspectorEvent* event, |
- internal::InspectorCommandResponse* command_response) { |
- return false; |
-} |
- |
-Status AlwaysTrue(bool* is_met) { |
- *is_met = true; |
- return Status(kOk); |
-} |
- |
-Status AlwaysError(bool* is_met) { |
- return Status(kUnknownError); |
-} |
- |
-} // namespace |
- |
-TEST(DevToolsClientImpl, SendCommandOnlyConnectsOnce) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnCommand)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- ASSERT_TRUE(client.SendCommand("method", params).IsOk()); |
- ASSERT_TRUE(client.SendCommand("method", params).IsOk()); |
-} |
- |
-TEST(DevToolsClientImpl, SendCommandBadResponse) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnBadResponse)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
-} |
- |
-TEST(DevToolsClientImpl, SendCommandBadId) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnCommandBadId)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
-} |
- |
-TEST(DevToolsClientImpl, SendCommandResponseError) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnCommandError)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- ASSERT_TRUE(client.SendCommand("method", params).IsError()); |
-} |
- |
-TEST(DevToolsClientImpl, SendCommandEventBeforeResponse) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>); |
- MockListener listener; |
- bool first = true; |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnEventThenResponse, &first)); |
- client.AddListener(&listener); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- scoped_ptr<base::DictionaryValue> result; |
- ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); |
- ASSERT_TRUE(result); |
- int key; |
- ASSERT_TRUE(result->GetInteger("key", &key)); |
- ASSERT_EQ(2, key); |
-} |
- |
-TEST(ParseInspectorMessage, NonJson) { |
- internal::InspectorMessageType type; |
- internal::InspectorEvent event; |
- internal::InspectorCommandResponse response; |
- ASSERT_FALSE(internal::ParseInspectorMessage( |
- "hi", 0, &type, &event, &response)); |
-} |
- |
-TEST(ParseInspectorMessage, NeitherCommandNorEvent) { |
- internal::InspectorMessageType type; |
- internal::InspectorEvent event; |
- internal::InspectorCommandResponse response; |
- ASSERT_FALSE(internal::ParseInspectorMessage( |
- "{}", 0, &type, &event, &response)); |
-} |
- |
-TEST(ParseInspectorMessage, EventNoParams) { |
- internal::InspectorMessageType type; |
- internal::InspectorEvent event; |
- internal::InspectorCommandResponse response; |
- ASSERT_TRUE(internal::ParseInspectorMessage( |
- "{\"method\":\"method\"}", 0, &type, &event, &response)); |
- ASSERT_EQ(internal::kEventMessageType, type); |
- ASSERT_STREQ("method", event.method.c_str()); |
- ASSERT_TRUE(event.params->IsType(base::Value::TYPE_DICTIONARY)); |
-} |
- |
-TEST(ParseInspectorMessage, EventWithParams) { |
- internal::InspectorMessageType type; |
- internal::InspectorEvent event; |
- internal::InspectorCommandResponse response; |
- ASSERT_TRUE(internal::ParseInspectorMessage( |
- "{\"method\":\"method\",\"params\":{\"key\":100}}", |
- 0, &type, &event, &response)); |
- ASSERT_EQ(internal::kEventMessageType, type); |
- ASSERT_STREQ("method", event.method.c_str()); |
- int key; |
- ASSERT_TRUE(event.params->GetInteger("key", &key)); |
- ASSERT_EQ(100, key); |
-} |
- |
-TEST(ParseInspectorMessage, CommandNoErrorOrResult) { |
- internal::InspectorMessageType type; |
- internal::InspectorEvent event; |
- internal::InspectorCommandResponse response; |
- ASSERT_FALSE(internal::ParseInspectorMessage( |
- "{\"id\":1}", 0, &type, &event, &response)); |
-} |
- |
-TEST(ParseInspectorMessage, CommandError) { |
- internal::InspectorMessageType type; |
- internal::InspectorEvent event; |
- internal::InspectorCommandResponse response; |
- ASSERT_TRUE(internal::ParseInspectorMessage( |
- "{\"id\":1,\"error\":{}}", 0, &type, &event, &response)); |
- ASSERT_EQ(internal::kCommandResponseMessageType, type); |
- ASSERT_EQ(1, response.id); |
- ASSERT_TRUE(response.error.length()); |
- ASSERT_FALSE(response.result); |
-} |
- |
-TEST(ParseInspectorMessage, Command) { |
- internal::InspectorMessageType type; |
- internal::InspectorEvent event; |
- internal::InspectorCommandResponse response; |
- ASSERT_TRUE(internal::ParseInspectorMessage( |
- "{\"id\":1,\"result\":{\"key\":1}}", 0, &type, &event, &response)); |
- ASSERT_EQ(internal::kCommandResponseMessageType, type); |
- ASSERT_EQ(1, response.id); |
- ASSERT_FALSE(response.error.length()); |
- int key; |
- ASSERT_TRUE(response.result->GetInteger("key", &key)); |
- ASSERT_EQ(1, key); |
-} |
- |
-TEST(DevToolsClientImpl, HandleEventsUntil) { |
- MockListener listener; |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnEvent)); |
- client.AddListener(&listener); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
- ASSERT_EQ(kOk, status.code()); |
-} |
- |
-TEST(DevToolsClientImpl, WaitForNextEventCommand) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnCommand)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
- ASSERT_EQ(kUnknownError, status.code()); |
-} |
- |
-TEST(DevToolsClientImpl, WaitForNextEventError) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnError)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
- ASSERT_EQ(kUnknownError, status.code()); |
-} |
- |
-TEST(DevToolsClientImpl, WaitForNextEventConditionalFuncReturnsError) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc), |
- base::Bind(&ReturnEvent)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- Status status = client.HandleEventsUntil(base::Bind(&AlwaysError)); |
- ASSERT_EQ(kUnknownError, status.code()); |
-} |
- |
-TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
- int recurse_count = 0; |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- client.SetParserFuncForTesting( |
- base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client)); |
- base::DictionaryValue params; |
- params.SetInteger("param", 1); |
- scoped_ptr<base::DictionaryValue> result; |
- ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); |
- ASSERT_TRUE(result); |
- int key; |
- ASSERT_TRUE(result->GetInteger("key", &key)); |
- ASSERT_EQ(2, key); |
-} |
- |
-namespace { |
- |
-class OnConnectedListener : public DevToolsEventListener { |
- public: |
- OnConnectedListener(const std::string& method, DevToolsClient* client) |
- : method_(method), |
- client_(client), |
- on_connected_called_(false), |
- on_event_called_(false) { |
- client_->AddListener(this); |
- } |
- virtual ~OnConnectedListener() {} |
- |
- void VerifyCalled() { |
- EXPECT_TRUE(on_connected_called_); |
- EXPECT_TRUE(on_event_called_); |
- } |
- |
- virtual Status OnConnected() OVERRIDE { |
- EXPECT_FALSE(on_connected_called_); |
- EXPECT_FALSE(on_event_called_); |
- on_connected_called_ = true; |
- base::DictionaryValue params; |
- return client_->SendCommand(method_, params); |
- } |
- |
- virtual void OnEvent(const std::string& method, |
- const base::DictionaryValue& params) OVERRIDE { |
- EXPECT_TRUE(on_connected_called_); |
- on_event_called_ = true; |
- } |
- |
- private: |
- std::string method_; |
- DevToolsClient* client_; |
- bool on_connected_called_; |
- bool on_event_called_; |
-}; |
- |
-class OnConnectedSyncWebSocket : public SyncWebSocket { |
- public: |
- OnConnectedSyncWebSocket() : connected_(false) {} |
- virtual ~OnConnectedSyncWebSocket() {} |
- |
- virtual bool IsConnected() OVERRIDE { |
- return connected_; |
- } |
- |
- virtual bool Connect(const GURL& url) OVERRIDE { |
- connected_ = true; |
- return true; |
- } |
- |
- virtual bool Send(const std::string& message) OVERRIDE { |
- EXPECT_TRUE(connected_); |
- scoped_ptr<base::Value> value(base::JSONReader::Read(message)); |
- base::DictionaryValue* dict = NULL; |
- EXPECT_TRUE(value->GetAsDictionary(&dict)); |
- if (!dict) |
- return false; |
- int id; |
- EXPECT_TRUE(dict->GetInteger("id", &id)); |
- std::string method; |
- EXPECT_TRUE(dict->GetString("method", &method)); |
- |
- base::DictionaryValue response; |
- response.SetInteger("id", id); |
- response.Set("result", new base::DictionaryValue()); |
- std::string json_response; |
- base::JSONWriter::Write(&response, &json_response); |
- queued_response_.push_back(json_response); |
- |
- // Push one event. |
- base::DictionaryValue event; |
- event.SetString("method", "updateEvent"); |
- event.Set("params", new base::DictionaryValue()); |
- std::string json_event; |
- base::JSONWriter::Write(&event, &json_event); |
- queued_response_.push_back(json_event); |
- |
- return true; |
- } |
- |
- virtual bool ReceiveNextMessage(std::string* message) OVERRIDE { |
- if (queued_response_.empty()) |
- return false; |
- *message = queued_response_.front(); |
- queued_response_.pop_front(); |
- return true; |
- } |
- |
- virtual bool HasNextMessage() OVERRIDE { |
- return !queued_response_.empty(); |
- } |
- |
- private: |
- bool connected_; |
- std::list<std::string> queued_response_; |
-}; |
- |
-} // namespace |
- |
-TEST(DevToolsClientImpl, ProcessOnConnectedFirstOnCommand) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<OnConnectedSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- OnConnectedListener listener1("DOM.getDocument", &client); |
- OnConnectedListener listener2("Runtime.enable", &client); |
- OnConnectedListener listener3("Page.enable", &client); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- base::DictionaryValue params; |
- EXPECT_EQ(kOk, client.SendCommand("Runtime.execute", params).code()); |
- listener1.VerifyCalled(); |
- listener2.VerifyCalled(); |
- listener3.VerifyCalled(); |
-} |
- |
-TEST(DevToolsClientImpl, ProcessOnConnectedFirstOnHandleEventsUntil) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<OnConnectedSyncWebSocket>); |
- DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc)); |
- OnConnectedListener listener1("DOM.getDocument", &client); |
- OnConnectedListener listener2("Runtime.enable", &client); |
- OnConnectedListener listener3("Page.enable", &client); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- EXPECT_EQ(kOk, client.HandleReceivedEvents().code()); |
- listener1.VerifyCalled(); |
- listener2.VerifyCalled(); |
- listener3.VerifyCalled(); |
-} |
- |
-namespace { |
- |
-class DisconnectedSyncWebSocket : public MockSyncWebSocket { |
- public: |
- DisconnectedSyncWebSocket() : connection_count_(0), command_count_(0) {} |
- virtual ~DisconnectedSyncWebSocket() {} |
- |
- virtual bool Connect(const GURL& url) OVERRIDE { |
- connection_count_++; |
- connected_ = connection_count_ != 2; |
- return connected_; |
- } |
- |
- virtual bool Send(const std::string& message) OVERRIDE { |
- command_count_++; |
- if (command_count_ == 1) { |
- connected_ = false; |
- return false; |
- } |
- return MockSyncWebSocket::Send(message); |
- } |
- |
- private: |
- int connection_count_; |
- int command_count_; |
-}; |
- |
-Status CheckCloserFuncCalled(bool* is_called) { |
- *is_called = true; |
- return Status(kOk); |
-} |
- |
-} // namespace |
- |
-TEST(DevToolsClientImpl, Reconnect) { |
- SyncWebSocketFactory factory = |
- base::Bind(&CreateMockSyncWebSocket<DisconnectedSyncWebSocket>); |
- bool is_called = false; |
- DevToolsClientImpl client(factory, "http://url", |
- base::Bind(&CheckCloserFuncCalled, &is_called)); |
- ASSERT_FALSE(is_called); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- ASSERT_FALSE(is_called); |
- base::DictionaryValue params; |
- params.SetInteger("param", 1); |
- is_called = false; |
- ASSERT_EQ(kDisconnected, client.SendCommand("method", params).code()); |
- ASSERT_FALSE(is_called); |
- ASSERT_EQ(kDisconnected, client.HandleReceivedEvents().code()); |
- ASSERT_FALSE(is_called); |
- ASSERT_EQ(kOk, client.ConnectIfNecessary().code()); |
- ASSERT_TRUE(is_called); |
- is_called = false; |
- ASSERT_EQ(kOk, client.SendCommand("method", params).code()); |
- ASSERT_FALSE(is_called); |
-} |