| """ |
| Info: |
| This tests DeviceManagerADB with a real device |
| |
| Requirements: |
| - You must have a device connected |
| - It should be listed under 'adb devices' |
| |
| Notes: |
| - Not all functions have been covered. |
| In particular, functions from the parent class |
| - No testing of properties is done |
| - The test case are very simple and it could be |
| done with deeper inspection of the return values |
| |
| Author(s): |
| - Armen Zambrano <armenzg@mozilla.com> |
| |
| Functions that are not being tested: |
| - launchProcess - DEPRECATED |
| - getIP |
| - recordLogcat |
| - saveScreenshot |
| - validateDir |
| - mkDirs |
| - getDeviceRoot |
| - shellCheckOutput |
| - processExist |
| |
| I assume these functions are only useful for Android |
| - getAppRoot() |
| - updateApp() |
| - uninstallApp() |
| - uninstallAppAndReboot() |
| """ |
| |
| import os |
| import re |
| import socket |
| import sys |
| import tempfile |
| import unittest |
| from StringIO import StringIO |
| |
| from mozdevice import DeviceManagerADB, DMError |
| |
| def find_mount_permissions(dm, mount_path): |
| for mount_point in dm._runCmd(["shell", "mount"]).output: |
| if mount_point.find(mount_path) > 0: |
| return re.search('(ro|rw)(?=,)', mount_point).group(0) |
| |
| class DeviceManagerADBTestCase(unittest.TestCase): |
| tempLocalDir = "tempDir" |
| tempLocalFile = os.path.join(tempLocalDir, "tempfile.txt") |
| tempRemoteDir = None |
| tempRemoteFile = None |
| tempRemoteSystemFile = None |
| |
| def setUp(self): |
| self.assertTrue(find_mount_permissions(self.dm, "/system"), "ro") |
| |
| self.assertTrue(os.path.exists(self.tempLocalDir)) |
| self.assertTrue(os.path.exists(self.tempLocalFile)) |
| |
| if self.dm.fileExists(self.tempRemoteFile): |
| self.dm.removeFile(self.tempRemoteFile) |
| self.assertFalse(self.dm.fileExists(self.tempRemoteFile)) |
| |
| if self.dm.fileExists(self.tempRemoteSystemFile): |
| self.dm.removeFile(self.tempRemoteSystemFile) |
| |
| self.assertTrue(self.dm.dirExists(self.tempRemoteDir)) |
| |
| @classmethod |
| def setUpClass(self): |
| self.dm = DeviceManagerADB() |
| if not os.path.exists(self.tempLocalDir): |
| os.mkdir(self.tempLocalDir) |
| if not os.path.exists(self.tempLocalFile): |
| # Create empty file |
| open(self.tempLocalFile, 'w').close() |
| self.tempRemoteDir = self.dm.getTempDir() |
| self.tempRemoteFile = os.path.join(self.tempRemoteDir, |
| os.path.basename(self.tempLocalFile)) |
| self.tempRemoteSystemFile = \ |
| os.path.join("/system", os.path.basename(self.tempLocalFile)) |
| |
| @classmethod |
| def tearDownClass(self): |
| os.remove(self.tempLocalFile) |
| os.rmdir(self.tempLocalDir) |
| if self.dm.dirExists(self.tempRemoteDir): |
| # self.tempRemoteFile will get deleted with it |
| self.dm.removeDir(self.tempRemoteDir) |
| if self.dm.fileExists(self.tempRemoteSystemFile): |
| self.dm.removeFile(self.tempRemoteSystemFile) |
| |
| |
| class TestFileOperations(DeviceManagerADBTestCase): |
| def test_make_and_remove_directory(self): |
| dir1 = os.path.join(self.tempRemoteDir, "dir1") |
| self.assertFalse(self.dm.dirExists(dir1)) |
| self.dm.mkDir(dir1) |
| self.assertTrue(self.dm.dirExists(dir1)) |
| self.dm.removeDir(dir1) |
| self.assertFalse(self.dm.dirExists(dir1)) |
| |
| def test_push_and_remove_file(self): |
| self.dm.pushFile(self.tempLocalFile, self.tempRemoteFile) |
| self.assertTrue(self.dm.fileExists(self.tempRemoteFile)) |
| self.dm.removeFile(self.tempRemoteFile) |
| self.assertFalse(self.dm.fileExists(self.tempRemoteFile)) |
| |
| def test_push_and_pull_file(self): |
| self.dm.pushFile(self.tempLocalFile, self.tempRemoteFile) |
| self.assertTrue(self.dm.fileExists(self.tempRemoteFile)) |
| self.assertFalse(os.path.exists("pulled.txt")) |
| self.dm.getFile(self.tempRemoteFile, "pulled.txt") |
| self.assertTrue(os.path.exists("pulled.txt")) |
| os.remove("pulled.txt") |
| |
| def test_push_and_pull_directory_and_list_files(self): |
| self.dm.removeDir(self.tempRemoteDir) |
| self.assertFalse(self.dm.dirExists(self.tempRemoteDir)) |
| self.dm.pushDir(self.tempLocalDir, self.tempRemoteDir) |
| self.assertTrue(self.dm.dirExists(self.tempRemoteDir)) |
| response = self.dm.listFiles(self.tempRemoteDir) |
| # The local dir that was pushed contains the tempLocalFile |
| self.assertIn(os.path.basename(self.tempLocalFile), response) |
| # Create a temp dir to pull to |
| temp_dir = tempfile.mkdtemp() |
| self.assertTrue(os.path.exists(temp_dir)) |
| self.dm.getDirectory(self.tempRemoteDir, temp_dir) |
| self.assertTrue(os.path.exists(self.tempLocalFile)) |
| |
| def test_move_and_remove_directories(self): |
| dir1 = os.path.join(self.tempRemoteDir, "dir1") |
| dir2 = os.path.join(self.tempRemoteDir, "dir2") |
| |
| self.assertFalse(self.dm.dirExists(dir1)) |
| self.dm.mkDir(dir1) |
| self.assertTrue(self.dm.dirExists(dir1)) |
| |
| self.assertFalse(self.dm.dirExists(dir2)) |
| self.dm.moveTree(dir1, dir2) |
| self.assertTrue(self.dm.dirExists(dir2)) |
| |
| self.dm.removeDir(dir1) |
| self.dm.removeDir(dir2) |
| self.assertFalse(self.dm.dirExists(dir1)) |
| self.assertFalse(self.dm.dirExists(dir2)) |
| |
| def test_push_and_remove_system_file(self): |
| out = StringIO() |
| self.assertTrue(find_mount_permissions(self.dm, "/system") == "ro") |
| self.assertFalse(self.dm.fileExists(self.tempRemoteSystemFile)) |
| self.assertRaises(DMError, self.dm.pushFile, self.tempLocalFile, self.tempRemoteSystemFile) |
| self.dm.shell(['mount', '-w', '-o', 'remount', '/system'], out) |
| self.assertTrue(find_mount_permissions(self.dm, "/system") == "rw") |
| self.assertFalse(self.dm.fileExists(self.tempRemoteSystemFile)) |
| self.dm.pushFile(self.tempLocalFile, self.tempRemoteSystemFile) |
| self.assertTrue(self.dm.fileExists(self.tempRemoteSystemFile)) |
| self.dm.removeFile(self.tempRemoteSystemFile) |
| self.assertFalse(self.dm.fileExists(self.tempRemoteSystemFile)) |
| self.dm.shell(['mount', '-r', '-o', 'remount', '/system'], out) |
| out.close() |
| self.assertTrue(find_mount_permissions(self.dm, "/system") == "ro") |
| |
| |
| class TestOther(DeviceManagerADBTestCase): |
| def test_get_list_of_processes(self): |
| self.assertEquals(type(self.dm.getProcessList()), list) |
| |
| def test_get_current_time(self): |
| self.assertEquals(type(self.dm.getCurrentTime()), int) |
| |
| def test_get_info(self): |
| self.assertEquals(type(self.dm.getInfo()), dict) |
| |
| def test_list_devices(self): |
| self.assertEquals(len(list(self.dm.devices())), 1) |
| |
| def test_shell(self): |
| out = StringIO() |
| self.dm.shell(["echo", "$COMPANY", ";", "pwd"], out, |
| env={"COMPANY":"Mozilla"}, cwd="/", timeout=4, root=True) |
| output = str(out.getvalue()).rstrip().splitlines() |
| out.close() |
| self.assertEquals(output, ['Mozilla', '/']) |
| |
| def test_port_forwarding(self): |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| s.bind(("", 0)) |
| port = s.getsockname()[1] |
| s.close() |
| # If successful then no exception is raised |
| self.dm.forward("tcp:%s" % port, "tcp:2828") |
| |
| def test_port_forwarding_error(self): |
| self.assertRaises(DMError, self.dm.forward, "", "") |
| |
| |
| if __name__ == '__main__': |
| dm = DeviceManagerADB() |
| if not dm.devices(): |
| print "There are no connected adb devices" |
| sys.exit(1) |
| |
| if find_mount_permissions(dm, "/system") == "rw": |
| print "We've found out that /system is mounted as 'rw'. This is because the command " \ |
| "'adb remount' has been run before running this test case. Please reboot the device " \ |
| "and try again." |
| sys.exit(1) |
| |
| unittest.main() |