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