Index: chrome/test/chromedriver/chrome/adb_impl.cc |
diff --git a/chrome/test/chromedriver/chrome/adb_impl.cc b/chrome/test/chromedriver/chrome/adb_impl.cc |
index a60d8bce5dfaf31e0242ac49126df9da868effa1..512027464cbb7ce8bf440c27c36156f158a24f7e 100644 |
--- a/chrome/test/chromedriver/chrome/adb_impl.cc |
+++ b/chrome/test/chromedriver/chrome/adb_impl.cc |
@@ -226,6 +226,50 @@ Status AdbImpl::GetPidByName(const std::string& device_serial, |
"Failed to get PID for the following process: " + process_name); |
} |
+Status AdbImpl::GetDevtoolsRemoteSocket(const std::string& device_serial, |
+ const std::string& process_name, |
+ std::string* device_socket) { |
+ // Parse 'cat /proc/net/unix' output which on Android looks like this: |
+ // |
+ // Num RefCount Protocol Flags Type St Inode Path |
+ // 00000000: 00000002 00000000 00010000 0001 01 331813 /dev/socket/zygote |
+ // 00000000: 00000002 00000000 00010000 0001 01 358606 @xxx_devtools_remote |
+ // 00000000: 00000002 00000000 00010000 0001 01 347300 @yyy_devtools_remote |
+ // |
+ // We need to find records with paths starting from '@' (abstract socket) |
+ // and containing the channel pattern ("_devtools_remote"). |
+ |
+ std::string response; |
+ Status status = ExecuteHostShellCommand(device_serial, "cat /proc/net/unix", &response); |
samuong
2016/10/03 18:50:40
this line is too long (>80 chars)
Rahul Kavalapara
2016/10/05 08:06:42
Done.
|
+ if (!status.IsOk()) |
+ return status; |
+ for (const base::StringPiece& line : |
+ base::SplitStringPiece(response, "\n", base::KEEP_WHITESPACE, |
+ base::SPLIT_WANT_NONEMPTY)) { |
+ std::vector<std::string> fields = |
+ base::SplitString(line, " \r", base::KEEP_WHITESPACE, |
+ base::SPLIT_WANT_NONEMPTY); |
+ if (fields.size() < 8) |
+ continue; |
+ if (fields[3] != "00010000" || fields[5] != "01") |
samuong
2016/10/03 18:50:40
it's not really clear to me what these magic numbe
Rahul Kavalapara
2016/10/03 22:15:52
Please check MapSocketsToProcesses function.
https
Rahul Kavalapara
2016/10/04 01:18:04
I did some more digging, Similar question was post
samuong
2016/10/05 17:29:49
Thanks for digging that up. I was mostly curious a
Rahul Kavalapara
2016/10/05 18:41:53
This code is essentially exercised targeting andro
samuong
2016/10/12 05:18:35
OK, that makes sense. However I'd still like to ma
Rahul Kavalapara
2016/10/12 08:23:04
Fixed.
|
+ continue; |
+ std::string path_field = fields[7]; |
+ if (path_field.size() < 1 || path_field[0] != '@') |
+ continue; |
+ if (path_field.find(process_name) == std::string::npos) |
samuong
2016/10/03 18:50:40
what if there are two processes, where one of the
Rahul Kavalapara
2016/10/03 22:15:52
This is the adaptation from devtools code. That wo
samuong
2016/10/05 17:29:49
I think we should know the full socket name that w
Rahul Kavalapara
2016/10/05 18:41:53
I am sending back the entire name when trying to c
|
+ continue; |
+ |
+ *device_socket = path_field.substr(1); |
+ } |
+ |
+ // We could not find a device socket for the expected process name |
+ if (device_socket->empty()) { |
+ return Status(kUnknownError, |
+ "Failed to find the remote devtools socket for the following process: " + process_name); |
samuong
2016/10/03 18:50:40
this line is too long (>80 chars)
Rahul Kavalapara
2016/10/05 08:06:42
Done.
|
+ } |
+ return Status(kOk); |
+} |
+ |
Status AdbImpl::ExecuteCommand( |
const std::string& command, std::string* response) { |
scoped_refptr<ResponseBuffer> response_buffer = new ResponseBuffer; |