diff options
author | Pavel Feldman <pfeldman@chromium.org> | 2015-09-10 17:43:59 -0700 |
---|---|---|
committer | Pavel Feldman <pfeldman@chromium.org> | 2015-09-11 00:45:18 +0000 |
commit | a6fe22d1aa51cf2a7c1e918e77c7a27b6e0ee994 (patch) | |
tree | 2f2da79837c7c96dfe8b2b8df6a90ace24ef3f84 | |
parent | 28378e9e8901cc67e95875a34bfcd7baedd0dd77 (diff) | |
download | chromium_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}
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)); |