Chromium Code Reviews| 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; |