| ''' |
| Created on Aug 6, 2013 |
| |
| @author: diego |
| ''' |
| import sys |
| import time |
| import re |
| import unittest |
| import os |
| import subprocess |
| |
| try: |
| sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src')) |
| except: |
| pass |
| |
| from com.dtmilano.android.adb.adbclient import AdbClient |
| from com.dtmilano.android.common import obtainAdbPath |
| |
| VERBOSE = False |
| |
| TEST_TEMPERATURE_CONVERTER_APP = False |
| TEMPERATURE_CONVERTER_PKG = 'com.example.i2at.tc' |
| TEMPERATURE_CONVERTER_ACTIVITY = 'TemperatureConverterActivity' |
| CALCULATOR_KEYWORD = 'calculator' |
| CALCULATOR_ACTIVITY = 'Calculator' |
| |
| #ANDROIANDROID_SERIAL = 'emulator-5554' |
| |
| class AdbClientTest(unittest.TestCase): |
| |
| androidSerial = None |
| ''' The Android device serial number used by default''' |
| |
| @classmethod |
| def setUpClass(cls): |
| cls.adb = obtainAdbPath() |
| # we use 'fakeserialno' and settransport=False so AdbClient does not try to find the |
| # serialno in setTransport() |
| try: |
| adbClient = AdbClient('fakeserialno', settransport=False) |
| except RuntimeError, ex: |
| if re.search('Connection refused', str(ex)): |
| raise RuntimeError("adb is not running") |
| raise(ex) |
| devices = adbClient.getDevices() |
| if len(devices) == 0: |
| raise RuntimeError("This tests require at least one device connected. None was found.") |
| for device in devices: |
| if device.status == 'device': |
| cls.androidSerial = device.serialno |
| if VERBOSE: |
| print "AdbClientTest: using device %s" % cls.androidSerial |
| return |
| raise RuntimeError("No on-line devices found") |
| |
| def setUp(self): |
| subprocess.check_call([self.adb, '-s', self.androidSerial, 'forward', '--remove-all']) |
| self.adbClient = AdbClient(self.androidSerial) |
| self.assertIsNotNone(self.adbClient, "adbClient is None") |
| |
| def tearDown(self): |
| self.adbClient.close() |
| subprocess.check_call([self.adb, '-s', self.androidSerial, 'forward', '--remove-all']) |
| |
| def testSerialno_none(self): |
| try: |
| adbClient = AdbClient(None) |
| self.assertTrue(adbClient.checkConnected()) |
| # because serialno is None, transport cannot be set, so next statement |
| # will raise an exception |
| adbClient.getSdkVersion() |
| self.fail("No exception was generated") |
| except RuntimeError, ex: |
| self.assertIsNotNone(re.search("ERROR: Transport is not set", str(ex)), "Couldn't find error message: %s" % ex) |
| |
| def testSerialno_nonExistent(self): |
| try: |
| AdbClient('doesnotexist') |
| except RuntimeError, ex: |
| self.assertIsNotNone(re.search("ERROR: couldn't find device that matches 'doesnotexist'", str(ex)), "Couldn't find error message: %s" % ex) |
| |
| def testSerialno_empty(self): |
| try: |
| AdbClient('') |
| self.fail("No exception was generated") |
| except ValueError: |
| pass |
| |
| def testGetDevices(self): |
| # we use 'fakeserialno' and settransport=False so AdbClient does not try to find the |
| # serialno in setTransport() |
| adbclient = AdbClient('fakeserialno', settransport=False) |
| self.assertTrue(len(adbclient.getDevices()) >= 1) |
| |
| def testGetDevices_androidSerial(self): |
| devs = self.adbClient.getDevices() |
| self.assertTrue(self.androidSerial in [d.serialno for d in devs]) |
| |
| def testGetDevices_regex(self): |
| adbclient = AdbClient('.*', settransport=False) |
| self.assertTrue(len(adbclient.getDevices()) >= 1) |
| |
| #@unittest.skipIf(not re.search('emulator-5554', AdbClientTest.androidSerial), "Supported only when emulator is connected") |
| def testAdbClient_serialnoNoRegex(self): |
| if re.search('emulator-5554', AdbClientTest.androidSerial): |
| adbClient = AdbClient('emulator-5554') |
| self.assertIsNotNone(adbClient) |
| self.assertEqual('emulator-5554', adbClient.serialno) |
| |
| #@unittest.skipIf(not re.search('emulator', AdbClientTest.androidSerial), "Supported only when emulator is connected") |
| def testAdbClient_serialnoRegex(self): |
| if re.search('emulator', AdbClientTest.androidSerial): |
| adbClient = AdbClient('emulator-.*') |
| self.assertIsNotNone(adbClient) |
| self.assertTrue(re.match('emulator-.*', adbClient.serialno)) |
| |
| def testAdbClient_serialnoRegexIP(self): |
| IPRE = re.compile('(\d+\.){3}\d+') |
| if IPRE.search(AdbClientTest.androidSerial): |
| adbClient = AdbClient('\d+.*') |
| self.assertIsNotNone(adbClient) |
| self.assertTrue(IPRE.match(adbClient.serialno)) |
| |
| def testCheckVersion(self): |
| self.adbClient.checkVersion() |
| |
| def testShell(self): |
| date = self.adbClient.shell('date +"%Y/%m/%d"') |
| # this raises a ValueError if the format is not correct |
| time.strptime(date, '%Y/%m/%d\r\n') |
| |
| def testShell_noOutput(self): |
| empty = self.adbClient.shell('sleep 3') |
| self.assertIs('', empty, "Expected empty output but found '%s'" % empty) |
| |
| def testGetProp_ro_serialno(self): |
| serialno = self.adbClient.getProperty('ro.serialno') |
| self.assertIsNotNone(serialno) |
| if re.search('emulator-.*', self.androidSerial): |
| self.assertEqual(serialno, '') |
| elif re.search('VirtualBox', self.adbClient.getProperty('ro.product.model')): |
| self.assertEqual(serialno, '') |
| else: |
| self.assertEqual(serialno, self.androidSerial) |
| |
| def testGetProp_ro_kernel_qemu(self): |
| qemu = self.adbClient.getProperty('ro.kernel.qemu') |
| self.assertIsNotNone(qemu) |
| if re.search('emulator-.*', self.androidSerial): |
| self.assertEqual(qemu, '1') |
| else: |
| self.assertEqual(qemu, '') |
| |
| def testPress(self): |
| self.adbClient.press('KEYCODE_DPAD_UP') |
| |
| def testTouch(self): |
| self.adbClient.touch(480, 1250) |
| |
| def testType(self): |
| self.adbClient.type('Android is cool') |
| |
| def testType_digits(self): |
| self.adbClient.type('1234') |
| |
| def testType_digits_asInt(self): |
| self.adbClient.type(1234) |
| |
| |
| def __checkPackageInstalled(self): |
| packages = self.adbClient.shell('pm list packages').splitlines() |
| self.assertTrue(packages, "Could not detect any packages installed") |
| if TEST_TEMPERATURE_CONVERTER_APP: |
| self.assertIn('package:' + TEMPERATURE_CONVERTER_PKG, packages, TEMPERATURE_CONVERTER_PKG + " is not installed") |
| return (TEMPERATURE_CONVERTER_PKG, TEMPERATURE_CONVERTER_ACTIVITY) |
| else: |
| for line in packages: |
| if CALCULATOR_KEYWORD in line: |
| pkg = line[line.index(':')+1:] |
| self.assertTrue(pkg, "No calculator package to use for testing") |
| return (pkg, CALCULATOR_ACTIVITY) |
| return False |
| |
| def testStartActivity_component(self): |
| pkg = self.__checkPackageInstalled() |
| if pkg: |
| self.adbClient.startActivity(pkg[0] + '/.' + pkg[1]) |
| |
| def testGetWindows(self): |
| self.assertIsNotNone(self.adbClient.getWindows()) |
| |
| def testGetFocusedWindow(self): |
| pkg = self.__checkPackageInstalled() |
| if pkg: |
| self.adbClient.startActivity(pkg[0] + '/.' + pkg[1]) |
| time.sleep(3) |
| w = self.adbClient.getFocusedWindow() |
| self.assertIsNotNone(w) |
| self.assertEqual(pkg[0] + '/' + pkg[0] + '.' + pkg[1], w.activity) |
| |
| def testGetFocusedWindowName(self): |
| pkg = self.__checkPackageInstalled() |
| if pkg: |
| self.adbClient.startActivity(pkg[0] + '/.' + pkg[1]) |
| time.sleep(3) |
| n = self.adbClient.getFocusedWindowName() |
| self.assertIsNotNone(n) |
| self.assertEqual(pkg[0] + '/' + pkg[0] + '.' + pkg[1], n) |
| |
| def testStartActivity_uri(self): |
| self.adbClient.startActivity(uri='http://www.google.com') |
| |
| #@unittest.skip("sequence") |
| def testCommandsSequence(self): |
| self.adbClient.setReconnect(True) |
| if VERBOSE: |
| print "Sending touch(480, 800)" |
| self.adbClient.touch(480, 800) |
| self.assertTrue(self.adbClient.checkConnected()) |
| if VERBOSE: |
| print "Typing 'command 1'" |
| self.adbClient.type("command 1") |
| self.assertTrue(self.adbClient.checkConnected()) |
| if VERBOSE: |
| print "Typing 'command 2'" |
| self.adbClient.type("command 2") |
| self.assertTrue(self.adbClient.checkConnected()) |
| if VERBOSE: |
| print "Pressing ENTER" |
| self.adbClient.press('KEYCODE_ENTER') |
| self.assertTrue(self.adbClient.checkConnected()) |
| |
| #def testWake(self): |
| # self.adbClient.wake() |
| |
| if __name__ == "__main__": |
| #print >> sys.stderr, "sys.path=", sys.path |
| #sys.argv = ['', 'AdbClientTest'] |
| unittest.main() |