summaryrefslogtreecommitdiffstats
path: root/testing/mozbase/mozdevice/adb_tests/test_devicemanagerADB.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mozbase/mozdevice/adb_tests/test_devicemanagerADB.py')
-rw-r--r--testing/mozbase/mozdevice/adb_tests/test_devicemanagerADB.py219
1 files changed, 219 insertions, 0 deletions
diff --git a/testing/mozbase/mozdevice/adb_tests/test_devicemanagerADB.py b/testing/mozbase/mozdevice/adb_tests/test_devicemanagerADB.py
new file mode 100644
index 000000000..495e449a4
--- /dev/null
+++ b/testing/mozbase/mozdevice/adb_tests/test_devicemanagerADB.py
@@ -0,0 +1,219 @@
+"""
+ 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()