1cef7893435aa41160dd1255c43cb8498279738ccChris Craik#!/usr/bin/env python
2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2015 The Chromium Authors. All rights reserved.
3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be
4cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file.
5cef7893435aa41160dd1255c43cb8498279738ccChris Craik
6cef7893435aa41160dd1255c43cb8498279738ccChris Craik"""
7cef7893435aa41160dd1255c43cb8498279738ccChris CraikUnit tests for the contents of device_utils.py (mostly DeviceUtils).
8cef7893435aa41160dd1255c43cb8498279738ccChris CraikThe test will invoke real devices
9cef7893435aa41160dd1255c43cb8498279738ccChris Craik"""
10cef7893435aa41160dd1255c43cb8498279738ccChris Craik
11cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport os
12a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craikimport posixpath
1347f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craikimport sys
14cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport tempfile
15cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport unittest
16cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1747f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craikif __name__ == '__main__':
1847f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik  sys.path.append(
1947f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
2047f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik
217332cdb42368a904cbf7418de329868989e592daChris Craikfrom devil.android import device_test_case
22cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android import device_utils
23cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android.sdk import adb_wrapper
24cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.utils import cmd_helper
25cef7893435aa41160dd1255c43cb8498279738ccChris Craik
26cef7893435aa41160dd1255c43cb8498279738ccChris Craik_OLD_CONTENTS = "foo"
27cef7893435aa41160dd1255c43cb8498279738ccChris Craik_NEW_CONTENTS = "bar"
28cef7893435aa41160dd1255c43cb8498279738ccChris Craik_DEVICE_DIR = "/data/local/tmp/device_utils_test"
29cef7893435aa41160dd1255c43cb8498279738ccChris Craik_SUB_DIR = "sub"
30cef7893435aa41160dd1255c43cb8498279738ccChris Craik_SUB_DIR1 = "sub1"
31cef7893435aa41160dd1255c43cb8498279738ccChris Craik_SUB_DIR2 = "sub2"
32cef7893435aa41160dd1255c43cb8498279738ccChris Craik
33cef7893435aa41160dd1255c43cb8498279738ccChris Craik
347332cdb42368a904cbf7418de329868989e592daChris Craikclass DeviceUtilsPushDeleteFilesTest(device_test_case.DeviceTestCase):
35cef7893435aa41160dd1255c43cb8498279738ccChris Craik
36cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def setUp(self):
377332cdb42368a904cbf7418de329868989e592daChris Craik    super(DeviceUtilsPushDeleteFilesTest, self).setUp()
387332cdb42368a904cbf7418de329868989e592daChris Craik    self.adb = adb_wrapper.AdbWrapper(self.serial)
39cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.WaitForDevice()
40cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.device = device_utils.DeviceUtils(
41cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.adb, default_timeout=10, default_retries=0)
42cef7893435aa41160dd1255c43cb8498279738ccChris Craik
43cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @staticmethod
44cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def _MakeTempFile(contents):
45cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Make a temporary file with the given contents.
46cef7893435aa41160dd1255c43cb8498279738ccChris Craik
47cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Args:
48cef7893435aa41160dd1255c43cb8498279738ccChris Craik      contents: string to write to the temporary file.
49cef7893435aa41160dd1255c43cb8498279738ccChris Craik
50cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Returns:
51cef7893435aa41160dd1255c43cb8498279738ccChris Craik      the tuple contains the absolute path to the file and the file name
52cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
53cef7893435aa41160dd1255c43cb8498279738ccChris Craik    fi, path = tempfile.mkstemp(text=True)
54cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with os.fdopen(fi, 'w') as f:
55cef7893435aa41160dd1255c43cb8498279738ccChris Craik      f.write(contents)
56cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_name = os.path.basename(path)
57cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return (path, file_name)
58cef7893435aa41160dd1255c43cb8498279738ccChris Craik
59cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @staticmethod
60cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def _MakeTempFileGivenDir(directory, contents):
61cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Make a temporary file under the given directory
62cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with the given contents
63cef7893435aa41160dd1255c43cb8498279738ccChris Craik
64cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Args:
65cef7893435aa41160dd1255c43cb8498279738ccChris Craik      directory: the temp directory to create the file
66cef7893435aa41160dd1255c43cb8498279738ccChris Craik      contents: string to write to the temp file
67cef7893435aa41160dd1255c43cb8498279738ccChris Craik
68cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Returns:
69cef7893435aa41160dd1255c43cb8498279738ccChris Craik      the list contains the absolute path to the file and the file name
70cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
71cef7893435aa41160dd1255c43cb8498279738ccChris Craik    fi, path = tempfile.mkstemp(dir=directory, text=True)
72cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with os.fdopen(fi, 'w') as f:
73cef7893435aa41160dd1255c43cb8498279738ccChris Craik      f.write(contents)
74cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_name = os.path.basename(path)
75cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return (path, file_name)
76cef7893435aa41160dd1255c43cb8498279738ccChris Craik
77cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @staticmethod
78cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def _ChangeTempFile(path, contents):
79cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with os.open(path, 'w') as f:
80cef7893435aa41160dd1255c43cb8498279738ccChris Craik      f.write(contents)
81cef7893435aa41160dd1255c43cb8498279738ccChris Craik
82cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @staticmethod
83cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def _DeleteTempFile(path):
84cef7893435aa41160dd1255c43cb8498279738ccChris Craik    os.remove(path)
85cef7893435aa41160dd1255c43cb8498279738ccChris Craik
86cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testPushChangedFiles_noFileChange(self):
87cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
88cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
89cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path, device_file_path)
90cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.device.PushChangedFiles([(host_file_path, device_file_path)])
91a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    result = self.device.RunShellCommand(
92a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik        ['cat', device_file_path], check_return=True, single_line=True)
93cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(_OLD_CONTENTS, result)
94cef7893435aa41160dd1255c43cb8498279738ccChris Craik
95cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', host_file_path])
96a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
97cef7893435aa41160dd1255c43cb8498279738ccChris Craik
98cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testPushChangedFiles_singleFileChange(self):
99cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
100cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
101cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path, device_file_path)
102cef7893435aa41160dd1255c43cb8498279738ccChris Craik
103cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with open(host_file_path, 'w') as f:
104cef7893435aa41160dd1255c43cb8498279738ccChris Craik      f.write(_NEW_CONTENTS)
105cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.device.PushChangedFiles([(host_file_path, device_file_path)])
106a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    result = self.device.RunShellCommand(
107a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik        ['cat', device_file_path], check_return=True, single_line=True)
108cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(_NEW_CONTENTS, result)
109cef7893435aa41160dd1255c43cb8498279738ccChris Craik
110cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', host_file_path])
111a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
112cef7893435aa41160dd1255c43cb8498279738ccChris Craik
113cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testDeleteFiles(self):
114cef7893435aa41160dd1255c43cb8498279738ccChris Craik    host_tmp_dir = tempfile.mkdtemp()
115cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path, file_name) = self._MakeTempFileGivenDir(
116cef7893435aa41160dd1255c43cb8498279738ccChris Craik        host_tmp_dir, _OLD_CONTENTS)
117cef7893435aa41160dd1255c43cb8498279738ccChris Craik
118cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
119cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path, device_file_path)
120cef7893435aa41160dd1255c43cb8498279738ccChris Craik
121cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', host_file_path])
122cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
123cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                 delete_device_stale=True)
124a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    filenames = self.device.ListDirectory(_DEVICE_DIR)
125a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.assertEqual([], filenames)
126cef7893435aa41160dd1255c43cb8498279738ccChris Craik
127cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
128a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
129cef7893435aa41160dd1255c43cb8498279738ccChris Craik
130cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testPushAndDeleteFiles_noSubDir(self):
131cef7893435aa41160dd1255c43cb8498279738ccChris Craik    host_tmp_dir = tempfile.mkdtemp()
132cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
133cef7893435aa41160dd1255c43cb8498279738ccChris Craik        host_tmp_dir, _OLD_CONTENTS)
134cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
135cef7893435aa41160dd1255c43cb8498279738ccChris Craik        host_tmp_dir, _OLD_CONTENTS)
136cef7893435aa41160dd1255c43cb8498279738ccChris Craik
137cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
138cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
139cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path1, device_file_path1)
140cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path2, device_file_path2)
141cef7893435aa41160dd1255c43cb8498279738ccChris Craik
142cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with open(host_file_path1, 'w') as f:
143cef7893435aa41160dd1255c43cb8498279738ccChris Craik      f.write(_NEW_CONTENTS)
144cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', host_file_path2])
145cef7893435aa41160dd1255c43cb8498279738ccChris Craik
146cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
147cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                   delete_device_stale=True)
148a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    result = self.device.RunShellCommand(
149a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik        ['cat', device_file_path1], check_return=True, single_line=True)
150cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(_NEW_CONTENTS, result)
151cef7893435aa41160dd1255c43cb8498279738ccChris Craik
152a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    filenames = self.device.ListDirectory(_DEVICE_DIR)
153a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.assertEqual([file_name1], filenames)
154a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik
155cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
156a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
157cef7893435aa41160dd1255c43cb8498279738ccChris Craik
158cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testPushAndDeleteFiles_SubDir(self):
159cef7893435aa41160dd1255c43cb8498279738ccChris Craik    host_tmp_dir = tempfile.mkdtemp()
160cef7893435aa41160dd1255c43cb8498279738ccChris Craik    host_sub_dir1 = "%s/%s" % (host_tmp_dir, _SUB_DIR1)
161cef7893435aa41160dd1255c43cb8498279738ccChris Craik    host_sub_dir2 = "%s/%s/%s" % (host_tmp_dir, _SUB_DIR, _SUB_DIR2)
162cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir1])
163cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir2])
164cef7893435aa41160dd1255c43cb8498279738ccChris Craik
165cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
166cef7893435aa41160dd1255c43cb8498279738ccChris Craik        host_tmp_dir, _OLD_CONTENTS)
167cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
168cef7893435aa41160dd1255c43cb8498279738ccChris Craik        host_tmp_dir, _OLD_CONTENTS)
169cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path3, file_name3) = self._MakeTempFileGivenDir(
170cef7893435aa41160dd1255c43cb8498279738ccChris Craik        host_sub_dir1, _OLD_CONTENTS)
171cef7893435aa41160dd1255c43cb8498279738ccChris Craik    (host_file_path4, file_name4) = self._MakeTempFileGivenDir(
172cef7893435aa41160dd1255c43cb8498279738ccChris Craik        host_sub_dir2, _OLD_CONTENTS)
173cef7893435aa41160dd1255c43cb8498279738ccChris Craik
174cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
175cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
176cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path3 = "%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR1, file_name3)
177cef7893435aa41160dd1255c43cb8498279738ccChris Craik    device_file_path4 = "%s/%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR,
178cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         _SUB_DIR2, file_name4)
179cef7893435aa41160dd1255c43cb8498279738ccChris Craik
180cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path1, device_file_path1)
181cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path2, device_file_path2)
182cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path3, device_file_path3)
183cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.adb.Push(host_file_path4, device_file_path4)
184cef7893435aa41160dd1255c43cb8498279738ccChris Craik
185cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with open(host_file_path1, 'w') as f:
186cef7893435aa41160dd1255c43cb8498279738ccChris Craik      f.write(_NEW_CONTENTS)
187cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', host_file_path2])
188cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', host_file_path4])
189cef7893435aa41160dd1255c43cb8498279738ccChris Craik
190cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
191cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                   delete_device_stale=True)
192a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    result = self.device.RunShellCommand(
193a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik        ['cat', device_file_path1], check_return=True, single_line=True)
194cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(_NEW_CONTENTS, result)
195cef7893435aa41160dd1255c43cb8498279738ccChris Craik
196a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    filenames = self.device.ListDirectory(_DEVICE_DIR)
197a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.assertIn(file_name1, filenames)
198a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.assertIn(_SUB_DIR1, filenames)
199a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.assertIn(_SUB_DIR, filenames)
200a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.assertEqual(3, len(filenames))
201cef7893435aa41160dd1255c43cb8498279738ccChris Craik
202a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    result = self.device.RunShellCommand(
203a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik        ['cat', device_file_path3], check_return=True, single_line=True)
204cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(_OLD_CONTENTS, result)
205cef7893435aa41160dd1255c43cb8498279738ccChris Craik
206a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    filenames = self.device.ListDirectory(
207a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik        posixpath.join(_DEVICE_DIR, _SUB_DIR, _SUB_DIR2))
208a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.assertEqual([], filenames)
209cef7893435aa41160dd1255c43cb8498279738ccChris Craik
210cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
211a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
212cef7893435aa41160dd1255c43cb8498279738ccChris Craik
213cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testRestartAdbd(self):
2147332cdb42368a904cbf7418de329868989e592daChris Craik    def get_adbd_pid():
215a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik      # TODO(catapult:#3215): Migrate to device.GetPids().
216a0e5c0de428e9dea6d07dd57c5594fb1f1c17c20Chris Craik      ps_output = self.device.RunShellCommand(['ps'], check_return=True)
2177332cdb42368a904cbf7418de329868989e592daChris Craik      for ps_line in ps_output:
2187332cdb42368a904cbf7418de329868989e592daChris Craik        if 'adbd' in ps_line:
2197332cdb42368a904cbf7418de329868989e592daChris Craik          return ps_line.split()[1]
2207332cdb42368a904cbf7418de329868989e592daChris Craik      self.fail('Unable to find adbd')
2217332cdb42368a904cbf7418de329868989e592daChris Craik
2227332cdb42368a904cbf7418de329868989e592daChris Craik    old_adbd_pid = get_adbd_pid()
223cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.device.RestartAdbd()
2247332cdb42368a904cbf7418de329868989e592daChris Craik    new_adbd_pid = get_adbd_pid()
225cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertNotEqual(old_adbd_pid, new_adbd_pid)
226cef7893435aa41160dd1255c43cb8498279738ccChris Craik
227cef7893435aa41160dd1255c43cb8498279738ccChris Craik
228cef7893435aa41160dd1255c43cb8498279738ccChris Craikif __name__ == '__main__':
229cef7893435aa41160dd1255c43cb8498279738ccChris Craik  unittest.main()
230