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

Unified 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, 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 side-by-side diff with in-line comments
Download patch
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
index d8b9d3826eb33cac0b7a9745e30d87fde0b35bdf..1576fb0831a5157b8d7acae4f15207a1d970d2e0 100644
--- a/chrome/test/chromedriver/devtools_client_impl_unittest.cc
+++ b/chrome/test/chromedriver/devtools_client_impl_unittest.cc
@@ -21,11 +21,19 @@
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;
@@ -68,7 +76,7 @@ class MockSyncWebSocket : public SyncWebSocket {
return queued_messages_ > 0;
}
- private:
+ protected:
bool connected_;
int id_;
int queued_messages_;
@@ -84,7 +92,8 @@ scoped_ptr<SyncWebSocket> CreateMockSyncWebSocket() {
TEST(DevToolsClientImpl, SendCommand) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url");
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
params.SetInteger("param", 1);
ASSERT_EQ(kOk, client.SendCommand("method", params).code());
@@ -93,7 +102,8 @@ TEST(DevToolsClientImpl, SendCommand) {
TEST(DevToolsClientImpl, SendCommandAndGetResult) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url");
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
params.SetInteger("param", 1);
scoped_ptr<base::DictionaryValue> result;
@@ -111,6 +121,10 @@ class MockSyncWebSocket2 : public SyncWebSocket {
MockSyncWebSocket2() {}
virtual ~MockSyncWebSocket2() {}
+ virtual bool IsConnected() OVERRIDE {
+ return false;
+ }
+
virtual bool Connect(const GURL& url) OVERRIDE {
return false;
}
@@ -132,22 +146,26 @@ class MockSyncWebSocket2 : public SyncWebSocket {
} // namespace
-TEST(DevToolsClientImpl, SendCommandConnectFails) {
+TEST(DevToolsClientImpl, EnsureConnectedConnectFails) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket2>);
- DevToolsClientImpl client(factory, "http://url");
- base::DictionaryValue params;
- ASSERT_TRUE(client.SendCommand("method", params).IsError());
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
+ ASSERT_EQ(kDisconnected, client.EnsureConnected().code());
}
namespace {
class MockSyncWebSocket3 : public SyncWebSocket {
public:
- MockSyncWebSocket3() {}
+ MockSyncWebSocket3() : connected_(false) {}
virtual ~MockSyncWebSocket3() {}
+ virtual bool IsConnected() OVERRIDE {
+ return connected_;
+ }
+
virtual bool Connect(const GURL& url) OVERRIDE {
+ connected_ = true;
return true;
}
@@ -163,6 +181,9 @@ class MockSyncWebSocket3 : public SyncWebSocket {
virtual bool HasNextMessage() OVERRIDE {
return true;
}
+
+ private:
+ bool connected_;
};
} // namespace
@@ -170,7 +191,8 @@ class MockSyncWebSocket3 : public SyncWebSocket {
TEST(DevToolsClientImpl, SendCommandSendFails) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket3>);
- DevToolsClientImpl client(factory, "http://url");
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
ASSERT_TRUE(client.SendCommand("method", params).IsError());
}
@@ -179,10 +201,15 @@ namespace {
class MockSyncWebSocket4 : public SyncWebSocket {
public:
- MockSyncWebSocket4() {}
+ MockSyncWebSocket4() : connected_(false) {}
virtual ~MockSyncWebSocket4() {}
+ virtual bool IsConnected() OVERRIDE {
+ return connected_;
+ }
+
virtual bool Connect(const GURL& url) OVERRIDE {
+ connected_ = true;
return true;
}
@@ -197,6 +224,9 @@ class MockSyncWebSocket4 : public SyncWebSocket {
virtual bool HasNextMessage() OVERRIDE {
return true;
}
+
+ private:
+ bool connected_;
};
} // namespace
@@ -204,7 +234,8 @@ class MockSyncWebSocket4 : public SyncWebSocket {
TEST(DevToolsClientImpl, SendCommandReceiveNextMessageFails) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket4>);
- DevToolsClientImpl client(factory, "http://url");
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
ASSERT_TRUE(client.SendCommand("method", params).IsError());
}
@@ -216,6 +247,10 @@ class FakeSyncWebSocket : public SyncWebSocket {
FakeSyncWebSocket() : connected_(false) {}
virtual ~FakeSyncWebSocket() {}
+ virtual bool IsConnected() OVERRIDE {
+ return connected_;
+ }
+
virtual bool Connect(const GURL& url) OVERRIDE {
EXPECT_FALSE(connected_);
connected_ = true;
@@ -396,8 +431,9 @@ bool AlwaysTrue() {
TEST(DevToolsClientImpl, SendCommandOnlyConnectsOnce) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnCommand));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnCommand));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
ASSERT_TRUE(client.SendCommand("method", params).IsOk());
ASSERT_TRUE(client.SendCommand("method", params).IsOk());
@@ -406,8 +442,9 @@ TEST(DevToolsClientImpl, SendCommandOnlyConnectsOnce) {
TEST(DevToolsClientImpl, SendCommandBadResponse) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnBadResponse));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnBadResponse));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
ASSERT_TRUE(client.SendCommand("method", params).IsError());
}
@@ -415,8 +452,9 @@ TEST(DevToolsClientImpl, SendCommandBadResponse) {
TEST(DevToolsClientImpl, SendCommandBadId) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnCommandBadId));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnCommandBadId));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
ASSERT_TRUE(client.SendCommand("method", params).IsError());
}
@@ -424,8 +462,9 @@ TEST(DevToolsClientImpl, SendCommandBadId) {
TEST(DevToolsClientImpl, SendCommandResponseError) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnCommandError));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnCommandError));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
ASSERT_TRUE(client.SendCommand("method", params).IsError());
}
@@ -435,9 +474,10 @@ TEST(DevToolsClientImpl, SendCommandEventBeforeResponse) {
base::Bind(&CreateMockSyncWebSocket<FakeSyncWebSocket>);
MockListener listener;
bool first = true;
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnEventThenResponse, &first));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnEventThenResponse, &first));
client.AddListener(&listener);
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
base::DictionaryValue params;
scoped_ptr<base::DictionaryValue> result;
ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk());
@@ -526,9 +566,10 @@ TEST(DevToolsClientImpl, HandleEventsUntil) {
MockListener listener;
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnEvent));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnEvent));
client.AddListener(&listener);
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue));
ASSERT_EQ(kOk, status.code());
}
@@ -536,8 +577,9 @@ TEST(DevToolsClientImpl, HandleEventsUntil) {
TEST(DevToolsClientImpl, WaitForNextEventCommand) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnCommand));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnCommand));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue));
ASSERT_EQ(kUnknownError, status.code());
}
@@ -545,8 +587,9 @@ TEST(DevToolsClientImpl, WaitForNextEventCommand) {
TEST(DevToolsClientImpl, WaitForNextEventError) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url", base::Bind(
- &ReturnError));
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc),
+ base::Bind(&ReturnError));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue));
ASSERT_EQ(kUnknownError, status.code());
}
@@ -555,7 +598,8 @@ TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>);
int recurse_count = 0;
- DevToolsClientImpl client(factory, "http://url");
+ DevToolsClientImpl client(factory, "http://url", base::Bind(&CloserFunc));
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
client.SetParserFuncForTesting(
base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client));
base::DictionaryValue params;
@@ -612,6 +656,10 @@ class OnConnectedSyncWebSocket : public SyncWebSocket {
OnConnectedSyncWebSocket() : connected_(false) {}
virtual ~OnConnectedSyncWebSocket() {}
+ virtual bool IsConnected() OVERRIDE {
+ return connected_;
+ }
+
virtual bool Connect(const GURL& url) OVERRIDE {
connected_ = true;
return true;
@@ -669,13 +717,62 @@ class OnConnectedSyncWebSocket : public SyncWebSocket {
TEST(DevToolsClientImpl, ProcessOnConnectedBeforeOnEvent) {
SyncWebSocketFactory factory =
base::Bind(&CreateMockSyncWebSocket<OnConnectedSyncWebSocket>);
- DevToolsClientImpl client(factory, "http://url");
+ 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.EnsureConnected().code());
base::DictionaryValue params;
EXPECT_EQ(kOk, client.SendCommand("Runtime.execute", params).code());
listener1.VerifyCalled();
listener2.VerifyCalled();
listener3.VerifyCalled();
}
+
+namespace {
+
+class DisconnectedSyncWebSocket : public MockSyncWebSocket {
+ public:
+ DisconnectedSyncWebSocket() : command_count_(0) {}
+ virtual ~DisconnectedSyncWebSocket() {}
+
+ virtual bool Send(const std::string& message) OVERRIDE {
+ command_count_++;
+ if (command_count_ == 1) {
+ connected_ = false;
+ return false;
+ }
+ return MockSyncWebSocket::Send(message);
+ }
+
+ private:
+ 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));
+ EXPECT_FALSE(is_called);
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
+ EXPECT_TRUE(is_called);
+ base::DictionaryValue params;
+ params.SetInteger("param", 1);
+ is_called = false;
+ EXPECT_EQ(kDisconnected, client.SendCommand("method", params).code());
+ EXPECT_FALSE(is_called);
+ ASSERT_EQ(kOk, client.EnsureConnected().code());
+ EXPECT_TRUE(is_called);
+ is_called = false;
+ EXPECT_EQ(kOk, client.SendCommand("method", params).code());
+ EXPECT_FALSE(is_called);
+}

Powered by Google App Engine
This is Rietveld 408576698