summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Feldman <pfeldman@chromium.org>2015-09-10 17:43:59 -0700
committerPavel Feldman <pfeldman@chromium.org>2015-09-11 00:45:18 +0000
commita6fe22d1aa51cf2a7c1e918e77c7a27b6e0ee994 (patch)
tree2f2da79837c7c96dfe8b2b8df6a90ace24ef3f84
parent28378e9e8901cc67e95875a34bfcd7baedd0dd77 (diff)
downloadchromium_src-a6fe22d1aa51cf2a7c1e918e77c7a27b6e0ee994.zip
chromium_src-a6fe22d1aa51cf2a7c1e918e77c7a27b6e0ee994.tar.gz
chromium_src-a6fe22d1aa51cf2a7c1e918e77c7a27b6e0ee994.tar.bz2
DevTools: do not expect adb payload length to come in the first chunk.
BUG=512150 Review URL: https://codereview.chromium.org/1312333002 Cr-Commit-Position: refs/heads/master@{#345763} (cherry picked from commit cec6d0098f77e944be19c1fcccf6461d9955efae) Review URL: https://codereview.chromium.org/1335033002 . Cr-Commit-Position: refs/branch-heads/2454@{#458} Cr-Branched-From: 12bfc3360892ec53cd00fc239a47e5298beb063b-refs/heads/master@{#338390}
-rw-r--r--chrome/browser/devtools/device/adb/adb_client_socket.cc36
-rw-r--r--chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc18
-rw-r--r--chrome/browser/devtools/device/adb/mock_adb_server.cc42
-rw-r--r--chrome/browser/devtools/device/adb/mock_adb_server.h8
-rw-r--r--chrome/browser/ui/webui/inspect_ui_browsertest.cc2
5 files changed, 70 insertions, 36 deletions
diff --git a/chrome/browser/devtools/device/adb/adb_client_socket.cc b/chrome/browser/devtools/device/adb/adb_client_socket.cc
index 0a40ee1..8a1feb4 100644
--- a/chrome/browser/devtools/device/adb/adb_client_socket.cc
+++ b/chrome/browser/devtools/device/adb/adb_client_socket.cc
@@ -243,22 +243,12 @@ void AdbClientSocket::OnResponseHeader(
return;
}
+ // Trim OKAY.
data = data.substr(4);
-
- if (!is_void) {
- int payload_length = 0;
- int bytes_left = -1;
- if (data.length() >= 4 &&
- base::HexStringToInt(data.substr(0, 4), &payload_length)) {
- data = data.substr(4);
- bytes_left = payload_length - result + 8;
- } else {
- bytes_left = -1;
- }
- OnResponseData(callback, data, response_buffer, bytes_left, 0);
- } else {
+ if (!is_void)
+ OnResponseData(callback, data, response_buffer, -1, 0);
+ else
callback.Run(net::OK, data);
- }
}
void AdbClientSocket::OnResponseData(
@@ -272,9 +262,21 @@ void AdbClientSocket::OnResponseData(
return;
}
- bytes_left -= result;
- std::string new_response =
- response + std::string(response_buffer->data(), result);
+ std::string new_response = response +
+ std::string(response_buffer->data(), result);
+
+ if (bytes_left == -1) {
+ // First read the response header.
+ int payload_length = 0;
+ if (new_response.length() >= 4 &&
+ base::HexStringToInt(new_response.substr(0, 4), &payload_length)) {
+ new_response = new_response.substr(4);
+ bytes_left = payload_length - new_response.size();
+ }
+ } else {
+ bytes_left -= result;
+ }
+
if (bytes_left == 0) {
callback.Run(net::OK, new_response);
return;
diff --git a/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc b/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
index 77f270e..b0b4e5f 100644
--- a/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
+++ b/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
@@ -134,8 +134,22 @@ class AdbClientSocketTest : public InProcessBrowserTest,
DevToolsAndroidBridge::RemoteDevices devices_;
};
-IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestAdbClientSocket) {
- StartMockAdbServer();
+IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestFlushWithoutSize) {
+ StartMockAdbServer(FlushWithoutSize);
+ StartTest();
+ CheckDevices();
+ StopMockAdbServer();
+}
+
+IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestFlushWithSize) {
+ StartMockAdbServer(FlushWithSize);
+ StartTest();
+ CheckDevices();
+ StopMockAdbServer();
+}
+
+IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestFlushWithData) {
+ StartMockAdbServer(FlushWithData);
StartTest();
CheckDevices();
StopMockAdbServer();
diff --git a/chrome/browser/devtools/device/adb/mock_adb_server.cc b/chrome/browser/devtools/device/adb/mock_adb_server.cc
index e52299c..70e9a0c 100644
--- a/chrome/browser/devtools/device/adb/mock_adb_server.cc
+++ b/chrome/browser/devtools/device/adb/mock_adb_server.cc
@@ -381,14 +381,17 @@ class AdbParser : public SimpleHttpServer::Parser,
public base::NonThreadSafe,
public MockAndroidConnection::Delegate {
public:
- static Parser* Create(const SimpleHttpServer::SendCallback& callback) {
- return new AdbParser(callback);
+ static Parser* Create(FlushMode flush_mode,
+ const SimpleHttpServer::SendCallback& callback) {
+ return new AdbParser(flush_mode, callback);
}
~AdbParser() override {}
private:
- explicit AdbParser(const SimpleHttpServer::SendCallback& callback)
- : callback_(callback) {
+ explicit AdbParser(FlushMode flush_mode,
+ const SimpleHttpServer::SendCallback& callback)
+ : flush_mode_(flush_mode),
+ callback_(callback) {
}
int Consume(const char* data, int size) override {
@@ -440,20 +443,29 @@ class AdbParser : public SimpleHttpServer::Parser,
void Send(const std::string& status, const std::string& response) {
CHECK(CalledOnValidThread());
CHECK_EQ(4U, status.size());
-
- std::stringstream response_stream;
- response_stream << status;
+ std::string buffer = status;
+ if (flush_mode_ == FlushWithoutSize) {
+ callback_.Run(buffer);
+ buffer = std::string();
+ }
int size = response.size();
if (size > 0) {
static const char kHexChars[] = "0123456789ABCDEF";
for (int i = 3; i >= 0; i--)
- response_stream << kHexChars[ (size >> 4*i) & 0x0f ];
- response_stream << response;
+ buffer += kHexChars[ (size >> 4*i) & 0x0f ];
+ if (flush_mode_ == FlushWithSize) {
+ callback_.Run(buffer);
+ buffer = std::string();
+ }
+ buffer += response;
+ callback_.Run(buffer);
+ } else if (flush_mode_ != FlushWithoutSize) {
+ callback_.Run(buffer);
}
- callback_.Run(response_stream.str());
}
+ FlushMode flush_mode_;
SimpleHttpServer::SendCallback callback_;
std::string serial_;
scoped_ptr<MockAndroidConnection> mock_connection_;
@@ -461,14 +473,14 @@ class AdbParser : public SimpleHttpServer::Parser,
static SimpleHttpServer* mock_adb_server_ = NULL;
-void StartMockAdbServerOnIOThread() {
+void StartMockAdbServerOnIOThread(FlushMode flush_mode) {
CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
CHECK(mock_adb_server_ == NULL);
net::IPAddressNumber address;
net::ParseIPLiteralToNumber("127.0.0.1", &address);
net::IPEndPoint endpoint(address, kAdbPort);
- mock_adb_server_ =
- new SimpleHttpServer(base::Bind(&AdbParser::Create), endpoint);
+ mock_adb_server_ = new SimpleHttpServer(
+ base::Bind(&AdbParser::Create, flush_mode), endpoint);
}
void StopMockAdbServerOnIOThread() {
@@ -587,11 +599,11 @@ void MockAndroidConnection::SendHTTPResponse(const std::string& body) {
delegate_->SendRaw(response_data);
}
-void StartMockAdbServer() {
+void StartMockAdbServer(FlushMode flush_mode) {
BrowserThread::PostTaskAndReply(
BrowserThread::IO,
FROM_HERE,
- base::Bind(&StartMockAdbServerOnIOThread),
+ base::Bind(&StartMockAdbServerOnIOThread, flush_mode),
base::MessageLoop::QuitClosure());
content::RunMessageLoop();
}
diff --git a/chrome/browser/devtools/device/adb/mock_adb_server.h b/chrome/browser/devtools/device/adb/mock_adb_server.h
index 3f3e32f..d18c5a2 100644
--- a/chrome/browser/devtools/device/adb/mock_adb_server.h
+++ b/chrome/browser/devtools/device/adb/mock_adb_server.h
@@ -12,7 +12,13 @@
// Single instance mock ADB server for use in browser tests. Runs on IO thread.
// These methods can be called from any thread.
-void StartMockAdbServer();
+enum FlushMode {
+ FlushWithoutSize,
+ FlushWithSize,
+ FlushWithData
+};
+
+void StartMockAdbServer(FlushMode flush_mode);
void StopMockAdbServer();
// Part of mock server independent of transport.
diff --git a/chrome/browser/ui/webui/inspect_ui_browsertest.cc b/chrome/browser/ui/webui/inspect_ui_browsertest.cc
index 46b2b1e..a54b340 100644
--- a/chrome/browser/ui/webui/inspect_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/inspect_ui_browsertest.cc
@@ -76,7 +76,7 @@ IN_PROC_BROWSER_TEST_F(InspectUITest, AndroidTargets) {
providers.push_back(new AdbDeviceProvider());
android_bridge->set_device_providers_for_test(providers);
- StartMockAdbServer();
+ StartMockAdbServer(FlushWithSize);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL));